#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 strided_arr {
  /* 0x0000 */ float el;
  /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
};

struct LeftOver {
  /* 0x0000 */ float4x4 worldViewProjection;
  /* 0x0040 */ float time;
  /* 0x0044 */ tint_array<int8_t, 12> tint_pad_1;
  /* 0x0050 */ tint_array<float4x4, 2> test2;
  /* 0x00d0 */ tint_array<strided_arr, 4> test;
};

void main_1(thread float3* const tint_symbol_5, const constant LeftOver* const tint_symbol_6, thread float4* const tint_symbol_7, thread float2* const tint_symbol_8, thread float2* const tint_symbol_9) {
  float4 q = 0.0f;
  float3 p = 0.0f;
  float3 const x_13 = *(tint_symbol_5);
  q = float4(x_13[0], x_13[1], x_13[2], 1.0f);
  float4 const x_21 = q;
  p = float3(x_21[0], x_21[1], x_21[2]);
  float const x_27 = p[0];
  float const x_41 = (*(tint_symbol_6)).test[0].el;
  float const x_45 = (*(tint_symbol_5))[1];
  float const x_49 = (*(tint_symbol_6)).time;
  p[0] = (x_27 + sin(((x_41 * x_45) + x_49)));
  float const x_55 = p[1];
  float const x_57 = (*(tint_symbol_6)).time;
  p[1] = (x_55 + sin((x_57 + 4.0f)));
  float4x4 const x_69 = (*(tint_symbol_6)).worldViewProjection;
  float3 const x_70 = p;
  *(tint_symbol_7) = (x_69 * float4(x_70[0], x_70[1], x_70[2], 1.0f));
  float2 const x_83 = *(tint_symbol_8);
  *(tint_symbol_9) = x_83;
  float const x_87 = (*(tint_symbol_7))[1];
  (*(tint_symbol_7))[1] = (x_87 * -1.0f);
  return;
}

struct main_out {
  float4 gl_Position;
  float2 vUV_1;
};

struct tint_symbol_2 {
  float3 position_param [[attribute(0)]];
  float3 normal_param [[attribute(1)]];
  float2 uv_param [[attribute(2)]];
};

struct tint_symbol_3 {
  float2 vUV_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

main_out tint_symbol_inner(float3 position_param, float2 uv_param, float3 normal_param, thread float3* const tint_symbol_10, thread float2* const tint_symbol_11, const constant LeftOver* const tint_symbol_13, thread float4* const tint_symbol_14, thread float2* const tint_symbol_15) {
  thread float3 tint_symbol_12 = 0.0f;
  *(tint_symbol_10) = position_param;
  *(tint_symbol_11) = uv_param;
  tint_symbol_12 = normal_param;
  main_1(tint_symbol_10, tint_symbol_13, tint_symbol_14, tint_symbol_11, tint_symbol_15);
  main_out const tint_symbol_4 = {.gl_Position=*(tint_symbol_14), .vUV_1=*(tint_symbol_15)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(const constant LeftOver* tint_symbol_18 [[buffer(0)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float3 tint_symbol_16 = 0.0f;
  thread float2 tint_symbol_17 = 0.0f;
  thread float4 tint_symbol_19 = 0.0f;
  thread float2 tint_symbol_20 = 0.0f;
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.position_param, tint_symbol_1.uv_param, tint_symbol_1.normal_param, &(tint_symbol_16), &(tint_symbol_17), tint_symbol_18, &(tint_symbol_19), &(tint_symbol_20));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.gl_Position = inner_result.gl_Position;
  wrapper_result.vUV_1 = inner_result.vUV_1;
  return wrapper_result;
}

