diff --git a/CMakeLists.txt b/CMakeLists.txt index e7affb5..b80473b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set(GLERMINAL_GRID_WIDTH 40 CACHE STRING "") set(GLERMINAL_GRID_HEIGHT 25 CACHE STRING "") set(GLERMINAL_LAYER_COUNT 64 CACHE STRING "") set(GLERMINAL_CELL_SCALE 4 CACHE STRING "") +set(GLERMINAL_CELL_SIZE 8 CACHE STRING "") configure_file(source/glerminal-config.h.in glerminal-config.h @ONLY) diff --git a/source/glerminal-config.h.in b/source/glerminal-config.h.in index a9d58b9..aee3d00 100644 --- a/source/glerminal-config.h.in +++ b/source/glerminal-config.h.in @@ -16,7 +16,8 @@ enum GRID_WIDTH = @GLERMINAL_GRID_WIDTH@, GRID_HEIGHT = @GLERMINAL_GRID_HEIGHT@, LAYER_COUNT = @GLERMINAL_LAYER_COUNT@, - CELL_SCALE = @GLERMINAL_CELL_SCALE@ + CELL_SCALE = @GLERMINAL_CELL_SCALE@, + CELL_SIZE = @GLERMINAL_CELL_SIZE@ }; #ifdef __cplusplus diff --git a/source/glerminal-private.h b/source/glerminal-private.h index 2f49a82..e9c4db4 100644 --- a/source/glerminal-private.h +++ b/source/glerminal-private.h @@ -9,20 +9,18 @@ #include #include -#include -#include #include #include namespace glerminal { - constexpr unsigned int CELL_SIZE = 8; constexpr unsigned int MAX_SPRITES_ROW = 64; constexpr unsigned int MAX_SPRITES = MAX_SPRITES_ROW * MAX_SPRITES_ROW; constexpr unsigned int GRID_WIDTH = ::GRID_WIDTH; constexpr unsigned int GRID_HEIGHT = ::GRID_HEIGHT; constexpr unsigned int LAYER_COUNT = ::LAYER_COUNT; constexpr unsigned int CELL_SCALE = ::CELL_SCALE; + constexpr unsigned int CELL_SIZE = ::CELL_SIZE; constexpr unsigned int GRID_AREA = GRID_WIDTH * GRID_HEIGHT; constexpr unsigned int SCREEN_WIDTH = GRID_WIDTH * CELL_SIZE * CELL_SCALE; constexpr unsigned int SCREEN_HEIGHT = GRID_HEIGHT * CELL_SIZE * CELL_SCALE; diff --git a/source/glerminal.cpp b/source/glerminal.cpp index 579c142..56830d6 100644 --- a/source/glerminal.cpp +++ b/source/glerminal.cpp @@ -8,6 +8,7 @@ #define LAYERS_UNIFORM_NAME "layers" #define LAYER_COUNT_UNIFORM_NAME "layer_count" #define ATLAS_WIDTH_UNIFORM_NAME "atlas_width" +#define CELL_SIZE_UNIFORM_NAME "cell_size" namespace { @@ -33,6 +34,7 @@ namespace "layout (location = 2) in int sprite;\n" "layout (location = 3) in vec4 color;\n" "layout (location = 4) in float scale;\n" + "uniform float " CELL_SIZE_UNIFORM_NAME ";\n" "uniform vec4 " GRID_SIZE_UNIFORM_NAME ";\n" "uniform int " ATLAS_WIDTH_UNIFORM_NAME ";\n" "out VS_OUT {\n" @@ -48,7 +50,7 @@ namespace " vs_out.sprite = sprite;\n" " vs_out.layer = layer;\n" " vs_out.layer_color = color;\n" - " vs_out.texcoord = vec2(sprite % " ATLAS_WIDTH_UNIFORM_NAME " + position.x + 1, (sprite / " ATLAS_WIDTH_UNIFORM_NAME ") - position.y) / vec2(" ATLAS_WIDTH_UNIFORM_NAME ") + vec2(-(2 * position.x + 1) * " GRID_SIZE_UNIFORM_NAME ".z / 16, (2 * position.y + 1) * " GRID_SIZE_UNIFORM_NAME ".z / 16);\n" + " vs_out.texcoord = vec2(sprite % " ATLAS_WIDTH_UNIFORM_NAME " + position.x + 1, (sprite / " ATLAS_WIDTH_UNIFORM_NAME ") - position.y) / vec2(" ATLAS_WIDTH_UNIFORM_NAME ") + vec2(-(2 * position.x + 1) * " GRID_SIZE_UNIFORM_NAME ".z / (2 * " CELL_SIZE_UNIFORM_NAME "), (2 * position.y + 1) * " GRID_SIZE_UNIFORM_NAME ".z / (2 * " CELL_SIZE_UNIFORM_NAME "));\n" " vec2 cell_position = vec2(scale + (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 ".x), -floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) / " GRID_SIZE_UNIFORM_NAME ".x));\n" " vec2 temp = ((position + vec2(-0.5, 0.5)) * scale + cell_position + vec2(-0.5, 0.5)) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1);\n" " gl_Position = vec4(scaled_offset.x + temp.x, scaled_offset.y - temp.y, 0, 1);\n" @@ -64,6 +66,7 @@ namespace "layout (location = 2) in int sprite;\n" "layout (location = 3) in vec4 color;\n" "layout (location = 4) in float scale;\n" + "uniform float " CELL_SIZE_UNIFORM_NAME ";\n" "uniform vec4 " GRID_SIZE_UNIFORM_NAME ";\n" "uniform int " ATLAS_WIDTH_UNIFORM_NAME ";\n" "out VS_OUT {\n" @@ -77,7 +80,7 @@ namespace " gl_Layer = layer;\n" " vec2 scaled_offset = 2 * offset * " GRID_SIZE_UNIFORM_NAME ".zw;\n" " vs_out.sprite = sprite;\n" - " vs_out.texcoord = vec2(sprite % " ATLAS_WIDTH_UNIFORM_NAME " + position.x + 1, (sprite / " ATLAS_WIDTH_UNIFORM_NAME ") - position.y) / vec2(" ATLAS_WIDTH_UNIFORM_NAME ") + vec2(-(2 * position.x + 1) * " GRID_SIZE_UNIFORM_NAME ".z / 16, (2 * position.y + 1) * " GRID_SIZE_UNIFORM_NAME ".z / 16);\n" + " vs_out.texcoord = vec2(sprite % " ATLAS_WIDTH_UNIFORM_NAME " + position.x + 1, (sprite / " ATLAS_WIDTH_UNIFORM_NAME ") - position.y) / vec2(" ATLAS_WIDTH_UNIFORM_NAME ") + vec2(-(2 * position.x + 1) * " GRID_SIZE_UNIFORM_NAME ".z / (2 * " CELL_SIZE_UNIFORM_NAME "), (2 * position.y + 1) * " GRID_SIZE_UNIFORM_NAME ".z / (2 * " CELL_SIZE_UNIFORM_NAME "));\n" " vs_out.layer_color = color;\n" " vec2 cell_position = vec2(scale + (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 ".x), -floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) / " GRID_SIZE_UNIFORM_NAME ".x));\n" " vec2 temp = ((position + vec2(-0.5, 0.5)) * scale + cell_position + vec2(-0.5, 0.5)) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1);\n" @@ -654,6 +657,7 @@ namespace glerminal // setup uniforms glUseProgram(m_program); + glUniform1f(glGetUniformLocation(m_program, CELL_SIZE_UNIFORM_NAME), CELL_SIZE); glUniform4f(glGetUniformLocation(m_program, GRID_SIZE_UNIFORM_NAME), GRID_WIDTH + 2, GRID_AREA_2, 1.0f / GRID_WIDTH, 1.0f / GRID_HEIGHT); glUniform1i(glGetUniformLocation(m_program, ATLAS_WIDTH_UNIFORM_NAME), MAX_SPRITES_ROW);