#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct tint_private_vars_struct {
  float3 a_Position1;
  float2 a_UV1;
  float4 a_Color1;
  float3 a_Normal1;
  float a_PosMtxIdx1;
  float4 v_Color;
  float2 v_TexCoord;
  float4 gl_Position;
};

int tint_ftoi(float v) {
  return select(2147483647, select(int(v), (-2147483647 - 1), (v < -2147483648.0f)), (v < 2147483520.0f));
}

struct Mat4x4_ {
  /* 0x0000 */ float4 mx;
  /* 0x0010 */ float4 my;
  /* 0x0020 */ float4 mz;
  /* 0x0030 */ float4 mw;
};

struct Mat4x3_ {
  /* 0x0000 */ float4 mx;
  /* 0x0010 */ float4 my;
  /* 0x0020 */ float4 mz;
};

struct Mat4x2_ {
  /* 0x0000 */ float4 mx;
  /* 0x0010 */ float4 my;
};

struct ub_SceneParams {
  /* 0x0000 */ Mat4x4_ u_Projection;
};

struct ub_MaterialParams {
  /* 0x0000 */ tint_array<Mat4x2_, 1> u_TexMtx;
  /* 0x0020 */ float4 u_Misc0_;
};

struct ub_PacketParams {
  /* 0x0000 */ tint_array<Mat4x3_, 32> u_PosMtx;
};

struct VertexOutput {
  float4 v_Color;
  float2 v_TexCoord;
  float4 member;
};

float3 Mat4x3GetCol0_(Mat4x3_ m) {
  Mat4x3_ m1 = {};
  m1 = m;
  Mat4x3_ const x_e2 = m1;
  Mat4x3_ const x_e5 = m1;
  Mat4x3_ const x_e8 = m1;
  return float3(x_e2.mx[0], x_e5.my[0], x_e8.mz[0]);
}

float3 Mat4x3GetCol1_(Mat4x3_ m2) {
  Mat4x3_ m3 = {};
  m3 = m2;
  Mat4x3_ const x_e2 = m3;
  Mat4x3_ const x_e5 = m3;
  Mat4x3_ const x_e8 = m3;
  return float3(x_e2.mx[1], x_e5.my[1], x_e8.mz[1]);
}

float3 Mat4x3GetCol2_(Mat4x3_ m4) {
  Mat4x3_ m5 = {};
  m5 = m4;
  Mat4x3_ const x_e2 = m5;
  Mat4x3_ const x_e5 = m5;
  Mat4x3_ const x_e8 = m5;
  return float3(x_e2.mx[2], x_e5.my[2], x_e8.mz[2]);
}

float3 Mat4x3GetCol3_(Mat4x3_ m6) {
  Mat4x3_ m7 = {};
  m7 = m6;
  Mat4x3_ const x_e2 = m7;
  Mat4x3_ const x_e5 = m7;
  Mat4x3_ const x_e8 = m7;
  return float3(x_e2.mx[3], x_e5.my[3], x_e8.mz[3]);
}

float4 Mul(Mat4x4_ m8, float4 v) {
  Mat4x4_ m9 = {};
  float4 v1 = 0.0f;
  m9 = m8;
  v1 = v;
  Mat4x4_ const x_e4 = m9;
  float4 const x_e6 = v1;
  Mat4x4_ const x_e8 = m9;
  float4 const x_e10 = v1;
  Mat4x4_ const x_e12 = m9;
  float4 const x_e14 = v1;
  Mat4x4_ const x_e16 = m9;
  float4 const x_e18 = v1;
  return float4(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10), dot(x_e12.mz, x_e14), dot(x_e16.mw, x_e18));
}

float3 Mul1(Mat4x3_ m10, float4 v2) {
  Mat4x3_ m11 = {};
  float4 v3 = 0.0f;
  m11 = m10;
  v3 = v2;
  Mat4x3_ const x_e4 = m11;
  float4 const x_e6 = v3;
  Mat4x3_ const x_e8 = m11;
  float4 const x_e10 = v3;
  Mat4x3_ const x_e12 = m11;
  float4 const x_e14 = v3;
  return float3(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10), dot(x_e12.mz, x_e14));
}

float2 Mul2(Mat4x2_ m12, float4 v4) {
  Mat4x2_ m13 = {};
  float4 v5 = 0.0f;
  m13 = m12;
  v5 = v4;
  Mat4x2_ const x_e4 = m13;
  float4 const x_e6 = v5;
  Mat4x2_ const x_e8 = m13;
  float4 const x_e10 = v5;
  return float2(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10));
}

