From f28e9c3e03a9f94764b3811f7c4aa01991943fc7 Mon Sep 17 00:00:00 2001 From: fschildt Date: Wed, 17 Sep 2025 15:30:21 +0200 Subject: switch to software renderer --- src/games/minesweeper/Minesweeper.cpp | 71 +++++++++++++++++++++++------------ src/games/snake/Snake.cpp | 42 ++++++++++++++++----- src/games/tetris/Board.cpp | 20 ++++++++-- src/games/tetris/Tetris.cpp | 2 +- src/games/tetris/Tetromino.cpp | 20 ++++++---- src/games/tetris/Tetromino.hpp | 2 +- 6 files changed, 110 insertions(+), 47 deletions(-) (limited to 'src/games') diff --git a/src/games/minesweeper/Minesweeper.cpp b/src/games/minesweeper/Minesweeper.cpp index 60502c6..6dc77a4 100644 --- a/src/games/minesweeper/Minesweeper.cpp +++ b/src/games/minesweeper/Minesweeper.cpp @@ -85,7 +85,7 @@ void Minesweeper::InitAdjacentMineCounters() { } bool Minesweeper::Update(std::vector &events, RenderGroup &render_group) { - V3F32 clear_color = {0.3f, 0.2f, 0.3f}; + Color clear_color = {0.3f, 0.2f, 0.3f}; render_group.SetCameraSize(4.0f, 3.0f); render_group.Clear(clear_color); @@ -266,10 +266,10 @@ void Minesweeper::DrawGameOverMenu(RenderGroup &render_group) { } void Minesweeper::DrawBoard(RenderGroup &render_group) { - V3F32 covered_cell_color = V3F32(0.4f, 0.4f, 0.4f); - V3F32 uncovered_cell_color = V3F32(0.2f, 0.2f, 0.2f); - V3F32 flag_color = {0.6f, 0.3f, 03.f}; - V3F32 mine_color = {0.8f, 0.2f, 0.2f}; + Color covered_cell_color = {0.4f, 0.4f, 0.4f}; + Color uncovered_cell_color = {0.2f, 0.2f, 0.2f}; + Color flag_color = {0.6f, 0.3f, 03.f}; + Color mine_color = {0.8f, 0.2f, 0.2f}; V2F32 flag_draw_size = {m_CellInnerViewSize.x * 0.5f, m_CellInnerViewSize.y * 0.5f}; V2F32 flag_draw_offset = { @@ -278,42 +278,63 @@ void Minesweeper::DrawBoard(RenderGroup &render_group) { }; - - // Todo: avoid if-statement by having them in separate contiguous locations? - for (int32_t y = 0; y < m_MapHeight; y++) { for (int32_t x = 0; x < m_MapWidth; x++) { - V3F32 world_pos = { + V2F32 world_pos = { m_MapViewPos.x + (float)x * m_CellOuterViewSize.x, m_MapViewPos.y + (float)y * m_CellOuterViewSize.y, - 0.0f }; bool is_covered = IsCovered(x, y); bool is_flagged = IsFlagged(x, y); bool is_mine = IsMine(x, y); if (is_covered) { - render_group.PushRectangle(world_pos, m_CellInnerViewSize, covered_cell_color); - } - if (is_covered && is_flagged) { - assert(IsCovered(x ,y)); - V3F32 flag_world_pos = { - world_pos.x + flag_draw_offset.x, - world_pos.y + flag_draw_offset.y, - 1.0f + RectF32 cell_world_rect = { + world_pos.x, world_pos.y, + world_pos.x + m_CellInnerViewSize.x, world_pos.y + m_CellInnerViewSize.y }; - render_group.PushRectangle(flag_world_pos, flag_draw_size, flag_color); - } - if (!is_covered && !is_mine) { - render_group.PushRectangle(world_pos, m_CellInnerViewSize, uncovered_cell_color); + render_group.PushRectangle(cell_world_rect, 0.0f, covered_cell_color); + + + if (is_flagged) { + V3F32 flag_world_pos = { + world_pos.x + flag_draw_offset.x, + world_pos.y + flag_draw_offset.y, + 1.0f + }; + RectF32 flag_world_rect = { + flag_world_pos.x, + flag_world_pos.y, + flag_world_pos.x + m_CellInnerViewSize.x, + flag_world_pos.y + m_CellInnerViewSize.y, + }; + render_group.PushRectangle(flag_world_rect, flag_world_pos.z, flag_color); + } } - if (!is_covered && is_mine) { + else { V3F32 mine_world_pos = { world_pos.x, world_pos.y, - 2.0f + 1.0f }; - render_group.PushRectangle(mine_world_pos, m_CellInnerViewSize, mine_color); + if (is_mine) { + RectF32 mine_world_rect = { + mine_world_pos.x, + mine_world_pos.y, + mine_world_pos.x + m_CellInnerViewSize.x, + mine_world_pos.y + m_CellInnerViewSize.y, + }; + render_group.PushRectangle(mine_world_rect, mine_world_pos.z, mine_color); + } + else { + RectF32 mine_world_rect = { + mine_world_pos.x, + mine_world_pos.y, + mine_world_pos.x + m_CellInnerViewSize.x, + mine_world_pos.y + m_CellInnerViewSize.y, + }; + render_group.PushRectangle(mine_world_rect, mine_world_pos.z, uncovered_cell_color); + } } } } diff --git a/src/games/snake/Snake.cpp b/src/games/snake/Snake.cpp index 9764a9e..6a95521 100644 --- a/src/games/snake/Snake.cpp +++ b/src/games/snake/Snake.cpp @@ -43,7 +43,7 @@ bool Snake::Update(std::vector &events, RenderGroup &render_group) { m_LastMillisecondsSinceT0 = milliseconds_since_t0; - V3F32 clear_color = V3F32(0.3f, 0.3f, 0.3f); + Color clear_color = {0.3f, 0.3f, 0.3f, 1.0f}; render_group.SetCameraSize(4.0f, 3.0f); render_group.Clear(clear_color); @@ -268,8 +268,14 @@ void Snake::Draw(RenderGroup &render_group) { /* draw map background */ V3F32 map_world_pos = {map_x, map_y, 0.0f}; V2F32 map_world_dim = {map_view_width, map_view_height}; - V3F32 bg_color = {0.0f, 0.0f, 0.0f}; - render_group.PushRectangle(map_world_pos, map_world_dim, bg_color); + RectF32 map_world_rect = { + map_world_pos.x, + map_world_pos.y, + map_world_pos.x + map_world_dim.x, + map_world_pos.y + map_world_dim.y + }; + Color bg_color = {0.0f, 0.0f, 0.0f, 1.0f}; + render_group.PushRectangle(map_world_rect, map_world_pos.z, bg_color); /* draw snake */ @@ -290,9 +296,15 @@ void Snake::Draw(RenderGroup &render_group) { 1.0f }; V2F32 world_dim = local_dim; + RectF32 world_rect = { + world_pos.x, + world_pos.y, + world_pos.x + world_dim.x, + world_pos.y + world_dim.y, + }; - V3F32 color = {0.3f, 0.3f, 0.3f}; - render_group.PushRectangle(world_pos, world_dim, color); + Color color = {0.3f, 0.3f, 0.3f, 1.0f}; + render_group.PushRectangle(world_rect, world_pos.z, color); tail++; } tail = 0; @@ -312,9 +324,15 @@ void Snake::Draw(RenderGroup &render_group) { 1.0f }; V2F32 world_dim = local_dim; + RectF32 world_rect = { + world_pos.x, + world_pos.y, + world_pos.x + world_dim.x, + world_pos.y + world_dim.y, + }; - V3F32 color = {0.3f, 0.3f, 0.3f}; - render_group.PushRectangle(world_pos, world_dim, color); + Color color = {0.3f, 0.3f, 0.3f, 1.0f}; + render_group.PushRectangle(world_rect, world_pos.z, color); tail++; } @@ -326,8 +344,14 @@ void Snake::Draw(RenderGroup &render_group) { 1.0f }; V2F32 dim = {bodypart_size, bodypart_size}; - V3F32 color = {0.3f, 0.6f, 0.4f}; - render_group.PushRectangle(pos, dim, color); + RectF32 rect = { + pos.x, + pos.y, + pos.x + dim.x, + pos.y + dim.y + }; + Color color = {0.3f, 0.6f, 0.4f, 1.0f}; + render_group.PushRectangle(rect, pos.z, color); } void Snake::DoImgui() { diff --git a/src/games/tetris/Board.cpp b/src/games/tetris/Board.cpp index 9dff135..2230ee5 100644 --- a/src/games/tetris/Board.cpp +++ b/src/games/tetris/Board.cpp @@ -106,8 +106,14 @@ void Board::Draw(int32_t level, RenderGroup& render_group) { tetromino_size_with_border * 10, tetromino_size_with_border * 20 }; - V3F32 bg_color = {0.0f, 0.0f, 0.0f}; - render_group.PushRectangle(bg_world_pos, bg_world_dim, bg_color); + RectF32 bg_world_rect = { + bg_world_pos.x, + bg_world_pos.y, + bg_world_pos.x + bg_world_dim.x, + bg_world_pos.y + bg_world_dim.y, + }; + Color bg_color = {0.0f, 0.0f, 0.0f, 1.0f}; + render_group.PushRectangle(bg_world_rect, bg_world_pos.z, bg_color); // tetromino parts @@ -128,10 +134,16 @@ void Board::Draw(int32_t level, RenderGroup& render_group) { 1.0f }; V2F32 world_dim = local_dim; + RectF32 world_rect = { + world_pos.x, + world_pos.y, + world_pos.x + world_dim.x, + world_pos.y + world_dim.y, + }; - V3F32 color = Tetromino::GetColor(static_cast(tetromino_id)); - render_group.PushRectangle(world_pos, world_dim, color); + Color color = Tetromino::GetColor(static_cast(tetromino_id)); + render_group.PushRectangle(world_rect, world_pos.z, color); } } } diff --git a/src/games/tetris/Tetris.cpp b/src/games/tetris/Tetris.cpp index e776fb0..24881a8 100644 --- a/src/games/tetris/Tetris.cpp +++ b/src/games/tetris/Tetris.cpp @@ -35,7 +35,7 @@ void Tetris::Restart() { } bool Tetris::Update(std::vector &events, RenderGroup &render_group) { - V3F32 clear_color = V3F32(0.2f, 0.2f, 0.2f); + Color clear_color = {0.2f, 0.2f, 0.2f, 1.0f}; render_group.SetCameraSize(4.0f, 3.0f); render_group.Clear(clear_color); diff --git a/src/games/tetris/Tetromino.cpp b/src/games/tetris/Tetromino.cpp index 577a869..78ac68d 100644 --- a/src/games/tetris/Tetromino.cpp +++ b/src/games/tetris/Tetromino.cpp @@ -153,24 +153,24 @@ void Tetromino::GetBitmap(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *b *dest = *src >> pos.x; } -V3F32 Tetromino::GetColor(TetrominoId id) { +Color Tetromino::GetColor(TetrominoId id) { using enum TetrominoId; - V3F32 color; + Color color; switch (id) { case TETROMINO_I: case TETROMINO_O: case TETROMINO_T: { - color = V3F32(0.8f, 0.8f, 0.8f); + color = {0.8f, 0.8f, 0.8f, 1.0f}; } break; case TETROMINO_J: case TETROMINO_S: { - color = V3F32(0.8f, 0.2f, 0.2f); + color = {0.8f, 0.2f, 0.2f, 1.0f}; } break; default: { - color = V3F32(0.2f, 0.4f, 0.2f); + color = {0.2f, 0.4f, 0.2f, 1.0f}; } } return color; @@ -201,10 +201,16 @@ void Tetromino::Draw(TetrominoId id, int32_t ori, V2F32 pos, float scale, Render 1.0f }; V2F32 world_dim = local_dim; + RectF32 world_rect = { + world_pos.x, + world_pos.y, + world_pos.x + world_dim.x, + world_pos.y + world_dim.y, + }; - V3F32 color = GetColor(id); - render_group.PushRectangle(world_pos, world_dim, color); + Color color = GetColor(id); + render_group.PushRectangle(world_rect, world_pos.z, color); } } } diff --git a/src/games/tetris/Tetromino.hpp b/src/games/tetris/Tetromino.hpp index c3ceeff..d6d99c6 100644 --- a/src/games/tetris/Tetromino.hpp +++ b/src/games/tetris/Tetromino.hpp @@ -42,7 +42,7 @@ public: public: static bool IsCollisionWithBoard(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *board_bitmap); static void GetBitmap(TetrominoId id, BoardPos pos, int32_t ori, uint16_t *bitmap); - static V3F32 GetColor(TetrominoId id); + static Color GetColor(TetrominoId id); static void Draw(TetrominoId id, int32_t ori, V2F32 pos, float scale, RenderGroup &render_group); -- cgit v1.2.3