From e01a608d8c3e5ce6112cac7d1620a2bf8baf0ca4 Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Thu, 20 Oct 2022 19:16:03 +0800 Subject: [PATCH] Transform gizmo finally rendering correctly --- .../Inspector/SHEditorInspector.cpp | 6 +++- .../Editor/EditorWindow/SHEditorWindow.cpp | 5 ++- .../src/Editor/EditorWindow/SHEditorWindow.h | 8 +++-- .../ViewportWindow/SHEditorViewport.cpp | 32 ++++++++----------- .../ViewportWindow/SHEditorViewport.h | 3 ++ .../src/Editor/Gizmos/SHTransformGizmo.cpp | 16 +++++++--- SHADE_Engine/src/Editor/SHEditor.cpp | 7 ++-- SHADE_Engine/src/Editor/SHEditor.hpp | 2 +- 8 files changed, 46 insertions(+), 33 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp index da09f345..b59ce9cc 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorInspector.cpp @@ -55,7 +55,11 @@ namespace SHADE { EntityID const& eid = editor->selectedEntities[0]; SHEntity* entity = SHEntityManager::GetEntityByID(eid); - + if(!entity) + { + ImGui::End(); + return; + } ImGui::TextColored(ImGuiColors::green, "EID: %zu", eid); SHEditorWidgets::CheckBox("##IsActive", [entity]()->bool {return entity->GetActive(); }, [entity](bool const& active) {entity->SetActive(active); }); ImGui::SameLine(); diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.cpp b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.cpp index edbe0faa..b5a691d8 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.cpp @@ -43,9 +43,12 @@ namespace SHADE bool result = ImGui::Begin(windowName.data(), &isOpen, windowFlags); auto wndSize = ImGui::GetWindowSize(); - if(windowSize.x != wndSize.x || windowSize.y != wndSize.y) + auto contentRegionAvail = ImGui::GetContentRegionAvail(); + if( beginContentRegionAvailable.x != contentRegionAvail.x || beginContentRegionAvailable.y != contentRegionAvail.y || windowSize.x != wndSize.x || windowSize.y != wndSize.y) { windowSize = {wndSize.x, wndSize.y}; + beginContentRegionAvailable = {contentRegionAvail.x, contentRegionAvail.y}; + OnResize(); } auto wndPos = ImGui::GetWindowPos(); diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.h b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.h index f46cd880..239d8223 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.h +++ b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindow.h @@ -26,6 +26,10 @@ namespace SHADE bool isOpen; bool isWindowHovered; std::string_view windowName; + SHVec2 windowSize; + SHVec2 windowPos; + SHVec2 viewportMousePos; + SHVec2 beginContentRegionAvailable; protected: virtual bool Begin(); virtual void OnResize(); @@ -33,8 +37,6 @@ namespace SHADE ImGuiWindowFlags windowFlags = 0; ImGuiIO& io; - SHVec2 windowSize; - SHVec2 windowPos; - SHVec2 viewportMousePos; + };//class SHEditorWindow }//namespace SHADE diff --git a/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp b/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp index 420443ae..f4403ecb 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.cpp @@ -1,6 +1,8 @@ #include "SHpch.h" +#include "Editor/SHImGuiHelpers.hpp" #include "SHEditorViewport.h" +#include "ImGuizmo.h" #include "ECS_Base/Managers/SHSystemManager.h" #include "Editor/SHEditor.hpp" #include "Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h" @@ -24,31 +26,21 @@ namespace SHADE void SHEditorViewport::Update() { SHEditorWindow::Update(); + //ImGuizmo::SetDrawlist(ImGui::GetBackgroundDrawList(ImGui::GetMainViewport())); + + ImGuizmo::SetRect(beginCursorPos.x, beginCursorPos.y, beginContentRegionAvailable.x, beginContentRegionAvailable.y); + transfromGizmo.Draw(); if(Begin()) { DrawMenuBar(); auto gfxSystem = SHSystemManager::GetSystem(); auto const& descriptorSet = gfxSystem->GetPostOffscreenRenderSystem()->GetDescriptorSetGroup()->GetVkHandle()[0]; auto mousePos = ImGui::GetMousePos(); - auto cursorPos = ImGui::GetCursorScreenPos(); - viewportMousePos = {mousePos.x - cursorPos.x, mousePos.y - cursorPos.y}; + beginCursorPos = ImGui::GetCursorScreenPos(); + viewportMousePos = {mousePos.x - beginCursorPos.x, mousePos.y - beginCursorPos.y}; gfxSystem->GetMousePickSystem ()->SetViewportMousePos (viewportMousePos); - //if (ImGui::IsMouseReleased(ImGuiMouseButton_Left)) - //{ - // auto eid = gfxSystem->GetMousePickSystem ()->GetPickedEntity(); - // if(eid != MAX_EID) - // { - // auto editor = SHSystemManager::GetSystem(); - // editor->selectedEntities.clear(); - // editor->selectedEntities.push_back(eid); - // if (const auto hierarchyPanel = SHEditorWindowManager::GetEditorWindow()) - // { - // hierarchyPanel->SetScrollTo(eid); - // } - // } - //} - ImGui::Image((ImTextureID)descriptorSet, ImGui::GetWindowSize()); + ImGui::Image((ImTextureID)descriptorSet, {beginContentRegionAvailable.x, beginContentRegionAvailable.y}); } ImGui::End(); } @@ -66,7 +58,11 @@ namespace SHADE //auto pos = ImGui::GetCursorPos(); //windowCursorPos = {} - gfxSystem->PrepareResize(static_cast(windowSize.x), static_cast(windowSize.y)); + if(beginContentRegionAvailable.x == 0 || beginContentRegionAvailable.y == 0) + { + beginContentRegionAvailable = windowSize; + } + gfxSystem->PrepareResize(static_cast(beginContentRegionAvailable.x), static_cast(beginContentRegionAvailable.y)); } void SHEditorViewport::OnPosChange() diff --git a/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.h b/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.h index 5f4a5919..7bcfed82 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.h +++ b/SHADE_Engine/src/Editor/EditorWindow/ViewportWindow/SHEditorViewport.h @@ -10,6 +10,7 @@ #include "imgui_internal.h" #include "ECS_Base/SHECSMacros.h" #include "Editor/EditorWindow/SHEditorWindow.h" +#include "Editor/Gizmos/SHTransformGizmo.h" namespace SHADE { @@ -25,5 +26,7 @@ namespace SHADE void OnPosChange() override; private: void DrawMenuBar() const noexcept; + SHTransformGizmo transfromGizmo; + SHVec2 beginCursorPos; };//class SHEditorViewport }//namespace SHADE diff --git a/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp b/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp index 5c3a0ce0..70f98eb1 100644 --- a/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp +++ b/SHADE_Engine/src/Editor/Gizmos/SHTransformGizmo.cpp @@ -8,6 +8,7 @@ #include #include "Camera/SHCameraSystem.h" +#include "Editor/EditorWindow/ViewportWindow/SHEditorViewport.h" namespace SHADE { @@ -21,20 +22,25 @@ namespace SHADE EntityID eid = editor->selectedEntities.back(); selectedEntityTranformComponent = SHComponentManager::GetComponent_s(eid); } - + if(selectedEntityTranformComponent == nullptr) + return; if(!editorCamera) { auto const cameraSystem = SHSystemManager::GetSystem(); editorCamera = cameraSystem->GetEditorCamera(); } + auto viewportWindow = SHEditorWindowManager::GetEditorWindow(); ImGuizmo::SetOrthographic(false); - SHMatrix view = editorCamera->GetViewMatrix(); - SHMatrix proj = editorCamera->GetProjMatrix(); + SHMatrix view = SHMatrix::Transpose(editorCamera->GetViewMatrix()); + view(3, 1) = -view(3, 1); + SHMatrix proj = SHMatrix::Transpose(editorCamera->GetProjMatrix()); SHMatrix mat = selectedEntityTranformComponent->GetTRS(); - ImGuizmo::DrawGrid(view.m[0], proj.m[0], mat.m[0], 10.f); - if(ImGuizmo::Manipulate(view.m[0], proj.m[0], ImGuizmo::OPERATION::UNIVERSAL, ImGuizmo::MODE::WORLD, mat.m[0])) + SHMatrix gridMat = SHMatrix::Identity; + ImGuizmo::DrawGrid(&view._11, &proj._11, &gridMat._11, 0.1f); + //ImGuizmo::ViewManipulate() + if(ImGuizmo::Manipulate(&view._11, &proj._11, ImGuizmo::OPERATION::UNIVERSAL, ImGuizmo::MODE::WORLD, &mat._11)) { } diff --git a/SHADE_Engine/src/Editor/SHEditor.cpp b/SHADE_Engine/src/Editor/SHEditor.cpp index 7399665f..162102b3 100644 --- a/SHADE_Engine/src/Editor/SHEditor.cpp +++ b/SHADE_Engine/src/Editor/SHEditor.cpp @@ -88,10 +88,10 @@ namespace SHADE //Add editor windows SHEditorWindowManager::CreateEditorWindow(); - SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); + SHEditorWindowManager::CreateEditorWindow(); io = &ImGui::GetIO(); @@ -128,11 +128,10 @@ namespace SHADE for (const auto& window : SHEditorWindowManager::editorWindows | std::views::values) { if(window->isOpen) + { window->Update(); + } } - - ImGuizmo::SetDrawlist(ImGui::GetForegroundDrawList()); - transformGizmo.Draw(); if(ImGui::IsKeyDown(ImGuiKey_LeftShift) && ImGui::IsKeyDown(ImGuiKey_LeftCtrl) && ImGui::IsKeyReleased(ImGuiKey_Z)) { diff --git a/SHADE_Engine/src/Editor/SHEditor.hpp b/SHADE_Engine/src/Editor/SHEditor.hpp index 4f8b32e2..5603e9f4 100644 --- a/SHADE_Engine/src/Editor/SHEditor.hpp +++ b/SHADE_Engine/src/Editor/SHEditor.hpp @@ -203,6 +203,6 @@ namespace SHADE ImGuiIO* io{nullptr}; - SHTransformGizmo transformGizmo; + //SHTransformGizmo transformGizmo; };//class SHEditor }//namespace SHADE