struct Mat4x4_ {
  mx : vec4<f32>;
  my : vec4<f32>;
  mz : vec4<f32>;
  mw : vec4<f32>;
};

struct Mat4x3_ {
  mx : vec4<f32>;
  my : vec4<f32>;
  mz : vec4<f32>;
};

struct Mat4x2_ {
  mx : vec4<f32>;
  my : vec4<f32>;
};

[[block]]
struct ub_SceneParams {
  u_Projection : Mat4x4_;
};

[[block]]
struct ub_MaterialParams {
  u_TexMtx : [[stride(32)]] array<Mat4x2_, 1>;
  u_Misc0_ : vec4<f32>;
};

[[block]]
struct ub_PacketParams {
  u_PosMtx : [[stride(48)]] array<Mat4x3_, 32>;
};

struct VertexOutput {
  [[location(0)]]
  v_Color : vec4<f32>;
  [[location(1)]]
  v_TexCoord : vec2<f32>;
  [[builtin(position)]]
  member : vec4<f32>;
};

[[group(0), binding(0)]] var<uniform> global : ub_SceneParams;

[[group(0), binding(1)]] var<uniform> global1 : ub_MaterialParams;

[[group(0), binding(2)]] var<uniform> global2 : ub_PacketParams;

var<private> a_Position1 : vec3<f32>;

var<private> a_UV1 : vec2<f32>;

var<private> a_Color1 : vec4<f32>;

var<private> a_Normal1 : vec3<f32>;

var<private> a_PosMtxIdx1 : f32;

var<private> v_Color : vec4<f32>;

var<private> v_TexCoord : vec2<f32>;

var<private> gl_Position : vec4<f32>;

fn Mat4x3GetCol0_(m : Mat4x3_) -> vec3<f32> {
  var m1 : Mat4x3_;
  m1 = m;
  let _e2 : Mat4x3_ = m1;
  let _e5 : Mat4x3_ = m1;
  let _e8 : Mat4x3_ = m1;
  return vec3<f32>(_e2.mx.x, _e5.my.x, _e8.mz.x);
}

fn Mat4x3GetCol1_(m2 : Mat4x3_) -> vec3<f32> {
  var m3 : Mat4x3_;
  m3 = m2;
  let _e2 : Mat4x3_ = m3;
  let _e5 : Mat4x3_ = m3;
  let _e8 : Mat4x3_ = m3;
  return vec3<f32>(_e2.mx.y, _e5.my.y, _e8.mz.y);
}

fn Mat4x3GetCol2_(m4 : Mat4x3_) -> vec3<f32> {
  var m5 : Mat4x3_;
  m5 = m4;
  let _e2 : Mat4x3_ = m5;
  let _e5 : Mat4x3_ = m5;
  let _e8 : Mat4x3_ = m5;
  return vec3<f32>(_e2.mx.z, _e5.my.z, _e8.mz.z);
}

fn Mat4x3GetCol3_(m6 : Mat4x3_) -> vec3<f32> {
  var m7 : Mat4x3_;
  m7 = m6;
  let _e2 : Mat4x3_ = m7;
  let _e5 : Mat4x3_ = m7;
  let _e8 : Mat4x3_ = m7;
  return vec3<f32>(_e2.mx.w, _e5.my.w, _e8.mz.w);
}

fn Mul(m8 : Mat4x4_, v : vec4<f32>) -> vec4<f32> {
  var m9 : Mat4x4_;
  var v1 : vec4<f32>;
  m9 = m8;
  v1 = v;
  let _e4 : Mat4x4_ = m9;
  let _e6 : vec4<f32> = v1;
  let _e8 : Mat4x4_ = m9;
  let _e10 : vec4<f32> = v1;
  let _e12 : Mat4x4_ = m9;
  let _e14 : vec4<f32> = v1;
  let _e16 : Mat4x4_ = m9;
  let _e18 : vec4<f32> = v1;
  return vec4<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14), dot(_e16.mw, _e18));
}

