#version 310 es

layout(location = 0) in vec3 a_Position_1;
layout(location = 1) in vec2 a_UV_1;
layout(location = 2) in vec4 a_Color_1;
layout(location = 3) in vec3 a_Normal_1;
layout(location = 4) in float a_PosMtxIdx_1;
layout(location = 0) out vec4 v_Color_1;
layout(location = 1) out vec2 v_TexCoord_1;
struct Mat4x4_ {
  vec4 mx;
  vec4 my;
  vec4 mz;
  vec4 mw;
};

struct Mat4x3_ {
  vec4 mx;
  vec4 my;
  vec4 mz;
};

struct Mat4x2_ {
  vec4 mx;
  vec4 my;
};

struct ub_SceneParams {
  Mat4x4_ u_Projection;
};

struct ub_MaterialParams {
  Mat4x2_ u_TexMtx[1];
  vec4 u_Misc0_;
};

struct ub_PacketParams {
  Mat4x3_ u_PosMtx[32];
};

struct VertexOutput {
  vec4 v_Color;
  vec2 v_TexCoord;
  vec4 member;
};

layout(binding = 0, std140) uniform global_block_ubo {
  ub_SceneParams inner;
} global;

layout(binding = 1, std140) uniform global1_block_ubo {
  ub_MaterialParams inner;
} global1;

layout(binding = 2, std140) uniform global2_block_ubo {
  ub_PacketParams inner;
} global2;

vec3 a_Position1 = vec3(0.0f, 0.0f, 0.0f);
vec2 a_UV1 = vec2(0.0f, 0.0f);
vec4 a_Color1 = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec3 a_Normal1 = vec3(0.0f, 0.0f, 0.0f);
float a_PosMtxIdx1 = 0.0f;
vec4 v_Color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec2 v_TexCoord = vec2(0.0f, 0.0f);
vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec4 Mul(Mat4x4_ m8, vec4 v) {
  Mat4x4_ m9 = Mat4x4_(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  vec4 v1 = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  m9 = m8;
  v1 = v;
  Mat4x4_ x_e4 = m9;
  vec4 x_e6 = v1;
  Mat4x4_ x_e8 = m9;
  vec4 x_e10 = v1;
  Mat4x4_ x_e12 = m9;
  vec4 x_e14 = v1;
  Mat4x4_ x_e16 = m9;
  vec4 x_e18 = v1;
  return vec4(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10), dot(x_e12.mz, x_e14), dot(x_e16.mw, x_e18));
}

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

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

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

void main1() {
  Mat4x3_ t_PosMtx = Mat4x3_(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  vec2 t_TexSpaceCoord = vec2(0.0f, 0.0f);
  float x_e15 = a_PosMtxIdx1;
  Mat4x3_ x_e18 = global2.inner.u_PosMtx[int(x_e15)];
  t_PosMtx = x_e18;
  Mat4x3_ x_e23 = t_PosMtx;
  Mat4x4_ x_e24 = x_Mat4x4_1(x_e23);
  vec3 x_e25 = a_Position1;
  Mat4x3_ x_e29 = t_PosMtx;
  Mat4x4_ x_e30 = x_Mat4x4_1(x_e29);
  vec3 x_e31 = a_Position1;
  vec4 x_e34 = Mul(x_e30, vec4(x_e31, 1.0f));
  Mat4x4_ x_e35 = global.inner.u_Projection;
  Mat4x3_ x_e37 = t_PosMtx;
  Mat4x4_ x_e38 = x_Mat4x4_1(x_e37);
  vec3 x_e39 = a_Position1;
  Mat4x3_ x_e43 = t_PosMtx;
  Mat4x4_ x_e44 = x_Mat4x4_1(x_e43);
  vec3 x_e45 = a_Position1;
  vec4 x_e48 = Mul(x_e44, vec4(x_e45, 1.0f));
  vec4 x_e49 = Mul(x_e35, x_e48);
  tint_symbol = x_e49;
  vec4 x_e50 = a_Color1;
  v_Color = x_e50;
  vec4 x_e52 = global1.inner.u_Misc0_;
  if ((x_e52.x == 2.0f)) {
    {
      vec3 x_e59 = a_Normal1;
      Mat4x2_ x_e64 = global1.inner.u_TexMtx[0];
      vec3 x_e65 = a_Normal1;
      vec2 x_e68 = Mul2(x_e64, vec4(x_e65, 1.0f));
      v_TexCoord = x_e68.xy;
      return;
    }
  } else {
    {
      vec2 x_e73 = a_UV1;
      Mat4x2_ x_e79 = global1.inner.u_TexMtx[0];
      vec2 x_e80 = a_UV1;
      vec2 x_e84 = Mul2(x_e79, vec4(x_e80, 1.0f, 1.0f));
      v_TexCoord = x_e84.xy;
      return;
    }
  }
}

VertexOutput tint_symbol_1(vec3 a_Position, vec2 a_UV, vec4 a_Color, vec3 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();
  vec4 x_e11 = v_Color;
  vec2 x_e13 = v_TexCoord;
  vec4 x_e15 = tint_symbol;
  VertexOutput tint_symbol_2 = VertexOutput(x_e11, x_e13, x_e15);
  return tint_symbol_2;
}

void main() {
  gl_PointSize = 1.0;
  VertexOutput inner_result = tint_symbol_1(a_Position_1, a_UV_1, a_Color_1, a_Normal_1, a_PosMtxIdx_1);
  v_Color_1 = inner_result.v_Color;
  v_TexCoord_1 = inner_result.v_TexCoord;
  gl_Position = inner_result.member;
  gl_Position.y = -(gl_Position.y);
  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
  return;
}
