struct PointLight {
  position : vec4<f32>;
};

struct PointLights {
  values : [[stride(16)]] array<PointLight>;
};

struct Uniforms {
  worldView : mat4x4<f32>;
  proj : mat4x4<f32>;
  numPointLights : u32;
  color_source : u32;
  color : vec4<f32>;
};

[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;

[[binding(1), group(0)]] var<storage, read> pointLights : PointLights;

[[binding(2), group(0)]] var mySampler : sampler;

[[binding(3), group(0)]] var myTexture : texture_2d<f32>;

struct FragmentInput {
  [[builtin(position)]]
  position : vec4<f32>;
  [[location(0)]]
  view_position : vec4<f32>;
  [[location(1)]]
  normal : vec4<f32>;
  [[location(2)]]
  uv : vec2<f32>;
  [[location(3)]]
  color : vec4<f32>;
};

struct FragmentOutput {
  [[location(0)]]
  color : vec4<f32>;
};

fn getColor(fragment : FragmentInput) -> vec4<f32> {
  var color : vec4<f32>;
  if ((uniforms.color_source == 0u)) {
    color = fragment.color;
  } elseif ((uniforms.color_source == 1u)) {
    color = fragment.normal;
    color.a = 1.0;
  } elseif ((uniforms.color_source == 2u)) {
    color = uniforms.color;
  } elseif ((uniforms.color_source == 3u)) {
    color = textureSample(myTexture, mySampler, fragment.uv);
  }
  return color;
}

[[stage(fragment)]]
fn main(fragment : FragmentInput) -> FragmentOutput {
  var output : FragmentOutput;
  output.color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  _ = uniforms;
  _ = mySampler;
  _ = myTexture;
  _ = &(pointLights);
  return output;
}
