From 55b905f3776e7e0ff4ded9cb6161a9ba9345631b Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 7 Mar 2025 14:52:36 -0700 Subject: [PATCH] Setup imgui layout for editor --- src/engine/editor/EditorMath.cpp | 6 +- src/engine/editor/Gizmo.cpp | 5 ++ src/port/ui/ContentBrowser.cpp | 26 ++++++++ src/port/ui/ContentBrowser.h | 15 +++++ src/port/ui/EditorWindow.cpp | 106 ------------------------------- src/port/ui/ImguiUI.cpp | 18 ++++++ src/port/ui/MenuTypes.h | 2 + src/port/ui/PortMenu.cpp | 19 +++++- src/port/ui/SceneExplorer.cpp | 27 ++++++++ src/port/ui/SceneExplorer.h | 15 +++++ src/port/ui/Tools.cpp | 34 ++++++++++ src/port/ui/Tools.h | 16 +++++ 12 files changed, 179 insertions(+), 110 deletions(-) create mode 100644 src/port/ui/ContentBrowser.cpp create mode 100644 src/port/ui/ContentBrowser.h delete mode 100644 src/port/ui/EditorWindow.cpp create mode 100644 src/port/ui/SceneExplorer.cpp create mode 100644 src/port/ui/SceneExplorer.h create mode 100644 src/port/ui/Tools.cpp create mode 100644 src/port/ui/Tools.h diff --git a/src/engine/editor/EditorMath.cpp b/src/engine/editor/EditorMath.cpp index 2173fa0ad..040816fd5 100644 --- a/src/engine/editor/EditorMath.cpp +++ b/src/engine/editor/EditorMath.cpp @@ -23,10 +23,12 @@ FVector ScreenRayTrace() { Camera* camera = &cameras[0]; Ship::Coords mouse = wnd->GetMousePos(); + mouse.x -= gfx_current_game_window_viewport.x; + mouse.y -= gfx_current_game_window_viewport.y; // Get screen dimensions - uint32_t width = wnd->GetWidth(); - uint32_t height = wnd->GetHeight(); + uint32_t width = OTRGetGameRenderWidth(); + uint32_t height = OTRGetGameRenderHeight(); // Convert mouse to NDS screen coordinates float x = (2.0f * mouse.x) / width - 1.0f; // Normalized X: -1 to 1 diff --git a/src/engine/editor/Gizmo.cpp b/src/engine/editor/Gizmo.cpp index b7e37cf1e..7bfbf9d0a 100644 --- a/src/engine/editor/Gizmo.cpp +++ b/src/engine/editor/Gizmo.cpp @@ -21,6 +21,7 @@ extern "C" { #include "math_util_2.h" #include "camera.h" #include "courses/harbour/ship_model.h" +#include "src/racing/collision.h" } Gizmo::Gizmo() { @@ -93,6 +94,10 @@ void Gizmo::Translate() { break; } + if (CVarGetInteger("gEditorSnapToGround", false) == true) { + _selected->Pos->y = spawn_actor_on_surface(_selected->Pos->x, 2000.0f, _selected->Pos->z); + } + Pos = FVector( _selected->Pos->x, _selected->Pos->y, diff --git a/src/port/ui/ContentBrowser.cpp b/src/port/ui/ContentBrowser.cpp new file mode 100644 index 000000000..6d9d7099c --- /dev/null +++ b/src/port/ui/ContentBrowser.cpp @@ -0,0 +1,26 @@ +#include "ContentBrowser.h" +#include "port/ui/PortMenu.h" +#include "UIWidgets.h" +#include "libultraship/src/Context.h" + +#include +#include +#include +#include +#include "spdlog/formatter.h" +#include +#include + +namespace Editor { + + ContentBrowserWindow::~ContentBrowserWindow() { + SPDLOG_TRACE("destruct editor window"); + } + + void ContentBrowserWindow::DrawElement() { + ImGui::Text("This is your Content browser Lab editor window!"); + if (ImGui::Button("Click Me")) { + // Handle button click (example) + } + } +} \ No newline at end of file diff --git a/src/port/ui/ContentBrowser.h b/src/port/ui/ContentBrowser.h new file mode 100644 index 000000000..d986aa0e3 --- /dev/null +++ b/src/port/ui/ContentBrowser.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace Editor { +class ContentBrowserWindow : public Ship::GuiWindow { +public: + using Ship::GuiWindow::GuiWindow; + ~ContentBrowserWindow(); +protected: + void InitElement() override {}; + void DrawElement() override; + void UpdateElement() override {}; +}; +} \ No newline at end of file diff --git a/src/port/ui/EditorWindow.cpp b/src/port/ui/EditorWindow.cpp deleted file mode 100644 index 665f247f0..000000000 --- a/src/port/ui/EditorWindow.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "EditorWindow.h" -#include "port/ui/PortMenu.h" -#include "UIWidgets.h" -#include "libultraship/src/Context.h" - -#include -#include -#include -#include -#include "spdlog/formatter.h" -#include -#include - -namespace GameUI { - - extern std::shared_ptr mPortMenu; - - void RegisterEditorWidgets() { - mPortMenu->AddSidebarEntry("Enhancements", "HM64 Lab", 4); - WidgetPath path = { "Enhancements", "HM64 Lab", SECTION_COLUMN_1 }; - mPortMenu->AddWidget(path, "Enable HM64 Labs", WIDGET_CVAR_CHECKBOX) - .CVar("gEditor") - .Options(UIWidgets::CheckboxOptions({{ .tooltip = "Edit the universe!"}})); - } - -static RegisterMenuInitFunc initFunc(RegisterEditorWidgets); - -} // namespace GameUI - -namespace EditorWin { - - EditorWindow::~EditorWindow() { - SPDLOG_TRACE("destruct editor window"); - } - - void EditorWindow::DrawElement() { - auto viewport = ImGui::GetMainViewport(); - ImGuiID mainDock = ImGui::GetID("main_dock"); - - EditorWindow::SetupLayout(); - EditorWindow::DrawContentBrowser(viewport, mainDock); - EditorWindow::DrawSceneExplorer(viewport, mainDock); - - - } - - void EditorWindow::SetupLayout() { - - } - - void EditorWindow::DrawContentBrowser(ImGuiViewport* viewport, ImGuiID mainDock) { - ImGuiID bottomId = 0; - - if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_DockingEnable) { - - if (!ImGui::DockBuilderGetNode(mainDock)) { - bottomId = ImGui::DockBuilderSplitNode(mainDock, ImGuiDir_Down, 0.25f, nullptr, nullptr); - ImGui::DockBuilderSetNodeSize(bottomId, ImVec2(viewport->Size.x * 0.2f, viewport->Size.y)); - - - - - - ImGui::DockBuilderDockWindow("Content Browser", bottomId); - ImGui::DockBuilderFinish(mainDock); - } - } - - if (ImGui::Begin("Content Browser", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove)) { - - ImGui::Text("This is your Content browser Lab editor window!"); - if (ImGui::Button("Click Me")) { - // Handle button click (example) - } - ImGui::End(); - } - } - - void EditorWindow::DrawSceneExplorer(ImGuiViewport* viewport, ImGuiID mainDock) { - ImGuiID rightId = 0; - - if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_DockingEnable) { - - if (!ImGui::DockBuilderGetNode(mainDock)) { - rightId = ImGui::DockBuilderSplitNode(mainDock, ImGuiDir_Right, 0.25f, nullptr, nullptr); - ImGui::DockBuilderSetNodeSize(rightId, ImVec2(viewport->Size.x * 0.2f, viewport->Size.y)); - - - - - - ImGui::DockBuilderDockWindow("HM64 Lab", rightId); - ImGui::DockBuilderFinish(mainDock); - } - } - - if (ImGui::Begin("HM64 Lab", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove)) { - - ImGui::Text("This is your HM64 Lab editor window!"); - if (ImGui::Button("Click Me")) { - // Handle button click (example) - } - ImGui::End(); - } - } -} diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index bbaa97454..6c31ad087 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -4,6 +4,9 @@ #include "GameInfoWindow.h" #include "MultiplayerWindow.h" #include "FreecamWindow.h" +#include "Tools.h" +#include "SceneExplorer.h" +#include "ContentBrowser.h" #include #include @@ -32,6 +35,9 @@ std::shared_ptr mInputEditorWindow; std::shared_ptr mGfxDebuggerWindow; std::shared_ptr mGameInfoWindow; std::shared_ptr mMultiplayerWindow; +std::shared_ptr mToolsWindow; +std::shared_ptr mSceneExplorerWindow; +std::shared_ptr mContentBrowserWindow; void SetupGuiElements() { auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); @@ -73,6 +79,15 @@ void SetupGuiElements() { SPDLOG_ERROR("Could not find input GfxDebuggerWindow"); } + mToolsWindow = std::make_shared("gEditorEnabled", true, "Tools", ImVec2(100, 100), (ImGuiWindowFlags_NoTitleBar)); + gui->AddGuiWindow(mToolsWindow); + + mSceneExplorerWindow = std::make_shared("gEditorEnabled", "Scene Explorer"); + gui->AddGuiWindow(mSceneExplorerWindow); + + mContentBrowserWindow = std::make_shared("gEditorEnabled", "Content Browser"); + gui->AddGuiWindow(mContentBrowserWindow); + mGameInfoWindow = std::make_shared("gGameInfoEnabled", "Game Info"); gui->AddGuiWindow(mGameInfoWindow); } @@ -82,6 +97,9 @@ void Destroy() { mConsoleWindow = nullptr; mStatsWindow = nullptr; mInputEditorWindow = nullptr; + mToolsWindow = nullptr; + mSceneExplorerWindow = nullptr; + mContentBrowserWindow = nullptr; } std::string GetWindowButtonText(const char* text, bool menuOpen) { diff --git a/src/port/ui/MenuTypes.h b/src/port/ui/MenuTypes.h index 72ac48846..653c6955d 100644 --- a/src/port/ui/MenuTypes.h +++ b/src/port/ui/MenuTypes.h @@ -7,6 +7,8 @@ typedef enum { DISABLE_FOR_FREE_CAM_ON, DISABLE_FOR_FREE_CAM_OFF, + DISABLE_FOR_EDITOR_ON, + DISABLE_FOR_EDITOR_OFF, DISABLE_FOR_DEBUG_MODE_OFF, DISABLE_FOR_NO_VSYNC, DISABLE_FOR_NO_WINDOWED_FULLSCREEN, diff --git a/src/port/ui/PortMenu.cpp b/src/port/ui/PortMenu.cpp index 825ed8527..83aeb97e3 100644 --- a/src/port/ui/PortMenu.cpp +++ b/src/port/ui/PortMenu.cpp @@ -360,6 +360,17 @@ void PortMenu::AddEnhancements() { .CVar("gMinHeight") .Options(FloatSliderOptions().Min(-50.0f).Max(50.0f).DefaultValue(0.0f) .Tooltip("When Disable Wall Collision are enable what is the minimal height you can get.")); + + path = { "Enhancements", "HM64 Lab", SECTION_COLUMN_1 }; + AddSidebarEntry("Enhancements", "HM64 Lab", 4); + AddWidget(path, "Enable HM64 Labs", WIDGET_CVAR_CHECKBOX) + .CVar("gEditorEnabled") + .Callback([](WidgetInfo& info) { + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Tools")->ToggleVisibility(); + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Scene Explorer")->ToggleVisibility(); + Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Content Browser")->ToggleVisibility(); + }) + .Options(UIWidgets::CheckboxOptions({{ .tooltip = "Edit the universe!"}})); } void PortMenu::AddDevTools() { @@ -432,9 +443,13 @@ void PortMenu::InitElement() { disabledMap = { { DISABLE_FOR_FREE_CAM_ON, - { [](disabledInfo& info) -> bool { return CVarGetInteger("gFreecam", 0); }, "Free Cam is Enabled" } }, + { [](disabledInfo& info) -> bool { return CVarGetInteger("gFreecam", 0); }, "Freecam is Enabled" } }, { DISABLE_FOR_FREE_CAM_OFF, - { [](disabledInfo& info) -> bool { return !CVarGetInteger("gFreecam", 0); }, "Free Cam is Disabled" } }, + { [](disabledInfo& info) -> bool { return !CVarGetInteger("gFreecam", 0); }, "Freecam is Disabled" } }, + { DISABLE_FOR_EDITOR_ON, + { [](disabledInfo& info) -> bool { return CVarGetInteger("gEditorEnabled", 0); }, "Editor is Enabled" } }, + { DISABLE_FOR_EDITOR_OFF, + { [](disabledInfo& info) -> bool { return !CVarGetInteger("gEditorEnabled", 0); }, "Editor is Disabled" } }, { DISABLE_FOR_DEBUG_MODE_OFF, { [](disabledInfo& info) -> bool { return !CVarGetInteger("gEnableDebugMode", 0); }, "Debug Mode is Disabled" } }, diff --git a/src/port/ui/SceneExplorer.cpp b/src/port/ui/SceneExplorer.cpp new file mode 100644 index 000000000..e79289eff --- /dev/null +++ b/src/port/ui/SceneExplorer.cpp @@ -0,0 +1,27 @@ +#include "SceneExplorer.h" +#include "port/ui/PortMenu.h" +#include "UIWidgets.h" +#include "libultraship/src/Context.h" + +#include +#include +#include +#include +#include "spdlog/formatter.h" +#include +#include + +namespace Editor { + + SceneExplorerWindow::~SceneExplorerWindow() { + SPDLOG_TRACE("destruct editor window"); + } + + void SceneExplorerWindow::DrawElement() { + ImGui::Text("This is your Scene Explorer window!"); + if (ImGui::Button("Click Me")) { + // Handle button click (example) + } + ImGui::End(); + } +} \ No newline at end of file diff --git a/src/port/ui/SceneExplorer.h b/src/port/ui/SceneExplorer.h new file mode 100644 index 000000000..7e6e1af10 --- /dev/null +++ b/src/port/ui/SceneExplorer.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace Editor { +class SceneExplorerWindow : public Ship::GuiWindow { +public: + using Ship::GuiWindow::GuiWindow; + ~SceneExplorerWindow(); +protected: + void InitElement() override {}; + void DrawElement() override; + void UpdateElement() override {}; +}; +} \ No newline at end of file diff --git a/src/port/ui/Tools.cpp b/src/port/ui/Tools.cpp new file mode 100644 index 000000000..eef624a32 --- /dev/null +++ b/src/port/ui/Tools.cpp @@ -0,0 +1,34 @@ +#include "Tools.h" +#include "port/ui/PortMenu.h" +#include "UIWidgets.h" +#include "libultraship/src/Context.h" + +#include +#include +#include +#include +#include "spdlog/formatter.h" +#include +#include + +namespace Editor { + + ToolsWindow::~ToolsWindow() { + SPDLOG_TRACE("destruct editor window"); + } + + void ToolsWindow::InitElement() { + + } + + void ToolsWindow::DrawElement() { + static bool toggleState = false; + ImGui::PushStyleColor(ImGuiCol_Button, toggleState ? ImVec4(0.2f, 0.8f, 0.2f, 1.0f) : ImVec4(0.8f, 0.2f, 0.2f, 1.0f)); + if (ImGui::Button(toggleState ? "v" : "v", ImVec2(50, 25))) { + toggleState = !toggleState; + + CVarSetInteger("gEditorSnapToGround", toggleState); + } + ImGui::PopStyleColor(); + } +} diff --git a/src/port/ui/Tools.h b/src/port/ui/Tools.h new file mode 100644 index 000000000..b1afccf18 --- /dev/null +++ b/src/port/ui/Tools.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace Editor { +class ToolsWindow : public Ship::GuiWindow { +public: + using Ship::GuiWindow::GuiWindow; + + ~ToolsWindow(); +protected: + void InitElement() override; + void DrawElement() override; + void UpdateElement() override {}; +}; +}