
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;
};

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

    return output;
}
