Raw File
circle.vert
#version 450

layout(location=0) out vec2 v_coords;
layout(location=1) out float v_angle;
layout(location=2) out vec4 v_color;

layout(set = 0, binding = 0)
uniform Globals {
    vec2 u_resolution;
    vec2 u_scroll_offset;
    float u_zoom;
};

struct Instances {
    vec2 center;
    float radius;
    float angle;
    int z_index;
    uint color;
};

layout(std430, set=1, binding=0) 
buffer InstancesBlock {
    Instances instances[];
};

void main() {
    float min_x = -1.;
    float max_x = 1.;
    float min_y = -1;
    float max_y = 1.;

    vec2 position[4] = vec2[4](
        vec2(min_x, min_y),
        vec2(min_x, max_y),
        vec2(max_x, min_y),
        vec2(max_x, max_y)
    );

    v_angle = instances[gl_InstanceIndex].angle;
    uint color = instances[gl_InstanceIndex].color;
    v_color = vec4(
          float((color >> 16) & 0xFF) / 255.,
          float((color >> 8) & 0xFF) / 255.,
          float(color & 0xFF) / 255.,
          float((color >> 24) & 0xFF) / 255.);
    v_coords = position[gl_VertexIndex] * vec2(1, -1);

    float radius = instances[gl_InstanceIndex].radius;
    vec2 local_pos = instances[gl_InstanceIndex].center + position[gl_VertexIndex] * radius;
    vec2 world_pos = local_pos - u_scroll_offset; 
    vec2 zoom_factor = u_zoom / (vec2(0.5, 0.5) * u_resolution);
    vec2 transformed_pos = world_pos * zoom_factor * vec2(1., -1);
    float z_index = float(instances[gl_InstanceIndex].z_index) + 0.5;
    float z = z_index >= 0 ? z_index / 10000. : 1e-7;

    gl_Position = vec4(transformed_pos, z, 1.0);
}
back to top