#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 = {tint_symbol.cur_position, tint_symbol.color};
  VertexOutput output = {};
  output.Position = (uniforms.modelViewProjectionMatrix * input.cur_position);
  output.vtxFragColor = input.color;
  return {output.vtxFragColor, output.Position};
}

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

