#version 450
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_debug_printf : require

layout (location = 0) out vec4 out_color;
layout (location = 1) out vec2 out_uv;
layout (location = 2) out uint out_texture_index;

struct Vertex {
    float x;
    float y;
    float uv_x;
    float uv_y;
    vec4 color;
    uint texture_index;
    uint r[3];
}; 

layout(buffer_reference, std430) readonly buffer VertexBuffer{ 
   Vertex vertices[];
};

//push constants block
layout(push_constant) uniform constants
{
    VertexBuffer vertex_buffer;
    float width;
    float height;
} PushConstants;

void main() 
{
    Vertex v = PushConstants.vertex_buffer.vertices[gl_VertexIndex];
    float width = PushConstants.width;
    float height = PushConstants.height;

    //output data
    gl_Position = vec4(2 * v.x / width - 1, 2 * v.y / height - 1, 0, 1);
    out_uv = vec2(v.uv_x, v.uv_y);
    out_color = v.color;
    out_texture_index = v.texture_index;
    //debugPrintfEXT("Position: (%f, %f)\n", v.x, v.y);
    //debugPrintfEXT("UV: (%f, %f)\n", v.uv_x, v.uv_y);
}