From fffc799447e63cabb1de3bb6b985dce149062dd4 Mon Sep 17 00:00:00 2001 From: sebastian Date: Sun, 8 Feb 2026 15:44:04 +0100 Subject: [PATCH] UPD: Refactor Building System --- CMakeLists.txt | 2 ++ src/game/GameLayer.cpp | 34 ++++++++---------------------- src/game/GameLayer.h | 2 ++ src/game/TileInteractionSystem.cpp | 30 ++++++++++++++++++++++++++ src/game/TileInteractionSystem.h | 19 +++++++++++++++++ 5 files changed, 62 insertions(+), 25 deletions(-) create mode 100644 src/game/TileInteractionSystem.cpp create mode 100644 src/game/TileInteractionSystem.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f7b167f..1f9aa75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,8 @@ add_executable(Dicewars_Siedler src/main.cpp src/game/hexWorld/tileGenerator/ForestTileGenerator.h src/engine/toolbox/Random.cpp src/engine/toolbox/Random.h + src/game/TileInteractionSystem.cpp + src/game/TileInteractionSystem.h ) target_include_directories(Dicewars_Siedler PRIVATE diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index add809d..c5296da 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -67,38 +67,22 @@ void GameLayer::onUpdate() renderer->submitEntity(entity.get()); } - for (HexTile& tile : map->tiles) { - glm::vec3 intersectionPoint; - bool highlight = tile.intersect(camera->getPosition(), mousePicker->getCurrentRay(), intersectionPoint); - tile.isHighlighted = highlight; - - if (tile.isHighlighted) { - if (InputManager::isMouseButtonPressed(GLFW_MOUSE_BUTTON_1)) { - //On this tile you should build something - if (!tile.building && tile.resourceType == RessourceType::WOOD) { - tile.entitiesOnTile.clear(); - tile.building = std::make_shared(AssetManager::getModel("cabin"), tile.worldPos, 0,0,0,1.f); - } - } - } - - for (const auto& entity: tile.entitiesOnTile) { - renderer->submitEntity(entity.get()); - } - - if (tile.building) { - renderer->submitEntity(tile.building.get()); - } - } + tileInteractionSystem->update(*map, *camera, *mousePicker); + tileInteractionSystem->handleBuildAction(*map); std::vector terrainRenderData = map->getTerrainRenderData(hexModelDefault, hexModelWood, hexModelStone); - - for (auto& renderData : terrainRenderData) { renderer->submitTerrainTile(&renderData); } + for (HexTile& tile : map->tiles) { + for (const auto& entity : tile.entitiesOnTile) { + renderer->submitEntity(entity.get()); + } + if (tile.building) renderer->submitEntity(tile.building.get()); + } + renderer->render(*light, *camera); } diff --git a/src/game/GameLayer.h b/src/game/GameLayer.h index e09ce0d..a68544c 100644 --- a/src/game/GameLayer.h +++ b/src/game/GameLayer.h @@ -4,6 +4,7 @@ #ifndef DICEWARS_SIEDLER_GAMELAYER_H #define DICEWARS_SIEDLER_GAMELAYER_H +#include "TileInteractionSystem.h" #include "../engine/layer/Layer.h" #include "../engine/platform/glfw/MousePicker.h" #include "../engine/renderer/Renderer.h" @@ -37,6 +38,7 @@ private: std::vector> mapEntities; std::vector> entities; + std::unique_ptr tileInteractionSystem = std::make_unique(); std::unique_ptr map; }; diff --git a/src/game/TileInteractionSystem.cpp b/src/game/TileInteractionSystem.cpp new file mode 100644 index 0000000..a8f211c --- /dev/null +++ b/src/game/TileInteractionSystem.cpp @@ -0,0 +1,30 @@ +// +// Created by sebastian on 08.02.26. +// + +#include "TileInteractionSystem.h" + +#include "../engine/layer/entities/Camera.h" +#include "../engine/platform/glfw/InputManager.h" +#include "../engine/renderer/model/AssetManager.h" +#include "GLFW/glfw3.h" + +void TileInteractionSystem::update(Map &map, const Camera &camera, const MousePicker &mousePicker) { + for (HexTile& tile : map.tiles) { + glm::vec3 intersectionPoint; + tile.isHighlighted = tile.intersect(camera.getPosition(), mousePicker.getCurrentRay(), intersectionPoint); + } + + +} + +void TileInteractionSystem::handleBuildAction(Map &map) { + for (HexTile& tile : map.tiles) { + if (tile.isHighlighted && InputManager::isMouseButtonPressed(GLFW_MOUSE_BUTTON_1)) { + if (!tile.building && tile.resourceType == RessourceType::WOOD) { + tile.entitiesOnTile.clear(); + tile.building = std::make_shared(AssetManager::getModel("cabin"), tile.worldPos, 0,0,0,1.f); + } + } + } +} diff --git a/src/game/TileInteractionSystem.h b/src/game/TileInteractionSystem.h new file mode 100644 index 0000000..b12af5d --- /dev/null +++ b/src/game/TileInteractionSystem.h @@ -0,0 +1,19 @@ +// +// Created by sebastian on 08.02.26. +// + +#ifndef TILEINTERACTIONSYSTEM_H +#define TILEINTERACTIONSYSTEM_H +#include "../engine/platform/glfw/MousePicker.h" +#include "hexWorld/Map.h" + + +class TileInteractionSystem { +public: + void update(Map& map, const Camera& camera, const MousePicker& mousePicker); + void handleBuildAction(Map& map); +}; + + + +#endif //TILEINTERACTIONSYSTEM_H