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>;
};

struct ub_SceneParams {
    u_Projection: Mat4x4_;
};

struct ub_MaterialParams {
    u_TexMtx: array<Mat4x2_,1>;
    u_Misc0_: vec4<f32>;
};

struct ub_PacketParams {
    u_PosMtx: 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 x_e2: Mat4x3_ = m1;
    let x_e5: Mat4x3_ = m1;
    let x_e8: Mat4x3_ = m1;
    return vec3<f32>(x_e2.mx.x, x_e5.my.x, x_e8.mz.x);
}

fn Mat4x3GetCol1_(m2: Mat4x3_) -> vec3<f32> {
    var m3: Mat4x3_;

    m3 = m2;
    let x_e2: Mat4x3_ = m3;
    let x_e5: Mat4x3_ = m3;
    let x_e8: Mat4x3_ = m3;
    return vec3<f32>(x_e2.mx.y, x_e5.my.y, x_e8.mz.y);
}

fn Mat4x3GetCol2_(m4: Mat4x3_) -> vec3<f32> {
    var m5: Mat4x3_;

    m5 = m4;
    let x_e2: Mat4x3_ = m5;
    let x_e5: Mat4x3_ = m5;
    let x_e8: Mat4x3_ = m5;
    return vec3<f32>(x_e2.mx.z, x_e5.my.z, x_e8.mz.z);
}

fn Mat4x3GetCol3_(m6: Mat4x3_) -> vec3<f32> {
    var m7: Mat4x3_;

    m7 = m6;
    let x_e2: Mat4x3_ = m7;
    let x_e5: Mat4x3_ = m7;
    let x_e8: Mat4x3_ = m7;
    return vec3<f32>(x_e2.mx.w, x_e5.my.w, x_e8.mz.w);
}

fn Mul(m8: Mat4x4_, v: vec4<f32>) -> vec4<f32> {
    var m9: Mat4x4_;
    var v1: vec4<f32>;

    m9 = m8;
    v1 = v;
    let x_e4: Mat4x4_ = m9;
    let x_e6: vec4<f32> = v1;
    let x_e8: Mat4x4_ = m9;
    let x_e10: vec4<f32> = v1;
    let x_e12: Mat4x4_ = m9;
    let x_e14: vec4<f32> = v1;
    let x_e16: Mat4x4_ = m9;
    let x_e18: vec4<f32> = v1;
    return vec4<f32>(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10), dot(x_e12.mz, x_e14), dot(x_e16.mw, x_e18));
}

fn Mul1(m10: Mat4x3_, v2: vec4<f32>) -> vec3<f32> {
    var m11: Mat4x3_;
    var v3: vec4<f32>;

    m11 = m10;
    v3 = v2;
    let x_e4: Mat4x3_ = m11;
    let x_e6: vec4<f32> = v3;
    let x_e8: Mat4x3_ = m11;
    let x_e10: vec4<f32> = v3;
    let x_e12: Mat4x3_ = m11;
    let x_e14: vec4<f32> = v3;
    return vec3<f32>(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10), dot(x_e12.mz, x_e14));
}

fn Mul2(m12: Mat4x2_, v4: vec4<f32>) -> vec2<f32> {
    var m13: Mat4x2_;
    var v5: vec4<f32>;

    m13 = m12;
    v5 = v4;
    let x_e4: Mat4x2_ = m13;
    let x_e6: vec4<f32> = v5;
    let x_e8: Mat4x2_ = m13;
    let x_e10: vec4<f32> = v5;
    return vec2<f32>(dot(x_e4.mx, x_e6), dot(x_e8.my, x_e10));
}

fn Mul3(v6: vec3<f32>, m14: Mat4x3_) -> vec4<f32> {
    var v7: vec3<f32>;
    var m15: Mat4x3_;

    v7 = v6;
    m15 = m14;
    let x_e5: Mat4x3_ = m15;
    let x_e6: vec3<f32> = Mat4x3GetCol0_(x_e5);
    let x_e7: vec3<f32> = v7;
    let x_e10: Mat4x3_ = m15;
    let x_e11: vec3<f32> = Mat4x3GetCol1_(x_e10);
    let x_e12: vec3<f32> = v7;
    let x_e15: Mat4x3_ = m15;
    let x_e16: vec3<f32> = Mat4x3GetCol2_(x_e15);
    let x_e17: vec3<f32> = v7;
    let x_e20: Mat4x3_ = m15;
    let x_e21: vec3<f32> = Mat4x3GetCol3_(x_e20);
    let x_e22: vec3<f32> = v7;
    return vec4<f32>(dot(x_e6, x_e7), dot(x_e11, x_e12), dot(x_e16, x_e17), dot(x_e21, x_e22));
}

fn x_Mat4x4_(n: f32) -> Mat4x4_ {
    var n1: f32;
    var o: Mat4x4_;

    n1 = n;
    let x_e4: f32 = n1;
    o.mx = vec4<f32>(x_e4, 0.0, 0.0, 0.0);
    let x_e11: f32 = n1;
    o.my = vec4<f32>(0.0, x_e11, 0.0, 0.0);
    let x_e18: f32 = n1;
    o.mz = vec4<f32>(0.0, 0.0, x_e18, 0.0);
    let x_e25: f32 = n1;
    o.mw = vec4<f32>(0.0, 0.0, 0.0, x_e25);
    let x_e27: Mat4x4_ = o;
    return x_e27;
}

