struct Mat4x4_ {
  float4 mx;
  float4 my;
  float4 mz;
  float4 mw;
};
struct Mat4x3_ {
  float4 mx;
  float4 my;
  float4 mz;
};
struct Mat4x2_ {
  float4 mx;
  float4 my;
};
struct VertexOutput {
  float4 v_Color;
  float2 v_TexCoord;
  float4 member;
};

cbuffer cbuffer_global : register(b0, space0) {
  uint4 global[4];
};
cbuffer cbuffer_global1 : register(b1, space0) {
  uint4 global1[3];
};
cbuffer cbuffer_global2 : register(b2, space0) {
  uint4 global2[96];
};
static float3 a_Position1 = float3(0.0f, 0.0f, 0.0f);
static float2 a_UV1 = float2(0.0f, 0.0f);
static float4 a_Color1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float3 a_Normal1 = float3(0.0f, 0.0f, 0.0f);
static float a_PosMtxIdx1 = 0.0f;
static float4 v_Color = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float2 v_TexCoord = float2(0.0f, 0.0f);
static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);

float3 Mat4x3GetCol0_(Mat4x3_ m) {
  Mat4x3_ m1 = (Mat4x3_)0;
  m1 = m;
  return float3(m1.mx.x, m1.my.x, m1.mz.x);
}

float3 Mat4x3GetCol1_(Mat4x3_ m2) {
  Mat4x3_ m3 = (Mat4x3_)0;
  m3 = m2;
  return float3(m3.mx.y, m3.my.y, m3.mz.y);
}

float3 Mat4x3GetCol2_(Mat4x3_ m4) {
  Mat4x3_ m5 = (Mat4x3_)0;
  m5 = m4;
  return float3(m5.mx.z, m5.my.z, m5.mz.z);
}

float3 Mat4x3GetCol3_(Mat4x3_ m6) {
  Mat4x3_ m7 = (Mat4x3_)0;
  m7 = m6;
  return float3(m7.mx.w, m7.my.w, m7.mz.w);
}

float4 Mul(Mat4x4_ m8, float4 v) {
  Mat4x4_ m9 = (Mat4x4_)0;
  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  m9 = m8;
  v1 = v;
  return float4(dot(m9.mx, v1), dot(m9.my, v1), dot(m9.mz, v1), dot(m9.mw, v1));
}

float3 Mul1(Mat4x3_ m10, float4 v2) {
  Mat4x3_ m11 = (Mat4x3_)0;
  float4 v3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  m11 = m10;
  v3 = v2;
  return float3(dot(m11.mx, v3), dot(m11.my, v3), dot(m11.mz, v3));
}

float2 Mul2(Mat4x2_ m12, float4 v4) {
  Mat4x2_ m13 = (Mat4x2_)0;
  float4 v5 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  m13 = m12;
  v5 = v4;
  return float2(dot(m13.mx, v5), dot(m13.my, v5));
}

float4 Mul3(float3 v6, Mat4x3_ m14) {
  float3 v7 = float3(0.0f, 0.0f, 0.0f);
  Mat4x3_ m15 = (Mat4x3_)0;
  v7 = v6;
  m15 = m14;
  const float3 _e6 = Mat4x3GetCol0_(m15);
  const float3 _e7 = v7;
  const float3 _e11 = Mat4x3GetCol1_(m15);
  const float3 _e12 = v7;
  const float3 _e16 = Mat4x3GetCol2_(m15);
  const float3 _e17 = v7;
  const float3 _e21 = Mat4x3GetCol3_(m15);
  return float4(dot(_e6, _e7), dot(_e11, _e12), dot(_e16, _e17), dot(_e21, v7));
}

Mat4x4_ _Mat4x4_(float n) {
  float n1 = 0.0f;
  Mat4x4_ o = (Mat4x4_)0;
  n1 = n;
  o.mx = float4(n1, 0.0f, 0.0f, 0.0f);
  o.my = float4(0.0f, n1, 0.0f, 0.0f);
  o.mz = float4(0.0f, 0.0f, n1, 0.0f);
  o.mw = float4(0.0f, 0.0f, 0.0f, n1);
  return o;
}

Mat4x4_ _Mat4x4_1(Mat4x3_ m16) {
  Mat4x3_ m17 = (Mat4x3_)0;
  Mat4x4_ o1 = (Mat4x4_)0;
  m17 = m16;
  const Mat4x4_ _e4 = _Mat4x4_(1.0f);
  o1 = _e4;
  o1.mx = m17.mx;
  o1.my = m17.my;
  o1.mz = m17.mz;
  return o1;
}

Mat4x4_ _Mat4x4_2(Mat4x2_ m18) {
  Mat4x2_ m19 = (Mat4x2_)0;
  Mat4x4_ o2 = (Mat4x4_)0;
  m19 = m18;
  const Mat4x4_ _e4 = _Mat4x4_(1.0f);
  o2 = _e4;
  o2.mx = m19.mx;
  o2.my = m19.my;
  return o2;
}

Mat4x3_ _Mat4x3_(float n2) {
  float n3 = 0.0f;
  Mat4x3_ o3 = (Mat4x3_)0;
  n3 = n2;
  o3.mx = float4(n3, 0.0f, 0.0f, 0.0f);
  o3.my = float4(0.0f, n3, 0.0f, 0.0f);
  o3.mz = float4(0.0f, 0.0f, n3, 0.0f);
  return o3;
}

