From afc12c44f850a65e793771fb1f93c3f770c772eb Mon Sep 17 00:00:00 2001 From: SweetId <2630750+SweetId@users.noreply.github.com> Date: Tue, 9 Aug 2022 21:40:37 +0100 Subject: [PATCH] add handlers to allow imgui code with no access to main loop --- include/NazaraImgui/NazaraImgui.hpp | 13 +++++++++++++ src/NazaraImgui/NazaraImgui.cpp | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/NazaraImgui/NazaraImgui.hpp b/include/NazaraImgui/NazaraImgui.hpp index ff8d26f..072ec61 100644 --- a/include/NazaraImgui/NazaraImgui.hpp +++ b/include/NazaraImgui/NazaraImgui.hpp @@ -8,6 +8,7 @@ #include #include +#include namespace Nz { @@ -19,6 +20,12 @@ namespace Nz class Texture; class Window; + struct ImguiHandler + { + public: + virtual void OnRenderImgui() = 0; + }; + class Imgui : public Nz::ModuleBase { friend ModuleBase; @@ -34,6 +41,10 @@ namespace Nz void Update(Nz::Window& window, float dt); void Render(Nz::RenderWindow& window, Nz::RenderFrame& frame); + // User-defined + void AddHandler(ImguiHandler* handler); + void RemoveHandler(ImguiHandler* handler); + // Clipboard functions static void SetClipboardText(void* userData, const char* text); static const char* GetClipboardText(void* userData); @@ -79,6 +90,8 @@ namespace Nz std::shared_ptr m_uboBuffer; std::shared_ptr m_fontTexture; + std::unordered_set m_handlers; + static Imgui* s_instance; }; } diff --git a/src/NazaraImgui/NazaraImgui.cpp b/src/NazaraImgui/NazaraImgui.cpp index 97d4132..309689e 100644 --- a/src/NazaraImgui/NazaraImgui.cpp +++ b/src/NazaraImgui/NazaraImgui.cpp @@ -312,10 +312,23 @@ namespace Nz void Imgui::Render(Nz::RenderWindow& window, Nz::RenderFrame& frame) { + for (auto* handler : m_handlers) + handler->OnRenderImgui(); + ImGui::Render(); RenderDrawLists(window, frame, ImGui::GetDrawData()); } + void Imgui::AddHandler(ImguiHandler* handler) + { + m_handlers.insert(handler); + } + + void Imgui::RemoveHandler(ImguiHandler* handler) + { + m_handlers.erase(handler); + } + void Imgui::SetClipboardText(void* userData, const char* text) { Imgui* backend = static_cast(userData);