From 8d6a314a3c60f7431450f2722edbb4abc472851c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 25 Apr 2026 10:51:48 +0200 Subject: [PATCH] ADD: Dimming Text --- CMakeLists.txt | 6 +++ assets/shaders/textFragmentShader.glsl | 2 + src/engine/core/Application.cpp | 5 ++- src/engine/core/Application.h | 2 + src/engine/core/EngineContext.cpp | 5 +++ src/engine/core/EngineContext.h | 18 +++++++++ src/engine/core/gui/uiMain/UiConfig.h | 19 +++++++++ src/engine/core/gui/uiMain/UiContainer.cpp | 1 + src/engine/core/gui/uiMain/UiStack.cpp | 25 ++++++++++++ src/engine/core/gui/uiMain/UiStack.h | 26 +++++++++++++ src/engine/core/scenes/Scene.h | 2 +- src/engine/core/scenes/SceneManager.cpp | 3 +- src/engine/core/scenes/SceneManager.h | 7 +++- src/engine/core/scenes/SplashScreen.cpp | 2 +- src/engine/core/scenes/SplashScreen.h | 2 +- src/engine/core/scenes/SplashScreenLayer.cpp | 2 +- src/engine/core/scenes/SplashScreenLayer.h | 2 +- src/engine/renderer/RenderContext.h | 21 ++++++++++ src/engine/renderer/TextRenderer.cpp | 3 +- src/engine/renderer/TextRenderer.h | 6 ++- src/engine/renderer/shaders/TextShader.cpp | 4 ++ src/engine/renderer/shaders/TextShader.h | 1 + src/game/UILayer.cpp | 3 +- src/game/scenes/main/MainMenu.cpp | 4 +- src/game/scenes/main/MainMenu.h | 2 +- src/game/scenes/main/MainUiLayer.cpp | 41 +++++++++++++------- src/game/scenes/main/MainUiLayer.h | 6 ++- 27 files changed, 186 insertions(+), 34 deletions(-) create mode 100644 src/engine/core/EngineContext.cpp create mode 100644 src/engine/core/EngineContext.h create mode 100644 src/engine/core/gui/uiMain/UiConfig.h create mode 100644 src/engine/core/gui/uiMain/UiStack.cpp create mode 100644 src/engine/core/gui/uiMain/UiStack.h create mode 100644 src/engine/renderer/RenderContext.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f9ec57..e901d92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -326,6 +326,12 @@ if(BUILD_GAME) src/game/scenes/main/MainUiLayer.cpp src/game/scenes/main/MainUiLayer.h src/game/scenes/main/events/QuitEvent.h + src/engine/core/gui/uiMain/UiStack.cpp + src/engine/core/gui/uiMain/UiStack.h + src/engine/core/EngineContext.cpp + src/engine/core/EngineContext.h + src/engine/core/gui/uiMain/UiConfig.h + src/engine/renderer/RenderContext.h ) target_compile_options(Dicewars_Siedler PRIVATE -Wall diff --git a/assets/shaders/textFragmentShader.glsl b/assets/shaders/textFragmentShader.glsl index 60c4cfb..e97526a 100644 --- a/assets/shaders/textFragmentShader.glsl +++ b/assets/shaders/textFragmentShader.glsl @@ -6,8 +6,10 @@ out vec4 outColor; uniform sampler2D text; uniform vec3 textColor; +uniform float dimFactor; void main() { float alpha = texture(text, pass_texCoords).r; outColor = vec4(textColor, alpha); + outColor *= dimFactor; } diff --git a/src/engine/core/Application.cpp b/src/engine/core/Application.cpp index e67e4d4..a86461c 100644 --- a/src/engine/core/Application.cpp +++ b/src/engine/core/Application.cpp @@ -24,7 +24,8 @@ void Application::updateTime() { Application::Application() { instance = this; - sceneManager = std::make_unique(); + context = std::make_unique(); + sceneManager = std::make_unique(*context.get()); WindowProps window_props = WindowProps(); window_props.Width = 1280; @@ -66,4 +67,4 @@ void Application::run() { Application& Application::getInstance() { return *instance; -} +} \ No newline at end of file diff --git a/src/engine/core/Application.h b/src/engine/core/Application.h index 627e651..85d12c8 100644 --- a/src/engine/core/Application.h +++ b/src/engine/core/Application.h @@ -7,6 +7,7 @@ #include #include +#include "EngineContext.h" #include "Window.h" #include "events/EventBus.h" #include "inputsOutputs/inputs/Keyboard.h" @@ -34,6 +35,7 @@ public: std::unique_ptr stateManager; std::shared_ptr gameState; std::unique_ptr sceneManager; + std::unique_ptr context; private: bool running = true; std::unique_ptr window; diff --git a/src/engine/core/EngineContext.cpp b/src/engine/core/EngineContext.cpp new file mode 100644 index 0000000..b9323d1 --- /dev/null +++ b/src/engine/core/EngineContext.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 25.04.26. +// + +#include "EngineContext.h" diff --git a/src/engine/core/EngineContext.h b/src/engine/core/EngineContext.h new file mode 100644 index 0000000..1af4efa --- /dev/null +++ b/src/engine/core/EngineContext.h @@ -0,0 +1,18 @@ +// +// Created by sebastian on 25.04.26. +// + +#ifndef ENGINECONTEXT_H +#define ENGINECONTEXT_H +#include "gui/uiMain/UiConfig.h" + + +class EngineContext { +public: + UiConfig uiConfig = UiConfig(); + +}; + + + +#endif //ENGINECONTEXT_H diff --git a/src/engine/core/gui/uiMain/UiConfig.h b/src/engine/core/gui/uiMain/UiConfig.h new file mode 100644 index 0000000..0b27f49 --- /dev/null +++ b/src/engine/core/gui/uiMain/UiConfig.h @@ -0,0 +1,19 @@ +// +// Created by sebastian on 25.04.26. +// + +#ifndef UICONFIG_H +#define UICONFIG_H +#include "json.hpp" + +struct UiConfig { + float backgroundDim = 0.6f; + + static UiConfig fromJson(const nlohmann::json & j) { + UiConfig cfg; + cfg.backgroundDim = j.at("backgroundDim").get(); + return cfg; + } +}; + +#endif //UICONFIG_H diff --git a/src/engine/core/gui/uiMain/UiContainer.cpp b/src/engine/core/gui/uiMain/UiContainer.cpp index 554e405..93ccc80 100644 --- a/src/engine/core/gui/uiMain/UiContainer.cpp +++ b/src/engine/core/gui/uiMain/UiContainer.cpp @@ -24,6 +24,7 @@ void UiContainer::onUpdate(float x) { } void UiContainer::onCollectRenderData(UiRenderBundle& renderBundle) { + if (backgroundTextureID.has_value()) { GUITextureBuilder builder = GUITextureBuilder(); builder.Foreground(backgroundTextureID.value()); diff --git a/src/engine/core/gui/uiMain/UiStack.cpp b/src/engine/core/gui/uiMain/UiStack.cpp new file mode 100644 index 0000000..61f0de7 --- /dev/null +++ b/src/engine/core/gui/uiMain/UiStack.cpp @@ -0,0 +1,25 @@ +// +// Created by sebastian on 25.04.26. +// + +#include "UiStack.h" + +void UiStack::push(std::unique_ptr panel) { + panels.push_back(std::move(panel)); +} + +void UiStack::pop() { + panels.pop_back(); +} + +UiContainer * UiStack::top() { + return panels.empty() ? nullptr : panels.back().get(); +} + +const std::vector> & UiStack::getPanels() const { + return panels; +} + +bool UiStack::isTop(const UiContainer *panel) const { + return !panels.empty() && panels.back().get() == panel; +} diff --git a/src/engine/core/gui/uiMain/UiStack.h b/src/engine/core/gui/uiMain/UiStack.h new file mode 100644 index 0000000..103cc18 --- /dev/null +++ b/src/engine/core/gui/uiMain/UiStack.h @@ -0,0 +1,26 @@ +// +// Created by sebastian on 25.04.26. +// + +#ifndef UISTACK_H +#define UISTACK_H +#include + +#include "UiContainer.h" + + +class UiStack { +public: + void push(std::unique_ptr panel); + void pop(); + UiContainer* top(); + const std::vector>& getPanels() const; + bool isTop(const UiContainer* panel) const; +private: + std::vector> panels; + +}; + + + +#endif //UISTACK_H diff --git a/src/engine/core/scenes/Scene.h b/src/engine/core/scenes/Scene.h index 4334417..9eb7d64 100644 --- a/src/engine/core/scenes/Scene.h +++ b/src/engine/core/scenes/Scene.h @@ -14,7 +14,7 @@ class Scene { public: virtual ~Scene() = default; - virtual void onEnter() {} //Layer registrieren + virtual void onEnter(EngineContext& ctx) {} //Layer registrieren virtual void onExit() { for (const auto& layer : layers) { layer->onDetach(); diff --git a/src/engine/core/scenes/SceneManager.cpp b/src/engine/core/scenes/SceneManager.cpp index c5b568e..73ee159 100644 --- a/src/engine/core/scenes/SceneManager.cpp +++ b/src/engine/core/scenes/SceneManager.cpp @@ -4,7 +4,6 @@ #include "SceneManager.h" -#include "Scene.h" #include "spdlog/spdlog.h" void SceneManager::switchTo(std::unique_ptr next, std::function onLoaded) { @@ -29,7 +28,7 @@ void SceneManager::update() { } currentScene = std::move(nextScene); nextScene = nullptr; - currentScene->onEnter(); + currentScene->onEnter(ctx); assetLoader.stop(); if (onSceneLoaded) { diff --git a/src/engine/core/scenes/SceneManager.h b/src/engine/core/scenes/SceneManager.h index c3956ac..11e5335 100644 --- a/src/engine/core/scenes/SceneManager.h +++ b/src/engine/core/scenes/SceneManager.h @@ -6,11 +6,13 @@ #define SCENEMANAGER_H #include -#include "../../renderer/loader/async/AssetLoader.h"" -class Scene; +#include "../../renderer/loader/async/AssetLoader.h" +#include "../EngineContext.h" +#include "Scene.h" class SceneManager { public: + explicit SceneManager(EngineContext& ctx) : ctx(ctx) {} void switchTo(std::unique_ptr next, std::function onLoaded = nullptr); void update(); void render(); @@ -20,6 +22,7 @@ public: private: std::unique_ptr currentScene; std::unique_ptr nextScene; + EngineContext& ctx; AssetLoader assetLoader; diff --git a/src/engine/core/scenes/SplashScreen.cpp b/src/engine/core/scenes/SplashScreen.cpp index 0af88ea..58e075d 100644 --- a/src/engine/core/scenes/SplashScreen.cpp +++ b/src/engine/core/scenes/SplashScreen.cpp @@ -14,7 +14,7 @@ std::vector SplashScreen::getRequiredAssets() { return requests; } -void SplashScreen::onEnter() { +void SplashScreen::onEnter(EngineContext& ctx) { addLayer(std::make_unique()); } diff --git a/src/engine/core/scenes/SplashScreen.h b/src/engine/core/scenes/SplashScreen.h index 8f0b7d6..7ee0aa1 100644 --- a/src/engine/core/scenes/SplashScreen.h +++ b/src/engine/core/scenes/SplashScreen.h @@ -10,7 +10,7 @@ class SplashScreen : public Scene { public: std::vector getRequiredAssets() override; - void onEnter() override; + void onEnter(EngineContext& ctx) override; void onExit() override; }; diff --git a/src/engine/core/scenes/SplashScreenLayer.cpp b/src/engine/core/scenes/SplashScreenLayer.cpp index cb3ddbe..fc845ac 100644 --- a/src/engine/core/scenes/SplashScreenLayer.cpp +++ b/src/engine/core/scenes/SplashScreenLayer.cpp @@ -12,7 +12,7 @@ #include "../gui/uiMain/UiContainer.h" #include "spdlog/spdlog.h" -SplashScreenLayer::SplashScreenLayer() { +SplashScreenLayer::SplashScreenLayer(): progressbar(nullptr) { guiRenderer = std::make_unique(Loader::instance()); } diff --git a/src/engine/core/scenes/SplashScreenLayer.h b/src/engine/core/scenes/SplashScreenLayer.h index eaffe54..a384f27 100644 --- a/src/engine/core/scenes/SplashScreenLayer.h +++ b/src/engine/core/scenes/SplashScreenLayer.h @@ -12,7 +12,7 @@ class SplashScreenLayer: public Layer { public: - SplashScreenLayer(); + explicit SplashScreenLayer(); virtual void onRender() override; virtual void onUpdate() override; virtual void onAttach() override; diff --git a/src/engine/renderer/RenderContext.h b/src/engine/renderer/RenderContext.h new file mode 100644 index 0000000..e8e27c9 --- /dev/null +++ b/src/engine/renderer/RenderContext.h @@ -0,0 +1,21 @@ +// +// Created by sebastian on 25.04.26. +// + +#ifndef RENDERCONTEXT_H +#define RENDERCONTEXT_H +struct RenderContext { + float dimFactor = 1.0f; + // später einfach erweiterbar: + // float colorTint = 1.0f; + // glm::vec4 clipRect = ...; + + static RenderContext Default() { + return RenderContext{}; + } + + static RenderContext Dimmed(float factor) { + return RenderContext{ factor }; + } +}; +#endif //RENDERCONTEXT_H diff --git a/src/engine/renderer/TextRenderer.cpp b/src/engine/renderer/TextRenderer.cpp index a31faf0..9819dce 100644 --- a/src/engine/renderer/TextRenderer.cpp +++ b/src/engine/renderer/TextRenderer.cpp @@ -9,9 +9,10 @@ #include "../core/gui/text/Font.h" #include "glm/ext/matrix_clip_space.hpp" -void TextRenderer::renderGuiTexts(const std::vector> &texts, const float width, const float height) { +void TextRenderer::renderGuiTexts(const std::vector> &texts, const float width, const float height, RenderContext& ctx) { shader.start(); shader.loadProjectionMatrix(calculateOrthographicProjectionMatrix(width, height)); + shader.loadDimFactor(ctx.dimFactor); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/engine/renderer/TextRenderer.h b/src/engine/renderer/TextRenderer.h index 8ec40ad..5f2c7f6 100644 --- a/src/engine/renderer/TextRenderer.h +++ b/src/engine/renderer/TextRenderer.h @@ -6,6 +6,7 @@ #define DICEWARS_SIEDLER_TEXTRENDERER_H #include +#include "RenderContext.h" #include "../core/gui/uiComponent/UiText.h" #include "loader/Loader.h" #include "model/RawModel.h" @@ -16,12 +17,13 @@ class TextRenderer { public: TextRenderer() : textModel(Loader::instance().loadTextModel()) {}; - void renderGuiTexts(const std::vector> & texts, float width, float height); + void renderGuiTexts(const std::vector> & texts, float width, float height, RenderContext& ctx); void renderGuiText(const GUIText& text, float width, float height); - + void setDimFactor(const float dimFactor) {this->dimFactor = dimFactor;} private: TextShader shader; TextQuadModel textModel; + float dimFactor = 1.0f; static glm::mat4 calculateOrthographicProjectionMatrix(float width, float height); }; diff --git a/src/engine/renderer/shaders/TextShader.cpp b/src/engine/renderer/shaders/TextShader.cpp index 21e63d4..fedf6cd 100644 --- a/src/engine/renderer/shaders/TextShader.cpp +++ b/src/engine/renderer/shaders/TextShader.cpp @@ -12,6 +12,10 @@ void TextShader::loadTextColor(glm::vec3 color) { ShaderProgram::loadVector(getUniformLocation("textColor"), color); } +void TextShader::loadDimFactor(float dimFactor) { + ShaderProgram::loadFloat(getUniformLocation("dimFactor"), dimFactor); +} + void TextShader::bindAttributes() const { ShaderProgram::bindAttribute(0, "vertices"); diff --git a/src/engine/renderer/shaders/TextShader.h b/src/engine/renderer/shaders/TextShader.h index 00c8fdc..f045ce3 100644 --- a/src/engine/renderer/shaders/TextShader.h +++ b/src/engine/renderer/shaders/TextShader.h @@ -14,6 +14,7 @@ public : } void loadProjectionMatrix(glm::mat4 matrix); void loadTextColor(glm::vec3 color); + void loadDimFactor(float dimFactor); protected: void bindAttributes() const override; diff --git a/src/game/UILayer.cpp b/src/game/UILayer.cpp index 4a89654..e5ae9f6 100644 --- a/src/game/UILayer.cpp +++ b/src/game/UILayer.cpp @@ -161,5 +161,6 @@ void UILayer::onRender() { guiRenderer->render(guis); auto renderTexts = renderBundle.getGUITexts(); - textRenderer->renderGuiTexts(renderTexts, Application::getInstance().getWindow().GetWidth(), Application::getInstance().getWindow().GetHeight()); + RenderContext ctx = RenderContext::Default(); + textRenderer->renderGuiTexts(renderTexts, Application::getInstance().getWindow().GetWidth(), Application::getInstance().getWindow().GetHeight(), ctx); } diff --git a/src/game/scenes/main/MainMenu.cpp b/src/game/scenes/main/MainMenu.cpp index a348a1c..5abc792 100644 --- a/src/game/scenes/main/MainMenu.cpp +++ b/src/game/scenes/main/MainMenu.cpp @@ -6,8 +6,8 @@ #include "MainUiLayer.h" -void MainMenu::onEnter() { - addLayer(std::make_unique()); +void MainMenu::onEnter(EngineContext& ctx) { + addLayer(std::make_unique(ctx.uiConfig)); } void MainMenu::onExit() { diff --git a/src/game/scenes/main/MainMenu.h b/src/game/scenes/main/MainMenu.h index 54eb78e..92c4587 100644 --- a/src/game/scenes/main/MainMenu.h +++ b/src/game/scenes/main/MainMenu.h @@ -8,7 +8,7 @@ class MainMenu: public Scene { public: - void onEnter() override; + void onEnter(EngineContext& ctx) override; void onExit() override; std::vector getRequiredAssets() override; diff --git a/src/game/scenes/main/MainUiLayer.cpp b/src/game/scenes/main/MainUiLayer.cpp index 27a2d6a..f66c4a6 100644 --- a/src/game/scenes/main/MainUiLayer.cpp +++ b/src/game/scenes/main/MainUiLayer.cpp @@ -12,7 +12,7 @@ void MainUiLayer::onAttach() { AssetManager::loadUiTheme("default", "assets/ui/uiTheme.json"); //Todo: Move to AssetLoader - rootContainer = std::make_unique(); + auto rootContainer = std::make_unique(); rootContainer->setBackgroundTexture(AssetManager::getTexture("mainCover")->getTextureID()); LayoutStyle btnStyle; @@ -55,7 +55,8 @@ void MainUiLayer::onAttach() { EventBus::getInstance().emit(QuitEvent{}); } }); - + uiStack = std::make_unique(); + uiStack->push(std::move(rootContainer)); } void MainUiLayer::onDetach() { @@ -63,22 +64,34 @@ void MainUiLayer::onDetach() { } void MainUiLayer::onRender() { - UiRenderBundle renderBundle; - if (rootContainer) { - rootContainer->collectRenderData(renderBundle); + + if (uiStack) { + for (const auto& panel : uiStack->getPanels()) { + RenderContext ctx; + if (!uiStack->isTop(panel.get())) { + ctx = RenderContext::Default(); + } else { + ctx = RenderContext::Dimmed(uiConfig.backgroundDim); + } + + UiRenderBundle renderBundle; + panel->collectRenderData(renderBundle); + + auto guis = renderBundle.getGUITextures(); + guiRenderer->render(guis); + + const auto renderTexts = renderBundle.getGUITexts(); + textRenderer->renderGuiTexts(renderTexts, static_cast(Application::getInstance().getWindow().GetWidth()), + static_cast(Application::getInstance().getWindow().GetHeight()), ctx); + } } - - auto guis = renderBundle.getGUITextures(); - guiRenderer->render(guis); - - const auto renderTexts = renderBundle.getGUITexts(); - textRenderer->renderGuiTexts(renderTexts, static_cast(Application::getInstance().getWindow().GetWidth()), - static_cast(Application::getInstance().getWindow().GetHeight())); } void MainUiLayer::onUpdate() { Dimensions rootParent {0.0, 0.0, 1.0, 1.0f}; - rootContainer->uiPositioner.compute(rootParent); + for (const auto& panel : uiStack->getPanels()) { + panel->uiPositioner.compute(rootParent); + } - rootContainer->update(EngineTime::deltaTime); + uiStack->top()->update(EngineTime::deltaTime); } diff --git a/src/game/scenes/main/MainUiLayer.h b/src/game/scenes/main/MainUiLayer.h index 788b666..50b1c18 100644 --- a/src/game/scenes/main/MainUiLayer.h +++ b/src/game/scenes/main/MainUiLayer.h @@ -8,19 +8,21 @@ #include "../../../engine/renderer/GUIRenderer.h" #include "../../../engine/renderer/loader/Loader.h" #include "../../../engine/core/gui/uiMain/UiContainer.h" +#include "../../../engine/core/gui/uiMain/UiStack.h" #include "../../../engine/renderer/TextRenderer.h" class MainUiLayer: public Layer { public: - MainUiLayer(): guiRenderer(std::make_unique(Loader::instance())), textRenderer(std::make_unique()) {} + explicit MainUiLayer(UiConfig& config): uiConfig(config), guiRenderer(std::make_unique(Loader::instance())), textRenderer(std::make_unique()) {} void onAttach() override; void onDetach() override; void onRender() override; void onUpdate() override; private: + UiConfig& uiConfig; std::unique_ptr guiRenderer; std::unique_ptr textRenderer; - std::unique_ptr rootContainer; + std::unique_ptr uiStack; };