diff --git a/framework/opengl_renderer/CMakeLists.txt b/framework/opengl_renderer/CMakeLists.txt index 707163d..fd46a64 100644 --- a/framework/opengl_renderer/CMakeLists.txt +++ b/framework/opengl_renderer/CMakeLists.txt @@ -27,6 +27,18 @@ if(EMSCRIPTEN) set_target_properties(opengl_renderer_s PROPERTIES LINK_FLAGS "-s USE_SDL=2") endif() +############# imgui opengl renderer tools ########### + +add_library(imgui_opengl_renderer_tools + src/mm/services/opengl_renderer_tools.hpp + src/mm/services/opengl_renderer_tools.cpp +) + +target_link_libraries(imgui_opengl_renderer_tools + opengl_renderer_s + imgui_service +) + ############# imgui render task ########### add_library(imgui_render_task diff --git a/framework/opengl_renderer/src/mm/opengl/render_task.hpp b/framework/opengl_renderer/src/mm/opengl/render_task.hpp index d0d1e1c..c589314 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_task.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_task.hpp @@ -22,6 +22,8 @@ namespace MM::OpenGL { public: virtual ~RenderTask(void) = default; + virtual const char* name(void) = 0;//{ return "NoName"; }; + virtual void render(Services::OpenGLRenderer& rs, Engine& engine) = 0; // a place to reload/compile shaders etc. diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/batched_spritesheet.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/batched_spritesheet.hpp index 2e95c19..8da42f4 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/batched_spritesheet.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/batched_spritesheet.hpp @@ -42,6 +42,8 @@ namespace MM::OpenGL::RenderTasks { BatchedSpriteSheet(Engine& engine); ~BatchedSpriteSheet(void); + const char* name(void) override { return "BatchedSpriteSheet"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/blit_fb.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/blit_fb.hpp index 10ee6c8..c96b7a6 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/blit_fb.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/blit_fb.hpp @@ -11,6 +11,8 @@ namespace MM::OpenGL::RenderTasks { BlitFB(Engine& engine); ~BlitFB(void); + const char* name(void) override { return "BlitFB"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/blur.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/blur.hpp index 29c59a5..603bf22 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/blur.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/blur.hpp @@ -26,6 +26,8 @@ namespace MM::OpenGL::RenderTasks { Blur(Engine& engine); ~Blur(void); + const char* name(void) override { return "Blur"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/clear.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/clear.hpp index cafa27d..60b8da2 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/clear.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/clear.hpp @@ -9,6 +9,8 @@ namespace MM::OpenGL::RenderTasks { Clear(Engine& engine); ~Clear(void); + const char* name(void) override { return "Clear"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/copy_to_fb.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/copy_to_fb.hpp index 3eabf08..bba4bce 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/copy_to_fb.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/copy_to_fb.hpp @@ -22,6 +22,8 @@ namespace MM::OpenGL::RenderTasks { CopyToFB(Engine& engine); ~CopyToFB(void); + const char* name(void) override { return "CopyToFB"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/fast_sky_render_task.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/fast_sky_render_task.hpp index 5fce7bd..e769989 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/fast_sky_render_task.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/fast_sky_render_task.hpp @@ -33,6 +33,8 @@ namespace MM::OpenGL { FastSky(MM::Engine& engine); ~FastSky(void); + const char* name(void) override { return "FastSky"; } + void render(MM::Services::OpenGLRenderer& rs, MM::Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/imgui.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/imgui.hpp index 432684a..9d63874 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/imgui.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/imgui.hpp @@ -11,6 +11,8 @@ namespace MM::OpenGL::RenderTasks { ImGuiRT(Engine& engine); ~ImGuiRT(void); + const char* name(void) override { return "ImGuiRT"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; }; diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_rect.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_rect.hpp index 701f426..65af2bc 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_rect.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_rect.hpp @@ -31,6 +31,8 @@ namespace MM::OpenGL::RenderTasks { SimpleRect(Engine& engine); ~SimpleRect(void); + const char* name(void) override { return "SimpleRect"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_sprite.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_sprite.hpp index 00cbfed..3f95f63 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_sprite.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_sprite.hpp @@ -31,6 +31,8 @@ namespace MM::OpenGL::RenderTasks { SimpleSprite(Engine& engine); ~SimpleSprite(void); + const char* name(void) override { return "SimpleSprite"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_spritesheet.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_spritesheet.hpp index 394e51a..d69a67f 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_spritesheet.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/simple_spritesheet.hpp @@ -31,6 +31,8 @@ namespace MM::OpenGL::RenderTasks { SimpleSpriteSheet(Engine& engine); ~SimpleSpriteSheet(void); + const char* name(void) override { return "SimpleSpriteSheet"; } + void render(Services::OpenGLRenderer& rs, Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/opengl/render_tasks/tilemap.hpp b/framework/opengl_renderer/src/mm/opengl/render_tasks/tilemap.hpp index 10e5221..51f506d 100644 --- a/framework/opengl_renderer/src/mm/opengl/render_tasks/tilemap.hpp +++ b/framework/opengl_renderer/src/mm/opengl/render_tasks/tilemap.hpp @@ -25,6 +25,8 @@ namespace MM::OpenGL::RenderTasks { Tilemap(MM::Engine& engine); ~Tilemap(void); + const char* name(void) override { return "Tilemap"; } + void render(MM::Services::OpenGLRenderer& rs, MM::Engine& engine) override; public: diff --git a/framework/opengl_renderer/src/mm/services/opengl_renderer_tools.cpp b/framework/opengl_renderer/src/mm/services/opengl_renderer_tools.cpp new file mode 100644 index 0000000..684d068 --- /dev/null +++ b/framework/opengl_renderer/src/mm/services/opengl_renderer_tools.cpp @@ -0,0 +1,97 @@ +#include "./opengl_renderer_tools.hpp" + +#include + +#include + +#include + +#include + +namespace MM::Services { + +bool ImGuiOpenGLRendererTools::enable(Engine& engine) { + auto& menu_bar = engine.getService(); + + menu_bar.menu_tree["OpenGL"]["RenderTasks"] = [this](Engine&) { + ImGui::MenuItem("Render Tasks", NULL, &_show_render_tasks); + }; + + menu_bar.menu_tree["OpenGL"]["TextureCacheLegacy"] = [this](Engine&) { + ImGui::MenuItem("Texture Cache (legacy)", NULL, &_show_texture_cache_legacy); + }; + + return true; +} + +void ImGuiOpenGLRendererTools::disable(Engine& engine) { + auto& menu_bar = engine.getService(); + + menu_bar.menu_tree["OpenGL"].erase("RenderTasks"); + menu_bar.menu_tree["OpenGL"].erase("TextureCacheLegacy"); +} + +std::vector ImGuiOpenGLRendererTools::registerUpdates(void) { + using namespace entt::literals; + return { + { + "ImGuiOpenGLRendererTools::render"_hs, + "ImGuiOpenGLRendererTools::render", + [this](Engine& e) { renderImGui(e); }, + UpdateStrategies::update_phase_t::MAIN, + true, + { + "ImGuiMenuBar::render"_hs + } + } + }; +} + +void ImGuiOpenGLRendererTools::renderImGui(Engine& engine) { + if (_show_render_tasks) { + renderRenderTasks(engine); + } + + if (_show_texture_cache_legacy) { + renderTextureCacheLegacy(engine); + } +} + +void ImGuiOpenGLRendererTools::renderRenderTasks(Engine& engine) { + if (ImGui::Begin("RenderTasks##OpenGLRendererTools", &_show_render_tasks)) { + auto& ogl_renderer = engine.getService(); + + if (ImGui::BeginTable("table", 1)) { + for (const auto& task : ogl_renderer.render_tasks) { + ImGui::TableNextRow(); + + ImGui::TableNextColumn(); + ImGui::Text("%s", task->name()); + } + ImGui::EndTable(); + } + + } + ImGui::End(); +} + +void ImGuiOpenGLRendererTools::renderTextureCacheLegacy(Engine& engine) { + if (ImGui::Begin("TextureCache (legacy)##OpenGLRendererTools", &_show_texture_cache_legacy)) { + if (ImGui::BeginTabBar("tabs")) { + if (ImGui::BeginTabItem("Texture List")) { + ImGuiWidgets::TextureResourceManagerList(); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Texture Loader")) { + ImGuiWidgets::TextureResourceManagerLoader(engine); + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + } + ImGui::End(); +} + +} // MM::Services diff --git a/framework/opengl_renderer/src/mm/services/opengl_renderer_tools.hpp b/framework/opengl_renderer/src/mm/services/opengl_renderer_tools.hpp new file mode 100644 index 0000000..de5b34f --- /dev/null +++ b/framework/opengl_renderer/src/mm/services/opengl_renderer_tools.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include + +namespace MM::Services { + + class ImGuiOpenGLRendererTools : public Service { + public: + const char* name(void) override { return "ImGuiOpenGLRendererTools"; } + + bool enable(Engine& engine) override; + void disable(Engine& engine) override; + + std::vector registerUpdates(void) override; + + private: + bool _show_render_tasks = false; + bool _show_texture_cache_legacy = false; + + private: + void renderImGui(Engine& engine); + + void renderRenderTasks(Engine& engine); + void renderTextureCacheLegacy(Engine& engine); + }; + +} // namespace MM::Services +