fn Mul1(m10 : Mat4x3_, v2 : vec4<f32>) -> vec3<f32> {
  var m11 : Mat4x3_;
  var v3 : vec4<f32>;
  m11 = m10;
  v3 = v2;
  let _e4 : Mat4x3_ = m11;
  let _e6 : vec4<f32> = v3;
  let _e8 : Mat4x3_ = m11;
  let _e10 : vec4<f32> = v3;
  let _e12 : Mat4x3_ = m11;
  let _e14 : vec4<f32> = v3;
  return vec3<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10), dot(_e12.mz, _e14));
}

fn Mul2(m12 : Mat4x2_, v4 : vec4<f32>) -> vec2<f32> {
  var m13 : Mat4x2_;
  var v5 : vec4<f32>;
  m13 = m12;
  v5 = v4;
  let _e4 : Mat4x2_ = m13;
  let _e6 : vec4<f32> = v5;
  let _e8 : Mat4x2_ = m13;
  let _e10 : vec4<f32> = v5;
  return vec2<f32>(dot(_e4.mx, _e6), dot(_e8.my, _e10));
}

fn Mul3(v6 : vec3<f32>, m14 : Mat4x3_) -> vec4<f32> {
  var v7 : vec3<f32>;
  var m15 : Mat4x3_;
  v7 = v6;
  m15 = m14;
  let _e5 : Mat4x3_ = m15;
  let _e6 : vec3<f32> = Mat4x3GetCol0_(_e5);
  let _e7 : vec3<f32> = v7;
  let _e10 : Mat4x3_ = m15;
  let _e11 : vec3<f32> = Mat4x3GetCol1_(_e10);
  let _e12 : vec3<f32> = v7;
  let _e15 : Mat4x3_ = m15;
  let _e16 : vec3<f32> = Mat4x3GetCol2_(_e15);
  let _e17 : vec3<f32> = v7;
  let _e20 : Mat4x3_ = m15;
  let _e21 : vec3<f32> = Mat4x3GetCol3_(_e20);
  let _e22 : vec3<f32> = v7;
  return vec4<f32>(dot(_e6, _e7), dot(_e11, _e12), dot(_e16, _e17), dot(_e21, _e22));
}

fn _Mat4x4_(n : f32) -> Mat4x4_ {
  var n1 : f32;
  var o : Mat4x4_;
  n1 = n;
  let _e4 : f32 = n1;
  o.mx = vec4<f32>(_e4, 0.0, 0.0, 0.0);
  let _e11 : f32 = n1;
  o.my = vec4<f32>(0.0, _e11, 0.0, 0.0);
  let _e18 : f32 = n1;
  o.mz = vec4<f32>(0.0, 0.0, _e18, 0.0);
  let _e25 : f32 = n1;
  o.mw = vec4<f32>(0.0, 0.0, 0.0, _e25);
  let _e27 : Mat4x4_ = o;
  return _e27;
}

fn _Mat4x4_1(m16 : Mat4x3_) -> Mat4x4_ {
  var m17 : Mat4x3_;
  var o1 : Mat4x4_;
  m17 = m16;
  let _e4 : Mat4x4_ = _Mat4x4_(1.0);
  o1 = _e4;
  let _e7 : Mat4x3_ = m17;
  o1.mx = _e7.mx;
  let _e10 : Mat4x3_ = m17;
  o1.my = _e10.my;
  let _e13 : Mat4x3_ = m17;
  o1.mz = _e13.mz;
  let _e15 : Mat4x4_ = o1;
  return _e15;
}

fn _Mat4x4_2(m18 : Mat4x2_) -> Mat4x4_ {
  var m19 : Mat4x2_;
  var o2 : Mat4x4_;
  m19 = m18;
  let _e4 : Mat4x4_ = _Mat4x4_(1.0);
  o2 = _e4;
  let _e7 : Mat4x2_ = m19;
  o2.mx = _e7.mx;
  let _e10 : Mat4x2_ = m19;
  o2.my = _e10.my;
  let _e12 : Mat4x4_ = o2;
  return _e12;
}