Mat4x3_ _Mat4x3_1(Mat4x4_ m20) {
  Mat4x4_ m21 = (Mat4x4_)0;
  Mat4x3_ o4 = (Mat4x3_)0;
  m21 = m20;
  o4.mx = m21.mx;
  o4.my = m21.my;
  o4.mz = m21.mz;
  return o4;
}

Mat4x3_ tint_symbol_3(uint4 buffer[96], uint offset) {
  const uint scalar_offset = ((offset + 0u)) / 4;
  const uint scalar_offset_1 = ((offset + 16u)) / 4;
  const uint scalar_offset_2 = ((offset + 32u)) / 4;
  const Mat4x3_ tint_symbol_9 = {asfloat(buffer[scalar_offset / 4]), asfloat(buffer[scalar_offset_1 / 4]), asfloat(buffer[scalar_offset_2 / 4])};
  return tint_symbol_9;
}

Mat4x4_ tint_symbol_5(uint4 buffer[4], uint offset) {
  const uint scalar_offset_3 = ((offset + 0u)) / 4;
  const uint scalar_offset_4 = ((offset + 16u)) / 4;
  const uint scalar_offset_5 = ((offset + 32u)) / 4;
  const uint scalar_offset_6 = ((offset + 48u)) / 4;
  const Mat4x4_ tint_symbol_10 = {asfloat(buffer[scalar_offset_3 / 4]), asfloat(buffer[scalar_offset_4 / 4]), asfloat(buffer[scalar_offset_5 / 4]), asfloat(buffer[scalar_offset_6 / 4])};
  return tint_symbol_10;
}

Mat4x2_ tint_symbol_8(uint4 buffer[3], uint offset) {
  const uint scalar_offset_7 = ((offset + 0u)) / 4;
  const uint scalar_offset_8 = ((offset + 16u)) / 4;
  const Mat4x2_ tint_symbol_11 = {asfloat(buffer[scalar_offset_7 / 4]), asfloat(buffer[scalar_offset_8 / 4])};
  return tint_symbol_11;
}

void main1() {
  Mat4x3_ t_PosMtx = (Mat4x3_)0;
  float2 t_TexSpaceCoord = float2(0.0f, 0.0f);
  const Mat4x3_ _e18 = tint_symbol_3(global2, (48u * uint(int(a_PosMtxIdx1))));
  t_PosMtx = _e18;
  const Mat4x4_ _e24 = _Mat4x4_1(t_PosMtx);
  const float3 _e25 = a_Position1;
  const Mat4x4_ _e30 = _Mat4x4_1(t_PosMtx);
  const float4 _e34 = Mul(_e30, float4(a_Position1, 1.0f));
  const Mat4x4_ _e35 = tint_symbol_5(global, 0u);
  const Mat4x4_ _e38 = _Mat4x4_1(t_PosMtx);
  const float3 _e39 = a_Position1;
  const Mat4x4_ _e44 = _Mat4x4_1(t_PosMtx);
  const float4 _e48 = Mul(_e44, float4(a_Position1, 1.0f));
  const float4 _e49 = Mul(_e35, _e48);
  gl_Position = _e49;
  v_Color = a_Color1;
  const float4 _e52 = asfloat(global1[2]);
  if ((_e52.x == 2.0f)) {
    {
      const float3 _e59 = a_Normal1;
      const Mat4x2_ _e64 = tint_symbol_8(global1, (32u * uint(0)));
      const float2 _e68 = Mul2(_e64, float4(a_Normal1, 1.0f));
      v_TexCoord = _e68.xy;
      return;
    }
  } else {
    {
      const float2 _e73 = a_UV1;
      const Mat4x2_ _e79 = tint_symbol_8(global1, (32u * uint(0)));
      const float2 _e84 = Mul2(_e79, float4(a_UV1, 1.0f, 1.0f));
      v_TexCoord = _e84.xy;
      return;
    }
  }
}

struct tint_symbol_1 {
  float3 a_Position : TEXCOORD0;
  float2 a_UV : TEXCOORD1;
  float4 a_Color : TEXCOORD2;
  float3 a_Normal : TEXCOORD3;
  float a_PosMtxIdx : TEXCOORD4;
};
struct tint_symbol_2 {
  float4 v_Color : TEXCOORD0;
  float2 v_TexCoord : TEXCOORD1;
  float4 member : SV_Position;
};

VertexOutput main_inner(float3 a_Position, float2 a_UV, float4 a_Color, float3 a_Normal, float a_PosMtxIdx) {
  a_Position1 = a_Position;
  a_UV1 = a_UV;
  a_Color1 = a_Color;
  a_Normal1 = a_Normal;
  a_PosMtxIdx1 = a_PosMtxIdx;
  main1();
  const VertexOutput tint_symbol_12 = {v_Color, v_TexCoord, gl_Position};
  return tint_symbol_12;
}

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const VertexOutput inner_result = main_inner(tint_symbol.a_Position, tint_symbol.a_UV, tint_symbol.a_Color, tint_symbol.a_Normal, tint_symbol.a_PosMtxIdx);
  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
  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;
}
