#version 450 #extension GL_EXT_buffer_reference : require #include "ui_common.glsl" layout(std430, push_constant) uniform PushConstant { Context context; Layer layer; } pc; layout(location = 0) out vec4 fragColor; layout(location = 1) out vec2 fragUV; layout(location = 2) out flat uint code; layout(location = 3) out flat uint index; layout(location = 4) out flat uint type; layout(location = 5) out flat vec2 container_offset; const vec2 square[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 0.0), vec2(1.0, 1.0), vec2(0.0, 1.0), }; void main() { Drawable drawable = pc.layer.drawables.d[gl_InstanceIndex]; vec2 pos = square[gl_VertexIndex]; // Top Left if(pc.layer.container.anchor == 0) { container_offset = pc.layer.container.offset; } // Top Right if(pc.layer.container.anchor == 1) { container_offset = pc.layer.container.offset + vec2(pc.context.extent.x - pc.layer.container.size.x, 0); } // Bottom Left if(pc.layer.container.anchor == 2) { container_offset = pc.layer.container.offset + vec2(0, pc.context.extent.y - pc.layer.container.size.y); } // Bottom Right if(pc.layer.container.anchor == 3) { container_offset = pc.layer.container.offset + vec2(pc.context.extent.x - pc.layer.container.size.x, pc.context.extent.y - pc.layer.container.size.y); } if(drawable.type == 1){ // Glyph Font font = pc.context.fonts.f[drawable.index]; Symbol symbol = font.symbols.s[drawable.code]; fragUV = pos * vec2(symbol.width, symbol.height); pos = pos * vec2(symbol.width, symbol.height) + vec2(symbol.left, -symbol.top); } else { fragUV = pos; } gl_Position = vec4((pos * drawable.size + drawable.pos + container_offset) * pc.context.screen * 2, 0.0, 1.0) - vec4(1.0, 1.0, 0.0, 0.0); fragColor = drawable.color; code = drawable.code; type = drawable.type; index = drawable.index; }