From a4eb0a92e78dfbf209544174f5031cd801c9c059 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 18:26:03 +0700 Subject: [PATCH 01/12] (#90) Pizza slice cursor --- CREDITS.org | 1 + assets/textures/atlas.conf | 3 ++- assets/textures/pizzaslice.png | Bin 0 -> 4060 bytes assets/vars.conf | 6 +++++- src/something_game.cpp | 7 +++++++ 5 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 assets/textures/pizzaslice.png diff --git a/CREDITS.org b/CREDITS.org index 4d791c2..d5eff37 100644 --- a/CREDITS.org +++ b/CREDITS.org @@ -21,3 +21,4 @@ - https://opengameart.org/content/mech-stomp-step-sound - https://opengameart.org/content/crystals-0 - https://opengameart.org/content/futuristic-gun +- https://opengameart.org/content/pizza-cursor diff --git a/assets/textures/atlas.conf b/assets/textures/atlas.conf index 95aec64..a915db4 100644 --- a/assets/textures/atlas.conf +++ b/assets/textures/atlas.conf @@ -8,4 +8,5 @@ assets/textures/pajaDank.png assets/textures/tile-grass.png assets/textures/tile-dirt.png assets/textures/tsodinclown.png -assets/textures/64.png \ No newline at end of file +assets/textures/64.png +assets/textures/pizzaslice.png \ No newline at end of file diff --git a/assets/textures/pizzaslice.png b/assets/textures/pizzaslice.png new file mode 100644 index 0000000000000000000000000000000000000000..871482e902d94bee6392240b1f64c498e77d852e GIT binary patch literal 4060 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 O0000fill_aabb( + AABB(mouse_world - V2(MOUSE_CURSOR_SIZE), + V2(MOUSE_CURSOR_SIZE * 2)), + MOUSE_CURSOR_COLOR, + atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(), + REGULAR_PROGRAM_ASSET); } renderer->draw(this); } From e12f745451f4ea5a68ec37bd5bd935e97a816956 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 19:12:55 +0700 Subject: [PATCH 02/12] (#90) Make the cursor look a bit better --- assets/shaders/vert/triangle_screen.vert | 29 ++++++++++++++++++++++++ assets/vars.conf | 2 +- src/something_atlas.cpp | 15 +++++++++--- src/something_atlas.hpp | 6 ++++- src/something_game.cpp | 13 +++++++---- src/something_renderer.cpp | 8 +++++-- src/something_renderer.hpp | 2 ++ 7 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 assets/shaders/vert/triangle_screen.vert diff --git a/assets/shaders/vert/triangle_screen.vert b/assets/shaders/vert/triangle_screen.vert new file mode 100644 index 0000000..72e6a04 --- /dev/null +++ b/assets/shaders/vert/triangle_screen.vert @@ -0,0 +1,29 @@ +// Vertex shader that renders a triangle with a particular `uv` +// coordinates and `color` with applied camera_projection +#version 330 core + +precision mediump float; + +uniform vec2 resolution; +uniform float time; + +layout(location = 0) in vec2 vertex_position; +layout(location = 1) in vec4 vertex_color; +layout(location = 2) in vec2 vertex_uv; + +out vec4 color; +out vec2 uv; + +vec2 screen_projection(vec2 position) +{ + return 2.0 * position / resolution; +} + +void main() { + gl_Position = vec4( + screen_projection(vertex_position), + 0.0, + 1.0); + color = vertex_color; + uv = vertex_uv; +} diff --git a/assets/vars.conf b/assets/vars.conf index c0e080f..06196a2 100644 --- a/assets/vars.conf +++ b/assets/vars.conf @@ -17,6 +17,6 @@ ENEMY_SPEED: float = 500.0 GRAVITY: float = 4000.0 -MOUSE_CURSOR_SIZE: float = 50.0 +MOUSE_CURSOR_SIZE: float = 100.0 MOUSE_CURSOR_COLOR: color = FFFFFFFF MOUSE_CURSOR_TEXTURE: int = 12 \ No newline at end of file diff --git a/src/something_atlas.cpp b/src/something_atlas.cpp index ae2150e..22c307c 100644 --- a/src/something_atlas.cpp +++ b/src/something_atlas.cpp @@ -61,6 +61,7 @@ Atlas Atlas::from_config(const char *file_path, int margin) const float uv_h = static_cast(h) / static_cast(atlas_height); result.uvs.push(AABB(V2(uv_x, uv_y), V2(uv_w, uv_h))); + result.sizes.push(V2(w, h)); } atlas_row += 2 * margin + textures.data[i].height; @@ -71,8 +72,16 @@ Atlas Atlas::from_config(const char *file_path, int margin) return result; } -AABB Atlas::get_uv(Index> uv_index) const +AABB Atlas::get_uv(Index> texture_index) const { - assert(uv_index.unwrap < uvs.size); - return uvs.data[uv_index.unwrap]; + assert(texture_index.unwrap < uvs.size); + return uvs.data[texture_index.unwrap]; +} + +V2 Atlas::get_size(Index> texture_index, float height) const +{ + assert(texture_index.unwrap < uvs.size); + const auto size = sizes.data[texture_index.unwrap].cast_to(); + const auto aspect = size.x / size.y; + return V2(height * aspect, height); } diff --git a/src/something_atlas.hpp b/src/something_atlas.hpp index 55efed0..51ae4c7 100644 --- a/src/something_atlas.hpp +++ b/src/something_atlas.hpp @@ -7,10 +7,14 @@ struct Atlas { Texture texture; GL_Texture gl_texture; Dynamic_Array> uvs; + Dynamic_Array> sizes; static Atlas from_config(const char *file_path, int margin); - AABB get_uv(Index> uv_index) const; + // TODO: introduce a special type Atlas::Index instead of Index> + // TODO: introduce a special type in vars.conf for Atlas::Index + AABB get_uv(Index> texture_index) const; + V2 get_size(Index> texture_index, float height) const; }; #endif // SOMETHING_ATLAS_HPP_ diff --git a/src/something_game.cpp b/src/something_game.cpp index be4c5e5..3a93f7d 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -233,12 +233,17 @@ void Game::render(Renderer *renderer) const } particles.render(renderer); + const auto mouse_screen = + window_to_viewport(window, mouse_window) - + V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to() * V2(0.5f); + const auto cursor_texture_uv = atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(); + const auto cursor_size = atlas.get_size({static_cast(MOUSE_CURSOR_TEXTURE)}, MOUSE_CURSOR_SIZE); + renderer->fill_aabb( - AABB(mouse_world - V2(MOUSE_CURSOR_SIZE), - V2(MOUSE_CURSOR_SIZE * 2)), + AABB(mouse_screen - cursor_size * V2(0.0f, 1.0f), cursor_size), MOUSE_CURSOR_COLOR, - atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(), - REGULAR_PROGRAM_ASSET); + cursor_texture_uv, + SCREEN_PROGRAM_ASSET); } renderer->draw(this); } diff --git a/src/something_renderer.cpp b/src/something_renderer.cpp index a411ca5..9d2d841 100644 --- a/src/something_renderer.cpp +++ b/src/something_renderer.cpp @@ -10,19 +10,23 @@ void Renderer::init() Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/frag/texture_color.frag"); shaders[TRIANGLE_CAMERA_VERT_SHADER_ASSET] = Shader::make(GL_VERTEX_SHADER, "./assets/shaders/vert/triangle_camera.vert"); + shaders[TRIANGLE_SCREEN_VERT_SHADER_ASSET] = + Shader::make(GL_VERTEX_SHADER, "./assets/shaders/vert/triangle_screen.vert"); shaders[HSL_FRAG_SHADER_ASSET] = Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/frag/hsl.frag"); - static_assert(COUNT_SHADER_ASSETS == 4, "The amount of shader assets have changed"); + static_assert(COUNT_SHADER_ASSETS == 5, "The amount of shader assets have changed"); programs[REGULAR_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}); + programs[SCREEN_PROGRAM_ASSET] = + Program::make({TRIANGLE_SCREEN_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}); programs[PARTICLE_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {GRADIENT_CIRCLE_FRAG_SHADER_ASSET}); programs[PRIDE_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {HSL_FRAG_SHADER_ASSET}); programs[FONT_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}, 1); - static_assert(COUNT_PROGRAM_ASSETS == 4, "The amount of program assets have changed"); + static_assert(COUNT_PROGRAM_ASSETS == 5, "The amount of program assets have changed"); } void Renderer::clear() diff --git a/src/something_renderer.hpp b/src/something_renderer.hpp index 7538c3a..d4d4882 100644 --- a/src/something_renderer.hpp +++ b/src/something_renderer.hpp @@ -10,12 +10,14 @@ enum Shader_Asset: size_t { GRADIENT_CIRCLE_FRAG_SHADER_ASSET = 0, TEXTURE_COLOR_FRAG_SHADER_ASSET, TRIANGLE_CAMERA_VERT_SHADER_ASSET, + TRIANGLE_SCREEN_VERT_SHADER_ASSET, HSL_FRAG_SHADER_ASSET, COUNT_SHADER_ASSETS, }; enum Program_Asset: size_t { REGULAR_PROGRAM_ASSET = 0, + SCREEN_PROGRAM_ASSET, PARTICLE_PROGRAM_ASSET, PRIDE_PROGRAM_ASSET, FONT_PROGRAM_ASSET, From 413c9336c08a2ecceb003fd85b29cdba45904740 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 19:31:27 +0700 Subject: [PATCH 03/12] (#90) Don't include the level editor in the release build --- src/something_game.cpp | 44 +++++++++++++++++++++++++++++++----------- src/something_game.hpp | 5 +++++ src/something_main.cpp | 4 ++++ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/something_game.cpp b/src/something_game.cpp index 3a93f7d..4b3a859 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -125,6 +125,13 @@ void Game::handle_event(const SDL_Event *event) println(stdout, aabb_bodies[0].hitbox); } break; + +#ifndef SOMETHING_RELEASE + case SDLK_F3: { + editor = !editor; + } + break; +#endif } } break; @@ -135,7 +142,18 @@ void Game::handle_event(const SDL_Event *event) break; case SDL_MOUSEBUTTONDOWN: { +#ifndef SOMETHING_RELEASE + if (editor) { + Tile *tile = tile_grid.get_tile(World_Coord(mouse_world)); + if (tile != NULL) { + tile->wall = !tile->wall; + } + } else { + player.shoot(this); + } +#else player.shoot(this); +#endif } break; @@ -233,17 +251,21 @@ void Game::render(Renderer *renderer) const } particles.render(renderer); - const auto mouse_screen = - window_to_viewport(window, mouse_window) - - V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to() * V2(0.5f); - const auto cursor_texture_uv = atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(); - const auto cursor_size = atlas.get_size({static_cast(MOUSE_CURSOR_TEXTURE)}, MOUSE_CURSOR_SIZE); - - renderer->fill_aabb( - AABB(mouse_screen - cursor_size * V2(0.0f, 1.0f), cursor_size), - MOUSE_CURSOR_COLOR, - cursor_texture_uv, - SCREEN_PROGRAM_ASSET); +#ifndef SOMETHING_RELEASE + if (editor) { + const auto mouse_screen = + window_to_viewport(window, mouse_window) - + V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to() * V2(0.5f); + const auto cursor_texture_uv = atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(); + const auto cursor_size = atlas.get_size({static_cast(MOUSE_CURSOR_TEXTURE)}, MOUSE_CURSOR_SIZE); + + renderer->fill_aabb( + AABB(mouse_screen - cursor_size * V2(0.0f, 1.0f), cursor_size), + MOUSE_CURSOR_COLOR, + cursor_texture_uv, + SCREEN_PROGRAM_ASSET); + } +#endif } renderer->draw(this); } diff --git a/src/something_game.hpp b/src/something_game.hpp index 1a71711..f99ff0e 100644 --- a/src/something_game.hpp +++ b/src/something_game.hpp @@ -21,6 +21,11 @@ struct Game { bool quit; +#ifndef SOMETHING_RELEASE + // Indicates whether the level editor mode is on + bool editor; +#endif + const Uint8 *keyboard; SDL_Window *window; diff --git a/src/something_main.cpp b/src/something_main.cpp index 0c3e9b9..dc61783 100644 --- a/src/something_main.cpp +++ b/src/something_main.cpp @@ -67,6 +67,10 @@ int main(int argc, char *argv[]) } defer(SDL_DestroyWindow(window)); + if (SDL_ShowCursor(0) < 0) { + panic("SDL ERROR: ", SDL_GetError()); + } + { SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); From 57860db26650ed5b066f5156e9f3b14f5efabb1a Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 19:58:14 +0700 Subject: [PATCH 04/12] (#90) Add "debug" label on the screen in the debug build --- assets/vars.conf | 6 +++++- src/something_font.cpp | 5 +++++ src/something_font.hpp | 2 ++ src/something_game.cpp | 19 +++++++++++++++++++ src/something_renderer.cpp | 2 +- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/assets/vars.conf b/assets/vars.conf index 06196a2..10bdfce 100644 --- a/assets/vars.conf +++ b/assets/vars.conf @@ -19,4 +19,8 @@ GRAVITY: float = 4000.0 MOUSE_CURSOR_SIZE: float = 100.0 MOUSE_CURSOR_COLOR: color = FFFFFFFF -MOUSE_CURSOR_TEXTURE: int = 12 \ No newline at end of file +MOUSE_CURSOR_TEXTURE: int = 12 + +DEBUG_TEXT_SCALE: float = 5.0 +DEBUG_TEXT_PADDING: float = 20.0 +DEBUG_TEXT_COLOR: color = FF0000FF \ No newline at end of file diff --git a/src/something_font.cpp b/src/something_font.cpp index 8d2dac7..f350199 100644 --- a/src/something_font.cpp +++ b/src/something_font.cpp @@ -53,3 +53,8 @@ void Font::render_text(Renderer *renderer, const char *text, V2 positio FONT_PROGRAM_ASSET); } } + +V2 Font::text_size(const char *text, GLfloat scale) const +{ + return char_size_pix.cast_to() * V2(scale) * V2(strlen(text), static_cast(1)).cast_to(); +} diff --git a/src/something_font.hpp b/src/something_font.hpp index ccccf6d..aa522f5 100644 --- a/src/something_font.hpp +++ b/src/something_font.hpp @@ -13,6 +13,8 @@ struct Font { static Font from_file(const char *file_path); AABB char_uv(char c) const; + + V2 text_size(const char *text, GLfloat scale) const; void render_text(Renderer *renderer, const char *text, diff --git a/src/something_game.cpp b/src/something_game.cpp index 4b3a859..c2fa714 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -265,6 +265,25 @@ void Game::render(Renderer *renderer) const cursor_texture_uv, SCREEN_PROGRAM_ASSET); } + + { + // TODO: vars.conf does not support string type + + const char *debug_text = "debug"; + const auto debug_size = font.text_size(debug_text, DEBUG_TEXT_SCALE); + const auto screen_size = V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to(); + const auto debug_position = + screen_size * V2(0.5f, -0.5f) - + debug_size * V2(1.0f, 0.0f) + + V2(DEBUG_TEXT_PADDING) * V2(-1.0f, 1.0f); + + font.render_text( + renderer, + debug_text, + debug_position, + DEBUG_TEXT_SCALE, + DEBUG_TEXT_COLOR); + } #endif } renderer->draw(this); diff --git a/src/something_renderer.cpp b/src/something_renderer.cpp index 9d2d841..2b7d4b4 100644 --- a/src/something_renderer.cpp +++ b/src/something_renderer.cpp @@ -25,7 +25,7 @@ void Renderer::init() programs[PRIDE_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {HSL_FRAG_SHADER_ASSET}); programs[FONT_PROGRAM_ASSET] = - Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}, 1); + Program::make({TRIANGLE_SCREEN_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}, 1); static_assert(COUNT_PROGRAM_ASSETS == 5, "The amount of program assets have changed"); } From 24fbf0281cffa644bec32a3e47fbd20df6d87a28 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:36:52 +0700 Subject: [PATCH 05/12] (#90) Editor Tool panel --- assets/vars.conf | 5 ++- src/something_enemy.cpp | 1 - src/something_game.cpp | 95 +++++++++++++++++++++++++++++++++++------ src/something_game.hpp | 10 +++++ 4 files changed, 95 insertions(+), 16 deletions(-) diff --git a/assets/vars.conf b/assets/vars.conf index 10bdfce..b319177 100644 --- a/assets/vars.conf +++ b/assets/vars.conf @@ -23,4 +23,7 @@ MOUSE_CURSOR_TEXTURE: int = 12 DEBUG_TEXT_SCALE: float = 5.0 DEBUG_TEXT_PADDING: float = 20.0 -DEBUG_TEXT_COLOR: color = FF0000FF \ No newline at end of file +DEBUG_TEXT_COLOR: color = FF0000FF + +TOOLS_PANEL_PADDING: float = 50.0 +TOOL_BUTTON_SIZE: float = 100.0 \ No newline at end of file diff --git a/src/something_enemy.cpp b/src/something_enemy.cpp index cfc275e..cbc9c37 100644 --- a/src/something_enemy.cpp +++ b/src/something_enemy.cpp @@ -24,7 +24,6 @@ void Enemy::update(Game *game, Seconds) if (game->projectiles.states[i] == Projectiles::State::Aliv && body.hitbox.contains(game->projectiles.positions[i])) { game->projectiles.states[i] = Projectiles::State::Ded; kill(game); - game->spawn_enemy(V2(1947.0f, 1818.5f)); } } diff --git a/src/something_game.cpp b/src/something_game.cpp index c2fa714..a893689 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -131,6 +131,16 @@ void Game::handle_event(const SDL_Event *event) editor = !editor; } break; + + case SDLK_z: { + editor_tool = Editor_Tool::Tiles; + } + break; + + case SDLK_x: { + editor_tool = Editor_Tool::Enemies; + } + break; #endif } } @@ -144,9 +154,24 @@ void Game::handle_event(const SDL_Event *event) case SDL_MOUSEBUTTONDOWN: { #ifndef SOMETHING_RELEASE if (editor) { - Tile *tile = tile_grid.get_tile(World_Coord(mouse_world)); - if (tile != NULL) { - tile->wall = !tile->wall; + // TODO: the level editor does not allow to "draw" the tiles by dragging the mouse cursor + switch (editor_tool) { + case Editor_Tool::Tiles: { + Tile *tile = tile_grid.get_tile(World_Coord(mouse_world)); + if (tile != NULL) { + tile->wall = !tile->wall; + } + } + break; + + case Editor_Tool::Enemies: { + spawn_enemy(mouse_world); + } + break; + + case Editor_Tool::Count: + default: + aids::unreachable(); } } else { player.shoot(this); @@ -253,19 +278,46 @@ void Game::render(Renderer *renderer) const #ifndef SOMETHING_RELEASE if (editor) { - const auto mouse_screen = - window_to_viewport(window, mouse_window) - - V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to() * V2(0.5f); - const auto cursor_texture_uv = atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(); - const auto cursor_size = atlas.get_size({static_cast(MOUSE_CURSOR_TEXTURE)}, MOUSE_CURSOR_SIZE); - - renderer->fill_aabb( - AABB(mouse_screen - cursor_size * V2(0.0f, 1.0f), cursor_size), - MOUSE_CURSOR_COLOR, - cursor_texture_uv, - SCREEN_PROGRAM_ASSET); + // Tools Panel + { + const auto screen_size = V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to(); + const auto tools_panel_pos = + screen_size * V2(-0.5f) + V2(TOOLS_PANEL_PADDING); + + // TODO: editor tools panel does not allow to select tools by clicking on their icons + // TODO: editor tools panel buttons don't have any icons on them + + for (size_t i = 0; i < static_cast(Editor_Tool::Count); ++i) { + const auto tool = static_cast(i); + const auto tool_pos = + tools_panel_pos + + V2(i, static_cast(0)).cast_to() + * V2(TOOL_BUTTON_SIZE + TOOLS_PANEL_PADDING); + renderer->fill_aabb( + AABB(tool_pos, V2(TOOL_BUTTON_SIZE)), + tool == editor_tool ? editor_tool_color(tool) : RGBA(1.0f), + atlas.get_uv({0}), + SCREEN_PROGRAM_ASSET); + } + } + + // Cursor + { + const auto mouse_screen = + window_to_viewport(window, mouse_window) - + V2(SCREEN_WIDTH, SCREEN_HEIGHT).cast_to() * V2(0.5f); + const auto cursor_texture_uv = atlas.get_uv({static_cast(MOUSE_CURSOR_TEXTURE)}).flip_vertically(); + const auto cursor_size = atlas.get_size({static_cast(MOUSE_CURSOR_TEXTURE)}, MOUSE_CURSOR_SIZE); + + renderer->fill_aabb( + AABB(mouse_screen - cursor_size * V2(0.0f, 1.0f), cursor_size), + MOUSE_CURSOR_COLOR, + cursor_texture_uv, + SCREEN_PROGRAM_ASSET); + } } + // Debug Label { // TODO: vars.conf does not support string type @@ -327,3 +379,18 @@ void Game::spawn_enemy(V2 pos) enemies_size += 1; } } + +#ifndef SOMETHING_RELEASE +RGBA Game::editor_tool_color(Editor_Tool tool) const +{ + switch(tool) { + case Editor_Tool::Tiles: + return RGBA::GREEN(); + case Editor_Tool::Enemies: + return RGBA::RED(); + case Editor_Tool::Count: + default: + aids::unreachable("Game::editor_tool_color()"); + } +} +#endif // SOMETHING_RELEASE diff --git a/src/something_game.hpp b/src/something_game.hpp index f99ff0e..047cab4 100644 --- a/src/something_game.hpp +++ b/src/something_game.hpp @@ -21,9 +21,19 @@ struct Game { bool quit; + // TODO: decouple editor from the game #ifndef SOMETHING_RELEASE + enum class Editor_Tool: size_t { + Tiles, + Enemies, + Count + }; + // Indicates whether the level editor mode is on bool editor; + Editor_Tool editor_tool; + + RGBA editor_tool_color(Editor_Tool tool) const; #endif const Uint8 *keyboard; From 5470971d4edcf26eab93a18ceaa852a0b243bd2a Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:55 +0700 Subject: [PATCH 06/12] Add TODO(#96) --- src/something_atlas.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_atlas.hpp b/src/something_atlas.hpp index 51ae4c7..bd7eec8 100644 --- a/src/something_atlas.hpp +++ b/src/something_atlas.hpp @@ -11,7 +11,7 @@ struct Atlas { static Atlas from_config(const char *file_path, int margin); - // TODO: introduce a special type Atlas::Index instead of Index> + // TODO(#96): introduce a special type Atlas::Index instead of Index> // TODO: introduce a special type in vars.conf for Atlas::Index AABB get_uv(Index> texture_index) const; V2 get_size(Index> texture_index, float height) const; From 73dcbd609466c65b973c2660c2798fa145b8ce2b Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:56 +0700 Subject: [PATCH 07/12] Add TODO(#97) --- src/something_atlas.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_atlas.hpp b/src/something_atlas.hpp index bd7eec8..8b5f9d1 100644 --- a/src/something_atlas.hpp +++ b/src/something_atlas.hpp @@ -12,7 +12,7 @@ struct Atlas { static Atlas from_config(const char *file_path, int margin); // TODO(#96): introduce a special type Atlas::Index instead of Index> - // TODO: introduce a special type in vars.conf for Atlas::Index + // TODO(#97): introduce a special type in vars.conf for Atlas::Index AABB get_uv(Index> texture_index) const; V2 get_size(Index> texture_index, float height) const; }; From 3a055b5e17b4b82017a589a14869cb3c40508714 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:57 +0700 Subject: [PATCH 08/12] Add TODO(#98) --- src/something_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_game.cpp b/src/something_game.cpp index a893689..38c5cc3 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -154,7 +154,7 @@ void Game::handle_event(const SDL_Event *event) case SDL_MOUSEBUTTONDOWN: { #ifndef SOMETHING_RELEASE if (editor) { - // TODO: the level editor does not allow to "draw" the tiles by dragging the mouse cursor + // TODO(#98): the level editor does not allow to "draw" the tiles by dragging the mouse cursor switch (editor_tool) { case Editor_Tool::Tiles: { Tile *tile = tile_grid.get_tile(World_Coord(mouse_world)); From 6b404714823c7b1df2708bb084377c4315057148 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:57 +0700 Subject: [PATCH 09/12] Add TODO(#99) --- src/something_game.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_game.hpp b/src/something_game.hpp index 047cab4..aacc53c 100644 --- a/src/something_game.hpp +++ b/src/something_game.hpp @@ -21,7 +21,7 @@ struct Game { bool quit; - // TODO: decouple editor from the game + // TODO(#99): decouple editor from the game #ifndef SOMETHING_RELEASE enum class Editor_Tool: size_t { Tiles, From 98dde5b7f29e42ca18233076b47a68ac078012f9 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:58 +0700 Subject: [PATCH 10/12] Add TODO(#100) --- src/something_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_game.cpp b/src/something_game.cpp index 38c5cc3..4632aee 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -284,7 +284,7 @@ void Game::render(Renderer *renderer) const const auto tools_panel_pos = screen_size * V2(-0.5f) + V2(TOOLS_PANEL_PADDING); - // TODO: editor tools panel does not allow to select tools by clicking on their icons + // TODO(#100): editor tools panel does not allow to select tools by clicking on their icons // TODO: editor tools panel buttons don't have any icons on them for (size_t i = 0; i < static_cast(Editor_Tool::Count); ++i) { From 177fbcceb8226168119ab5463e532aeff365278d Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:58 +0700 Subject: [PATCH 11/12] Add TODO(#101) --- src/something_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_game.cpp b/src/something_game.cpp index 4632aee..caa7dbb 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -285,7 +285,7 @@ void Game::render(Renderer *renderer) const screen_size * V2(-0.5f) + V2(TOOLS_PANEL_PADDING); // TODO(#100): editor tools panel does not allow to select tools by clicking on their icons - // TODO: editor tools panel buttons don't have any icons on them + // TODO(#101): editor tools panel buttons don't have any icons on them for (size_t i = 0; i < static_cast(Editor_Tool::Count); ++i) { const auto tool = static_cast(i); From 64563fe19bd0ad27a57b4acc05c372c449322dec Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 30 May 2021 20:38:59 +0700 Subject: [PATCH 12/12] Add TODO(#102) --- src/something_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_game.cpp b/src/something_game.cpp index caa7dbb..f1b5480 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -319,7 +319,7 @@ void Game::render(Renderer *renderer) const // Debug Label { - // TODO: vars.conf does not support string type + // TODO(#102): vars.conf does not support string type const char *debug_text = "debug"; const auto debug_size = font.text_size(debug_text, DEBUG_TEXT_SCALE);