From 150fbca06c3134fa0152579df8701b4f5a660d1a Mon Sep 17 00:00:00 2001 From: sebastian Date: Fri, 13 Feb 2026 21:47:02 +0100 Subject: [PATCH] ADD: Basic StageSystem --- CMakeLists.txt | 4 ++++ src/engine/core/ECS/ModelComponent.h | 24 ++++++++++++++++++++++-- src/engine/core/ECS/RenderSystem.cpp | 3 ++- src/engine/layer/entities/ModelStage.cpp | 5 +++++ src/engine/layer/entities/ModelStage.h | 22 ++++++++++++++++++++++ src/engine/layer/entities/ModelState.cpp | 5 +++++ src/engine/layer/entities/ModelState.h | 22 ++++++++++++++++++++++ src/engine/renderer/MasterRenderer.cpp | 2 +- src/game/GameMode.cpp | 1 - 9 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 src/engine/layer/entities/ModelStage.cpp create mode 100644 src/engine/layer/entities/ModelStage.h create mode 100644 src/engine/layer/entities/ModelState.cpp create mode 100644 src/engine/layer/entities/ModelState.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fcfd505..247cbbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -171,6 +171,10 @@ add_executable(Dicewars_Siedler src/main.cpp src/game/hexWorld/gameplay/TurnSystem.cpp src/game/hexWorld/gameplay/TurnSystem.h src/game/hexWorld/gameplay/TurnState.h + src/engine/layer/entities/ModelState.cpp + src/engine/layer/entities/ModelState.h + src/engine/layer/entities/ModelStage.cpp + src/engine/layer/entities/ModelStage.h ) target_compile_options(Dicewars_Siedler PRIVATE diff --git a/src/engine/core/ECS/ModelComponent.h b/src/engine/core/ECS/ModelComponent.h index fecb51b..ad69c77 100644 --- a/src/engine/core/ECS/ModelComponent.h +++ b/src/engine/core/ECS/ModelComponent.h @@ -5,15 +5,35 @@ #ifndef MODELCOMPONENT_H #define MODELCOMPONENT_H #include +#include #include "Component.h" +#include "../../layer/entities/ModelStage.h" #include "../../renderer/model/TexturedModel.h" class ModelComponent: public Component { public: - std::shared_ptr model; - ModelComponent(std::shared_ptr model) : model(std::move(model)) {}; + ModelComponent(const std::vector& stages) : stages(stages) {}; + ModelComponent(std::shared_ptr model) { + activeModel = std::move(model); + } + + void updateStage() { + for (const auto& stage : stages) { + if (stage.isActive()) { + activeModel = stage.model; + return; + } + } + } + + [[nodiscard]] std::shared_ptr getActiveModel() const { + return activeModel; + } +private: + std::vector stages; + std::shared_ptr activeModel; }; diff --git a/src/engine/core/ECS/RenderSystem.cpp b/src/engine/core/ECS/RenderSystem.cpp index 1815648..a7a6c0e 100644 --- a/src/engine/core/ECS/RenderSystem.cpp +++ b/src/engine/core/ECS/RenderSystem.cpp @@ -9,6 +9,7 @@ void RenderSystem::render(EntityManager &entityManager, MasterRenderer &renderer auto transform = entityManager.getComponent(id); auto model = entityManager.getComponent(id); + model->updateStage(); auto tileRenderingComponent = entityManager.getComponent(id); if (!transform || !model) continue; @@ -16,7 +17,7 @@ void RenderSystem::render(EntityManager &entityManager, MasterRenderer &renderer if (tileRenderingComponent) { renderer.submitTerrainTile(transform, model, tileRenderingComponent); } else { - Entity entity = Entity(model->model, transform->position, transform->rotation.x, transform->rotation.y, transform->rotation.z, transform->scale); + Entity entity = Entity(model->getActiveModel(), transform->position, transform->rotation.x, transform->rotation.y, transform->rotation.z, transform->scale); renderer.submitEntity(std::make_unique(entity)); } diff --git a/src/engine/layer/entities/ModelStage.cpp b/src/engine/layer/entities/ModelStage.cpp new file mode 100644 index 0000000..250dfac --- /dev/null +++ b/src/engine/layer/entities/ModelStage.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 13.02.26. +// + +#include "ModelStage.h" \ No newline at end of file diff --git a/src/engine/layer/entities/ModelStage.h b/src/engine/layer/entities/ModelStage.h new file mode 100644 index 0000000..68c440f --- /dev/null +++ b/src/engine/layer/entities/ModelStage.h @@ -0,0 +1,22 @@ +// +// Created by sebastian on 13.02.26. +// + +#ifndef DICEWARS_SIEDLER_MODELSTAGE_H +#define DICEWARS_SIEDLER_MODELSTAGE_H +#include +#include + +#include "../../renderer/model/TexturedModel.h" + + +class ModelStage { +public: + std::string name; + std::shared_ptr model; + // Trigger-Funktion: Gibt true zurück, wenn dieser State aktiv sein sollte + std::function isActive; +}; + + +#endif //DICEWARS_SIEDLER_MODELSTAGE_H \ No newline at end of file diff --git a/src/engine/layer/entities/ModelState.cpp b/src/engine/layer/entities/ModelState.cpp new file mode 100644 index 0000000..54ea1cd --- /dev/null +++ b/src/engine/layer/entities/ModelState.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 13.02.26. +// + +#include "ModelState.h" \ No newline at end of file diff --git a/src/engine/layer/entities/ModelState.h b/src/engine/layer/entities/ModelState.h new file mode 100644 index 0000000..227f224 --- /dev/null +++ b/src/engine/layer/entities/ModelState.h @@ -0,0 +1,22 @@ +// +// Created by sebastian on 13.02.26. +// + +#ifndef DICEWARS_SIEDLER_MODELSTATE_H +#define DICEWARS_SIEDLER_MODELSTATE_H +#include +#include + + +class ModelState { +public: + std::string name; + std::string modelPath; + std::string texturePath; + + // Trigger-Function: Returns true when this state should be active + std::function isActive; +}; + + +#endif //DICEWARS_SIEDLER_MODELSTATE_H \ No newline at end of file diff --git a/src/engine/renderer/MasterRenderer.cpp b/src/engine/renderer/MasterRenderer.cpp index d271a15..8bbbe3a 100644 --- a/src/engine/renderer/MasterRenderer.cpp +++ b/src/engine/renderer/MasterRenderer.cpp @@ -33,7 +33,7 @@ void MasterRenderer::submitEntity(std::unique_ptr entity) { void MasterRenderer::submitTerrainTile(std::shared_ptr transform, std::shared_ptr model, std::shared_ptr terrainTileComponent) { TerrainRenderingData terrain = TerrainRenderingData(std::move(transform), std::move(model), std::move(terrainTileComponent)); - terrainTiles[terrain.modelComponent->model.get()].push_back(std::make_unique(std::move(terrain))); + terrainTiles[terrain.modelComponent->getActiveModel().get()].push_back(std::make_unique(std::move(terrain))); } diff --git a/src/game/GameMode.cpp b/src/game/GameMode.cpp index c44a3e5..04cfd87 100644 --- a/src/game/GameMode.cpp +++ b/src/game/GameMode.cpp @@ -72,7 +72,6 @@ size_t GameMode::getPlayerCount() const { } bool GameMode::hasTurn(PlayerID playerID, int turn) const { - printf("Turn: %d, PlayerCount: %lu, playerID: %u\n, Modulo Result: %lu", turn, getPlayerCount(), playerID, turn % getPlayerCount()); return turn % static_cast(getPlayerCount()) == static_cast(playerID); }