Fix layering

This commit is contained in:
Shylie 2024-05-14 17:16:06 -05:00
parent a32897d5d4
commit 4f5bc7b5cd
2 changed files with 43 additions and 25 deletions

View File

@ -4,19 +4,27 @@ namespace
{ {
void init() void init()
{ {
glerminal_update_palette(0, 0xFF0000FF); glerminal_update_palette(0, 0x00000000);
glerminal_update_palette(1, 0x00FF00FF); glerminal_update_palette(1, 0xFF00001F);
glerminal_update_palette(2, 0x00FF001F);
glerminal_update_sprite(0, { glerminal_update_sprite(1, {
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 2,
1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 2,
1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 2,
1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 2,
1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 2,
1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 2,
1, 0, 0, 0, 0, 0, 0, 0 2, 2, 2, 2, 2, 2, 2, 2
}); });
glerminal_set(0, 0, 0, 1);
glerminal_set(1, 0, 0, 1);
glerminal_set(1, 0, 1, 1);
glerminal_set(2, 0, 0, 1);
glerminal_set(2, 0, 1, 1);
glerminal_set(2, 0, 2, 1);
} }
void mainloop(float dt) void mainloop(float dt)

View File

@ -25,18 +25,19 @@ namespace
constexpr char* VERTEX_SHADER_SOURCE = constexpr char* VERTEX_SHADER_SOURCE =
"#version 400 core\n" "#version 400 core\n"
"layout (location = 0) in vec2 position;\n" "layout (location = 0) in vec2 position;\n"
"layout (location = 1) in int sprite;\n" "layout (location = 1) in ivec4 sprite[4];\n"
"uniform vec4 " SCREEN_SIZE_UNIFORM_NAME ";\n" "uniform vec4 " SCREEN_SIZE_UNIFORM_NAME ";\n"
"out VS_OUT {\n" "out VS_OUT {\n"
" flat int sprite;\n" " flat ivec4 sprite[4];\n"
" vec2 texcoord;\n" " vec2 texcoord;\n"
"} vs_out;\n" "} vs_out;\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vs_out.sprite = sprite;\n" " vs_out.sprite = sprite;\n"
" vs_out.texcoord = position + 1;\n" " vs_out.texcoord = vec2(position.x + 1, -position.y);\n"
" vec2 cell_position = vec2(1 + gl_InstanceID - " SCREEN_SIZE_UNIFORM_NAME ".x * floor(gl_InstanceID * " SCREEN_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID) * " SCREEN_SIZE_UNIFORM_NAME ".z));\n" " vec2 cell_position = vec2(1 + gl_InstanceID - " SCREEN_SIZE_UNIFORM_NAME ".x * floor(gl_InstanceID * " SCREEN_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID) * " SCREEN_SIZE_UNIFORM_NAME ".z));\n"
" gl_Position = vec4((position + cell_position) * " SCREEN_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1), 0, 1);\n" " vec2 temp = vec2((position + cell_position) * " SCREEN_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1));\n"
" gl_Position = vec4(temp.x, -temp.y, 0, 1);\n"
"}"; "}";
constexpr char* GEOMETRY_SHADER_SOURCE = constexpr char* GEOMETRY_SHADER_SOURCE =
@ -45,7 +46,7 @@ namespace
"layout (triangle_strip, max_vertices = 48) out;\n" "layout (triangle_strip, max_vertices = 48) out;\n"
"layout (invocations = 16) in;\n" "layout (invocations = 16) in;\n"
"in VS_OUT {\n" "in VS_OUT {\n"
" flat int sprite;\n" " flat ivec4 sprite[4];\n"
" vec2 texcoord;\n" " vec2 texcoord;\n"
"} gs_in[];\n" "} gs_in[];\n"
"flat out int sprite;\n" "flat out int sprite;\n"
@ -54,17 +55,17 @@ namespace
"{\n" "{\n"
" gl_Layer = gl_InvocationID;\n" " gl_Layer = gl_InvocationID;\n"
" gl_Position = gl_in[0].gl_Position;\n" " gl_Position = gl_in[0].gl_Position;\n"
" sprite = gs_in[0].sprite;\n" " sprite = gs_in[0].sprite[gl_InvocationID / 16][gl_InvocationID % 16];\n"
" texcoord = gs_in[0].texcoord;\n" " texcoord = gs_in[0].texcoord;\n"
" EmitVertex();\n" " EmitVertex();\n"
" gl_Layer = gl_InvocationID;\n" " gl_Layer = gl_InvocationID;\n"
" gl_Position = gl_in[1].gl_Position;\n" " gl_Position = gl_in[1].gl_Position;\n"
" sprite = gs_in[1].sprite;\n" " sprite = gs_in[1].sprite[gl_InvocationID / 16][gl_InvocationID % 16];\n"
" texcoord = gs_in[1].texcoord;\n" " texcoord = gs_in[1].texcoord;\n"
" EmitVertex();\n" " EmitVertex();\n"
" gl_Layer = gl_InvocationID;\n" " gl_Layer = gl_InvocationID;\n"
" gl_Position = gl_in[2].gl_Position;\n" " gl_Position = gl_in[2].gl_Position;\n"
" sprite = gs_in[2].sprite;\n" " sprite = gs_in[2].sprite[gl_InvocationID / 16][gl_InvocationID % 16];\n"
" texcoord = gs_in[2].texcoord;\n" " texcoord = gs_in[2].texcoord;\n"
" EmitVertex();\n" " EmitVertex();\n"
" EndPrimitive();\n" " EndPrimitive();\n"
@ -100,10 +101,10 @@ namespace
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec3 current_color = vec3(0);\n" " vec3 current_color = vec3(0);\n"
" for (int i = 15; i >= 0; i--)\n" " for (int i = 0; i < 16; i++)\n"
" {\n" " {\n"
" vec4 texsample = texture(" LAYERS_UNIFORM_NAME ", vec3(texcoord, i));\n" " vec4 texsample = texture(" LAYERS_UNIFORM_NAME ", vec3(texcoord, i));\n"
" current_color = mix(current_color, texsample.xyz, texsample.w);\n" " current_color = mix(current_color, texsample.rgb, texsample.a);\n"
" }\n" " }\n"
" FragColor = vec4(current_color, 1);\n" " FragColor = vec4(current_color, 1);\n"
"}"; "}";
@ -195,7 +196,7 @@ namespace glerminal
{ {
if (x < GRID_WIDTH && y < GRID_HEIGHT && layer < LAYER_COUNT) if (x < GRID_WIDTH && y < GRID_HEIGHT && layer < LAYER_COUNT)
{ {
m_cells[x + y * GRID_WIDTH + layer * GRID_AREA] = sprite; m_cells[layer + x * LAYER_COUNT + y * LAYER_COUNT * GRID_WIDTH] = sprite;
} }
} }
@ -350,8 +351,17 @@ namespace glerminal
glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo); glBindBuffer(GL_ARRAY_BUFFER, m_instance_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(m_cells), m_cells, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(m_cells), m_cells, GL_STREAM_DRAW);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glVertexAttribIPointer(1, 1, GL_UNSIGNED_BYTE, sizeof(*m_cells), reinterpret_cast<void*>(0)); glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, 16 * sizeof(*m_cells), reinterpret_cast<void*>(0));
glVertexAttribDivisor(1, 1); glVertexAttribDivisor(1, 1);
glEnableVertexAttribArray(2);
glVertexAttribIPointer(2, 4, GL_UNSIGNED_BYTE, 16 * sizeof(*m_cells), reinterpret_cast<void*>(4));
glVertexAttribDivisor(2, 1);
glEnableVertexAttribArray(3);
glVertexAttribIPointer(3, 4, GL_UNSIGNED_BYTE, 16 * sizeof(*m_cells), reinterpret_cast<void*>(8));
glVertexAttribDivisor(3, 1);
glEnableVertexAttribArray(4);
glVertexAttribIPointer(4, 4, GL_UNSIGNED_BYTE, 16 * sizeof(*m_cells), reinterpret_cast<void*>(12));
glVertexAttribDivisor(4, 1);
// set up static vertex attributes // set up static vertex attributes
glGenVertexArrays(1, &m_screen_vao); glGenVertexArrays(1, &m_screen_vao);