float4 Mul3(float3 v6, Mat4x3_ m14) {
  float3 v7 = 0.0f;
  Mat4x3_ m15 = {};
  v7 = v6;
  m15 = m14;
  Mat4x3_ const x_e5 = m15;
  float3 const x_e6 = Mat4x3GetCol0_(x_e5);
  float3 const x_e7 = v7;
  Mat4x3_ const x_e10 = m15;
  float3 const x_e11 = Mat4x3GetCol1_(x_e10);
  float3 const x_e12 = v7;
  Mat4x3_ const x_e15 = m15;
  float3 const x_e16 = Mat4x3GetCol2_(x_e15);
  float3 const x_e17 = v7;
  Mat4x3_ const x_e20 = m15;
  float3 const x_e21 = Mat4x3GetCol3_(x_e20);
  float3 const x_e22 = v7;
  return float4(dot(x_e6, x_e7), dot(x_e11, x_e12), dot(x_e16, x_e17), dot(x_e21, x_e22));
}

Mat4x4_ x_Mat4x4_(float n) {
  float n1 = 0.0f;
  Mat4x4_ o = {};
  n1 = n;
  float const x_e4 = n1;
  o.mx = float4(x_e4, 0.0f, 0.0f, 0.0f);
  float const x_e11 = n1;
  o.my = float4(0.0f, x_e11, 0.0f, 0.0f);
  float const x_e18 = n1;
  o.mz = float4(0.0f, 0.0f, x_e18, 0.0f);
  float const x_e25 = n1;
  o.mw = float4(0.0f, 0.0f, 0.0f, x_e25);
  Mat4x4_ const x_e27 = o;
  return x_e27;
}

Mat4x4_ x_Mat4x4_1(Mat4x3_ m16) {
  Mat4x3_ m17 = {};
  Mat4x4_ o1 = {};
  m17 = m16;
  Mat4x4_ const x_e4 = x_Mat4x4_(1.0f);
  o1 = x_e4;
  Mat4x3_ const x_e7 = m17;
  o1.mx = x_e7.mx;
  Mat4x3_ const x_e10 = m17;
  o1.my = x_e10.my;
  Mat4x3_ const x_e13 = m17;
  o1.mz = x_e13.mz;
  Mat4x4_ const x_e15 = o1;
  return x_e15;
}

Mat4x4_ x_Mat4x4_2(Mat4x2_ m18) {
  Mat4x2_ m19 = {};
  Mat4x4_ o2 = {};
  m19 = m18;
  Mat4x4_ const x_e4 = x_Mat4x4_(1.0f);
  o2 = x_e4;
  Mat4x2_ const x_e7 = m19;
  o2.mx = x_e7.mx;
  Mat4x2_ const x_e10 = m19;
  o2.my = x_e10.my;
  Mat4x4_ const x_e12 = o2;
  return x_e12;
}

Mat4x3_ x_Mat4x3_(float n2) {
  float n3 = 0.0f;
  Mat4x3_ o3 = {};
  n3 = n2;
  float const x_e4 = n3;
  o3.mx = float4(x_e4, 0.0f, 0.0f, 0.0f);
  float const x_e11 = n3;
  o3.my = float4(0.0f, x_e11, 0.0f, 0.0f);
  float const x_e18 = n3;
  o3.mz = float4(0.0f, 0.0f, x_e18, 0.0f);
  Mat4x3_ const x_e21 = o3;
  return x_e21;
}

Mat4x3_ x_Mat4x3_1(Mat4x4_ m20) {
  Mat4x4_ m21 = {};
  Mat4x3_ o4 = {};
  m21 = m20;
  Mat4x4_ const x_e4 = m21;
  o4.mx = x_e4.mx;
  Mat4x4_ const x_e7 = m21;
  o4.my = x_e7.my;
  Mat4x4_ const x_e10 = m21;
  o4.mz = x_e10.mz;
  Mat4x3_ const x_e12 = o4;
  return x_e12;
}

