From 7476719bb29fcdd2a3a3ab0112dd13476c3213ce Mon Sep 17 00:00:00 2001 From: sebastian Date: Sat, 14 Feb 2026 20:52:30 +0100 Subject: [PATCH] ADD: Minimap --- CMakeLists.txt | 9 ++ assets/shaders/minimapFragmentShader.glsl | 9 ++ assets/shaders/minimapVertexShader.glsl | 10 +++ src/engine/core/Application.cpp | 2 + src/engine/core/ECS/RenderSystem.cpp | 3 +- src/engine/renderer/MasterRenderer.cpp | 23 ++++- src/engine/renderer/MasterRenderer.h | 13 ++- src/engine/renderer/MinimapRenderer.cpp | 83 +++++++++++++++++++ src/engine/renderer/MinimapRenderer.h | 37 +++++++++ .../renderer/components/MinimapRenderData.h | 17 ++++ .../renderer/model/FramebufferObject.cpp | 9 ++ src/engine/renderer/model/FramebufferObject.h | 60 ++++++++++++++ src/engine/renderer/model/RenderTargets.cpp | 5 ++ src/engine/renderer/model/RenderTargets.h | 25 ++++++ src/engine/renderer/shaders/MinimapShader.cpp | 27 ++++++ src/engine/renderer/shaders/MinimapShader.h | 34 ++++++++ src/game/GameMode.cpp | 4 + src/game/GameMode.h | 1 + src/game/UILayer.cpp | 10 +++ src/game/hexWorld/MapGenerator.cpp | 17 ++++ src/game/hexWorld/MapGenerator.h | 12 +++ src/game/player/Player.cpp | 4 + src/game/player/Player.h | 3 + 23 files changed, 411 insertions(+), 6 deletions(-) create mode 100644 assets/shaders/minimapFragmentShader.glsl create mode 100644 assets/shaders/minimapVertexShader.glsl create mode 100644 src/engine/renderer/MinimapRenderer.cpp create mode 100644 src/engine/renderer/MinimapRenderer.h create mode 100644 src/engine/renderer/components/MinimapRenderData.h create mode 100644 src/engine/renderer/model/FramebufferObject.cpp create mode 100644 src/engine/renderer/model/FramebufferObject.h create mode 100644 src/engine/renderer/model/RenderTargets.cpp create mode 100644 src/engine/renderer/model/RenderTargets.h create mode 100644 src/engine/renderer/shaders/MinimapShader.cpp create mode 100644 src/engine/renderer/shaders/MinimapShader.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 979dbdf..397d167 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,6 +202,15 @@ add_executable(Dicewars_Siedler src/main.cpp src/engine/core/EngineTime.h src/game/hexWorld/ecs/systems/CollectResourceSystem.cpp src/game/hexWorld/ecs/systems/CollectResourceSystem.h + src/engine/renderer/model/FramebufferObject.cpp + src/engine/renderer/model/FramebufferObject.h + src/engine/renderer/MinimapRenderer.cpp + src/engine/renderer/MinimapRenderer.h + src/engine/renderer/components/MinimapRenderData.h + src/engine/renderer/shaders/MinimapShader.cpp + src/engine/renderer/shaders/MinimapShader.h + src/engine/renderer/model/RenderTargets.cpp + src/engine/renderer/model/RenderTargets.h ) target_compile_options(Dicewars_Siedler PRIVATE diff --git a/assets/shaders/minimapFragmentShader.glsl b/assets/shaders/minimapFragmentShader.glsl new file mode 100644 index 0000000..2a92417 --- /dev/null +++ b/assets/shaders/minimapFragmentShader.glsl @@ -0,0 +1,9 @@ +#version 400 core + +uniform vec3 color; + +out vec4 fragColor; + +void main() { + fragColor = vec4(color, 1.0); +} diff --git a/assets/shaders/minimapVertexShader.glsl b/assets/shaders/minimapVertexShader.glsl new file mode 100644 index 0000000..8fda98c --- /dev/null +++ b/assets/shaders/minimapVertexShader.glsl @@ -0,0 +1,10 @@ +#version 400 core + +layout(location = 0) in vec3 position; + +uniform mat4 transformationMatrix; +uniform mat4 viewProjectionMatrix; + +void main() { + gl_Position = viewProjectionMatrix * transformationMatrix * vec4(position, 1.0); +} diff --git a/src/engine/core/Application.cpp b/src/engine/core/Application.cpp index 1b28242..c3d1a4f 100644 --- a/src/engine/core/Application.cpp +++ b/src/engine/core/Application.cpp @@ -15,6 +15,8 @@ void Application::updateTime() { EngineTime::deltaTime = now - lastFrame; EngineTime::totalTime += EngineTime::deltaTime; lastFrame = now; + + printf("Frametime: %f\n", EngineTime::deltaTime); } void Application::pushLayer(Layer* layer) { diff --git a/src/engine/core/ECS/RenderSystem.cpp b/src/engine/core/ECS/RenderSystem.cpp index aa5e866..d55f61e 100644 --- a/src/engine/core/ECS/RenderSystem.cpp +++ b/src/engine/core/ECS/RenderSystem.cpp @@ -14,6 +14,7 @@ void RenderSystem::render(EntityManager &entityManager, MasterRenderer &renderer auto model = entityManager.getComponent(id); auto tileRenderingComponent = entityManager.getComponent(id); auto modelStateComponent = entityManager.getComponent(id); + auto ownerComponent = entityManager.getComponent(id); auto worldSpriteComponent = entityManager.getComponent(id); if (modelStateComponent) { @@ -27,7 +28,7 @@ void RenderSystem::render(EntityManager &entityManager, MasterRenderer &renderer } if (tileRenderingComponent) { - renderer.submitTerrainTile(transform, model, tileRenderingComponent); + renderer.submitTerrainTile(transform, model, tileRenderingComponent, ownerComponent); } else { 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/renderer/MasterRenderer.cpp b/src/engine/renderer/MasterRenderer.cpp index b9c7789..b0f0634 100644 --- a/src/engine/renderer/MasterRenderer.cpp +++ b/src/engine/renderer/MasterRenderer.cpp @@ -29,6 +29,15 @@ void MasterRenderer::render(const Light &light, const Camera &camera) { worldSpriteRenderer->finalize(); worldSprites.clear(); + std::unordered_map colorMapping; + colorMapping[0] = glm::vec3(1.0f, 0.0f, 0.0f); + colorMapping[1] = glm::vec3(0.0f, 1.0f, 0.0f); + colorMapping[2] = glm::vec3(0.0f, 0.0f, 1.0f); + colorMapping[3] = glm::vec3(1.0f, 1.0f, 0.0f); + + minimapRenderer->render(minimapRenderData, colorMapping); + minimapRenderData.clear(); + } void MasterRenderer::submitEntity(std::unique_ptr entity) { @@ -36,11 +45,19 @@ void MasterRenderer::submitEntity(std::unique_ptr entity) { entities[entityModel].push_back(std::move(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->getActiveModel().get()].push_back(std::make_unique(std::move(terrain))); +void MasterRenderer::submitTerrainTile(const std::shared_ptr& transform, + const std::shared_ptr& model, + const std::shared_ptr& terrainTileComponent, + const std::shared_ptr& owner) +{ + auto terrain = std::make_unique(transform, model, terrainTileComponent); + + terrainTiles[model->getActiveModel().get()].push_back(std::move(terrain)); + + minimapRenderData.emplace_back(model, transform, owner); } + void MasterRenderer::submitWorldSprite( const std::shared_ptr& transform, const std::shared_ptr& sprite, diff --git a/src/engine/renderer/MasterRenderer.h b/src/engine/renderer/MasterRenderer.h index 3f3c656..e9a8a8c 100644 --- a/src/engine/renderer/MasterRenderer.h +++ b/src/engine/renderer/MasterRenderer.h @@ -7,10 +7,12 @@ #include #include +#include "MinimapRenderer.h" #include "Renderer.h" #include "TerrainRenderer.h" #include "WorldSpriteRenderer.h" #include "../layer/entities/Entity.h" +#include "model/RenderTargets.h" #include "model/TexturedModel.h" @@ -22,10 +24,12 @@ private: std::unordered_map>> entities; std::unordered_map>> terrainTiles; std::unordered_map> worldSprites; + std::vector minimapRenderData; glm::mat4 projectionMatrix; std::unique_ptr entityRenderer; std::unique_ptr terrainRenderer; std::unique_ptr worldSpriteRenderer; + std::unique_ptr minimapRenderer; constexpr static float FOV = 70.0f; constexpr static float NEAR_PLANE = 0.1f; constexpr static float FAR_PLANE = 1000.0f; @@ -34,15 +38,20 @@ private: public: MasterRenderer() : projectionMatrix(createProjectionMatrix()), entityRenderer(std::make_unique(projectionMatrix)), - terrainRenderer(std::make_unique(projectionMatrix)), worldSpriteRenderer(std::make_unique(projectionMatrix)) + terrainRenderer(std::make_unique(projectionMatrix)), worldSpriteRenderer(std::make_unique(projectionMatrix)), + minimapRenderer(std::make_unique(600,400)) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); + + + RenderTargets::instance().setMinimapTexture(minimapRenderer->getMinimapTexture()); }; void render(const Light &light, const Camera &camera); void submitEntity(std::unique_ptr entity); - void submitTerrainTile(std::shared_ptr transform, std::shared_ptr model, std::shared_ptr); + void submitTerrainTile(const std::shared_ptr& transform, const std::shared_ptr& model, const std::shared_ptr< + TileRenderComponent>&, const std::shared_ptr& owner); void submitWorldSprite(const std::shared_ptr &transform, const std::shared_ptr &sprite, const std:: shared_ptr &texture); diff --git a/src/engine/renderer/MinimapRenderer.cpp b/src/engine/renderer/MinimapRenderer.cpp new file mode 100644 index 0000000..cb3a503 --- /dev/null +++ b/src/engine/renderer/MinimapRenderer.cpp @@ -0,0 +1,83 @@ +// +// Created by sebastian on 14.02.26. +// + +#include "MinimapRenderer.h" + +#include "../../game/GameMode.h" +#include "../../game/hexWorld/MapGenerator.h" +#include "../core/ECS/ModelComponent.h" +#include "../core/ECS/TransformComponent.h" +#include "../toolbox/MathUtils.h" +#include "glm/ext/matrix_clip_space.hpp" +#include "glm/ext/matrix_transform.hpp" + + +void MinimapRenderer::render(const std::vector &renderData, std::unordered_map colorMapping) { + minimapFBO->bind(); + glViewport(0,0, width, height); + glClear(GL_COLOR_BUFFER_BIT); + + glDisable(GL_DEPTH_TEST); + + + prepareShader(); + for (const MinimapRenderData& renderDatum : renderData) { + prepareInstance(renderDatum, colorMapping); + + for (const auto& submodel : renderDatum.modelComponent->getActiveModel()->getSubModels()) { + glBindVertexArray(submodel.rawModel->vaoID); + glEnableVertexAttribArray(0); + + glDrawElements(GL_TRIANGLES, submodel.rawModel->vertexCount, GL_UNSIGNED_INT, 0); + + glDisableVertexAttribArray(0); + glBindVertexArray(0); + } + + } + finalizeShader(); + minimapFBO->unbind(); + + glViewport(0,0, Application::getInstance().getWindow().GetWidth(), Application::getInstance().getWindow().GetHeight()); + glEnable(GL_DEPTH_TEST); +} + +GLuint MinimapRenderer::getMinimapTexture() { + return minimapFBO->getColorTexture(); +} + +void MinimapRenderer::prepareShader() { + minimapShader.start(); + + MapBounds bounds = MapGenerator::getMapBounds(); + + + float mapWidth = bounds.maxX - bounds.minX; + float mapHeight = bounds.maxZ - bounds.minZ; + glm::vec3 mapCenter( + bounds.minX + mapWidth * 0.5f, + 50.0f, + bounds.minZ + mapHeight * 0.5f + ); + + glm::mat4 view = glm::lookAt(mapCenter + glm::vec3(0,50,0), mapCenter, glm::vec3(0,0,1)); + glm::mat4 proj = glm::ortho(-mapWidth * 0.5f, mapWidth * 0.5f, -mapHeight * 0.5f, mapHeight * 0.5f, -100.f, 100.0f); + + minimapShader.loadViewProjectionMatrix(proj * view); +} + +void MinimapRenderer::finalizeShader() { + minimapShader.stop(); +} + +void MinimapRenderer::prepareInstance(const MinimapRenderData &data, const std::unordered_map& colorMapping) { + glm::mat4 model = MathUtils::createTransformationMatrix(data.transform->position, data.transform->rotation.x, data.transform->rotation.y, data.transform->rotation.z, data.transform->scale); + minimapShader.loadTransformationMatrix(model); + + auto color = glm::vec3(0.5f); + if (data.owner) { + color = colorMapping.at(data.owner->playerID); + } + minimapShader.loadColor(color); +} diff --git a/src/engine/renderer/MinimapRenderer.h b/src/engine/renderer/MinimapRenderer.h new file mode 100644 index 0000000..47bd63e --- /dev/null +++ b/src/engine/renderer/MinimapRenderer.h @@ -0,0 +1,37 @@ +// +// Created by sebastian on 14.02.26. +// + +#ifndef DICEWARS_SIEDLER_MINIMAPRENDERER_H +#define DICEWARS_SIEDLER_MINIMAPRENDERER_H +#include +#include + +#include "../../game/GameMode.h" +#include "components/MinimapRenderData.h" +#include "model/FramebufferObject.h" +#include "shaders/MinimapShader.h" + + +class MinimapRenderer { +public: + MinimapRenderer(int width, int height): width(width), height(height) { + minimapFBO = std::make_unique(width, height); + } + + void render(const std::vector &renderData, std::unordered_map colorMapping); + + GLuint getMinimapTexture(); + +private: + std::unique_ptr minimapFBO; + MinimapShader minimapShader; + int width, height; + + void prepareShader(); + void finalizeShader(); + void prepareInstance(const MinimapRenderData &data, const std::unordered_map& colorMapping); +}; + + +#endif //DICEWARS_SIEDLER_MINIMAPRENDERER_H \ No newline at end of file diff --git a/src/engine/renderer/components/MinimapRenderData.h b/src/engine/renderer/components/MinimapRenderData.h new file mode 100644 index 0000000..50512ce --- /dev/null +++ b/src/engine/renderer/components/MinimapRenderData.h @@ -0,0 +1,17 @@ +// +// Created by sebastian on 14.02.26. +// + +#ifndef DICEWARS_SIEDLER_MINIMAPRENDERDATA_H +#define DICEWARS_SIEDLER_MINIMAPRENDERDATA_H +#include + +#include "../../../game/hexWorld/ecs/components/TileGameplayComponent.h" + +struct MinimapRenderData { + std::shared_ptr modelComponent; + std::shared_ptr transform; + std::shared_ptr owner; +}; + +#endif //DICEWARS_SIEDLER_MINIMAPRENDERDATA_H \ No newline at end of file diff --git a/src/engine/renderer/model/FramebufferObject.cpp b/src/engine/renderer/model/FramebufferObject.cpp new file mode 100644 index 0000000..cd2fcba --- /dev/null +++ b/src/engine/renderer/model/FramebufferObject.cpp @@ -0,0 +1,9 @@ +// +// Created by sebastian on 14.02.26. +// + +#include "FramebufferObject.h" + +GLuint FramebufferObject::getColorTexture() const { + return colorTextureID; +} diff --git a/src/engine/renderer/model/FramebufferObject.h b/src/engine/renderer/model/FramebufferObject.h new file mode 100644 index 0000000..110e205 --- /dev/null +++ b/src/engine/renderer/model/FramebufferObject.h @@ -0,0 +1,60 @@ +// +// Created by sebastian on 14.02.26. +// + +#ifndef DICEWARS_SIEDLER_FRAMEBUFFEROBJECT_H +#define DICEWARS_SIEDLER_FRAMEBUFFEROBJECT_H +#include + +#include "glad/glad.h" + + +class FramebufferObject { +public: + FramebufferObject(int width, int height, bool withDepth = true) : width(width), height(height) { + // Fbo erzeugen + glGenFramebuffers(1, &fboID); + glBindFramebuffer(GL_FRAMEBUFFER, fboID); + + // Color Texture + glGenTextures(1, &colorTextureID); + glBindTexture(GL_TEXTURE_2D, colorTextureID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTextureID, 0); + + if (withDepth) { + glGenRenderbuffers(1, &rboDepthID); + glBindRenderbuffer(GL_RENDERBUFFER, rboDepthID); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboDepthID); + } + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + throw std::runtime_error("Framebuffer is incomplete!"); + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } + + ~FramebufferObject() { + glDeleteFramebuffers(1, &fboID); + glDeleteTextures(1, &colorTextureID); + if (rboDepthID) glDeleteRenderbuffers(1, &rboDepthID); + } + + void bind() const { glBindFramebuffer(GL_FRAMEBUFFER, fboID); } + void unbind() const { glBindFramebuffer(GL_FRAMEBUFFER, 0); } + + GLuint getColorTexture() const; + +private: + GLuint fboID = 0; + GLuint colorTextureID = 0; + GLuint rboDepthID = 0; + int width, height; +}; + + +#endif //DICEWARS_SIEDLER_FRAMEBUFFEROBJECT_H \ No newline at end of file diff --git a/src/engine/renderer/model/RenderTargets.cpp b/src/engine/renderer/model/RenderTargets.cpp new file mode 100644 index 0000000..b3e2487 --- /dev/null +++ b/src/engine/renderer/model/RenderTargets.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 14.02.26. +// + +#include "RenderTargets.h" \ No newline at end of file diff --git a/src/engine/renderer/model/RenderTargets.h b/src/engine/renderer/model/RenderTargets.h new file mode 100644 index 0000000..6bf4f97 --- /dev/null +++ b/src/engine/renderer/model/RenderTargets.h @@ -0,0 +1,25 @@ +// +// Created by sebastian on 14.02.26. +// + +#ifndef DICEWARS_SIEDLER_RENDERTARGETS_H +#define DICEWARS_SIEDLER_RENDERTARGETS_H +#include "glad/glad.h" + + +class RenderTargets { +public: + static RenderTargets& instance() { + static RenderTargets instance; + return instance; + } + + [[nodiscard]] GLuint getMinimapTexture() const {return minimapTexture;} + void setMinimapTexture(const GLuint textureID) {minimapTexture = textureID;} + +private: + GLuint minimapTexture = 0; +}; + + +#endif //DICEWARS_SIEDLER_RENDERTARGETS_H \ No newline at end of file diff --git a/src/engine/renderer/shaders/MinimapShader.cpp b/src/engine/renderer/shaders/MinimapShader.cpp new file mode 100644 index 0000000..71e1ed5 --- /dev/null +++ b/src/engine/renderer/shaders/MinimapShader.cpp @@ -0,0 +1,27 @@ +// +// Created by sebastian on 14.02.26. +// + +#include "MinimapShader.h" + +void MinimapShader::loadTransformationMatrix(const glm::mat4 &matrix) { + ShaderProgram::loadMatrix(location_transformationMatrix, matrix); +} + +void MinimapShader::loadViewProjectionMatrix(const glm::mat4 &matrix) { + ShaderProgram::loadMatrix(location_viewProjectionMatrix, matrix); +} + +void MinimapShader::loadColor(glm::vec3 color) { + ShaderProgram::loadVector(location_color, color); +} + +void MinimapShader::getAllUniformLocations() { + location_color = getUniformLocation("color"); + location_transformationMatrix = getUniformLocation("transformationMatrix"); + location_viewProjectionMatrix = getUniformLocation("viewProjectionMatrix"); +} + +void MinimapShader::bindAttributes() const { + bindAttribute(0, "position"); +} diff --git a/src/engine/renderer/shaders/MinimapShader.h b/src/engine/renderer/shaders/MinimapShader.h new file mode 100644 index 0000000..5ee2fc6 --- /dev/null +++ b/src/engine/renderer/shaders/MinimapShader.h @@ -0,0 +1,34 @@ +// +// Created by sebastian on 14.02.26. +// + +#ifndef DICEWARS_SIEDLER_MINIMAPSHADER_H +#define DICEWARS_SIEDLER_MINIMAPSHADER_H +#include "ShaderProgram.h" + + +class MinimapShader: public ShaderProgram { +public: + MinimapShader() : ShaderProgram(VERTEX_FILE, FRAGMENT_FILE) { + MinimapShader::bindAttributes(); + MinimapShader::getAllUniformLocations(); + } + + void loadTransformationMatrix(const glm::mat4 &matrix); + void loadViewProjectionMatrix(const glm::mat4 &matrix); + void loadColor(glm::vec3 color); +private: + int location_transformationMatrix; + int location_viewProjectionMatrix; + int location_color; + +protected: + inline static const std::string VERTEX_FILE = "assets/shaders/minimapVertexShader.glsl"; + inline static const std::string FRAGMENT_FILE = "assets/shaders/minimapFragmentShader.glsl"; + + void getAllUniformLocations() override; + void bindAttributes() const override; +}; + + +#endif //DICEWARS_SIEDLER_MINIMAPSHADER_H \ No newline at end of file diff --git a/src/game/GameMode.cpp b/src/game/GameMode.cpp index 231908f..565c8b1 100644 --- a/src/game/GameMode.cpp +++ b/src/game/GameMode.cpp @@ -79,4 +79,8 @@ void GameMode::addResource(PlayerID playerID, RessourceType ressource, int amoun players[playerID].getInventory()->add(ressource, amount); } +glm::vec3 GameMode::getColorOfPlayer(PlayerID playerID) { + return players[playerID].getColor(); +} + diff --git a/src/game/GameMode.h b/src/game/GameMode.h index 3f3bb43..c48f6df 100644 --- a/src/game/GameMode.h +++ b/src/game/GameMode.h @@ -38,6 +38,7 @@ public: bool getCurrentTurnPlayer(int turn) const; void addResource(PlayerID uint32, RessourceType ressource, int get_storage); + glm::vec3 getColorOfPlayer(PlayerID playerID); private: std::unordered_map players; diff --git a/src/game/UILayer.cpp b/src/game/UILayer.cpp index aab0a9f..40b584c 100644 --- a/src/game/UILayer.cpp +++ b/src/game/UILayer.cpp @@ -14,6 +14,7 @@ #include "../engine/core/gui/uiComponent/UiText.h" #include "../engine/renderer/loader/Loader.h" #include "../engine/renderer/model/GUITexture.h" +#include "../engine/renderer/model/RenderTargets.h" #include "hexWorld/events/TurnChangedEvent.h" #include "ui/components/UiInventoryContainer.h" #include "ui/components/UiRessourceWidget.h" @@ -92,6 +93,15 @@ void UILayer::onAttach() { turnTextLabel->setText("Runde: " + std::to_string(event.newTurn)); }; }); + + auto minimapStyle = LayoutStyle(); + minimapStyle.width = SizeValue(600, SizeUnit::Pixels); + minimapStyle.height = SizeValue(400.f, SizeUnit::Pixels); + minimapStyle.margin.top = {10.f, SizeUnit::Pixels}; + + GLuint minimapTextureID = RenderTargets::instance().getMinimapTexture(); + auto minimap = std::make_unique(minimapTextureID, minimapStyle); + rootContainer->addChild(std::move(minimap)); } void UILayer::onUpdate() { diff --git a/src/game/hexWorld/MapGenerator.cpp b/src/game/hexWorld/MapGenerator.cpp index b2793c5..30cd41e 100644 --- a/src/game/hexWorld/MapGenerator.cpp +++ b/src/game/hexWorld/MapGenerator.cpp @@ -12,6 +12,7 @@ struct TileInfo { }; float MapGenerator::hexRadius = 10.0f; +MapBounds MapGenerator::mapBounds; void MapGenerator::init(Loader &loader, float hexRadius) { MapGenerator::hexRadius = hexRadius; @@ -72,6 +73,7 @@ void MapGenerator::generateHexMap(Map &map, int width, int height, EntityManager } assignOwners(entityManager, 2); + computeMapBounds(entityManager); } void MapGenerator::assignOwners(EntityManager &entityManager, int numPlayers) { @@ -170,3 +172,18 @@ bool MapGenerator::areHexNeighbors(int q1, int r1, int q2, int r2) { } return false; } + +MapBounds MapGenerator::getMapBounds() { + return mapBounds; +} + +void MapGenerator::computeMapBounds(EntityManager em) { + for (EntityID e : em.getAllEntities()) { + if (auto t = em.getComponent(e)) { + mapBounds.minX = std::min(mapBounds.minX, t->position.x); + mapBounds.maxX = std::max(mapBounds.maxX, t->position.x); + mapBounds.minZ = std::min(mapBounds.minZ, t->position.z); + mapBounds.maxZ = std::max(mapBounds.maxZ, t->position.z); + } + } +} diff --git a/src/game/hexWorld/MapGenerator.h b/src/game/hexWorld/MapGenerator.h index a718d89..7ef8cdc 100644 --- a/src/game/hexWorld/MapGenerator.h +++ b/src/game/hexWorld/MapGenerator.h @@ -4,6 +4,7 @@ #ifndef MAPGENERATOR_H #define MAPGENERATOR_H +#include #include #include @@ -18,6 +19,13 @@ #include "ecs/components/TileGameplayComponent.h" #include "tileGenerator/ForestTileGenerator.h" +struct MapBounds { + float minX = FLT_MAX; + float maxX = -FLT_MAX; + float minZ = FLT_MAX; + float maxZ = -FLT_MAX; +}; + struct MapArea { int id; std::vector> tiles; @@ -26,6 +34,8 @@ struct MapArea { class MapGenerator { private: static float hexRadius; + static MapBounds mapBounds; + static void computeMapBounds(EntityManager em); public: static void init(Loader& loader, float hexRadius); static void generateHexMap(Map& map, int width, int height, EntityManager& entityManager); @@ -33,6 +43,8 @@ public: static void assignOwners(EntityManager &entityManager, int numPlayers); static bool areHexNeighbors(int tile_q, int tile_r, int neighbor_q, int neighbor_r); + static MapBounds getMapBounds(); + private: diff --git a/src/game/player/Player.cpp b/src/game/player/Player.cpp index dd3a43c..00e55fa 100644 --- a/src/game/player/Player.cpp +++ b/src/game/player/Player.cpp @@ -7,3 +7,7 @@ const std::unique_ptr & Player::getInventory() const { return inventory; } + +glm::vec3 Player::getColor() const { + return color; +} diff --git a/src/game/player/Player.h b/src/game/player/Player.h index e8bbf8f..12ba414 100644 --- a/src/game/player/Player.h +++ b/src/game/player/Player.h @@ -10,6 +10,7 @@ #include #include "PlayerInventory.h" +#include "glm/vec3.hpp" using PlayerID = std::uint32_t; @@ -19,6 +20,7 @@ private: std::string name; std::unique_ptr inventory = std::make_unique(); bool isAI = false; + glm::vec3 color = glm::vec3(1.0f); public: Player() = default; @@ -28,6 +30,7 @@ public: }; const std::unique_ptr &getInventory() const; + glm::vec3 getColor() const; };