From 3471b949cc068ff44bfc016205b5d3194075b9a7 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Mon, 11 Jan 2021 18:47:15 +0100 Subject: [PATCH] adopt scene tools to imgui menu bar, some features are now lost --- .../imgui/src/mm/services/engine_tools.cpp | 2 + .../imgui/src/mm/services/scene_tools.cpp | 222 +++++++----------- .../imgui/src/mm/services/scene_tools.hpp | 51 ++-- framework/imgui/test/scene_tools_test.cpp | 8 + framework/imgui/test/text_edit_test.cpp | 14 ++ 5 files changed, 126 insertions(+), 171 deletions(-) diff --git a/framework/imgui/src/mm/services/engine_tools.cpp b/framework/imgui/src/mm/services/engine_tools.cpp index a6be3e7..88db2d0 100644 --- a/framework/imgui/src/mm/services/engine_tools.cpp +++ b/framework/imgui/src/mm/services/engine_tools.cpp @@ -37,6 +37,8 @@ namespace MM::Services { auto& menu_bar = engine.getService(); menu_bar.menu_tree["Engine"].erase("Stop Engine"); + menu_bar.menu_tree["Engine"].erase("About"); + menu_bar.menu_tree["Engine"].erase("Services"); } std::vector ImGuiEngineTools::registerUpdates(void) { diff --git a/framework/imgui/src/mm/services/scene_tools.cpp b/framework/imgui/src/mm/services/scene_tools.cpp index 55d188a..16d6d25 100644 --- a/framework/imgui/src/mm/services/scene_tools.cpp +++ b/framework/imgui/src/mm/services/scene_tools.cpp @@ -1,12 +1,11 @@ #include "./scene_tools.hpp" -#include +//#include -#include - -#include +//#include #include +#include "./imgui_menu_bar.hpp" #include @@ -14,7 +13,7 @@ #include #include -#include +//#include #include #include @@ -28,75 +27,95 @@ #include -#include -#include +//#include +//#include #include #define LOGIGS(x) LOG("ImGuiSceneToolsService", x) namespace MM::Services { - void ImGuiSceneToolsService::renderImGui(Engine& engine) { - if (show_menu && ImGui::BeginMainMenuBar()) { - if (ImGui::BeginMenu("Engine")) { - if (ImGui::MenuItem("Stop Engine")) { - engine.stop(); - } - ImGui::EndMenu(); - } - - if (ImGui::BeginMenu("TextEditor")) { - if (ImGui::MenuItem("New Editor")) { - _text_editor_list.emplace_back(engine); - } - ImGui::EndMenu(); - } - - if (ImGui::BeginMenu("Windows")) { - ImGui::MenuItem("MM Metrics", NULL, &_show_mm_metrics); - ImGui::MenuItem("ImGui Metrics", NULL, &_show_imgui_metrics); - ImGui::MenuItem("Texture Loader", NULL, &_show_texture_loader); - ImGui::MenuItem("Texture List", NULL, &_show_texture_list); - ImGui::MenuItem("Entity Editor", NULL, &_show_entity_editor); - ImGui::MenuItem("Camera Tool", NULL, &_show_camera_tool); - ImGui::EndMenu(); - } - - ImGui::Text("%.1fFPS", ImGui::GetIO().Framerate); - ImGui::EndMainMenuBar(); + bool ImGuiSceneToolsService::enable(Engine& engine) { + if (!engine.tryService()) { + LOGIGS("error: no SceneServiceInterface"); + return false; } + // setup entity editor defaults + { + _entity_editor.show_window = false; + + _entity_editor.registerComponent("Name"); + _entity_editor.registerComponent("Transform2D"); + _entity_editor.registerComponent("Transform3D"); + _entity_editor.registerComponent("Velocity2D"); + _entity_editor.registerComponent("ViewDir2D"); + _entity_editor.registerComponent("ViewDir3D"); + _entity_editor.registerComponent("Color"); + + _entity_editor.registerComponent("Texture"); + } + + auto& menu_bar = engine.getService(); + + menu_bar.menu_tree["Scene"]["Metrics"] = [this](Engine&) { + ImGui::MenuItem("Metrics", NULL, &_show_scene_metrics); + }; + + menu_bar.menu_tree["Scene"]["EntityEditor"] = [this](Engine&) { + ImGui::MenuItem("EntityEditor", NULL, &_show_entity_editor); + }; + + menu_bar.menu_tree["Scene"]["CameraTool"] = [this](Engine&) { + ImGui::MenuItem("Camera3D Tool", NULL, &_show_camera_tool); + }; + + return true; + } + + void ImGuiSceneToolsService::disable(Engine& engine) { + auto& menu_bar = engine.getService(); + + menu_bar.menu_tree["Scene"].erase("Metrics"); + menu_bar.menu_tree["Scene"].erase("EntityEditor"); + } + + std::vector ImGuiSceneToolsService::registerUpdates(void) { + using namespace entt::literals; + return { + { + "ImGuiSceneToolsService::render"_hs, + "ImGuiSceneToolsService::render", + [this](Engine& e){ renderImGui(e); }, + UpdateStrategies::update_phase_t::MAIN, + true, + { + "ImGuiMenuBar::render"_hs + } + } + }; + } + + void ImGuiSceneToolsService::renderImGui(Engine& engine) { + //if (show_menu && ImGui::BeginMainMenuBar()) { + + //if (ImGui::BeginMenu("Windows")) { + //ImGui::MenuItem("Camera Tool", NULL, &_show_camera_tool); + //ImGui::EndMenu(); + //} + + //} + auto& scene = engine.tryService()->getScene(); - if (_show_mm_metrics) { - if (ImGui::Begin("Metrics##MM", &_show_mm_metrics)) { - if (ImGui::CollapsingHeader("ECS")) { - ImGui::Text("EnTT v%d.%d.%d", ENTT_VERSION_MAJOR, ENTT_VERSION_MINOR, ENTT_VERSION_PATCH); - ImGui::Text("capacity: %lu", scene.capacity()); - ImGui::Text("size: %lu", scene.size()); - ImGui::Text("alive: %lu", scene.alive()); - size_t orphans = 0; - scene.orphans([&](auto) { orphans++; }); - ImGui::Text("orphans: %lu", orphans); - } - } - ImGui::End(); - } - - if (_show_imgui_metrics) { - ImGui::ShowMetricsWindow(&_show_imgui_metrics); - } - - if (_show_texture_loader) { - if (ImGui::Begin("Texture Loader", &_show_texture_loader)) { - ImGuiWidgets::TextureResourceManagerLoader(engine); - } - ImGui::End(); - } - - if (_show_texture_list) { - if (ImGui::Begin("Texture List", &_show_texture_list)) { - ImGuiWidgets::TextureResourceManagerList(); + if (_show_scene_metrics) { + if (ImGui::Begin("Scene Metrics##ImGuiSceneToolsService", &_show_scene_metrics)) { + ImGui::Text("capacity: %lu", scene.capacity()); + ImGui::Text("size: %lu", scene.size()); + ImGui::Text("alive: %lu", scene.alive()); + size_t orphans = 0; + scene.orphans([&](auto) { orphans++; }); + ImGui::Text("orphans: %lu", orphans); } ImGui::End(); } @@ -131,86 +150,11 @@ namespace MM::Services { } ImGui::End(); } - - for (auto it = _text_editor_list.begin(); it != _text_editor_list.end();) { - bool keep_open = true; - it->renderImGui(&keep_open); - - if (!keep_open) { - it = _text_editor_list.erase(it); - continue; - } - it++; - } } EntityEditor& ImGuiSceneToolsService::getEntityEditor(void) { return _entity_editor; } - bool ImGuiSceneToolsService::enable(Engine& engine) { - if (!engine.tryService()) { - LOGIGS("error: rendering is not in engine"); - return false; - } - - if (!engine.tryService()) { - LOGIGS("error: filesystem not initialized"); - return false; - } - - if (!engine.tryService()) { - LOGIGS("error: no SceneServiceInterface"); - return false; - } - - // setup entity editor defaults - { - _entity_editor.show_window = false; - - _entity_editor.registerComponent("Name"); - _entity_editor.registerComponent("Transform2D"); - _entity_editor.registerComponent("Transform3D"); - _entity_editor.registerComponent("Velocity2D"); - _entity_editor.registerComponent("ViewDir2D"); - _entity_editor.registerComponent("ViewDir3D"); - _entity_editor.registerComponent("Color"); - - _entity_editor.registerComponent("Texture"); - } - - auto* sdl_ss = engine.tryService(); - if (sdl_ss) { - _event_handle = sdl_ss->addEventHandler([this](const SDL_Event& e) -> bool { - if (e.type == SDL_KEYDOWN && !e.key.repeat && e.key.keysym.sym == this->toggle_key) { - this->show_menu = !this->show_menu; - } - return false; // invis - }); - } else { - LOGIGS("Warn: no SDLService, skipping toggle hotkey"); - } - - return true; - } - - void ImGuiSceneToolsService::disable(Engine& engine) { - if (_event_handle) { - auto* sdl_ss = engine.tryService(); - sdl_ss->removeEventHandler(_event_handle); - _event_handle = nullptr; - } - } - - std::vector ImGuiSceneToolsService::registerUpdates(void) { - using namespace entt::literals; - return { - { - "ImGuiSceneToolsService::render"_hs, - "ImGuiSceneToolsService::render", - [this](Engine& e){ renderImGui(e); } - } - }; - } } // namespace MM::Services diff --git a/framework/imgui/src/mm/services/scene_tools.hpp b/framework/imgui/src/mm/services/scene_tools.hpp index 60987fa..143748a 100644 --- a/framework/imgui/src/mm/services/scene_tools.hpp +++ b/framework/imgui/src/mm/services/scene_tools.hpp @@ -1,46 +1,15 @@ #pragma once -#include - #define MM_IEEE_ENTITY_WIDGET ::MM::ImGuiWidgets::Entity // evil #define MM_IEEE_ASSERT(x) #include #include -#include +//#include namespace MM::Services { class ImGuiSceneToolsService : public Service { - public: - bool show_menu = true; - - SDL_Keycode toggle_key = SDLK_F2; - - private: - bool _show_mm_metrics = false; - bool _show_imgui_metrics = false; - bool _show_texture_loader = false; - bool _show_texture_list = false; - bool _show_entity_editor = false; - bool _show_entity_list = true; - bool _show_camera_tool = false; - - EntityEditor _entity_editor; - // for list - std::set::ComponentTypeID> _entity_comp_list; - - std::vector _text_editor_list; - - MM::Services::SDLService::EventHandlerHandle _event_handle = nullptr; - - private: - void renderImGui(Engine& engine); - - public: - EntityEditor& getEntityEditor(void); - Entity _e = entt::null; // entity currently in editor - public: bool enable(Engine& engine) override; void disable(Engine& engine) override; @@ -49,6 +18,24 @@ namespace MM::Services { std::vector registerUpdates(void) override; + private: + bool _show_scene_metrics = false; + bool _show_entity_editor = false; + bool _show_entity_list = true; + bool _show_camera_tool = false; + + EntityEditor _entity_editor; + // for list + std::set::ComponentTypeID> _entity_comp_list; + + //std::vector _text_editor_list; + + private: + void renderImGui(Engine& engine); + + public: + EntityEditor& getEntityEditor(void); + Entity _e = entt::null; // entity currently in editor }; } // namespace MM::Services diff --git a/framework/imgui/test/scene_tools_test.cpp b/framework/imgui/test/scene_tools_test.cpp index dfc915a..862a798 100644 --- a/framework/imgui/test/scene_tools_test.cpp +++ b/framework/imgui/test/scene_tools_test.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -38,6 +40,12 @@ TEST(imgui_scene_tools, it) { engine.addService(); ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + engine.addService(); engine.getUpdateStrategy().depend("ImGuiSceneToolsService::render"_hs, "SimpleSceneService::scene_tick"_hs); diff --git a/framework/imgui/test/text_edit_test.cpp b/framework/imgui/test/text_edit_test.cpp index f8b6092..eb5ec7e 100644 --- a/framework/imgui/test/text_edit_test.cpp +++ b/framework/imgui/test/text_edit_test.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include @@ -62,6 +64,12 @@ TEST(imgui_text_edit, it) { engine.addService(); ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + engine.addService(); auto& rs = engine.addService(); @@ -104,6 +112,12 @@ TEST(imgui_text_edit, shader) { engine.addService(); ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + engine.addService(); auto& rs = engine.addService();