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

 struct PointLights {
    values : 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_buffer, 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){
        // VERTEX COLOR

        color = fragment.color;

    } else if(uniforms.color_source == 1u){
        // NORMALS

        // color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
        color = fragment.normal;
        color.a = 1.0;

    } else if(uniforms.color_source == 2u){
        // uniform color

        color = uniforms.color;

    } else if(uniforms.color_source == 3u){
        // TEXTURE

        color = textureSample(myTexture, mySampler, fragment.uv);

    }

    return color;
};

@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;
    // output.color.x = output.color.x + pointLights.values[0].position.x;

    return output;
}
