@ctype vec2 vec2
@ctype vec4 vec4

@vs vs
layout(binding=0) uniform render_data {
    vec2 one_over_window_size;
    float zoom;
};

in vec4 quad;
in vec4 tex_quad;
in vec4 colour;

out vec2 uv;
out vec4 fs_colour;

const int indices[6] = {
    0, 1, 2, 2, 3, 0,
};

const vec3 positions[4] = {
    vec3(0, 0, 0),
    vec3(0, 1, 0),
    vec3(1, 1, 0),
    vec3(1, 0, 0),
};

const vec2 uvs[4] = {
    vec2(0.0f, 0.0f), 
    vec2(0.0f, 1.0f),
    vec2(1.0f, 1.0f), 
    vec2(1.0f, 0.0f), 
};

void main() {
    int vtx = indices[gl_VertexIndex];
    vec3 pos = positions[vtx];
    uv = uvs[vtx];

    pos.xy = ((pos.xy * quad.zw) + quad.xy) * zoom;
    pos.xy = (pos.xy * one_over_window_size) * 2.0 - 1.0;
    pos.y = -pos.y;

    uv *= tex_quad.zw;
    uv += tex_quad.xy;

    gl_Position = vec4(pos, 1);
    fs_colour = colour;
}
@end

@fs fs
layout(binding=0) uniform texture2D tex;
layout(binding=0) uniform sampler smp;
in vec2 uv;
in vec4 fs_colour;

out vec4 frag_colour;

void main() {
    vec4 c = texture(sampler2D(tex, smp), uv) * fs_colour;
    if (c.a < 1) discard;
    frag_colour = c;
}
@end

@program batcher vs fs
