#include <metal_stdlib>

using namespace metal;
struct PointLight {
  /* 0x0000 */ float4 position;
};
struct PointLights {
  /* 0x0000 */ PointLight values[1];
};
struct Uniforms {
  /* 0x0000 */ float4x4 worldView;
  /* 0x0040 */ float4x4 proj;
  /* 0x0080 */ uint numPointLights;
  /* 0x0084 */ uint color_source;
  /* 0x0088 */ int8_t tint_pad[8];
  /* 0x0090 */ float4 color;
};
struct FragmentInput {
  float4 position;
  float4 view_position;
  float4 normal;
  float2 uv;
  float4 color;
};
struct FragmentOutput {
  float4 color;
};
struct tint_symbol_3 {
  float4 view_position [[user(locn0)]];
  float4 normal [[user(locn1)]];
  float2 uv [[user(locn2)]];
  float4 color [[user(locn3)]];
};
struct tint_symbol_4 {
  float4 color [[color(0)]];
};

float4 getColor(constant Uniforms& uniforms, FragmentInput tint_symbol, texture2d<float, access::sample> tint_symbol_6, sampler tint_symbol_7) {
  float4 color = 0.0f;
  if ((uniforms.color_source == 0u)) {
    color = tint_symbol.color;
  } else {
    if ((uniforms.color_source == 1u)) {
      color = tint_symbol.normal;
      color.a = 1.0f;
    } else {
      if ((uniforms.color_source == 2u)) {
        color = uniforms.color;
      } else {
        if ((uniforms.color_source == 3u)) {
          color = tint_symbol_6.sample(tint_symbol_7, tint_symbol.uv);
        }
      }
    }
  }
  return color;
}

FragmentOutput tint_symbol_1_inner(constant Uniforms& uniforms, const device PointLights& pointLights, FragmentInput tint_symbol, sampler tint_symbol_8, texture2d<float, access::sample> tint_symbol_9) {
  FragmentOutput output = {};
  output.color = float4(1.0f, 0.0f, 0.0f, 1.0f);
  (void) uniforms;
  (void) tint_symbol_8;
  (void) tint_symbol_9;
  (void) pointLights;
  return output;
}

fragment tint_symbol_4 tint_symbol_1(sampler tint_symbol_10 [[sampler(0)]], texture2d<float, access::sample> tint_symbol_11 [[texture(0)]], float4 position [[position]], tint_symbol_3 tint_symbol_2 [[stage_in]], constant Uniforms& uniforms [[buffer(0)]], const device PointLights& pointLights [[buffer(1)]]) {
  FragmentInput const tint_symbol_5 = {.position=position, .view_position=tint_symbol_2.view_position, .normal=tint_symbol_2.normal, .uv=tint_symbol_2.uv, .color=tint_symbol_2.color};
  FragmentOutput const inner_result = tint_symbol_1_inner(uniforms, pointLights, tint_symbol_5, tint_symbol_10, tint_symbol_11);
  tint_symbol_4 wrapper_result = {};
  wrapper_result.color = inner_result.color;
  return wrapper_result;
}

