From 5c61c5ede8664fa067e99460f55275ebb104860a Mon Sep 17 00:00:00 2001 From: Luke Street Date: Thu, 16 Apr 2026 00:34:17 -0600 Subject: [PATCH] Add Bloom debug window --- files.cmake | 2 + src/d/d_kankyo.cpp | 5 ++ src/dusk/imgui/ImGuiBloomWindow.cpp | 126 ++++++++++++++++++++++++++++ src/dusk/imgui/ImGuiBloomWindow.hpp | 6 ++ src/dusk/imgui/ImGuiConsole.cpp | 1 + src/dusk/imgui/ImGuiMenuTools.cpp | 2 +- src/dusk/imgui/ImGuiMenuTools.hpp | 3 + 7 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 src/dusk/imgui/ImGuiBloomWindow.cpp create mode 100644 src/dusk/imgui/ImGuiBloomWindow.hpp diff --git a/files.cmake b/files.cmake index d1e0436625..8f62b9346c 100644 --- a/files.cmake +++ b/files.cmake @@ -1358,6 +1358,8 @@ set(DUSK_FILES src/dusk/imgui/ImGuiEngine.hpp src/dusk/imgui/ImGuiMenuGame.cpp src/dusk/imgui/ImGuiMenuGame.hpp + src/dusk/imgui/ImGuiBloomWindow.cpp + src/dusk/imgui/ImGuiBloomWindow.hpp src/dusk/imgui/ImGuiMenuTools.cpp src/dusk/imgui/ImGuiMenuTools.hpp src/dusk/imgui/ImGuiMenuEnhancements.cpp diff --git a/src/d/d_kankyo.cpp b/src/d/d_kankyo.cpp index 60e4d619a4..9bb96efc82 100644 --- a/src/d/d_kankyo.cpp +++ b/src/d/d_kankyo.cpp @@ -33,6 +33,7 @@ #include #include #if TARGET_PC +#include "dusk/imgui/ImGuiBloomWindow.hpp" #include "dusk/settings.h" #endif @@ -2578,6 +2579,10 @@ void dScnKy_env_light_c::setLight() { mDoGph_gInf_c::getBloom()->setMode(mode); } +#if TARGET_PC + dusk::ApplyBloomOverride(); +#endif + f32 var_f30; if (dKy_Outdoor_check() == true) { static f32 now_shadow_alpha[] = {0.25f, 0.35f, 0.6f, 0.6f, 0.25f, 0.35f}; diff --git a/src/dusk/imgui/ImGuiBloomWindow.cpp b/src/dusk/imgui/ImGuiBloomWindow.cpp new file mode 100644 index 0000000000..1741f82cd8 --- /dev/null +++ b/src/dusk/imgui/ImGuiBloomWindow.cpp @@ -0,0 +1,126 @@ +#include + +#include "imgui.h" + +#include "ImGuiBloomWindow.hpp" +#include "ImGuiMenuTools.hpp" +#include "m_Do/m_Do_graphic.h" + +namespace dusk { +namespace { +struct BloomOverride { + bool enabled = false; + bool bloomEnabled = true; + int mode = 0; + int point = 128; + int blureSize = 64; + int blureRatio = 128; + GXColor blendColor = {255, 255, 255, 255}; + GXColor monoColor = {0, 0, 0, 0}; +}; + +BloomOverride s_bloomOverride; + +void SyncFromCurrentBloom() { + mDoGph_gInf_c::bloom_c* bloom = mDoGph_gInf_c::getBloom(); + s_bloomOverride.bloomEnabled = bloom->getEnable() != 0; + s_bloomOverride.mode = bloom->mMode; + s_bloomOverride.point = bloom->getPoint(); + s_bloomOverride.blureSize = bloom->getBlureSize(); + s_bloomOverride.blureRatio = bloom->getBlureRatio(); + s_bloomOverride.blendColor = *bloom->getBlendColor(); + s_bloomOverride.monoColor = *bloom->getMonoColor(); +} + +u8 ClampToByte(int value) { + return static_cast(std::clamp(value, 0, 255)); +} + +void DrawColorEdit(const char* label, GXColor& color) { + float colorValue[4] = { + color.r / 255.0f, + color.g / 255.0f, + color.b / 255.0f, + color.a / 255.0f, + }; + if (ImGui::ColorEdit4(label, colorValue, ImGuiColorEditFlags_Uint8)) { + color.r = ClampToByte(static_cast(colorValue[0] * 255.0f + 0.5f)); + color.g = ClampToByte(static_cast(colorValue[1] * 255.0f + 0.5f)); + color.b = ClampToByte(static_cast(colorValue[2] * 255.0f + 0.5f)); + color.a = ClampToByte(static_cast(colorValue[3] * 255.0f + 0.5f)); + } +} +} // namespace + +void ApplyBloomOverride() { + if (!s_bloomOverride.enabled) { + return; + } + + mDoGph_gInf_c::bloom_c* bloom = mDoGph_gInf_c::getBloom(); + bloom->setEnable(s_bloomOverride.bloomEnabled ? 1 : 0); + bloom->setMode(static_cast(std::clamp(s_bloomOverride.mode, 0, 1))); + bloom->setPoint(ClampToByte(s_bloomOverride.point)); + bloom->setBlureSize(ClampToByte(s_bloomOverride.blureSize)); + bloom->setBlureRatio(ClampToByte(s_bloomOverride.blureRatio)); + bloom->setBlendColor(s_bloomOverride.blendColor); + bloom->setMonoColor(s_bloomOverride.monoColor); +} + +void DrawBloomWindow(bool& open) { + if (!open) { + return; + } + + if (!ImGui::Begin("Bloom", &open)) { + ImGui::End(); + return; + } + + bool copyCurrent = false; + if (ImGui::Checkbox("Override", &s_bloomOverride.enabled) && s_bloomOverride.enabled) { + copyCurrent = true; + } + + ImGui::SameLine(); + if (ImGui::Button("Sync with current")) { + copyCurrent = true; + } + + if (copyCurrent) { + SyncFromCurrentBloom(); + } + + ImGui::SeparatorText("Values"); + ImGui::Checkbox("Enabled", &s_bloomOverride.bloomEnabled); + ImGui::SliderInt("Mode", &s_bloomOverride.mode, 0, 1); + ImGui::SliderInt("Threshold", &s_bloomOverride.point, 0, 255); + ImGui::SliderInt("Blur Size", &s_bloomOverride.blureSize, 0, 255); + ImGui::SliderInt("Blur Ratio", &s_bloomOverride.blureRatio, 0, 255); + DrawColorEdit("Blend Color", s_bloomOverride.blendColor); + DrawColorEdit("Mono Color", s_bloomOverride.monoColor); + + ApplyBloomOverride(); + + ImGui::SeparatorText("Current"); + mDoGph_gInf_c::bloom_c* bloom = mDoGph_gInf_c::getBloom(); + GXColor blendColor = *bloom->getBlendColor(); + GXColor monoColor = *bloom->getMonoColor(); + ImGui::Text("Enabled: %d", bloom->getEnable()); + ImGui::Text("Mode: %d", bloom->mMode); + ImGui::Text("Threshold: %u", static_cast(bloom->getPoint())); + ImGui::Text("Blur Size: %u", static_cast(bloom->getBlureSize())); + ImGui::Text("Blur Ratio: %u", static_cast(bloom->getBlureRatio())); + ImGui::Text("Blend RGBA: %u, %u, %u, %u", static_cast(blendColor.r), + static_cast(blendColor.g), static_cast(blendColor.b), + static_cast(blendColor.a)); + ImGui::Text("Mono RGBA: %u, %u, %u, %u", static_cast(monoColor.r), + static_cast(monoColor.g), static_cast(monoColor.b), + static_cast(monoColor.a)); + ImGui::End(); +} + +void ImGuiMenuTools::ShowBloomWindow() { + DrawBloomWindow(m_showBloomWindow); +} +} // namespace dusk diff --git a/src/dusk/imgui/ImGuiBloomWindow.hpp b/src/dusk/imgui/ImGuiBloomWindow.hpp new file mode 100644 index 0000000000..58e644e96d --- /dev/null +++ b/src/dusk/imgui/ImGuiBloomWindow.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace dusk { +void DrawBloomWindow(bool& open); +void ApplyBloomOverride(); +} // namespace dusk diff --git a/src/dusk/imgui/ImGuiConsole.cpp b/src/dusk/imgui/ImGuiConsole.cpp index 0cf3906d75..f71dc8c278 100644 --- a/src/dusk/imgui/ImGuiConsole.cpp +++ b/src/dusk/imgui/ImGuiConsole.cpp @@ -271,6 +271,7 @@ namespace dusk { m_menuTools.ShowHeapOverlay(); m_menuTools.ShowStubLog(); m_menuTools.ShowMapLoader(); + m_menuTools.ShowBloomWindow(); m_menuTools.ShowPlayerInfo(); m_menuTools.ShowAudioDebug(); m_menuTools.ShowSaveEditor(); diff --git a/src/dusk/imgui/ImGuiMenuTools.cpp b/src/dusk/imgui/ImGuiMenuTools.cpp index 7b317c978b..9bb7670e88 100644 --- a/src/dusk/imgui/ImGuiMenuTools.cpp +++ b/src/dusk/imgui/ImGuiMenuTools.cpp @@ -54,7 +54,7 @@ namespace dusk { ImGui::MenuItem("State Share", hotkeys::SHOW_STATE_SHARE, &m_showStateShare); ImGui::MenuItem("Debug Camera", hotkeys::SHOW_DEBUG_CAMERA, &m_showCameraOverlay); ImGui::MenuItem("Audio Debug", hotkeys::SHOW_AUDIO_DEBUG, &m_showAudioDebug); - + ImGui::MenuItem("Bloom", nullptr, &m_showBloomWindow); ImGui::MenuItem("Stub Log", nullptr, &m_showStubLog); if (!dusk::IsGameLaunched) { diff --git a/src/dusk/imgui/ImGuiMenuTools.hpp b/src/dusk/imgui/ImGuiMenuTools.hpp index 05bdd9364b..e48aab2742 100644 --- a/src/dusk/imgui/ImGuiMenuTools.hpp +++ b/src/dusk/imgui/ImGuiMenuTools.hpp @@ -21,6 +21,7 @@ namespace dusk { void ShowHeapOverlay(); void ShowStubLog(); void ShowMapLoader(); + void ShowBloomWindow(); void ShowPlayerInfo(); void ShowAudioDebug(); void ShowSaveEditor(); @@ -41,6 +42,8 @@ namespace dusk { bool m_showMapLoader = false; + bool m_showBloomWindow = false; + bool m_showAudioDebug = false; struct { int mapIdx = -1;