#version 450 #extension GL_EXT_buffer_reference : require layout(buffer_reference, std430) buffer Symbol { int top; uint left; uint width; uint height; uint advance; }; layout(buffer_reference, std430) buffer Character { vec3 pos; vec4 color; float size; uint code; }; layout(buffer_reference, std430) buffer String { vec3 pos; vec4 color; float size; uint offset; uint len; }; layout(buffer_reference, std430) readonly buffer SymbolList{ Symbol symbols[]; }; layout(buffer_reference, std430) writeonly buffer CharacterList{ Character characters[]; }; layout(buffer_reference, std430) readonly buffer Characters{ uint codes[]; }; layout(buffer_reference, std430) readonly buffer Strings{ String strings[]; }; layout(buffer_reference, std430) readonly buffer Font { uint num_symbols; uint width; uint height; SymbolList symbol_list; }; layout(buffer_reference, std430) buffer DrawCommand { uint vertex_count; uint instance_count; uint first_vertx; uint first_instance; }; layout(buffer_reference, std430) readonly buffer Pointers { Strings strings; Characters codes; CharacterList characters; DrawCommand draw; }; layout(buffer_reference, std430) readonly buffer FontList { Font fonts[]; }; layout(buffer_reference, std430) readonly buffer UIContext { mat4 screen; FontList fonts; }; layout(std430, push_constant) uniform Push { UIContext ui; Pointers pointers; } push; layout(local_size_x = 1) in; void main() { uint gID = gl_GlobalInvocationID.x; String string = push.pointers.strings.strings[gID]; Font font = push.ui.fonts.fonts[0]; uint buffer_pos = atomicAdd(push.pointers.draw.instance_count, string.len); float x = 0; for(uint i = 0; i < string.len; i++) { Symbol symbol = font.symbol_list.symbols[push.pointers.codes.codes[string.offset + i]]; push.pointers.characters.characters[buffer_pos + i].pos = string.pos + vec3(x, 0, 0); x += string.size*symbol.advance/font.width; push.pointers.characters.characters[buffer_pos + i].size = string.size; push.pointers.characters.characters[buffer_pos + i].color = string.color; push.pointers.characters.characters[buffer_pos + i].code = push.pointers.codes.codes[string.offset + i]; } }