void main1(thread tint_private_vars_struct* const tint_private_vars, const constant ub_PacketParams* const tint_symbol_5, const constant ub_SceneParams* const tint_symbol_6, const constant ub_MaterialParams* const tint_symbol_7) {
  Mat4x3_ t_PosMtx = {};
  float2 t_TexSpaceCoord = 0.0f;
  float const x_e15 = (*(tint_private_vars)).a_PosMtxIdx1;
  Mat4x3_ const x_e18 = (*(tint_symbol_5)).u_PosMtx[tint_ftoi(x_e15)];
  t_PosMtx = x_e18;
  Mat4x3_ const x_e23 = t_PosMtx;
  Mat4x4_ const x_e24 = x_Mat4x4_1(x_e23);
  float3 const x_e25 = (*(tint_private_vars)).a_Position1;
  Mat4x3_ const x_e29 = t_PosMtx;
  Mat4x4_ const x_e30 = x_Mat4x4_1(x_e29);
  float3 const x_e31 = (*(tint_private_vars)).a_Position1;
  float4 const x_e34 = Mul(x_e30, float4(x_e31, 1.0f));
  Mat4x4_ const x_e35 = (*(tint_symbol_6)).u_Projection;
  Mat4x3_ const x_e37 = t_PosMtx;
  Mat4x4_ const x_e38 = x_Mat4x4_1(x_e37);
  float3 const x_e39 = (*(tint_private_vars)).a_Position1;
  Mat4x3_ const x_e43 = t_PosMtx;
  Mat4x4_ const x_e44 = x_Mat4x4_1(x_e43);
  float3 const x_e45 = (*(tint_private_vars)).a_Position1;
  float4 const x_e48 = Mul(x_e44, float4(x_e45, 1.0f));
  float4 const x_e49 = Mul(x_e35, x_e48);
  (*(tint_private_vars)).gl_Position = x_e49;
  float4 const x_e50 = (*(tint_private_vars)).a_Color1;
  (*(tint_private_vars)).v_Color = x_e50;
  float4 const x_e52 = (*(tint_symbol_7)).u_Misc0_;
  if ((x_e52[0] == 2.0f)) {
    {
      float3 const x_e59 = (*(tint_private_vars)).a_Normal1;
      Mat4x2_ const x_e64 = (*(tint_symbol_7)).u_TexMtx[0];
      float3 const x_e65 = (*(tint_private_vars)).a_Normal1;
      float2 const x_e68 = Mul2(x_e64, float4(x_e65, 1.0f));
      (*(tint_private_vars)).v_TexCoord = x_e68.xy;
      return;
    }
  } else {
    {
      float2 const x_e73 = (*(tint_private_vars)).a_UV1;
      Mat4x2_ const x_e79 = (*(tint_symbol_7)).u_TexMtx[0];
      float2 const x_e80 = (*(tint_private_vars)).a_UV1;
      float2 const x_e84 = Mul2(x_e79, float4(x_e80, 1.0f, 1.0f));
      (*(tint_private_vars)).v_TexCoord = x_e84.xy;
      return;
    }
  }
}

struct tint_symbol_2 {
  float3 a_Position [[attribute(0)]];
  float2 a_UV [[attribute(1)]];
  float4 a_Color [[attribute(2)]];
  float3 a_Normal [[attribute(3)]];
  float a_PosMtxIdx [[attribute(4)]];
};

struct tint_symbol_3 {
  float4 v_Color [[user(locn0)]];
  float2 v_TexCoord [[user(locn1)]];
  float4 member [[position]];
};

VertexOutput tint_symbol_inner(float3 a_Position, float2 a_UV, float4 a_Color, float3 a_Normal, float a_PosMtxIdx, thread tint_private_vars_struct* const tint_private_vars, const constant ub_PacketParams* const tint_symbol_8, const constant ub_SceneParams* const tint_symbol_9, const constant ub_MaterialParams* const tint_symbol_10) {
  (*(tint_private_vars)).a_Position1 = a_Position;
  (*(tint_private_vars)).a_UV1 = a_UV;
  (*(tint_private_vars)).a_Color1 = a_Color;
  (*(tint_private_vars)).a_Normal1 = a_Normal;
  (*(tint_private_vars)).a_PosMtxIdx1 = a_PosMtxIdx;
  main1(tint_private_vars, tint_symbol_8, tint_symbol_9, tint_symbol_10);
  float4 const x_e11 = (*(tint_private_vars)).v_Color;
  float2 const x_e13 = (*(tint_private_vars)).v_TexCoord;
  float4 const x_e15 = (*(tint_private_vars)).gl_Position;
  VertexOutput const tint_symbol_4 = {.v_Color=x_e11, .v_TexCoord=x_e13, .member=x_e15};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(const constant ub_PacketParams* tint_symbol_11 [[buffer(0)]], const constant ub_SceneParams* tint_symbol_12 [[buffer(1)]], const constant ub_MaterialParams* tint_symbol_13 [[buffer(2)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread tint_private_vars_struct tint_private_vars = {};
  VertexOutput const inner_result = tint_symbol_inner(tint_symbol_1.a_Position, tint_symbol_1.a_UV, tint_symbol_1.a_Color, tint_symbol_1.a_Normal, tint_symbol_1.a_PosMtxIdx, &(tint_private_vars), tint_symbol_11, tint_symbol_12, tint_symbol_13);
  tint_symbol_3 wrapper_result = {};
  wrapper_result.v_Color = inner_result.v_Color;
  wrapper_result.v_TexCoord = inner_result.v_TexCoord;
  wrapper_result.member = inner_result.member;
  return wrapper_result;
}

