diff --git a/framework/engine/src/mm/engine.hpp b/framework/engine/src/mm/engine.hpp index 45f63d2..f1b4752 100644 --- a/framework/engine/src/mm/engine.hpp +++ b/framework/engine/src/mm/engine.hpp @@ -18,7 +18,14 @@ namespace MM { +// fwd +namespace Services { + class ImGuiEngineTools; +} + class Engine { + friend Services::ImGuiEngineTools; + private: using service_family = entt::family; diff --git a/framework/imgui/CMakeLists.txt b/framework/imgui/CMakeLists.txt index ce725df..4b5b595 100644 --- a/framework/imgui/CMakeLists.txt +++ b/framework/imgui/CMakeLists.txt @@ -85,6 +85,9 @@ add_library(imgui_tools ./src/mm/services/scene_tools.hpp ./src/mm/services/scene_tools.cpp + + ./src/mm/services/engine_tools.hpp + ./src/mm/services/engine_tools.cpp ) target_include_directories(imgui_tools PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src") diff --git a/framework/imgui/src/mm/services/engine_tools.cpp b/framework/imgui/src/mm/services/engine_tools.cpp new file mode 100644 index 0000000..a6be3e7 --- /dev/null +++ b/framework/imgui/src/mm/services/engine_tools.cpp @@ -0,0 +1,89 @@ +#include "./engine_tools.hpp" + +#include + +#include +#include + +#include + +#include +#define LOGIGS(x) LOG("ImGuiSceneToolsService", x) + +namespace MM::Services { + + bool ImGuiEngineTools::enable(Engine& engine) { + auto& menu_bar = engine.getService(); + + menu_bar.menu_tree["Engine"]["Stop Engine"] = [](Engine& e) { + ImGui::Separator(); + if (ImGui::MenuItem("Stop Engine")) { + e.stop(); + } + }; + + menu_bar.menu_tree["Engine"]["About"] = [this](Engine&) { + ImGui::MenuItem("About", NULL, &_show_about); + }; + + menu_bar.menu_tree["Engine"]["Services"] = [this](Engine&) { + ImGui::MenuItem("Services", NULL, &_show_services); + }; + + return true; + } + + void ImGuiEngineTools::disable(Engine& engine) { + auto& menu_bar = engine.getService(); + + menu_bar.menu_tree["Engine"].erase("Stop Engine"); + } + + std::vector ImGuiEngineTools::registerUpdates(void) { + using namespace entt::literals; + return { + { + "ImGuiEngineTools::render"_hs, + "ImGuiEngineTools::render", + [this](Engine& e){ renderImGui(e); }, + UpdateStrategies::update_phase_t::MAIN, + true, + { + "ImGuiMenuBar::render"_hs + } + } + }; + } + + void ImGuiEngineTools::renderImGui(Engine& engine) { + if (_show_about) { + renderAbout(); + } + + if (_show_services) { + renderServices(engine); + } + } + + void ImGuiEngineTools::renderAbout(void) { + if (ImGui::Begin("About##EngineTools", &_show_about)) { + ImGui::Text("TODO"); + ImGui::Text("MushMachine"); + ImGui::Text("EnTT v%d.%d.%d", ENTT_VERSION_MAJOR, ENTT_VERSION_MINOR, ENTT_VERSION_PATCH); + } + ImGui::End(); + } + + void ImGuiEngineTools::renderServices(Engine& engine) { + if (ImGui::Begin("Services##EngineTools", &_show_services)) { + ImGui::Text("TODO: use new table api"); + + for (auto& it : engine._services) { + ImGui::Text("[%d|%s]: %s", it.first, it.second->second->name(), it.second->first ? "enabled" : "disabled"); + } + } + ImGui::End(); + } + +} // namespace MM::Services + diff --git a/framework/imgui/src/mm/services/engine_tools.hpp b/framework/imgui/src/mm/services/engine_tools.hpp new file mode 100644 index 0000000..be36533 --- /dev/null +++ b/framework/imgui/src/mm/services/engine_tools.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "./imgui_menu_bar.hpp" + +namespace MM::Services { + + class ImGuiEngineTools : public Service { + public: + const char* name(void) override { return "ImGuiEngineTools"; } + + bool enable(Engine& engine) override; + void disable(Engine& engine) override; + + std::vector registerUpdates(void) override; + + private: + bool _show_about = false; + bool _show_services = false; + + private: + void renderImGui(Engine& engine); + + void renderAbout(void); + void renderServices(Engine& engine); + }; + +} // namespace MM::Services + diff --git a/framework/imgui/src/mm/services/imgui_menu_bar.cpp b/framework/imgui/src/mm/services/imgui_menu_bar.cpp index 6061d97..db926bd 100644 --- a/framework/imgui/src/mm/services/imgui_menu_bar.cpp +++ b/framework/imgui/src/mm/services/imgui_menu_bar.cpp @@ -80,7 +80,7 @@ namespace MM::Services { } - ImGui::Text("%.1fFPS", ImGui::GetIO().Framerate); + ImGui::Text("| %.1fFPS", ImGui::GetIO().Framerate); ImGui::EndMainMenuBar(); } } diff --git a/framework/imgui/test/CMakeLists.txt b/framework/imgui/test/CMakeLists.txt index e6f4207..95df3ac 100644 --- a/framework/imgui/test/CMakeLists.txt +++ b/framework/imgui/test/CMakeLists.txt @@ -37,6 +37,25 @@ add_test(NAME imgui_scene_tools_test COMMAND imgui_scene_tools_test) #################### +add_executable(imgui_engine_tools_test + engine_tools_test.cpp +) + +target_include_directories(imgui_engine_tools_test PRIVATE ".") + +target_link_libraries(imgui_engine_tools_test + engine + opengl_renderer_s + imgui_service + imgui_render_task + imgui_tools + gtest_main +) + +add_test(NAME imgui_engine_tools_test COMMAND imgui_engine_tools_test) + +#################### + add_executable(imgui_sound_test sound_test.cpp ) diff --git a/framework/imgui/test/engine_tools_test.cpp b/framework/imgui/test/engine_tools_test.cpp new file mode 100644 index 0000000..9ea00c5 --- /dev/null +++ b/framework/imgui/test/engine_tools_test.cpp @@ -0,0 +1,55 @@ +#include "mm/services/imgui_menu_bar.hpp" +#include + +#include + +#include +#include +#include + +#include +#include + +#include + +static char* argv0; + +TEST(imgui_scene_tools, it) { + MM::Engine engine; + + auto& sdl_ss = engine.addService(SDL_INIT_VIDEO); + ASSERT_TRUE(engine.enableService()); + + sdl_ss.createGLWindow("imgui_engine_tools_test", 1280, 720); + + engine.addService(argv0, "imgui_engine_tools_test"); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + auto& rs = engine.addService(); + ASSERT_TRUE(engine.enableService()); + + rs.addRenderTask(engine); + + engine.run(); + + sdl_ss.destroyWindow(); + +} + +int main(int argc, char** argv) { + argv0 = argv[0]; + + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} +