#version 450 // One instance per Surface image attachment. The CPU has already converted // the pane's cell rectangle and the aspect-preserving contain fit to NDC. layout(location = 0) in vec4 a_rect; // x0, y0, x1, y1 layout(location = 1) in vec4 a_uv_rect; // u0, v0, u1, v1 layout(location = 2) in vec4 a_panel_rect; layout(location = 3) in vec4 a_present_rect; layout(location = 4) in uvec4 a_effect; layout(location = 0) out vec2 v_uv; layout(location = 1) out vec2 v_panel_uv; layout(location = 2) flat out uvec4 v_effect; void main() { vec2 pos; int corner = gl_VertexIndex % 6; if (corner == 0) { pos = vec2(a_rect.x, a_rect.y); v_uv = vec2(a_uv_rect.x, a_uv_rect.y); } else if (corner == 1) { pos = vec2(a_rect.z, a_rect.y); v_uv = vec2(a_uv_rect.z, a_uv_rect.y); } else if (corner == 2) { pos = vec2(a_rect.z, a_rect.w); v_uv = vec2(a_uv_rect.z, a_uv_rect.w); } else if (corner == 3) { pos = vec2(a_rect.x, a_rect.y); v_uv = vec2(a_uv_rect.x, a_uv_rect.y); } else if (corner == 4) { pos = vec2(a_rect.z, a_rect.w); v_uv = vec2(a_uv_rect.z, a_uv_rect.w); } else { pos = vec2(a_rect.x, a_rect.w); v_uv = vec2(a_uv_rect.x, a_uv_rect.w); } v_panel_uv = v_uv; uint effect = a_effect.x & 0x7fffffffu; if (effect != 0u) { vec2 panel_size = a_panel_rect.zw - a_panel_rect.xy; panel_size.x = abs(panel_size.x) < 0.000001 ? 0.000001 : panel_size.x; panel_size.y = abs(panel_size.y) < 0.000001 ? -0.000001 : panel_size.y; v_panel_uv = (pos - a_panel_rect.xy) / panel_size; if (effect == 1u || effect == 2u || effect == 5u) pos = mix(a_present_rect.xy, a_present_rect.zw, v_panel_uv); } v_effect = a_effect; gl_Position = vec4(pos, 0.0, 1.0); }