diff --git a/files.cmake b/files.cmake index adacbde6ef..9a8de3244d 100644 --- a/files.cmake +++ b/files.cmake @@ -1336,6 +1336,10 @@ set(DUSK_FILES #src/dusk/m_Do_ext_dusk.cpp src/dusk/imgui/ImGuiConsole.hpp src/dusk/imgui/ImGuiConsole.cpp + src/dusk/imgui/ImGuiMenuGame.cpp + src/dusk/imgui/ImGuiMenuGame.hpp + src/dusk/imgui/ImGuiMenuTools.cpp + src/dusk/imgui/ImGuiMenuTools.hpp src/dusk/imgui/ImGuiProcessOverlay.cpp src/dusk/imgui/ImGuiCameraOverlay.cpp src/dusk/imgui/ImGuiHeapOverlay.cpp diff --git a/src/dusk/imgui/ImGuiCameraOverlay.cpp b/src/dusk/imgui/ImGuiCameraOverlay.cpp index 564956a6d5..58b31fe00f 100644 --- a/src/dusk/imgui/ImGuiCameraOverlay.cpp +++ b/src/dusk/imgui/ImGuiCameraOverlay.cpp @@ -3,10 +3,11 @@ #include "imgui.h" #include "ImGuiConsole.hpp" +#include "ImGuiMenuTools.hpp" namespace dusk { - void ImGuiConsole::ShowCameraOverlay() { - if (!CheckMenuViewToggle(ImGuiKey_F6, m_showCameraOverlay)) { + void ImGuiMenuTools::ShowCameraOverlay() { + if (!ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F6, m_showCameraOverlay)) { return; } diff --git a/src/dusk/imgui/ImGuiConsole.cpp b/src/dusk/imgui/ImGuiConsole.cpp index 99bf1d211c..d23280ba80 100644 --- a/src/dusk/imgui/ImGuiConsole.cpp +++ b/src/dusk/imgui/ImGuiConsole.cpp @@ -92,102 +92,13 @@ namespace dusk { } if (ImGui::BeginMainMenuBar()) { - if (ImGui::BeginMenu("View")) { - ImGui::MenuItem("Hide UI", "F1", &m_isHidden); - ImGui::MenuItem("Process Management", "F2", &m_showProcessManagement); - ImGui::MenuItem("Debug Overlay", "F3", &m_showDebugOverlay); - ImGui::MenuItem("Heaps", "F4", &m_showHeapOverlay); - ImGui::MenuItem("Stub Log", "F5", &m_showStubLog); - ImGui::MenuItem("Camera", "F6", &m_showCameraOverlay); - ImGui::MenuItem("Input Viewer", nullptr, &m_showInputViewer); - ImGui::MenuItem("Map Loader", nullptr, &m_showMapLoader); - ImGui::EndMenu(); - } - - if (ImGui::BeginMenu("Game")) { - if (ImGui::Selectable("Reset")) { - JUTGamePad::C3ButtonReset::sResetSwitchPushing = true; - } - ImGui::EndMenu(); - } - - ShowDebugOverlay(); - ShowCameraOverlay(); - ShowProcessManager(); - ShowHeapOverlay(); - ShowInputViewer(); - ShowStubLog(); - ShowMapLoader(); - - DuskDebugPad(); // temporary, remove later + m_menuGame.draw(); + m_menuTools.draw(); ImGui::EndMainMenuBar(); } } - void ImGuiConsole::ShowDebugOverlay() { - if (!CheckMenuViewToggle(ImGuiKey_F3, m_showDebugOverlay)) { - return; - } - - ImGuiIO& io = ImGui::GetIO(); - ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoDecoration | - ImGuiWindowFlags_AlwaysAutoResize | - ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoNav; - if (m_debugOverlayCorner != -1) { - SetOverlayWindowLocation(m_debugOverlayCorner); - windowFlags |= ImGuiWindowFlags_NoMove; - } - - ImGui::SetNextWindowBgAlpha(0.65f); - if (ImGui::Begin("Debug Overlay", nullptr, windowFlags)) { - bool hasPrevious = false; - if (hasPrevious) { - ImGui::Separator(); - } - hasPrevious = true; - - ImGuiStringViewText(fmt::format(FMT_STRING("FPS: {:.2f}\n"), io.Framerate)); - - if (hasPrevious) { - ImGui::Separator(); - } - hasPrevious = true; - - ImGuiStringViewText(fmt::format(FMT_STRING("Backend: {}\n"), backend_name(aurora_get_backend()))); - - if (hasPrevious) { - ImGui::Separator(); - } - hasPrevious = true; - - AuroraStats const* stats = aurora_get_stats(); - - ImGuiStringViewText( - fmt::format(FMT_STRING("Queued pipelines: {}\n"), stats->queuedPipelines)); - ImGuiStringViewText( - fmt::format(FMT_STRING("Done pipelines: {}\n"), stats->createdPipelines)); - ImGuiStringViewText( - fmt::format(FMT_STRING("Draw call count: {}\n"), stats->drawCallCount)); - ImGuiStringViewText(fmt::format(FMT_STRING("Merged draw calls: {}\n"), - stats->mergedDrawCallCount)); - ImGuiStringViewText(fmt::format(FMT_STRING("Vertex size: {}\n"), - BytesToString(stats->lastVertSize))); - ImGuiStringViewText(fmt::format(FMT_STRING("Uniform size: {}\n"), - BytesToString(stats->lastUniformSize))); - ImGuiStringViewText(fmt::format(FMT_STRING("Index size: {}\n"), - BytesToString(stats->lastIndexSize))); - ImGuiStringViewText(fmt::format(FMT_STRING("Storage size: {}\n"), - BytesToString(stats->lastStorageSize))); - ImGuiStringViewText(fmt::format( - FMT_STRING("Total: {}\n"), - BytesToString(stats->lastVertSize + stats->lastUniformSize + - stats->lastIndexSize + stats->lastStorageSize))); - } - ImGui::End(); - } - bool ImGuiConsole::CheckMenuViewToggle(ImGuiKey key, bool& active) { if (ImGui::IsKeyPressed(key)) { active = !active; diff --git a/src/dusk/imgui/ImGuiConsole.hpp b/src/dusk/imgui/ImGuiConsole.hpp index 31afb90335..96fd1dd7fc 100644 --- a/src/dusk/imgui/ImGuiConsole.hpp +++ b/src/dusk/imgui/ImGuiConsole.hpp @@ -5,55 +5,22 @@ #include #include "imgui.h" +#include "ImGuiMenuGame.hpp" +#include "ImGuiMenuTools.hpp" namespace dusk { class ImGuiConsole { public: ImGuiConsole(); - void draw(); - void ShowDebugOverlay(); - void ShowCameraOverlay(); - void ShowProcessManager(); - void ShowHeapOverlay(); - void ShowInputViewer(); - void ShowStubLog(); - void ShowMapLoader(); - - bool CheckMenuViewToggle(ImGuiKey key, bool& active); + static bool CheckMenuViewToggle(ImGuiKey key, bool& active); private: bool m_isHidden = false; - bool m_showDebugOverlay = false; - int m_debugOverlayCorner = 0; // top-left - - bool m_showCameraOverlay = false; - int m_cameraOverlayCorner = 3; - - bool m_showProcessManagement = false; - - bool m_showHeapOverlay = false; - - bool m_showStubLog = false; - - bool m_showInputViewer = false; - int m_inputOverlayCorner = 3; - std::string m_controllerName; - - bool m_showMapLoader = false; - struct { - int mapIdx = -1; - int regionIdx = -1; - int roomNoIdx = 0; - int pointNoIdx = 0; - int roomNo = -1; - int pointNo = -1; - int spawnId = 0; - int layer = -1; - bool showInternalNames = false; - } m_mapLoaderInfo; + ImGuiMenuGame m_menuGame; + ImGuiMenuTools m_menuTools; }; extern ImGuiConsole g_imguiConsole; @@ -62,6 +29,7 @@ namespace dusk { std::string BytesToString(size_t bytes); void SetOverlayWindowLocation(int corner); bool ShowCornerContextMenu(int& corner, int avoidCorner); + void ImGuiStringViewText(std::string_view text); } void DuskDebugPad(); diff --git a/src/dusk/imgui/ImGuiControllerOverlay.cpp b/src/dusk/imgui/ImGuiControllerOverlay.cpp index 87dbad8729..0da82ac878 100644 --- a/src/dusk/imgui/ImGuiControllerOverlay.cpp +++ b/src/dusk/imgui/ImGuiControllerOverlay.cpp @@ -3,6 +3,7 @@ #include "imgui.h" #include #include "ImGuiConsole.hpp" +#include "ImGuiMenuGame.hpp" namespace dusk { void TextCenter(const std::string& text) { @@ -14,7 +15,7 @@ namespace dusk { static inline float GetScale() { return ImGui::GetCurrentContext()->CurrentDpiScale; } - void ImGuiConsole::ShowInputViewer() { + void ImGuiMenuGame::windowInputViewer() { if (!m_showInputViewer) { return; } diff --git a/src/dusk/imgui/ImGuiHeapOverlay.cpp b/src/dusk/imgui/ImGuiHeapOverlay.cpp index d2660af6eb..43e495587f 100644 --- a/src/dusk/imgui/ImGuiHeapOverlay.cpp +++ b/src/dusk/imgui/ImGuiHeapOverlay.cpp @@ -4,12 +4,13 @@ #include "JSystem/JKernel/JKRHeap.h" #include "imgui.h" #include "ImGuiConsole.hpp" +#include "ImGuiMenuTools.hpp" namespace dusk { static void DrawTableCore(); - void ImGuiConsole::ShowHeapOverlay() { - if (!CheckMenuViewToggle(ImGuiKey_F4, m_showHeapOverlay)) { + void ImGuiMenuTools::ShowHeapOverlay() { + if (!ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F4, m_showHeapOverlay)) { return; } diff --git a/src/dusk/imgui/ImGuiMapLoader.cpp b/src/dusk/imgui/ImGuiMapLoader.cpp index 095d02ce5c..4b52fd1b04 100644 --- a/src/dusk/imgui/ImGuiMapLoader.cpp +++ b/src/dusk/imgui/ImGuiMapLoader.cpp @@ -3,10 +3,11 @@ #include "imgui.h" #include #include "ImGuiConsole.hpp" +#include "ImGuiMenuTools.hpp" #include "dusk/map_loader_definitions.h" namespace dusk { - void ImGuiConsole::ShowMapLoader() { + void ImGuiMenuTools::ShowMapLoader() { if (!m_showMapLoader) { return; } diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp new file mode 100644 index 0000000000..a92db0cdd1 --- /dev/null +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -0,0 +1,87 @@ +#include "fmt/format.h" +#include "imgui.h" +#include "aurora/gfx.h" + +#include "ImGuiConsole.hpp" +#include "ImGuiMenuGame.hpp" + +#include "JSystem/JUtility/JUTGamePad.h" +#include "m_Do/m_Do_audio.h" + +namespace dusk { + ImGuiMenuGame::ImGuiMenuGame() {} + + void ImGuiMenuGame::draw() { + if (ImGui::BeginMenu("Game")) { + if (ImGui::MenuItem("Reset", "Ctrl+R")) { + JUTGamePad::C3ButtonReset::sResetSwitchPushing = true; + } + + ImGui::Separator(); + + if (ImGui::BeginMenu("Graphics")) { + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Audio")) { + ImGui::Text("Master Volume"); + ImGui::SliderFloat("##m_masterVolume", &m_audioSettings.m_masterVolume, 0.0f, 1.0f, ""); + + ImGui::Text("Main Music Volume"); + ImGui::SliderFloat("##m_mainMusicVolume", &m_audioSettings.m_mainMusicVolume, 0.0f, 1.0f, ""); + + ImGui::Text("Sub Music Volume"); + ImGui::SliderFloat("##m_subMusicVolume", &m_audioSettings.m_subMusicVolume, 0.0f, 1.0f, ""); + + ImGui::Text("Sound Effects Volume"); + ImGui::SliderFloat("##m_soundEffectsVolume", &m_audioSettings.m_soundEffectsVolume, 0.0f, 1.0f, ""); + + ImGui::Text("Fanfare Volume"); + ImGui::SliderFloat("##m_fanfareVolume", &m_audioSettings.m_fanfareVolume, 0.0f, 1.0f, ""); + + Z2AudioMgr* audioMgr = Z2AudioMgr::getInterface(); + if (audioMgr != nullptr) { + // TODO: actually apply volume settings + } + + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Controller")) { + ImGui::MenuItem("Configure Controller", nullptr, &m_showControllerConfig); + ImGui::Checkbox("Show Input Viewer", &m_showInputViewer); + + ImGui::EndMenu(); + } + + ImGui::EndMenu(); + } + + windowInputViewer(); + windowControllerConfig(); + + if ((ImGui::IsKeyDown(ImGuiKey_LeftCtrl) || ImGui::IsKeyDown(ImGuiKey_RightCtrl)) && ImGui::IsKeyPressed(ImGuiKey_R)) { + JUTGamePad::C3ButtonReset::sResetSwitchPushing = true; + } + } + + void ImGuiMenuGame::windowControllerConfig() { + if (!m_showControllerConfig) { + return; + } + + ImGuiWindowFlags windowFlags = + ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_AlwaysAutoResize; + + ImGui::SetNextWindowBgAlpha(0.65f); + ImGui::SetNextWindowSizeConstraints(ImVec2(500, 200), ImVec2(1000, 200)); + + if (!ImGui::Begin("Controller Config", nullptr, windowFlags)) { + ImGui::End(); + return; + } + + ImGui::End(); + } +} \ No newline at end of file diff --git a/src/dusk/imgui/ImGuiMenuGame.hpp b/src/dusk/imgui/ImGuiMenuGame.hpp new file mode 100644 index 0000000000..3b09a62da3 --- /dev/null +++ b/src/dusk/imgui/ImGuiMenuGame.hpp @@ -0,0 +1,35 @@ +#ifndef DUSK_IMGUI_MENUGAME_HPP +#define DUSK_IMGUI_MENUGAME_HPP + +#include +#include + +#include "imgui.h" + +namespace dusk { + class ImGuiMenuGame { + public: + ImGuiMenuGame(); + void draw(); + + void windowInputViewer(); + void windowControllerConfig(); + + private: + struct { + float m_masterVolume = 1.0f; + float m_mainMusicVolume = 1.0f; + float m_subMusicVolume = 1.0f; + float m_soundEffectsVolume = 1.0f; + float m_fanfareVolume = 1.0f; + } m_audioSettings; + + bool m_showControllerConfig = false; + + bool m_showInputViewer = false; + int m_inputOverlayCorner = 3; + std::string m_controllerName; + }; +} + +#endif // DUSK_IMGUI_MENUGAME_HPP diff --git a/src/dusk/imgui/ImGuiMenuTools.cpp b/src/dusk/imgui/ImGuiMenuTools.cpp new file mode 100644 index 0000000000..64afcc2ddf --- /dev/null +++ b/src/dusk/imgui/ImGuiMenuTools.cpp @@ -0,0 +1,94 @@ +#include "fmt/format.h" +#include "imgui.h" +#include "aurora/gfx.h" + +#include "ImGuiConsole.hpp" +#include "ImGuiMenuTools.hpp" + +namespace dusk { + ImGuiMenuTools::ImGuiMenuTools() {} + + void ImGuiMenuTools::draw() { + if (ImGui::BeginMenu("Tools")) { + ImGui::MenuItem("Process Management", "F2", &m_showProcessManagement); + ImGui::MenuItem("Debug Overlay", "F3", &m_showDebugOverlay); + ImGui::MenuItem("Heaps", "F4", &m_showHeapOverlay); + ImGui::MenuItem("Stub Log", "F5", &m_showStubLog); + ImGui::MenuItem("Camera", "F6", &m_showCameraOverlay); + ImGui::MenuItem("Map Loader", nullptr, &m_showMapLoader); + ImGui::EndMenu(); + } + + ShowDebugOverlay(); + ShowCameraOverlay(); + ShowProcessManager(); + ShowHeapOverlay(); + ShowStubLog(); + ShowMapLoader(); + + DuskDebugPad(); // temporary, remove later + } + + void ImGuiMenuTools::ShowDebugOverlay() { + if (!ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F3, m_showDebugOverlay)) { + return; + } + + ImGuiIO& io = ImGui::GetIO(); + ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoDecoration | + ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoFocusOnAppearing | + ImGuiWindowFlags_NoNav; + if (m_debugOverlayCorner != -1) { + SetOverlayWindowLocation(m_debugOverlayCorner); + windowFlags |= ImGuiWindowFlags_NoMove; + } + + ImGui::SetNextWindowBgAlpha(0.65f); + if (ImGui::Begin("Debug Overlay", nullptr, windowFlags)) { + bool hasPrevious = false; + if (hasPrevious) { + ImGui::Separator(); + } + hasPrevious = true; + + ImGuiStringViewText(fmt::format(FMT_STRING("FPS: {:.2f}\n"), io.Framerate)); + + if (hasPrevious) { + ImGui::Separator(); + } + hasPrevious = true; + + ImGuiStringViewText(fmt::format(FMT_STRING("Backend: {}\n"), backend_name(aurora_get_backend()))); + + if (hasPrevious) { + ImGui::Separator(); + } + hasPrevious = true; + + AuroraStats const* stats = aurora_get_stats(); + + ImGuiStringViewText( + fmt::format(FMT_STRING("Queued pipelines: {}\n"), stats->queuedPipelines)); + ImGuiStringViewText( + fmt::format(FMT_STRING("Done pipelines: {}\n"), stats->createdPipelines)); + ImGuiStringViewText( + fmt::format(FMT_STRING("Draw call count: {}\n"), stats->drawCallCount)); + ImGuiStringViewText(fmt::format(FMT_STRING("Merged draw calls: {}\n"), + stats->mergedDrawCallCount)); + ImGuiStringViewText(fmt::format(FMT_STRING("Vertex size: {}\n"), + BytesToString(stats->lastVertSize))); + ImGuiStringViewText(fmt::format(FMT_STRING("Uniform size: {}\n"), + BytesToString(stats->lastUniformSize))); + ImGuiStringViewText(fmt::format(FMT_STRING("Index size: {}\n"), + BytesToString(stats->lastIndexSize))); + ImGuiStringViewText(fmt::format(FMT_STRING("Storage size: {}\n"), + BytesToString(stats->lastStorageSize))); + ImGuiStringViewText(fmt::format( + FMT_STRING("Total: {}\n"), + BytesToString(stats->lastVertSize + stats->lastUniformSize + + stats->lastIndexSize + stats->lastStorageSize))); + } + ImGui::End(); + } +} \ No newline at end of file diff --git a/src/dusk/imgui/ImGuiMenuTools.hpp b/src/dusk/imgui/ImGuiMenuTools.hpp new file mode 100644 index 0000000000..1a2e5c705f --- /dev/null +++ b/src/dusk/imgui/ImGuiMenuTools.hpp @@ -0,0 +1,50 @@ +#ifndef DUSK_IMGUI_MENUTOOLS_HPP +#define DUSK_IMGUI_MENUTOOLS_HPP + +#include +#include + +#include "imgui.h" + +namespace dusk { + class ImGuiMenuTools { + public: + ImGuiMenuTools(); + void draw(); + + void ShowDebugOverlay(); + void ShowCameraOverlay(); + void ShowProcessManager(); + void ShowHeapOverlay(); + void ShowStubLog(); + void ShowMapLoader(); + + private: + bool m_showDebugOverlay = false; + int m_debugOverlayCorner = 0; // top-left + + bool m_showCameraOverlay = false; + int m_cameraOverlayCorner = 3; + + bool m_showProcessManagement = false; + + bool m_showHeapOverlay = false; + + bool m_showStubLog = false; + + bool m_showMapLoader = false; + struct { + int mapIdx = -1; + int regionIdx = -1; + int roomNoIdx = 0; + int pointNoIdx = 0; + int roomNo = -1; + int pointNo = -1; + int spawnId = 0; + int layer = -1; + bool showInternalNames = false; + } m_mapLoaderInfo; + }; +} + +#endif // DUSK_IMGUI_MENUTOOLS_HPP diff --git a/src/dusk/imgui/ImGuiProcessOverlay.cpp b/src/dusk/imgui/ImGuiProcessOverlay.cpp index 38d8beed26..cf2d22402e 100644 --- a/src/dusk/imgui/ImGuiProcessOverlay.cpp +++ b/src/dusk/imgui/ImGuiProcessOverlay.cpp @@ -11,6 +11,7 @@ #include "f_pc/f_pc_node.h" #include "imgui.h" #include "ImGuiConsole.hpp" +#include "ImGuiMenuTools.hpp" #include "imgui_internal.h" namespace dusk { @@ -68,8 +69,8 @@ namespace dusk { return 1; } - void ImGuiConsole::ShowProcessManager() { - if (!CheckMenuViewToggle(ImGuiKey_F2, m_showProcessManagement)) { + void ImGuiMenuTools::ShowProcessManager() { + if (!ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F2, m_showProcessManagement)) { return; } diff --git a/src/dusk/imgui/ImGuiStubLog.cpp b/src/dusk/imgui/ImGuiStubLog.cpp index 774ad3f7cc..fc9780800a 100644 --- a/src/dusk/imgui/ImGuiStubLog.cpp +++ b/src/dusk/imgui/ImGuiStubLog.cpp @@ -3,6 +3,7 @@ #include "dusk/logging.h" #include "imgui.h" #include "ImGuiConsole.hpp" +#include "ImGuiMenuTools.hpp" namespace dusk { static ImGuiTextBuffer StubLogBuffer; @@ -38,8 +39,8 @@ namespace dusk { static void ClearPastFrame(); - void ImGuiConsole::ShowStubLog() { - if (!CheckMenuViewToggle(ImGuiKey_F5, m_showStubLog)) { + void ImGuiMenuTools::ShowStubLog() { + if (!ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F5, m_showStubLog)) { ClearPastFrame(); return; }