diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index 292dbe6b..de1c716b 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -182,48 +182,48 @@ namespace Nuake { if (Selection.Type == EditorSelectionType::Entity && !Engine::IsPlayMode()) { TransformComponent& tc = Selection.Entity.GetComponent(); - ParentComponent& parent = Selection.Entity.GetComponent(); Matrix4 transform = tc.GetGlobalTransform(); - - auto editorCam = Engine::GetCurrentScene()->GetCurrentCamera(); + const auto& editorCam = Engine::GetCurrentScene()->GetCurrentCamera(); Matrix4 cameraView = editorCam->GetTransform(); Matrix4 cameraProjection = editorCam->GetPerspective(); + // Imguizmo calculates the delta from the gizmo, ImGuizmo::Manipulate( glm::value_ptr(cameraView), glm::value_ptr(cameraProjection), CurrentOperation, CurrentMode, glm::value_ptr(transform) ); - Matrix4 oldTransform = transform; + if (ImGuizmo::IsUsing()) { - Vector3 globalPos = Vector3(); - Entity currentParent = Selection.Entity; + // Since imguizmo returns a transform in global space and we want the local transform, + // we need to multiply by the inverse of the parent's global transform in order to revert + // the changes from the parent transform. + Matrix4 localTransform = transform; + ParentComponent& parent = Selection.Entity.GetComponent(); if (parent.HasParent) { Matrix4 inverseParent = glm::inverse(parent.Parent.GetComponent().GetGlobalTransform()); - oldTransform *= inverseParent; + localTransform = inverseParent * localTransform; } + // Decompose local transform Vector3 scale = Vector3(); Quat rotation = Quat(); Vector3 pos = Vector3(); - Vector3 skew = Vector3(); - Vector4 pesp = Vector4(); - glm::decompose(oldTransform, scale, rotation, pos, skew, pesp); - + ImGuizmo::DecomposeMatrixToComponents(glm::value_ptr(localTransform), glm::value_ptr(pos), glm::value_ptr(rotation), glm::value_ptr(scale)); + tc.Translation = pos; - tc.Rotation = rotation; + //tc.Rotation = rotation; tc.Scale = scale; - tc.LocalTransform = oldTransform; + tc.LocalTransform = localTransform; + // Decompose global trasnform Vector3 gscale = Vector3(); Quat grotation = Quat(); Vector3 gpos = Vector3(); - Vector3 gskew = Vector3(); - Vector4 gpesp = Vector4(); - glm::decompose(transform, gscale, grotation, gpos, skew, pesp); + ImGuizmo::DecomposeMatrixToComponents(glm::value_ptr(transform), glm::value_ptr(gpos), glm::value_ptr(grotation), glm::value_ptr(gscale)); tc.SetGlobalPosition(gpos); tc.SetGlobalRotation(grotation); diff --git a/Nuake/src/Core/Maths.cpp b/Nuake/src/Core/Maths.cpp index 563770d1..f77709c5 100644 --- a/Nuake/src/Core/Maths.cpp +++ b/Nuake/src/Core/Maths.cpp @@ -10,5 +10,5 @@ Quat Nuake::QuatFromEuler(float x, float y, float z) Vector3 Nuake::QuatToDirection(const Quat& quat) { //return quat * Vector3(0, 0, -1); - return glm::rotate(glm::inverse(quat), glm::vec3(-1.0, 0.0, 0.0)); + return glm::rotate(glm::inverse(quat), glm::vec3(0.0, 0.0, 1.0)); } \ No newline at end of file diff --git a/Nuake/src/Scene/Components/TransformComponent.h b/Nuake/src/Scene/Components/TransformComponent.h index 146263e2..2cdea3fd 100644 --- a/Nuake/src/Scene/Components/TransformComponent.h +++ b/Nuake/src/Scene/Components/TransformComponent.h @@ -73,6 +73,7 @@ namespace Nuake LocalTransform = Matrix4(1); GlobalTransform = Matrix4(1); + this->Dirty = true; return true; } }; diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index 83105bbb..3979488f 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -135,22 +135,14 @@ namespace Nuake { void Scene::Draw(FrameBuffer& framebuffer) { Ref cam = nullptr; - Matrix4 camTransform = Matrix4(); + const auto& view = m_Registry.view(); + for (const auto& e : view) { - auto view = m_Registry.view(); - for (auto e : view) - { - auto [transform, camera, parent] = view.get(e); - cam = camera.CameraInstance; + auto [transform, camera, parent] = view.get(e); + cam = camera.CameraInstance; - cam->Translation = transform.GetGlobalPosition(); - - //const Vector3& forward = QuatToDirection(transform.GetGlobalRotation()); - //cam->SetDirection(forward); - - //camTransform = transform.GetGlobalTransform(); - break; - } + cam->Translation = transform.GetGlobalPosition(); + break; } if (!cam) @@ -158,10 +150,6 @@ namespace Nuake { return; } - float x = cam->GetDirection().x; - float y = cam->GetDirection().y; - float z = cam->GetDirection().z; - Logger::Log("DIRECTION: (" + std::to_string(x) + ", " + std::to_string(y) + ", " + std::to_string(z) + ")"); mSceneRenderer->BeginRenderScene(cam->GetPerspective(), cam->GetTransform(), cam->Translation); mSceneRenderer->RenderScene(*this, framebuffer); }