#version 450 layout(binding = 0) uniform UniformBufferObject { mat4 model; mat4 geom_rot; mat4 view; mat4 proj; vec3 camera_pos; bool[16] use_geom_shader; } ubo; layout(binding = 3) readonly buffer CompoundBuffer { uint compounds[]; }; layout(binding = 4) readonly buffer ColorBuffer { uint grid_in[]; }; layout(binding = 9) readonly buffer TransparentBuffer { bool transparent_grid[]; }; layout(binding = 8) buffer SizeBuffer3D { uint grid_size_in[]; }; layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in; void main() { uint index = gl_GlobalInvocationID.x; uint output_offset = 0; uint compound_start = 0; // iterate over the compounds and find the work index inside of it while (index > compounds[compound_start] * compounds[compound_start]) { output_offset += compounds[compound_start] * compounds[compound_start] * compounds[compound_start] * 2; index -= compounds[compound_start] * compounds[compound_start]; compound_start = compounds[compound_start + 2]; } // grid pos in the task uint compound_grid_size = compounds[compound_start]; float compound_scale = uintBitsToFloat(compounds[compound_start + 1]); vec3 mid_offset = vec3(compound_scale * 0.5, compound_scale * 0.5, compound_scale * 0.5); uint x = index % compound_grid_size; uint y = ((index) % (compound_grid_size * compound_grid_size) - x) / (compound_grid_size); uint z = (index - x - y * compound_grid_size) / (compound_grid_size * compound_grid_size); uint size_x = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3]; uint size_y = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3 + 1]; uint size_z = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3 + 2]; }