fn _Mat4x3_(n2 : f32) -> Mat4x3_ {
  var n3 : f32;
  var o3 : Mat4x3_;
  n3 = n2;
  let _e4 : f32 = n3;
  o3.mx = vec4<f32>(_e4, 0.0, 0.0, 0.0);
  let _e11 : f32 = n3;
  o3.my = vec4<f32>(0.0, _e11, 0.0, 0.0);
  let _e18 : f32 = n3;
  o3.mz = vec4<f32>(0.0, 0.0, _e18, 0.0);
  let _e21 : Mat4x3_ = o3;
  return _e21;
}

fn _Mat4x3_1(m20 : Mat4x4_) -> Mat4x3_ {
  var m21 : Mat4x4_;
  var o4 : Mat4x3_;
  m21 = m20;
  let _e4 : Mat4x4_ = m21;
  o4.mx = _e4.mx;
  let _e7 : Mat4x4_ = m21;
  o4.my = _e7.my;
  let _e10 : Mat4x4_ = m21;
  o4.mz = _e10.mz;
  let _e12 : Mat4x3_ = o4;
  return _e12;
}

fn main1() {
  var t_PosMtx : Mat4x3_;
  var t_TexSpaceCoord : vec2<f32>;
  let _e15 : f32 = a_PosMtxIdx1;
  let _e18 : Mat4x3_ = global2.u_PosMtx[i32(_e15)];
  t_PosMtx = _e18;
  let _e23 : Mat4x3_ = t_PosMtx;
  let _e24 : Mat4x4_ = _Mat4x4_1(_e23);
  let _e25 : vec3<f32> = a_Position1;
  let _e29 : Mat4x3_ = t_PosMtx;
  let _e30 : Mat4x4_ = _Mat4x4_1(_e29);
  let _e31 : vec3<f32> = a_Position1;
  let _e34 : vec4<f32> = Mul(_e30, vec4<f32>(_e31, 1.0));
  let _e35 : Mat4x4_ = global.u_Projection;
  let _e37 : Mat4x3_ = t_PosMtx;
  let _e38 : Mat4x4_ = _Mat4x4_1(_e37);
  let _e39 : vec3<f32> = a_Position1;
  let _e43 : Mat4x3_ = t_PosMtx;
  let _e44 : Mat4x4_ = _Mat4x4_1(_e43);
  let _e45 : vec3<f32> = a_Position1;
  let _e48 : vec4<f32> = Mul(_e44, vec4<f32>(_e45, 1.0));
  let _e49 : vec4<f32> = Mul(_e35, _e48);
  gl_Position = _e49;
  let _e50 : vec4<f32> = a_Color1;
  v_Color = _e50;
  let _e52 : vec4<f32> = global1.u_Misc0_;
  if ((_e52.x == 2.0)) {
    {
      let _e59 : vec3<f32> = a_Normal1;
      let _e64 : Mat4x2_ = global1.u_TexMtx[0];
      let _e65 : vec3<f32> = a_Normal1;
      let _e68 : vec2<f32> = Mul2(_e64, vec4<f32>(_e65, 1.0));
      v_TexCoord = _e68.xy;
      return;
    }
  } else {
    {
      let _e73 : vec2<f32> = a_UV1;
      let _e79 : Mat4x2_ = global1.u_TexMtx[0];
      let _e80 : vec2<f32> = a_UV1;
      let _e84 : vec2<f32> = Mul2(_e79, vec4<f32>(_e80, 1.0, 1.0));
      v_TexCoord = _e84.xy;
      return;
    }
  }
}

[[stage(vertex)]]
fn main([[location(0)]] a_Position : vec3<f32>, [[location(1)]] a_UV : vec2<f32>, [[location(2)]] a_Color : vec4<f32>, [[location(3)]] a_Normal : vec3<f32>, [[location(4)]] a_PosMtxIdx : f32) -> VertexOutput {
  a_Position1 = a_Position;
  a_UV1 = a_UV;
  a_Color1 = a_Color;
  a_Normal1 = a_Normal;
  a_PosMtxIdx1 = a_PosMtxIdx;
  main1();
  let _e11 : vec4<f32> = v_Color;
  let _e13 : vec2<f32> = v_TexCoord;
  let _e15 : vec4<f32> = gl_Position;
  return VertexOutput(_e11, _e13, _e15);
}
