From 14e7a5e3b0bd270c39062de855a31ada20852893 Mon Sep 17 00:00:00 2001 From: sebastian Date: Sun, 8 Feb 2026 08:34:21 +0100 Subject: [PATCH] UPD: Refactor Renderer to be Entity Specific --- CMakeLists.txt | 2 + src/engine/renderer/MasterRenderer.cpp | 35 +++++++++++++ src/engine/renderer/MasterRenderer.h | 42 ++++++++++++++++ src/engine/renderer/Renderer.cpp | 70 +++++++++----------------- src/engine/renderer/Renderer.h | 18 +++---- src/game/GameLayer.cpp | 6 ++- src/game/GameLayer.h | 3 +- 7 files changed, 116 insertions(+), 60 deletions(-) create mode 100644 src/engine/renderer/MasterRenderer.cpp create mode 100644 src/engine/renderer/MasterRenderer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3db3f68..579d689 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,8 @@ add_executable(Dicewars_Siedler src/main.cpp src/game/hexWorld/MapGenerator.h src/game/hexWorld/HexModelFactory.cpp src/game/hexWorld/HexModelFactory.h + src/engine/renderer/MasterRenderer.cpp + src/engine/renderer/MasterRenderer.h ) target_include_directories(Dicewars_Siedler PRIVATE diff --git a/src/engine/renderer/MasterRenderer.cpp b/src/engine/renderer/MasterRenderer.cpp new file mode 100644 index 0000000..3e4b81e --- /dev/null +++ b/src/engine/renderer/MasterRenderer.cpp @@ -0,0 +1,35 @@ +// +// Created by sebastian on 08.02.26. +// + +#include "MasterRenderer.h" + +#include "../core/Application.h" +#include "glm/ext/matrix_clip_space.hpp" + +void MasterRenderer::render(const Light &light, const Camera &camera) { + entityRenderer->prepare(camera, light); + entityRenderer->renderEntities(entities); + entityRenderer->finalizeFrame(); + entities.clear(); + +} + +void MasterRenderer::submitEntity(Entity *entity) { + TexturedModel* entityModel = entity->getModel().get(); + entities[entityModel].push_back(entity); +} + + +glm::mat4 MasterRenderer::createProjectionMatrix() { + float aspectRatio = static_cast(Application::getInstance().getWindow().GetWidth()) / static_cast(Application::getInstance().getWindow().GetHeight()); + + glm::mat4 projection = glm::perspective( + glm::radians(FOV), + aspectRatio, + NEAR_PLANE, + FAR_PLANE + ); + + return projection; +} diff --git a/src/engine/renderer/MasterRenderer.h b/src/engine/renderer/MasterRenderer.h new file mode 100644 index 0000000..f211d92 --- /dev/null +++ b/src/engine/renderer/MasterRenderer.h @@ -0,0 +1,42 @@ +// +// Created by sebastian on 08.02.26. +// + +#ifndef MASTERRENDERER_H +#define MASTERRENDERER_H +#include +#include + +#include "Renderer.h" +#include "../../game/hexWorld/HexTile.h" +#include "../layer/entities/Entity.h" +#include "model/TexturedModel.h" + + +class Camera; +class Light; + +class MasterRenderer { +private: + std::unordered_map> entities; + std::unordered_map> terrainTiles; + glm::mat4 projectionMatrix; + std::unique_ptr entityRenderer; + constexpr static float FOV = 70.0f; + constexpr static float NEAR_PLANE = 0.1f; + constexpr static float FAR_PLANE = 1000.0f; + + static glm::mat4 createProjectionMatrix(); + +public: + MasterRenderer() : projectionMatrix(createProjectionMatrix()), entityRenderer(std::make_unique(projectionMatrix)){}; + void render(const Light &light, const Camera &camera); + + void submitEntity(Entity* entity); + + [[nodiscard]] glm::mat4 getProjectionMatrix() const {return projectionMatrix;} +}; + + + +#endif //MASTERRENDERER_H diff --git a/src/engine/renderer/Renderer.cpp b/src/engine/renderer/Renderer.cpp index 8b6daa2..2ad3e22 100644 --- a/src/engine/renderer/Renderer.cpp +++ b/src/engine/renderer/Renderer.cpp @@ -4,6 +4,8 @@ #include "Renderer.h" +#include + #include "../../game/hexWorld/HexTile.h" #include "../core/Application.h" #include "../layer/entities/Light.h" @@ -23,71 +25,47 @@ void Renderer::prepare(const Camera& camera, const Light& light) { staticShader.start(); staticShader.loadLight(light.getPosition(), light.getColor()); staticShader.loadViewMatrix(viewMatrix); - staticShader.stop(); } -void Renderer::renderFrame(const Entity &entity, const Camera& camera, const Light& light, const std::vector& terrain) { - prepare(camera, light); - staticShader.start(); - renderRawModel(entity); - for (const auto& terrainTile : terrain) { - renderHexTile(terrainTile); + +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); + } + + unbindTexturedModel(); } - staticShader.stop(); } -void Renderer::renderHexTile(const HexRenderData& tile) { - auto texturedModel = tile.model; - auto model = texturedModel->getRawModel(); - - glBindVertexArray(model->vaoID); +void Renderer::prepareTexturedModel(const TexturedModel &texturedModel) { + auto rawModel = texturedModel.getRawModel(); + glBindVertexArray(rawModel->vaoID); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); - glm::mat4 transformationMatrix = MathUtils::createTransformationMatrix(tile.position, 0, 0, 0, 1.f); - staticShader.loadTransformationMatrix(transformationMatrix); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texturedModel->getTexture()->getTextureID()); - glDrawElements(GL_TRIANGLES , model->vertexCount, GL_UNSIGNED_INT, 0); + glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID()); +} +void Renderer::unbindTexturedModel() { glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2); glBindVertexArray(0); } -void Renderer::renderRawModel(const Entity& entity) { - auto texturedModel = entity.getModel(); - auto model = texturedModel->getRawModel(); - glBindVertexArray(model->vaoID); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - glEnableVertexAttribArray(2); - +void Renderer::prepareInstance(const Entity &entity) { glm::mat4 transformationMatrix = MathUtils::createTransformationMatrix(entity.getPosition(), entity.getRotX(), entity.getRotY(), entity.getRotZ(), entity.getScale()); staticShader.loadTransformationMatrix(transformationMatrix); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texturedModel->getTexture()->getTextureID()); - glDrawElements(GL_TRIANGLES , model->vertexCount, GL_UNSIGNED_INT, 0); - glDisableVertexAttribArray(0); - glDisableVertexAttribArray(1); - glDisableVertexAttribArray(2); - glBindVertexArray(0); - } -glm::mat4 Renderer::createProjectionMatrix() { - float aspectRatio = static_cast(Application::getInstance().getWindow().GetWidth()) / static_cast(Application::getInstance().getWindow().GetHeight()); - - glm::mat4 projection = glm::perspective( - glm::radians(FOV), - aspectRatio, - NEAR_PLANE, - FAR_PLANE - ); - - return projection; +void Renderer::finalizeFrame() { + staticShader.stop(); } + + + diff --git a/src/engine/renderer/Renderer.h b/src/engine/renderer/Renderer.h index b140cec..9234e94 100644 --- a/src/engine/renderer/Renderer.h +++ b/src/engine/renderer/Renderer.h @@ -17,7 +17,7 @@ class Camera; class Renderer { public: - Renderer() : projectionMatrix(createProjectionMatrix()) { + explicit Renderer(const glm::mat4 &projectionMatrix) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -26,21 +26,17 @@ public: staticShader.stop(); }; void prepare(const ::Camera &camera, const Light& light); - void renderFrame(const ::Entity &entity, const ::Camera &camera, const ::Light &light, const std::vector &terrainTiles); - void renderHexTile(const HexRenderData &tile); - - [[nodiscard]] glm::mat4 getProjectionMatrix() const {return projectionMatrix;} + void renderEntities(const std::unordered_map> &entities); + void finalizeFrame(); private: - void renderRawModel(const Entity &entity); StaticShader staticShader; - glm::mat4 projectionMatrix; - constexpr static float FOV = 70.0f; - constexpr static float NEAR_PLANE = 0.1f; - constexpr static float FAR_PLANE = 1000.0f; + void prepareTexturedModel(const TexturedModel &texturedModel); + void unbindTexturedModel(); + void prepareInstance(const Entity &entity); + - static glm::mat4 createProjectionMatrix(); }; diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index bcbed58..c5ef74a 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -24,7 +24,7 @@ void GameLayer::onAttach() entity = std::make_unique(Entity(std::make_shared(texturedModel), glm::vec3(0,0,-25), 0,0,0, 1.f)); camera = std::make_unique(); light = std::make_unique(glm::vec3(0,10,0), glm::vec3(1,1,1)); - mousePicker = std::make_unique(renderer.getProjectionMatrix(), MathUtils::createViewMatrix(*camera)); + mousePicker = std::make_unique(renderer->getProjectionMatrix(), MathUtils::createViewMatrix(*camera)); //Map Generation hexModel = std::make_shared(HexModelFactory::createTexturedHexModel(loader)); @@ -54,7 +54,9 @@ void GameLayer::onUpdate() camera->move(moveDir, 0.5f); std::vector terrainRenderData = map->getTerrainRenderData(hexModel); - renderer.renderFrame(*entity, *camera, *light, terrainRenderData); + renderer->submitEntity(entity.get()); + + renderer->render(*light, *camera); } diff --git a/src/game/GameLayer.h b/src/game/GameLayer.h index c4c1c7c..5f00e11 100644 --- a/src/game/GameLayer.h +++ b/src/game/GameLayer.h @@ -10,6 +10,7 @@ #include "../engine/renderer/loader/Loader.h" #include "../engine/renderer/model/TexturedModel.h" #include "../engine/layer/entities/Camera.h" +#include "../engine/renderer/MasterRenderer.h" #include "hexWorld/Map.h" @@ -29,7 +30,7 @@ private: std::unique_ptr camera; std::unique_ptr light; std::unique_ptr mousePicker; - Renderer renderer; + std::unique_ptr renderer = std::make_unique(); std::shared_ptr hexModel; std::unique_ptr map;