From 773336d38879b07326040759496e05c449aa99d1 Mon Sep 17 00:00:00 2001 From: greerdv Date: Fri, 4 Feb 2022 18:56:59 +0000 Subject: [PATCH] refactor and tidy up Signed-off-by: greerdv --- .../PhysX/Code/Editor/ColliderCapsuleMode.cpp | 92 +++++++++++++++---- Gems/PhysX/Code/Editor/ColliderCapsuleMode.h | 12 ++- Gems/PhysX/Code/Editor/ColliderSphereMode.cpp | 4 +- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/Gems/PhysX/Code/Editor/ColliderCapsuleMode.cpp b/Gems/PhysX/Code/Editor/ColliderCapsuleMode.cpp index 0bc941b082..eddd65a7f0 100644 --- a/Gems/PhysX/Code/Editor/ColliderCapsuleMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderCapsuleMode.cpp @@ -8,11 +8,13 @@ #include "ColliderCapsuleMode.h" #include +#include #include #include #include #include +#include #include #include @@ -34,10 +36,15 @@ namespace PhysX void ColliderCapsuleMode::Setup(const AZ::EntityComponentIdPair& idPair) { AZ::Transform colliderWorldTransform = AZ::Transform::Identity(); - PhysX::EditorColliderComponentRequestBus::EventResult(colliderWorldTransform, idPair, &PhysX::EditorColliderComponentRequests::GetColliderWorldTransform); + AZ::TransformBus::EventResult(colliderWorldTransform, idPair.GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); - SetupRadiusManipulator(idPair, colliderWorldTransform); - SetupHeightManipulator(idPair, colliderWorldTransform); + AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, idPair.GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); + + SetupRadiusManipulator(idPair, colliderWorldTransform, colliderLocalTransform, nonUniformScale); + SetupHeightManipulator(idPair, colliderWorldTransform, colliderLocalTransform, nonUniformScale); AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(idPair.GetEntityId()); } @@ -45,7 +52,12 @@ namespace PhysX void ColliderCapsuleMode::Refresh(const AZ::EntityComponentIdPair& idPair) { AZ::Transform colliderWorldTransform = AZ::Transform::Identity(); - PhysX::EditorColliderComponentRequestBus::EventResult(colliderWorldTransform, idPair, &PhysX::EditorColliderComponentRequests::GetColliderWorldTransform); + AZ::TransformBus::EventResult(colliderWorldTransform, idPair.GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); + + AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, idPair.GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + + AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); // Read the state of the capsule into manipulators to support undo/redo float capsuleHeight = 0.0f; @@ -55,9 +67,13 @@ namespace PhysX PhysX::EditorColliderComponentRequestBus::EventResult(capsuleRadius, idPair, &PhysX::EditorColliderComponentRequests::GetCapsuleRadius); m_radiusManipulator->SetSpace(colliderWorldTransform); - m_radiusManipulator->SetLocalPosition(m_radiusManipulator->GetAxis() * capsuleRadius); + m_radiusManipulator->SetLocalTransform( + colliderLocalTransform * AZ::Transform::CreateTranslation(m_radiusManipulator->GetAxis() * capsuleRadius)); + m_radiusManipulator->SetNonUniformScale(nonUniformScale); m_heightManipulator->SetSpace(colliderWorldTransform); - m_heightManipulator->SetLocalPosition(m_heightManipulator->GetAxis() * capsuleHeight * HalfHeight); + m_heightManipulator->SetLocalTransform( + colliderLocalTransform * AZ::Transform::CreateTranslation(m_heightManipulator->GetAxis() * capsuleHeight * HalfHeight)); + m_heightManipulator->SetNonUniformScale(nonUniformScale); } void ColliderCapsuleMode::Teardown(const AZ::EntityComponentIdPair& idPair) @@ -83,13 +99,23 @@ namespace PhysX AZ_UNUSED(debugDisplay); const AzFramework::CameraState cameraState = AzToolsFramework::GetCameraState(viewportInfo.m_viewportId); - float radius = m_radiusManipulator->GetLocalPosition().GetLength(); - m_radiusManipulator->SetAxis(cameraState.m_side); - m_radiusManipulator->SetLocalPosition(cameraState.m_side * radius); + if (!m_radiusManipulator->EntityComponentIdPairs().empty()) + { + const AZ::EntityComponentIdPair idPair = *m_radiusManipulator->EntityComponentIdPairs().begin(); + float radius = 0.0f; + PhysX::EditorColliderComponentRequestBus::EventResult(radius, idPair, &PhysX::EditorColliderComponentRequests::GetCapsuleRadius); + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); + m_radiusManipulator->SetAxis(cameraState.m_side); + m_radiusManipulator->SetLocalTransform(colliderLocalTransform * AZ::Transform::CreateTranslation(cameraState.m_side * radius)); + } } - void ColliderCapsuleMode::SetupRadiusManipulator(const AZ::EntityComponentIdPair& idPair, const AZ::Transform& worldTransform) + void ColliderCapsuleMode::SetupRadiusManipulator( + const AZ::EntityComponentIdPair& idPair, + const AZ::Transform& worldTransform, + const AZ::Transform& localTransform, + const AZ::Vector3& nonUniformScale) { // Radius manipulator float capsuleRadius = 0.0f; @@ -99,7 +125,8 @@ namespace PhysX m_radiusManipulator->AddEntityComponentIdPair(idPair); m_radiusManipulator->SetAxis(RadiusManipulatorAxis); m_radiusManipulator->Register(AzToolsFramework::g_mainManipulatorManagerId); - m_radiusManipulator->SetLocalPosition(RadiusManipulatorAxis * capsuleRadius); + m_radiusManipulator->SetLocalTransform(localTransform * AZ::Transform::CreateTranslation(RadiusManipulatorAxis * capsuleRadius)); + m_radiusManipulator->SetNonUniformScale(nonUniformScale); { AzToolsFramework::ManipulatorViews views; @@ -114,7 +141,11 @@ namespace PhysX }); } - void ColliderCapsuleMode::SetupHeightManipulator(const AZ::EntityComponentIdPair& idPair, const AZ::Transform& worldTransform) + void ColliderCapsuleMode::SetupHeightManipulator( + const AZ::EntityComponentIdPair& idPair, + const AZ::Transform& worldTransform, + const AZ::Transform& localTransform, + const AZ::Vector3& nonUniformScale) { // Height manipulator float capsuleHeight = 0.0f; @@ -124,7 +155,9 @@ namespace PhysX m_heightManipulator->AddEntityComponentIdPair(idPair); m_heightManipulator->SetAxis(HeightManipulatorAxis); m_heightManipulator->Register(AzToolsFramework::g_mainManipulatorManagerId); - m_heightManipulator->SetLocalPosition(HeightManipulatorAxis * capsuleHeight * HalfHeight); // Manipulator positioned at half the capsules height. + m_heightManipulator->SetLocalTransform( + localTransform * AZ::Transform::CreateTranslation(HeightManipulatorAxis * capsuleHeight * HalfHeight)); + m_heightManipulator->SetNonUniformScale(nonUniformScale); { AzToolsFramework::ManipulatorViews views; @@ -137,19 +170,26 @@ namespace PhysX { OnHeightManipulatorMoved(action, idPair); }); - } void ColliderCapsuleMode::OnRadiusManipulatorMoved(const AzToolsFramework::LinearManipulator::Action& action, const AZ::EntityComponentIdPair& idPair) { + // manipulator action offsets do not take entity transform scale into account, so need to apply it here + float transformScale = 1.0f; + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); + AZ::TransformBus::EventResult(transformScale, idPair.GetEntityId(), &AZ::TransformBus::Events::GetWorldUniformScale); + transformScale = AZ::GetMax(AZ::MinTransformScale, transformScale); + const AZ::Vector3 localPosition = colliderLocalTransform.GetInverse().TransformPoint( + action.m_start.m_localPosition + action.m_current.m_localPositionOffset / transformScale); + // Get the distance the manipulator has moved along the axis. - float extent = action.LocalPosition().Dot(action.m_fixed.m_axis); + float extent = localPosition.Dot(action.m_fixed.m_axis); // Clamp radius to a small value. extent = AZ::GetMax(extent, MinCapsuleRadius); // Update the manipulator and capsule radius. - m_radiusManipulator->SetLocalPosition(extent * action.m_fixed.m_axis); + m_radiusManipulator->SetLocalTransform(colliderLocalTransform * AZ::Transform::CreateTranslation(extent * action.m_fixed.m_axis)); // Adjust the height manipulator so it is always clamped to twice the radius. AdjustHeightManipulator(idPair, static_cast(extent)); @@ -160,14 +200,22 @@ namespace PhysX void ColliderCapsuleMode::OnHeightManipulatorMoved(const AzToolsFramework::LinearManipulator::Action& action, const AZ::EntityComponentIdPair& idPair) { + // manipulator action offsets do not take entity transform scale into account, so need to apply it here + float transformScale = 1.0f; + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); + AZ::TransformBus::EventResult(transformScale, idPair.GetEntityId(), &AZ::TransformBus::Events::GetWorldUniformScale); + transformScale = AZ::GetMax(AZ::MinTransformScale, transformScale); + const AZ::Vector3 localPosition = colliderLocalTransform.GetInverse().TransformPoint( + action.m_start.m_localPosition + action.m_current.m_localPositionOffset / transformScale); + // Get the distance the manipulator has moved along the axis. - float extent = action.LocalPosition().Dot(action.m_fixed.m_axis); + float extent = localPosition.Dot(action.m_fixed.m_axis); // Ensure capsule's half height is always greater than the radius. extent = AZ::GetMax(extent, MinCapsuleHeight); // Update the manipulator and capsule height. - m_heightManipulator->SetLocalPosition(extent * action.m_fixed.m_axis); + m_heightManipulator->SetLocalTransform(colliderLocalTransform * AZ::Transform::CreateTranslation(extent * action.m_fixed.m_axis)); // The final height of the capsule is twice the manipulator's extent. float capsuleHeight = extent / HalfHeight; @@ -188,7 +236,9 @@ namespace PhysX capsuleRadius = AZ::GetMin(capsuleRadius, capsuleHeight * HalfHeight); // Update manipulator and the capsule radius. - m_radiusManipulator->SetLocalPosition(capsuleRadius * m_radiusManipulator->GetAxis()); + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); + m_radiusManipulator->SetLocalTransform( + colliderLocalTransform * AZ::Transform::CreateTranslation(capsuleRadius * m_radiusManipulator->GetAxis())); PhysX::EditorColliderComponentRequestBus::Event(idPair, &PhysX::EditorColliderComponentRequests::SetCapsuleRadius, capsuleRadius); } @@ -201,7 +251,9 @@ namespace PhysX capsuleHeight = AZ::GetMax(capsuleHeight, capsuleRadius / HalfHeight); // Update the manipulator and capsule height. - m_heightManipulator->SetLocalPosition(capsuleHeight * HalfHeight * m_heightManipulator->GetAxis()); + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); + m_heightManipulator->SetLocalTransform( + colliderLocalTransform * AZ::Transform::CreateTranslation(capsuleHeight * HalfHeight * m_heightManipulator->GetAxis())); PhysX::EditorColliderComponentRequestBus::Event(idPair, &PhysX::EditorColliderComponentRequests::SetCapsuleHeight, capsuleHeight); } } diff --git a/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h b/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h index ceedd84a35..5284b3d1ed 100644 --- a/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h +++ b/Gems/PhysX/Code/Editor/ColliderCapsuleMode.h @@ -34,8 +34,16 @@ namespace PhysX const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override; - void SetupRadiusManipulator(const AZ::EntityComponentIdPair& idPair, const AZ::Transform& worldTransform); - void SetupHeightManipulator(const AZ::EntityComponentIdPair& idPair, const AZ::Transform& worldTransform); + void SetupRadiusManipulator( + const AZ::EntityComponentIdPair& idPair, + const AZ::Transform& worldTransform, + const AZ::Transform& localTransform, + const AZ::Vector3& nonUniformScale); + void SetupHeightManipulator( + const AZ::EntityComponentIdPair& idPair, + const AZ::Transform& worldTransform, + const AZ::Transform& localTransform, + const AZ::Vector3& nonUniformScale); void OnRadiusManipulatorMoved(const AzToolsFramework::LinearManipulator::Action& action, const AZ::EntityComponentIdPair& idPair); void OnHeightManipulatorMoved(const AzToolsFramework::LinearManipulator::Action& action, const AZ::EntityComponentIdPair& idPair); void AdjustRadiusManipulator(const AZ::EntityComponentIdPair& idPair, const float capsuleHeight); diff --git a/Gems/PhysX/Code/Editor/ColliderSphereMode.cpp b/Gems/PhysX/Code/Editor/ColliderSphereMode.cpp index 8425f203c1..d292f2dd2a 100644 --- a/Gems/PhysX/Code/Editor/ColliderSphereMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderSphereMode.cpp @@ -112,8 +112,10 @@ namespace PhysX // manipulator offsets do not take transform scale into account, need to handle it here AZ::Transform colliderWorldTransform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(colliderWorldTransform, idPair.GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); + const AZ::Transform colliderLocalTransform = Utils::GetColliderLocalTransform(idPair); const float transformScale = AZ::GetMax(AZ::MinTransformScale, colliderWorldTransform.GetUniformScale()); - const AZ::Vector3 localPosition = action.m_start.m_localPosition + action.m_current.m_localPositionOffset / transformScale; + const AZ::Vector3 localPosition = colliderLocalTransform.GetInverse().TransformPoint( + action.m_start.m_localPosition + action.m_current.m_localPositionOffset / transformScale); // Get the distance the manipulator has moved along the axis. float extent = localPosition.Dot(action.m_fixed.m_axis);