#include <metal_stdlib>

using namespace metal;
struct PointLight {
  float4 position;
};
struct PointLights {
  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(FragmentInput tint_symbol, const constant Uniforms* const tint_symbol_6, texture2d<float, access::sample> tint_symbol_7, sampler tint_symbol_8) {
  float4 color = 0.0f;
  if (((*(tint_symbol_6)).color_source == 0u)) {
    color = tint_symbol.color;
  } else {
    if (((*(tint_symbol_6)).color_source == 1u)) {
      color = tint_symbol.normal;
      color[3] = 1.0f;
    } else {
      if (((*(tint_symbol_6)).color_source == 2u)) {
        color = (*(tint_symbol_6)).color;
      } else {
        if (((*(tint_symbol_6)).color_source == 3u)) {
          color = tint_symbol_7.sample(tint_symbol_8, tint_symbol.uv);
        }
      }
    }
  }
  return color;
}

FragmentOutput tint_symbol_1_inner(FragmentInput tint_symbol) {
  FragmentOutput output = {};
  output.color = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return output;
}

fragment tint_symbol_4 tint_symbol_1(float4 position [[position]], tint_symbol_3 tint_symbol_2 [[stage_in]]) {
  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(tint_symbol_5);
  tint_symbol_4 wrapper_result = {};
  wrapper_result.color = inner_result.color;
  return wrapper_result;
}

