diff --git a/include/ui/game_screen.hpp b/include/ui/game_screen.hpp index ceaf3af4..ce1c4bab 100644 --- a/include/ui/game_screen.hpp +++ b/include/ui/game_screen.hpp @@ -75,6 +75,10 @@ private: int pendingSfxVolume = 100; float pendingMouseSensitivity = 0.2f; bool pendingInvertMouse = false; + int pendingUiOpacity = 100; + + // UI element transparency (0.0 = fully transparent, 1.0 = fully opaque) + float uiOpacity_ = 1.0f; /** * Render player info window diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index cd4e3050..001470bb 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -54,6 +54,10 @@ GameScreen::GameScreen() { } void GameScreen::render(game::GameHandler& gameHandler) { + // Apply UI transparency setting + float prevAlpha = ImGui::GetStyle().Alpha; + ImGui::GetStyle().Alpha = uiOpacity_; + // Process targeting input before UI windows processTargetInput(gameHandler); @@ -222,6 +226,9 @@ void GameScreen::render(game::GameHandler& gameHandler) { renderer->clearSelectionCircle(); } } + + // Restore previous alpha + ImGui::GetStyle().Alpha = prevAlpha; } void GameScreen::renderPlayerInfo(game::GameHandler& gameHandler) { @@ -2612,6 +2619,7 @@ void GameScreen::renderSettingsWindow() { } } } + pendingUiOpacity = static_cast(uiOpacity_ * 100.0f + 0.5f); settingsInit = true; } @@ -2678,7 +2686,18 @@ void GameScreen::renderSettingsWindow() { ImGui::Separator(); ImGui::Spacing(); + ImGui::Text("Interface"); + ImGui::SliderInt("UI Opacity", &pendingUiOpacity, 20, 100, "%d%%"); + if (ImGui::Button("Restore Interface Defaults", ImVec2(-1, 0))) { + pendingUiOpacity = 100; + } + + ImGui::Spacing(); + ImGui::Separator(); + ImGui::Spacing(); + if (ImGui::Button("Apply", ImVec2(-1, 0))) { + uiOpacity_ = static_cast(pendingUiOpacity) / 100.0f; window->setVsync(pendingVsync); window->setFullscreen(pendingFullscreen); window->applyResolution(kResolutions[pendingResIndex][0], kResolutions[pendingResIndex][1]);