From 800862c50a3c4761dbe290b0e5dbe4152c2ce9a6 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 14 Mar 2026 08:31:08 -0700 Subject: [PATCH] fix(ui): cache ghost opacity updates to state changes --- include/ui/game_screen.hpp | 3 +++ src/ui/game_screen.cpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/ui/game_screen.hpp b/include/ui/game_screen.hpp index f22ba4da..a6ebf9c0 100644 --- a/include/ui/game_screen.hpp +++ b/include/ui/game_screen.hpp @@ -621,6 +621,9 @@ private: float resurrectFlashTimer_ = 0.0f; static constexpr float kResurrectFlashDuration = 3.0f; bool ghostStateCallbackSet_ = false; + bool ghostOpacityStateKnown_ = false; + bool ghostOpacityLastState_ = false; + uint32_t ghostOpacityLastInstanceId_ = 0; void renderResurrectFlash(); // Zone discovery text ("Entering: ") diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index c9be2a9a..98b1df28 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -848,6 +848,20 @@ void GameScreen::render(game::GameHandler& gameHandler) { renderer->setInCombat(gameHandler.isInCombat() && !gameHandler.isPlayerDead() && !gameHandler.isPlayerGhost()); + if (auto* cr = renderer->getCharacterRenderer()) { + uint32_t charInstId = renderer->getCharacterInstanceId(); + if (charInstId != 0) { + const bool isGhost = gameHandler.isPlayerGhost(); + if (!ghostOpacityStateKnown_ || + ghostOpacityLastState_ != isGhost || + ghostOpacityLastInstanceId_ != charInstId) { + cr->setInstanceOpacity(charInstId, isGhost ? 0.5f : 1.0f); + ghostOpacityStateKnown_ = true; + ghostOpacityLastState_ = isGhost; + ghostOpacityLastInstanceId_ = charInstId; + } + } + } static glm::vec3 targetGLPos; if (gameHandler.hasTarget()) { auto target = gameHandler.getTarget();