From 46110b333d2e42407813b5c2a3dc2b78b6a28881 Mon Sep 17 00:00:00 2001 From: sebastian Date: Fri, 13 Feb 2026 22:01:42 +0100 Subject: [PATCH] ADD: Add Submodels --- CMakeLists.txt | 1 + src/engine/renderer/Renderer.cpp | 20 +++++++++++--------- src/engine/renderer/Renderer.h | 2 +- src/engine/renderer/TerrainRenderer.cpp | 6 +++--- src/engine/renderer/model/SubModel.h | 17 +++++++++++++++++ src/engine/renderer/model/TexturedModel.h | 13 ++++++++----- 6 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 src/engine/renderer/model/SubModel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 247cbbe..b5f2445 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,7 @@ add_executable(Dicewars_Siedler src/main.cpp src/engine/layer/entities/ModelState.h src/engine/layer/entities/ModelStage.cpp src/engine/layer/entities/ModelStage.h + src/engine/renderer/model/SubModel.h ) target_compile_options(Dicewars_Siedler PRIVATE diff --git a/src/engine/renderer/Renderer.cpp b/src/engine/renderer/Renderer.cpp index c8ae19e..b813136 100644 --- a/src/engine/renderer/Renderer.cpp +++ b/src/engine/renderer/Renderer.cpp @@ -26,25 +26,27 @@ void Renderer::prepare(const Camera& camera, const Light& light) { void Renderer::renderEntities(const std::unordered_map>>& entities) { for (const auto& [texturedModel, batch] : entities) { - prepareTexturedModel(*texturedModel); - for (const auto& entity : batch) { - prepareInstance(*entity); - glDrawElements(GL_TRIANGLES, texturedModel->getRawModel()->vertexCount, GL_UNSIGNED_INT, 0); - } + for (const auto& subModel : texturedModel->getSubModels()) { + prepareTexturedModel(subModel); + for (const auto& entity : batch) { + prepareInstance(*entity); + glDrawElements(GL_TRIANGLES, subModel.rawModel->vertexCount, GL_UNSIGNED_INT, 0); + } - unbindTexturedModel(); + unbindTexturedModel(); + } } } -void Renderer::prepareTexturedModel(const TexturedModel &texturedModel) { - auto rawModel = texturedModel.getRawModel(); +void Renderer::prepareTexturedModel(const SubModel &subModel) { + auto rawModel = subModel.rawModel; glBindVertexArray(rawModel->vaoID); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID()); + glBindTexture(GL_TEXTURE_2D, subModel.texture->getTextureID()); } void Renderer::unbindTexturedModel() { diff --git a/src/engine/renderer/Renderer.h b/src/engine/renderer/Renderer.h index 4377fe3..d1e4984 100644 --- a/src/engine/renderer/Renderer.h +++ b/src/engine/renderer/Renderer.h @@ -28,7 +28,7 @@ public: private: StaticShader staticShader; - void prepareTexturedModel(const TexturedModel &texturedModel); + void prepareTexturedModel(const SubModel &texturedModel); void unbindTexturedModel(); void prepareInstance(const Entity &entity); diff --git a/src/engine/renderer/TerrainRenderer.cpp b/src/engine/renderer/TerrainRenderer.cpp index dfb1cb4..8818186 100644 --- a/src/engine/renderer/TerrainRenderer.cpp +++ b/src/engine/renderer/TerrainRenderer.cpp @@ -18,7 +18,7 @@ void TerrainRenderer::renderTerrainTiles(const std::unordered_mapgetRawModel()->vertexCount, GL_UNSIGNED_INT, 0); + glDrawElements(GL_TRIANGLES, texturedModel->getSubModels().front().rawModel->vertexCount, GL_UNSIGNED_INT, 0); } unbindTexturedModel(); } @@ -30,14 +30,14 @@ void TerrainRenderer::finalizeFrame() { } void TerrainRenderer::prepareTexturedModel(const TexturedModel &texturedModel) { - auto rawModel = texturedModel.getRawModel(); + auto rawModel = texturedModel.getSubModels().front().rawModel; glBindVertexArray(rawModel->vaoID); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID()); + glBindTexture(GL_TEXTURE_2D, texturedModel.getSubModels().front().texture->getTextureID()); } void TerrainRenderer::unbindTexturedModel() { diff --git a/src/engine/renderer/model/SubModel.h b/src/engine/renderer/model/SubModel.h new file mode 100644 index 0000000..0766ef4 --- /dev/null +++ b/src/engine/renderer/model/SubModel.h @@ -0,0 +1,17 @@ +// +// Created by sebastian on 13.02.26. +// + +#ifndef DICEWARS_SIEDLER_SUBMODEL_H +#define DICEWARS_SIEDLER_SUBMODEL_H +#include + +#include "RawModel.h" +#include "../textures/ModelTexture.h" + +struct SubModel { + std::shared_ptr rawModel; + std::shared_ptr texture; +}; + +#endif //DICEWARS_SIEDLER_SUBMODEL_H \ No newline at end of file diff --git a/src/engine/renderer/model/TexturedModel.h b/src/engine/renderer/model/TexturedModel.h index e1dfcf5..160496a 100644 --- a/src/engine/renderer/model/TexturedModel.h +++ b/src/engine/renderer/model/TexturedModel.h @@ -6,21 +6,24 @@ #define TEXTUREDMODEL_H #include #include +#include #include "RawModel.h" +#include "SubModel.h" #include "../textures/ModelTexture.h" class TexturedModel { private: - std::shared_ptr rawModel; - std::shared_ptr texture; + std::vector subModels; public: - TexturedModel(std::shared_ptr rawModel, std::shared_ptr texture) : rawModel(std::move(rawModel)), texture(std::move(texture)) {}; + TexturedModel(std::shared_ptr rawModel, std::shared_ptr texture) { + subModels.emplace_back(rawModel, texture); + }; + TexturedModel(std::vector subModels) : subModels(std::move(subModels)) {}; - [[nodiscard]] const std::shared_ptr getRawModel() const {return rawModel;} - [[nodiscard]] const std::shared_ptr getTexture() const {return texture;} + [[nodiscard]] const std::vector &getSubModels() const {return subModels;} };