From 03776d16bc70c4c12088d18775822a04d0d59935 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 30 Mar 2025 10:44:01 -0500 Subject: [PATCH] persist module render commands --- include/utils/GuiModule/GuiModule.h | 1 + include/utils/Renderer/Renderer.h | 11 ++++++++- .../Renderer/RendererOpenGL/RendererOpenGL.h | 1 - .../GUImodules/TestImgui/src/TestImgui.cpp | 23 +++++++++++-------- modules/GUImodules/TestImgui/src/TestImgui.h | 3 ++- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/include/utils/GuiModule/GuiModule.h b/include/utils/GuiModule/GuiModule.h index 5fcb1b5..191049b 100644 --- a/include/utils/GuiModule/GuiModule.h +++ b/include/utils/GuiModule/GuiModule.h @@ -21,6 +21,7 @@ namespace Archimedes { protected: Window* window; + //Renderer* renderer; }; } diff --git a/include/utils/Renderer/Renderer.h b/include/utils/Renderer/Renderer.h index 38d44aa..a9e991f 100644 --- a/include/utils/Renderer/Renderer.h +++ b/include/utils/Renderer/Renderer.h @@ -17,7 +17,16 @@ namespace Archimedes { void render(); - void addRenderCmd(renderCmd* cmd) { rc.push_back(cmd); } + std::list::iterator addRenderCmd(renderCmd* cmd) { + + auto it = rc.end(); + rc.push_back(cmd); + return it; + } + + void removeRenderCmd(std::list::iterator cmd) { + rc.erase(cmd); + } private: std::list rc; diff --git a/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h b/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h index 4299e67..0812722 100644 --- a/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h +++ b/include/utils/Renderer/RendererOpenGL/RendererOpenGL.h @@ -27,7 +27,6 @@ namespace Archimedes { for(auto* f : cmdList) f(); - cmdList.clear(); } }; diff --git a/modules/GUImodules/TestImgui/src/TestImgui.cpp b/modules/GUImodules/TestImgui/src/TestImgui.cpp index 93d5052..7436f36 100644 --- a/modules/GUImodules/TestImgui/src/TestImgui.cpp +++ b/modules/GUImodules/TestImgui/src/TestImgui.cpp @@ -12,6 +12,7 @@ TestImgui::TestImgui(void* h, Archimedes::App* a) : Archimedes::GuiModule(h, a) } TestImgui::~TestImgui() { + window->getRenderer().removeRenderCmd(rcmd); ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); ImGui::DestroyContext(); @@ -39,7 +40,18 @@ void TestImgui::onLoad() { // Setup Platform/Renderer backends ImGui_ImplGlfw_InitForOpenGL(window->getWindowImpl().getWindow(), true); ImGui_ImplOpenGL3_Init("#version 130"); - + + rcmd = window->getRenderer().addRenderCmd([](){ + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + /*if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) + { + ImGui::UpdatePlatformWindows(); + ImGui::RenderPlatformWindowsDefault(); + }*/ + }); + + //cmdlist.push_back(it); } void TestImgui::run() { @@ -51,15 +63,6 @@ void TestImgui::run() { ImGui::Render(); - window->getRenderer().addRenderCmd([](){ - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); - - /*if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) - { - ImGui::UpdatePlatformWindows(); - ImGui::RenderPlatformWindowsDefault(); - }*/ - }); if(window->shouldClose()) app->end(); diff --git a/modules/GUImodules/TestImgui/src/TestImgui.h b/modules/GUImodules/TestImgui/src/TestImgui.h index 6d81247..4c00762 100644 --- a/modules/GUImodules/TestImgui/src/TestImgui.h +++ b/modules/GUImodules/TestImgui/src/TestImgui.h @@ -18,13 +18,14 @@ class TestImgui : public Archimedes::GuiModule { private: bool demo = true; + std::list::iterator rcmd; }; #ifndef TESTIMGUI_STATIC extern "C" { Archimedes::Module* create(void* handle, Archimedes::App* app) { - return new TestImgui(handle, app); + return (Archimedes::Module*) new TestImgui(handle, app); } }