#include <metal_stdlib>

using namespace metal;
struct Uniforms {
  /* 0x0000 */ float4x4 modelViewProjectionMatrix;
};
struct VertexInput {
  float4 cur_position;
  float4 color;
};
struct VertexOutput {
  float4 vtxFragColor;
  float4 Position;
};
struct tint_symbol_1 {
  float4 cur_position [[attribute(0)]];
  float4 color [[attribute(1)]];
};
struct tint_symbol_2 {
  float4 vtxFragColor [[user(locn0)]];
  float4 Position [[position]];
};
struct tint_symbol_4 {
  float4 fragColor [[user(locn0)]];
};
struct tint_symbol_5 {
  float4 value [[color(0)]];
};

vertex tint_symbol_2 vtx_main(tint_symbol_1 tint_symbol [[stage_in]], constant Uniforms& uniforms [[buffer(0)]]) {
  VertexInput const input = {.cur_position=tint_symbol.cur_position, .color=tint_symbol.color};
  VertexOutput output = {};
  output.Position = (uniforms.modelViewProjectionMatrix * input.cur_position);
  output.vtxFragColor = input.color;
  tint_symbol_2 const tint_symbol_6 = {.vtxFragColor=output.vtxFragColor, .Position=output.Position};
  return tint_symbol_6;
}

fragment tint_symbol_5 frag_main(tint_symbol_4 tint_symbol_3 [[stage_in]]) {
  float4 const fragColor = tint_symbol_3.fragColor;
  tint_symbol_5 const tint_symbol_7 = {.value=fragColor};
  return tint_symbol_7;
}