fn x_Mat4x4_1(m16: Mat4x3_) -> Mat4x4_ {
    var m17: Mat4x3_;
    var o1: Mat4x4_;

    m17 = m16;
    let x_e4: Mat4x4_ = x_Mat4x4_(1.0);
    o1 = x_e4;
    let x_e7: Mat4x3_ = m17;
    o1.mx = x_e7.mx;
    let x_e10: Mat4x3_ = m17;
    o1.my = x_e10.my;
    let x_e13: Mat4x3_ = m17;
    o1.mz = x_e13.mz;
    let x_e15: Mat4x4_ = o1;
    return x_e15;
}

fn x_Mat4x4_2(m18: Mat4x2_) -> Mat4x4_ {
    var m19: Mat4x2_;
    var o2: Mat4x4_;

    m19 = m18;
    let x_e4: Mat4x4_ = x_Mat4x4_(1.0);
    o2 = x_e4;
    let x_e7: Mat4x2_ = m19;
    o2.mx = x_e7.mx;
    let x_e10: Mat4x2_ = m19;
    o2.my = x_e10.my;
    let x_e12: Mat4x4_ = o2;
    return x_e12;
}

fn x_Mat4x3_(n2: f32) -> Mat4x3_ {
    var n3: f32;
    var o3: Mat4x3_;

    n3 = n2;
    let x_e4: f32 = n3;
    o3.mx = vec4<f32>(x_e4, 0.0, 0.0, 0.0);
    let x_e11: f32 = n3;
    o3.my = vec4<f32>(0.0, x_e11, 0.0, 0.0);
    let x_e18: f32 = n3;
    o3.mz = vec4<f32>(0.0, 0.0, x_e18, 0.0);
    let x_e21: Mat4x3_ = o3;
    return x_e21;
}

fn x_Mat4x3_1(m20: Mat4x4_) -> Mat4x3_ {
    var m21: Mat4x4_;
    var o4: Mat4x3_;

    m21 = m20;
    let x_e4: Mat4x4_ = m21;
    o4.mx = x_e4.mx;
    let x_e7: Mat4x4_ = m21;
    o4.my = x_e7.my;
    let x_e10: Mat4x4_ = m21;
    o4.mz = x_e10.mz;
    let x_e12: Mat4x3_ = o4;
    return x_e12;
}

fn main1() {
    var t_PosMtx: Mat4x3_;
    var t_TexSpaceCoord: vec2<f32>;

    let x_e15: f32 = a_PosMtxIdx1;
    let x_e18: Mat4x3_ = global2.u_PosMtx[i32(x_e15)];
    t_PosMtx = x_e18;
    let x_e23: Mat4x3_ = t_PosMtx;
    let x_e24: Mat4x4_ = x_Mat4x4_1(x_e23);
    let x_e25: vec3<f32> = a_Position1;
    let x_e29: Mat4x3_ = t_PosMtx;
    let x_e30: Mat4x4_ = x_Mat4x4_1(x_e29);
    let x_e31: vec3<f32> = a_Position1;
    let x_e34: vec4<f32> = Mul(x_e30, vec4<f32>(x_e31, 1.0));
    let x_e35: Mat4x4_ = global.u_Projection;
    let x_e37: Mat4x3_ = t_PosMtx;
    let x_e38: Mat4x4_ = x_Mat4x4_1(x_e37);
    let x_e39: vec3<f32> = a_Position1;
    let x_e43: Mat4x3_ = t_PosMtx;
    let x_e44: Mat4x4_ = x_Mat4x4_1(x_e43);
    let x_e45: vec3<f32> = a_Position1;
    let x_e48: vec4<f32> = Mul(x_e44, vec4<f32>(x_e45, 1.0));
    let x_e49: vec4<f32> = Mul(x_e35, x_e48);
    gl_Position = x_e49;
    let x_e50: vec4<f32> = a_Color1;
    v_Color = x_e50;
    let x_e52: vec4<f32> = global1.u_Misc0_;
    if ((x_e52.x == 2.0)) {
        {
            let x_e59: vec3<f32> = a_Normal1;
            let x_e64: Mat4x2_ = global1.u_TexMtx[0];
            let x_e65: vec3<f32> = a_Normal1;
            let x_e68: vec2<f32> = Mul2(x_e64, vec4<f32>(x_e65, 1.0));
            v_TexCoord = x_e68.xy;
            return;
        }
    } else {
        {
            let x_e73: vec2<f32> = a_UV1;
            let x_e79: Mat4x2_ = global1.u_TexMtx[0];
            let x_e80: vec2<f32> = a_UV1;
            let x_e84: vec2<f32> = Mul2(x_e79, vec4<f32>(x_e80, 1.0, 1.0));
            v_TexCoord = x_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 x_e11: vec4<f32> = v_Color;
    let x_e13: vec2<f32> = v_TexCoord;
    let x_e15: vec4<f32> = gl_Position;
    return VertexOutput(x_e11, x_e13, x_e15);
}
