diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index eb19d846..cb8ec0ff 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -74,6 +74,7 @@ set(SWA_CPU_CXX_SOURCES set(SWA_GPU_CXX_SOURCES "gpu/video.cpp" + "gpu/imgui_common.cpp" "gpu/imgui_snapshot.cpp" "gpu/rhi/plume_d3d12.cpp" "gpu/rhi/plume_vulkan.cpp" diff --git a/UnleashedRecomp/gpu/imgui_common.cpp b/UnleashedRecomp/gpu/imgui_common.cpp new file mode 100644 index 00000000..c273ac78 --- /dev/null +++ b/UnleashedRecomp/gpu/imgui_common.cpp @@ -0,0 +1,22 @@ +#include "imgui_common.h" + +static std::vector> g_callbackData; +static uint32_t g_callbackDataIndex = 0; + +ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback) +{ + if (g_callbackDataIndex >= g_callbackData.size()) + g_callbackData.emplace_back(std::make_unique()); + + auto& callbackData = g_callbackData[g_callbackDataIndex]; + ++g_callbackDataIndex; + + ImGui::GetForegroundDrawList()->AddCallback(reinterpret_cast(callback), callbackData.get()); + + return callbackData.get(); +} + +void ResetImGuiCallbacks() +{ + g_callbackDataIndex = 0; +} diff --git a/UnleashedRecomp/gpu/imgui_common.h b/UnleashedRecomp/gpu/imgui_common.h index 2a357f21..13981109 100644 --- a/UnleashedRecomp/gpu/imgui_common.h +++ b/UnleashedRecomp/gpu/imgui_common.h @@ -41,4 +41,8 @@ union ImGuiCallbackData } setScale; }; +extern ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback); + +extern void ResetImGuiCallbacks(); + #endif diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index 985bc427..821923a9 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -1774,6 +1774,8 @@ static void DrawImGui() ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); + ResetImGuiCallbacks(); + #ifdef ASYNC_PSO_DEBUG if (ImGui::Begin("Async PSO Stats")) { @@ -1789,6 +1791,7 @@ static void DrawImGui() } ImGui::End(); #endif + AchievementMenu::Draw(); OptionsMenu::Draw(); AchievementOverlay::Draw(); diff --git a/UnleashedRecomp/ui/imgui_utils.h b/UnleashedRecomp/ui/imgui_utils.h index 7fed7d57..4109a712 100644 --- a/UnleashedRecomp/ui/imgui_utils.h +++ b/UnleashedRecomp/ui/imgui_utils.h @@ -13,25 +13,9 @@ #define CENTRE_TEXT_HORZ(min, max, textSize) min.x + ((max.x - min.x) - textSize.x) / 2 #define CENTRE_TEXT_VERT(min, max, textSize) min.y + ((max.y - min.y) - textSize.y) / 2 -static std::vector> g_callbackData; -static uint32_t g_callbackDataIndex = 0; - -static ImGuiCallbackData* AddCallback(ImGuiCallback callback) -{ - if (g_callbackDataIndex >= g_callbackData.size()) - g_callbackData.emplace_back(std::make_unique()); - - auto& callbackData = g_callbackData[g_callbackDataIndex]; - ++g_callbackDataIndex; - - ImGui::GetForegroundDrawList()->AddCallback(reinterpret_cast(callback), callbackData.get()); - - return callbackData.get(); -} - static void SetGradient(const ImVec2& min, const ImVec2& max, ImU32 top, ImU32 bottom) { - auto callbackData = AddCallback(ImGuiCallback::SetGradient); + auto callbackData = AddImGuiCallback(ImGuiCallback::SetGradient); callbackData->setGradient.gradientMin[0] = min.x; callbackData->setGradient.gradientMin[1] = min.y; callbackData->setGradient.gradientMax[0] = max.x; @@ -42,26 +26,26 @@ static void SetGradient(const ImVec2& min, const ImVec2& max, ImU32 top, ImU32 b static void ResetGradient() { - auto callbackData = AddCallback(ImGuiCallback::SetGradient); + auto callbackData = AddImGuiCallback(ImGuiCallback::SetGradient); memset(&callbackData->setGradient, 0, sizeof(callbackData->setGradient)); } static void SetShaderModifier(uint32_t shaderModifier) { - auto callbackData = AddCallback(ImGuiCallback::SetShaderModifier); + auto callbackData = AddImGuiCallback(ImGuiCallback::SetShaderModifier); callbackData->setShaderModifier.shaderModifier = shaderModifier; } static void SetOrigin(ImVec2 origin) { - auto callbackData = AddCallback(ImGuiCallback::SetOrigin); + auto callbackData = AddImGuiCallback(ImGuiCallback::SetOrigin); callbackData->setOrigin.origin[0] = origin.x; callbackData->setOrigin.origin[1] = origin.y; } static void SetScale(ImVec2 scale) { - auto callbackData = AddCallback(ImGuiCallback::SetScale); + auto callbackData = AddImGuiCallback(ImGuiCallback::SetScale); callbackData->setScale.scale[0] = scale.x; callbackData->setScale.scale[1] = scale.y; } diff --git a/UnleashedRecomp/ui/options_menu.cpp b/UnleashedRecomp/ui/options_menu.cpp index 517c8c94..fdfe03d1 100644 --- a/UnleashedRecomp/ui/options_menu.cpp +++ b/UnleashedRecomp/ui/options_menu.cpp @@ -996,8 +996,6 @@ void OptionsMenu::Draw() auto pInputState = SWA::CInputState::GetInstance(); if (pInputState->GetPadState().IsReleased(SWA::eKeyState_A)) g_isEnterKeyBuffered = false; - - g_callbackDataIndex = 0; auto& res = ImGui::GetIO().DisplaySize; auto drawList = ImGui::GetForegroundDrawList();