cbuffer cbuffer_uniforms : register(b0) {
  uint4 uniforms[10];
};
ByteAddressBuffer pointLights : register(t1);
SamplerState mySampler : register(s2);
Texture2D<float4> myTexture : register(t3);

struct FragmentInput {
  float4 position;
  float4 view_position;
  float4 normal;
  float2 uv;
  float4 color;
};
struct FragmentOutput {
  float4 color;
};

float4 getColor(FragmentInput fragment) {
  float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
  if ((uniforms[8].y == 0u)) {
    color = fragment.color;
  } else {
    if ((uniforms[8].y == 1u)) {
      color = fragment.normal;
      color.a = 1.0f;
    } else {
      if ((uniforms[8].y == 2u)) {
        color = asfloat(uniforms[9]);
      } else {
        if ((uniforms[8].y == 3u)) {
          color = myTexture.Sample(mySampler, fragment.uv);
        }
      }
    }
  }
  return color;
}

struct tint_symbol_1 {
  float4 view_position : TEXCOORD0;
  float4 normal : TEXCOORD1;
  float2 uv : TEXCOORD2;
  float4 color : TEXCOORD3;
  float4 position : SV_Position;
};
struct tint_symbol_2 {
  float4 color : SV_Target0;
};

FragmentOutput main_inner(FragmentInput fragment) {
  FragmentOutput output = (FragmentOutput)0;
  output.color = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return output;
}

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  FragmentInput tint_symbol_3 = {float4(tint_symbol.position.xyz, (1.0f / tint_symbol.position.w)), tint_symbol.view_position, tint_symbol.normal, tint_symbol.uv, tint_symbol.color};
  FragmentOutput inner_result = main_inner(tint_symbol_3);
  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
  wrapper_result.color = inner_result.color;
  return wrapper_result;
}
