#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 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 float* const tint_symbol_5, const constant ub_PacketParams* const tint_symbol_6, thread float3* const tint_symbol_7, const constant ub_SceneParams* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11, const constant ub_MaterialParams* const tint_symbol_12, thread float3* const tint_symbol_13, thread float2* const tint_symbol_14, thread float2* const tint_symbol_15) {
  Mat4x3_ t_PosMtx = {};
  float2 t_TexSpaceCoord = 0.0f;
  float const x_e15 = *(tint_symbol_5);
  Mat4x3_ const x_e18 = (*(tint_symbol_6)).u_PosMtx[int(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_symbol_7);
  Mat4x3_ const x_e29 = t_PosMtx;
  Mat4x4_ const x_e30 = x_Mat4x4_1(x_e29);
  float3 const x_e31 = *(tint_symbol_7);
  float4 const x_e34 = Mul(x_e30, float4(x_e31, 1.0f));
  Mat4x4_ const x_e35 = (*(tint_symbol_8)).u_Projection;
  Mat4x3_ const x_e37 = t_PosMtx;
  Mat4x4_ const x_e38 = x_Mat4x4_1(x_e37);
  float3 const x_e39 = *(tint_symbol_7);
  Mat4x3_ const x_e43 = t_PosMtx;
  Mat4x4_ const x_e44 = x_Mat4x4_1(x_e43);
  float3 const x_e45 = *(tint_symbol_7);
  float4 const x_e48 = Mul(x_e44, float4(x_e45, 1.0f));
  float4 const x_e49 = Mul(x_e35, x_e48);
  *(tint_symbol_9) = x_e49;
  float4 const x_e50 = *(tint_symbol_10);
  *(tint_symbol_11) = x_e50;
  float4 const x_e52 = (*(tint_symbol_12)).u_Misc0_;
  if ((x_e52[0] == 2.0f)) {
    {
      float3 const x_e59 = *(tint_symbol_13);
      Mat4x2_ const x_e64 = (*(tint_symbol_12)).u_TexMtx[0];
      float3 const x_e65 = *(tint_symbol_13);
      float2 const x_e68 = Mul2(x_e64, float4(x_e65, 1.0f));
      *(tint_symbol_14) = float2(x_e68).xy;
      return;
    }
  } else {
    {
      float2 const x_e73 = *(tint_symbol_15);
      Mat4x2_ const x_e79 = (*(tint_symbol_12)).u_TexMtx[0];
      float2 const x_e80 = *(tint_symbol_15);
      float2 const x_e84 = Mul2(x_e79, float4(x_e80, 1.0f, 1.0f));
      *(tint_symbol_14) = float2(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 float3* const tint_symbol_16, thread float2* const tint_symbol_17, thread float4* const tint_symbol_18, thread float3* const tint_symbol_19, thread float* const tint_symbol_20, const constant ub_PacketParams* const tint_symbol_21, const constant ub_SceneParams* const tint_symbol_22, thread float4* const tint_symbol_23, thread float4* const tint_symbol_24, const constant ub_MaterialParams* const tint_symbol_25, thread float2* const tint_symbol_26) {
  *(tint_symbol_16) = a_Position;
  *(tint_symbol_17) = a_UV;
  *(tint_symbol_18) = a_Color;
  *(tint_symbol_19) = a_Normal;
  *(tint_symbol_20) = a_PosMtxIdx;
  main1(tint_symbol_20, tint_symbol_21, tint_symbol_16, tint_symbol_22, tint_symbol_23, tint_symbol_18, tint_symbol_24, tint_symbol_25, tint_symbol_19, tint_symbol_26, tint_symbol_17);
  float4 const x_e11 = *(tint_symbol_24);
  float2 const x_e13 = *(tint_symbol_26);
  float4 const x_e15 = *(tint_symbol_23);
  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_32 [[buffer(0)]], const constant ub_SceneParams* tint_symbol_33 [[buffer(1)]], const constant ub_MaterialParams* tint_symbol_36 [[buffer(2)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float3 tint_symbol_27 = 0.0f;
  thread float2 tint_symbol_28 = 0.0f;
  thread float4 tint_symbol_29 = 0.0f;
  thread float3 tint_symbol_30 = 0.0f;
  thread float tint_symbol_31 = 0.0f;
  thread float4 tint_symbol_34 = 0.0f;
  thread float4 tint_symbol_35 = 0.0f;
  thread float2 tint_symbol_37 = 0.0f;
  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_symbol_27), &(tint_symbol_28), &(tint_symbol_29), &(tint_symbol_30), &(tint_symbol_31), tint_symbol_32, tint_symbol_33, &(tint_symbol_34), &(tint_symbol_35), tint_symbol_36, &(tint_symbol_37));
  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;
}

