diff --git a/source/glerminal-private.h b/source/glerminal-private.h index d7765ca..75a7479 100644 --- a/source/glerminal-private.h +++ b/source/glerminal-private.h @@ -82,7 +82,7 @@ namespace glerminal unsigned int m_sprites[CELL_SIZE * CELL_SIZE * (1 << (8 * sizeof(*m_cells)))]; glerminal_main_cb m_main; -#ifdef _DEBUG +#ifdef GLERMINAL_OPENGL_DEBUG_CONTEXT mutable std::ofstream m_log; void log(GLenum type, GLuint id, GLenum severity, const char* message) const; #endif diff --git a/source/glerminal.cpp b/source/glerminal.cpp index dd33ae4..cccfff2 100644 --- a/source/glerminal.cpp +++ b/source/glerminal.cpp @@ -25,7 +25,7 @@ namespace -1, 0 // top left }; - constexpr char* VERTEX_SHADER_SOURCE = + constexpr char VERTEX_SHADER_SOURCE[] = "#version 450 core\n" "layout (location = 0) in vec2 position;\n" "layout (location = 1) in vec2 offset;\n" @@ -36,7 +36,6 @@ namespace " float scales[];\n" "} lss;\n" "out VS_OUT {\n" - " flat vec2 offset;\n" " flat int sprite;\n" " flat int layer;\n" " vec2 texcoord;\n" @@ -44,21 +43,22 @@ namespace "void main()\n" "{\n" " const int layer = int(floor(gl_InstanceID / " GRID_SIZE_UNIFORM_NAME ".y));\n" + " vec2 scaled_offset = 2 * offset * " GRID_SIZE_UNIFORM_NAME ".zw;\n" " vs_out.sprite = sprite;\n" - " vs_out.offset = offset * " GRID_SIZE_UNIFORM_NAME ".zw;\n" " vs_out.layer = layer;\n" " vs_out.texcoord = vec2(position.x + 1, -position.y);\n" " vec2 cell_position = vec2(lss.scales[layer] + (gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) - " GRID_SIZE_UNIFORM_NAME ".x * floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z));\n" " vec2 temp = ((position + vec2(-0.5, 0.5)) * lss.scales[layer] + cell_position + vec2(0.5, -0.5)) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1);\n" - " gl_Position = vec4(temp.x, -temp.y, 0, 1);\n" + " gl_Position = vec4(scaled_offset.x + temp.x, scaled_offset.y - temp.y, 0, 1);\n" "}"; - constexpr char* GEOMETRY_SHADER_SOURCE = + constexpr const char* VERTEX_SHADER_SOURCE_PTR = VERTEX_SHADER_SOURCE; + + constexpr char GEOMETRY_SHADER_SOURCE[] = "#version 450 core\n" "layout (triangles) in;\n" "layout (triangle_strip, max_vertices = 3) out;\n" "in VS_OUT {\n" - " flat vec2 offset;\n" " flat int sprite;\n" " flat int layer;\n" " vec2 texcoord;\n" @@ -68,24 +68,26 @@ namespace "void main()\n" "{\n" " gl_Layer = gs_in[0].layer;\n" - " gl_Position = vec4(gl_in[0].gl_Position.xy + gs_in[0].offset * 2, 0, 1);\n" + " gl_Position = gl_in[0].gl_Position;\n" " sprite = gs_in[0].sprite;\n" " texcoord = gs_in[0].texcoord;\n" " EmitVertex();\n" " gl_Layer = gs_in[1].layer;\n" - " gl_Position = vec4(gl_in[1].gl_Position.xy + gs_in[1].offset * 2, 0, 1);\n" + " gl_Position = gl_in[1].gl_Position;\n" " sprite = gs_in[1].sprite;\n" " texcoord = gs_in[1].texcoord;\n" " EmitVertex();\n" " gl_Layer = gs_in[2].layer;\n" - " gl_Position = vec4(gl_in[2].gl_Position.xy + gs_in[2].offset * 2, 0, 1);\n" + " gl_Position = gl_in[2].gl_Position;\n" " sprite = gs_in[2].sprite;\n" " texcoord = gs_in[2].texcoord;\n" " EmitVertex();\n" " EndPrimitive();\n" "}"; - constexpr char* FRAGMENT_SHADER_SOURCE = + constexpr const char* GEOMETRY_SHADER_SOURCE_PTR = GEOMETRY_SHADER_SOURCE; + + constexpr char FRAGMENT_SHADER_SOURCE[] = "#version 450 core\n" "in vec2 texcoord;\n" "flat in int sprite;\n" @@ -96,7 +98,9 @@ namespace " FragColor = texture(" SPRITES_UNIFORM_NAME ", vec3(texcoord, sprite));\n" "}"; - constexpr char* SCREEN_VERTEX_SHADER_SOURCE = + constexpr const char* FRAGMENT_SHADER_SOURCE_PTR = FRAGMENT_SHADER_SOURCE; + + constexpr char SCREEN_VERTEX_SHADER_SOURCE[] = "#version 450 core\n" "layout (location = 0) in vec2 position;\n" "out vec2 texcoord;\n" @@ -106,6 +110,8 @@ namespace " texcoord = vec2(position.x + 1, -position.y);\n" "}"; + constexpr const char* SCREEN_VERTEX_SHADER_SOURCE_PTR = SCREEN_VERTEX_SHADER_SOURCE; + constexpr char* SCREEN_FRAGMENT_SHADER_SOURCE = "#version 450 core\n" "in vec2 texcoord;\n" @@ -126,6 +132,8 @@ namespace " }\n" " FragColor = vec4(current_color, 1);\n" "}"; + + constexpr const char* SCREEN_FRAGMENT_SHADER_SOURCE_PTR = SCREEN_FRAGMENT_SHADER_SOURCE; } namespace glerminal @@ -444,15 +452,15 @@ namespace glerminal // -- setup shader program -- // compile const unsigned int vertex_shader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertex_shader, 1, &VERTEX_SHADER_SOURCE, nullptr); + glShaderSource(vertex_shader, 1, &VERTEX_SHADER_SOURCE_PTR, nullptr); glCompileShader(vertex_shader); const unsigned int geometry_shader = glCreateShader(GL_GEOMETRY_SHADER); - glShaderSource(geometry_shader, 1, &GEOMETRY_SHADER_SOURCE, nullptr); + glShaderSource(geometry_shader, 1, &GEOMETRY_SHADER_SOURCE_PTR, nullptr); glCompileShader(geometry_shader); const unsigned int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragment_shader, 1, &FRAGMENT_SHADER_SOURCE, nullptr); + glShaderSource(fragment_shader, 1, &FRAGMENT_SHADER_SOURCE_PTR, nullptr); glCompileShader(fragment_shader); constexpr int INFO_LOG_SIZE = 512; @@ -523,11 +531,11 @@ namespace glerminal // compile const unsigned int screen_vertex_shader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(screen_vertex_shader, 1, &SCREEN_VERTEX_SHADER_SOURCE, nullptr); + glShaderSource(screen_vertex_shader, 1, &SCREEN_VERTEX_SHADER_SOURCE_PTR, nullptr); glCompileShader(screen_vertex_shader); const unsigned int screen_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(screen_fragment_shader, 1, &SCREEN_FRAGMENT_SHADER_SOURCE, nullptr); + glShaderSource(screen_fragment_shader, 1, &SCREEN_FRAGMENT_SHADER_SOURCE_PTR, nullptr); glCompileShader(screen_fragment_shader); // verify compile