fix various issues with collider manipulators and non-uniform scale

Signed-off-by: greerdv <greerdv@amazon.com>
monroegm-disable-blank-issue-2
greerdv 4 years ago
parent eb84f54138
commit 08eb115e26

@ -40,25 +40,26 @@ namespace AzToolsFramework
BoxManipulatorRequestBus::EventResult( BoxManipulatorRequestBus::EventResult(
boxWorldFromLocal, m_entityComponentIdPair, &BoxManipulatorRequests::GetCurrentTransform); boxWorldFromLocal, m_entityComponentIdPair, &BoxManipulatorRequests::GetCurrentTransform);
AZ::Vector3 boxScale = AZ::Vector3::CreateOne(); AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne();
BoxManipulatorRequestBus::EventResult( BoxManipulatorRequestBus::EventResult(
boxScale, m_entityComponentIdPair, &BoxManipulatorRequests::GetBoxScale); nonUniformScale, m_entityComponentIdPair, &BoxManipulatorRequests::GetCurrentNonUniformScale);
AZ::Vector3 boxDimensions = AZ::Vector3::CreateZero(); AZ::Vector3 boxDimensions = AZ::Vector3::CreateZero();
BoxManipulatorRequestBus::EventResult( BoxManipulatorRequestBus::EventResult(
boxDimensions, m_entityComponentIdPair, &BoxManipulatorRequests::GetDimensions); boxDimensions, m_entityComponentIdPair, &BoxManipulatorRequests::GetDimensions);
// ensure we apply the entity scale to the box dimensions so AZ::Transform boxLocalTransform = AZ::Transform::CreateIdentity();
// the manipulators appear in the correct location BoxManipulatorRequestBus::EventResult(
boxDimensions *= boxScale; boxLocalTransform, m_entityComponentIdPair, &BoxManipulatorRequests::GetCurrentLocalTransform);
for (size_t manipulatorIndex = 0; manipulatorIndex < m_linearManipulators.size(); ++manipulatorIndex) for (size_t manipulatorIndex = 0; manipulatorIndex < m_linearManipulators.size(); ++manipulatorIndex)
{ {
if (auto& linearManipulator = m_linearManipulators[manipulatorIndex]) if (auto& linearManipulator = m_linearManipulators[manipulatorIndex])
{ {
linearManipulator->SetSpace(boxWorldFromLocal); linearManipulator->SetSpace(boxWorldFromLocal);
linearManipulator->SetLocalTransform( linearManipulator->SetLocalTransform(boxLocalTransform * AZ::Transform::CreateTranslation(
AZ::Transform::CreateTranslation(s_boxAxes[manipulatorIndex] * 0.5f * boxDimensions)); s_boxAxes[manipulatorIndex] * 0.5f * boxDimensions));
linearManipulator->SetNonUniformScale(nonUniformScale);
linearManipulator->SetBoundsDirty(); linearManipulator->SetBoundsDirty();
} }
} }
@ -92,29 +93,35 @@ namespace AzToolsFramework
[this, entityComponentIdPair]( [this, entityComponentIdPair](
const LinearManipulator::Action& action) const LinearManipulator::Action& action)
{ {
AZ::Transform boxLocalTransform = AZ::Transform::CreateIdentity();
BoxManipulatorRequestBus::EventResult(
boxLocalTransform, entityComponentIdPair, &BoxManipulatorRequests::GetCurrentLocalTransform);
AZ::Transform boxWorldTransform = AZ::Transform::CreateIdentity();
BoxManipulatorRequestBus::EventResult(
boxWorldTransform, entityComponentIdPair, &BoxManipulatorRequests::GetCurrentTransform);
float boxScale = AZ::GetMax(AZ::MinTransformScale, boxWorldTransform.GetUniformScale());
// calculate the position of the manipulator in the reference frame of the box
// the local position offset of the manipulator does not take the transform scale into account, so need to apply it here
const AZ::Vector3 localPosition = boxLocalTransform.GetInverse().TransformPoint(
action.m_start.m_localPosition + action.m_current.m_localPositionOffset / boxScale);
// calculate the amount of displacement along an axis this manipulator has moved // calculate the amount of displacement along an axis this manipulator has moved
// clamp movement so it cannot go negative based on axis direction // clamp movement so it cannot go negative based on axis direction
const AZ::Vector3 axisDisplacement = const AZ::Vector3 axisDisplacement =
action.LocalPosition().GetAbs() * 2.0f localPosition.GetAbs() * 2.0f
* AZ::GetMax<float>(0.0f, action.LocalPosition().GetNormalized().Dot(action.m_fixed.m_axis)); * AZ::GetMax<float>(0.0f, localPosition.GetNormalized().Dot(action.m_fixed.m_axis));
AZ::Vector3 boxScale = AZ::Vector3::CreateOne();
BoxManipulatorRequestBus::EventResult(
boxScale, entityComponentIdPair, &BoxManipulatorRequests::GetBoxScale);
AZ::Vector3 boxDimensions = AZ::Vector3::CreateZero(); AZ::Vector3 boxDimensions = AZ::Vector3::CreateZero();
BoxManipulatorRequestBus::EventResult( BoxManipulatorRequestBus::EventResult(
boxDimensions, entityComponentIdPair, &BoxManipulatorRequests::GetDimensions); boxDimensions, entityComponentIdPair, &BoxManipulatorRequests::GetDimensions);
// ensure we take into account the entity scale using the axis displacement
const AZ::Vector3 scaledAxisDisplacement =
axisDisplacement / boxScale;
// update dimensions - preserve dimensions not effected by this // update dimensions - preserve dimensions not effected by this
// axis, and update current axis displacement // axis, and update current axis displacement
BoxManipulatorRequestBus::Event( BoxManipulatorRequestBus::Event(
entityComponentIdPair, &BoxManipulatorRequests::SetDimensions, entityComponentIdPair, &BoxManipulatorRequests::SetDimensions,
(NotAxis(action.m_fixed.m_axis) * boxDimensions).GetMax(scaledAxisDisplacement)); (NotAxis(action.m_fixed.m_axis) * boxDimensions).GetMax(axisDisplacement));
UpdateManipulators(); UpdateManipulators();
}); });

@ -31,12 +31,17 @@ namespace AzToolsFramework
//! because a collider may have an additional translation/orientation offset from //! because a collider may have an additional translation/orientation offset from
//! the Entity transform. //! the Entity transform.
virtual AZ::Transform GetCurrentTransform() = 0; virtual AZ::Transform GetCurrentTransform() = 0;
//!
//!
virtual AZ::Transform GetCurrentLocalTransform() = 0;
//! Get the scale currently applied to the box. //! Get the scale currently applied to the box.
//! With the Box Shape, the largest x/y/z component is taken //! With the Box Shape, the largest x/y/z component is taken
//! so scale is always uniform, with colliders the scale may //! so scale is always uniform, with colliders the scale may
//! be different per component. //! be different per component.
virtual AZ::Vector3 GetBoxScale() = 0; virtual AZ::Vector3 GetBoxScale() = 0;
virtual AZ::Vector3 GetCurrentNonUniformScale() { return AZ::Vector3::CreateOne(); }
protected: protected:
~BoxManipulatorRequests() = default; ~BoxManipulatorRequests() = default;
}; };

@ -161,6 +161,11 @@ namespace LmbrCentral
return AzToolsFramework::TransformNormalizedScale(m_aaboxShape.GetCurrentTransform()); return AzToolsFramework::TransformNormalizedScale(m_aaboxShape.GetCurrentTransform());
} }
AZ::Transform EditorAxisAlignedBoxShapeComponent::GetCurrentLocalTransform()
{
return AZ::Transform::CreateIdentity();
}
AZ::Vector3 EditorAxisAlignedBoxShapeComponent::GetBoxScale() AZ::Vector3 EditorAxisAlignedBoxShapeComponent::GetBoxScale()
{ {
return AZ::Vector3(m_aaboxShape.GetCurrentTransform().GetUniformScale() * m_aaboxShape.GetCurrentNonUniformScale()); return AZ::Vector3(m_aaboxShape.GetCurrentTransform().GetUniformScale() * m_aaboxShape.GetCurrentNonUniformScale());

@ -58,6 +58,7 @@ namespace LmbrCentral
AZ::Vector3 GetDimensions() override; AZ::Vector3 GetDimensions() override;
void SetDimensions(const AZ::Vector3& dimensions) override; void SetDimensions(const AZ::Vector3& dimensions) override;
AZ::Transform GetCurrentTransform() override; AZ::Transform GetCurrentTransform() override;
AZ::Transform GetCurrentLocalTransform() override;
AZ::Vector3 GetBoxScale() override; AZ::Vector3 GetBoxScale() override;
void ConfigurationChanged(); void ConfigurationChanged();

@ -167,6 +167,11 @@ namespace LmbrCentral
return AzToolsFramework::TransformNormalizedScale(m_boxShape.GetCurrentTransform()); return AzToolsFramework::TransformNormalizedScale(m_boxShape.GetCurrentTransform());
} }
AZ::Transform EditorBoxShapeComponent::GetCurrentLocalTransform()
{
return AZ::Transform::CreateIdentity();
}
AZ::Vector3 EditorBoxShapeComponent::GetBoxScale() AZ::Vector3 EditorBoxShapeComponent::GetBoxScale()
{ {
return AZ::Vector3(m_boxShape.GetCurrentTransform().GetUniformScale() * m_boxShape.GetCurrentNonUniformScale()); return AZ::Vector3(m_boxShape.GetCurrentTransform().GetUniformScale() * m_boxShape.GetCurrentNonUniformScale());

@ -57,6 +57,7 @@ namespace LmbrCentral
AZ::Vector3 GetDimensions() override; AZ::Vector3 GetDimensions() override;
void SetDimensions(const AZ::Vector3& dimensions) override; void SetDimensions(const AZ::Vector3& dimensions) override;
AZ::Transform GetCurrentTransform() override; AZ::Transform GetCurrentTransform() override;
AZ::Transform GetCurrentLocalTransform() override;
AZ::Vector3 GetBoxScale() override; AZ::Vector3 GetBoxScale() override;
void ConfigurationChanged(); void ConfigurationChanged();

@ -10,6 +10,7 @@
#include <PhysX/EditorColliderComponentRequestBus.h> #include <PhysX/EditorColliderComponentRequestBus.h>
#include <AzToolsFramework/Manipulators/ManipulatorManager.h> #include <AzToolsFramework/Manipulators/ManipulatorManager.h>
#include <AzCore/Component/NonUniformScaleBus.h>
#include <AzCore/Component/TransformBus.h> #include <AzCore/Component/TransformBus.h>
#include <AzCore/Component/ComponentBus.h> #include <AzCore/Component/ComponentBus.h>
@ -28,10 +29,14 @@ namespace PhysX
AZ::Transform worldTransform; AZ::Transform worldTransform;
AZ::TransformBus::EventResult(worldTransform, idPair.GetEntityId(), &AZ::TransformInterface::GetWorldTM); AZ::TransformBus::EventResult(worldTransform, idPair.GetEntityId(), &AZ::TransformInterface::GetWorldTM);
AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne();
AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, idPair.GetEntityId(), &AZ::NonUniformScaleRequests::GetScale);
AZ::Vector3 colliderOffset; AZ::Vector3 colliderOffset;
PhysX::EditorColliderComponentRequestBus::EventResult(colliderOffset, idPair, &PhysX::EditorColliderComponentRequests::GetColliderOffset); PhysX::EditorColliderComponentRequestBus::EventResult(colliderOffset, idPair, &PhysX::EditorColliderComponentRequests::GetColliderOffset);
m_translationManipulators.SetSpace(worldTransform); m_translationManipulators.SetSpace(worldTransform);
m_translationManipulators.SetNonUniformScale(nonUniformScale);
m_translationManipulators.SetLocalPosition(colliderOffset); m_translationManipulators.SetLocalPosition(colliderOffset);
m_translationManipulators.AddEntityComponentIdPair(idPair); m_translationManipulators.AddEntityComponentIdPair(idPair);
m_translationManipulators.Register(AzToolsFramework::g_mainManipulatorManagerId); m_translationManipulators.Register(AzToolsFramework::g_mainManipulatorManagerId);

@ -10,6 +10,7 @@
#include <PhysX/EditorColliderComponentRequestBus.h> #include <PhysX/EditorColliderComponentRequestBus.h>
#include <AzToolsFramework/Manipulators/ManipulatorManager.h> #include <AzToolsFramework/Manipulators/ManipulatorManager.h>
#include <AzCore/Component/TransformBus.h> #include <AzCore/Component/TransformBus.h>
#include <AzCore/Component/NonUniformScaleBus.h>
#include <AzFramework/Viewport/ViewportColors.h> #include <AzFramework/Viewport/ViewportColors.h>
#include <AzToolsFramework/Manipulators/AngularManipulator.h> #include <AzToolsFramework/Manipulators/AngularManipulator.h>
#include <AzToolsFramework/ViewportSelection/EditorSelectionUtil.h> #include <AzToolsFramework/ViewportSelection/EditorSelectionUtil.h>
@ -29,6 +30,9 @@ namespace PhysX
AZ::Transform worldTransform; AZ::Transform worldTransform;
AZ::TransformBus::EventResult(worldTransform, idPair.GetEntityId(), &AZ::TransformInterface::GetWorldTM); AZ::TransformBus::EventResult(worldTransform, idPair.GetEntityId(), &AZ::TransformInterface::GetWorldTM);
AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne();
AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, idPair.GetEntityId(), &AZ::NonUniformScaleRequests::GetScale);
AZ::Quaternion colliderRotation; AZ::Quaternion colliderRotation;
PhysX::EditorColliderComponentRequestBus::EventResult(colliderRotation, idPair, &PhysX::EditorColliderComponentRequests::GetColliderRotation); PhysX::EditorColliderComponentRequestBus::EventResult(colliderRotation, idPair, &PhysX::EditorColliderComponentRequests::GetColliderRotation);
@ -36,7 +40,8 @@ namespace PhysX
PhysX::EditorColliderComponentRequestBus::EventResult(colliderOffset, idPair, &PhysX::EditorColliderComponentRequests::GetColliderOffset); PhysX::EditorColliderComponentRequestBus::EventResult(colliderOffset, idPair, &PhysX::EditorColliderComponentRequests::GetColliderOffset);
m_rotationManipulators.SetSpace(worldTransform); m_rotationManipulators.SetSpace(worldTransform);
m_rotationManipulators.SetLocalPosition(colliderOffset); m_rotationManipulators.SetNonUniformScale(nonUniformScale);
m_rotationManipulators.SetLocalPosition(nonUniformScale * colliderOffset);
m_rotationManipulators.SetLocalOrientation(colliderRotation); m_rotationManipulators.SetLocalOrientation(colliderRotation);
m_rotationManipulators.AddEntityComponentIdPair(idPair); m_rotationManipulators.AddEntityComponentIdPair(idPair);
m_rotationManipulators.Register(AzToolsFramework::g_mainManipulatorManagerId); m_rotationManipulators.Register(AzToolsFramework::g_mainManipulatorManagerId);
@ -70,7 +75,11 @@ namespace PhysX
AZ::Vector3 colliderOffset = AZ::Vector3::CreateZero(); AZ::Vector3 colliderOffset = AZ::Vector3::CreateZero();
PhysX::EditorColliderComponentRequestBus::EventResult(colliderOffset, idPair, &PhysX::EditorColliderComponentRequests::GetColliderOffset); PhysX::EditorColliderComponentRequestBus::EventResult(colliderOffset, idPair, &PhysX::EditorColliderComponentRequests::GetColliderOffset);
m_rotationManipulators.SetLocalPosition(colliderOffset);
AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne();
AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, idPair.GetEntityId(), &AZ::NonUniformScaleRequests::GetScale);
m_rotationManipulators.SetLocalPosition(nonUniformScale * colliderOffset);
} }
void ColliderRotationMode::Teardown(const AZ::EntityComponentIdPair& idPair) void ColliderRotationMode::Teardown(const AZ::EntityComponentIdPair& idPair)

@ -581,9 +581,8 @@ namespace PhysX
AZ::Transform EditorColliderComponent::GetColliderLocalTransform() const AZ::Transform EditorColliderComponent::GetColliderLocalTransform() const
{ {
const AZ::Vector3 nonUniformScale = Utils::GetTransformScale(GetEntityId());
return AZ::Transform::CreateFromQuaternionAndTranslation( return AZ::Transform::CreateFromQuaternionAndTranslation(
m_configuration.m_rotation, m_configuration.m_position * nonUniformScale); m_configuration.m_rotation, m_configuration.m_position);
} }
void EditorColliderComponent::UpdateMeshAsset() void EditorColliderComponent::UpdateMeshAsset()
@ -1053,12 +1052,22 @@ namespace PhysX
AZ::Transform EditorColliderComponent::GetCurrentTransform() AZ::Transform EditorColliderComponent::GetCurrentTransform()
{ {
return GetColliderWorldTransform(); return GetWorldTM();
}
AZ::Transform EditorColliderComponent::GetCurrentLocalTransform()
{
return GetColliderLocalTransform();
} }
AZ::Vector3 EditorColliderComponent::GetBoxScale() AZ::Vector3 EditorColliderComponent::GetBoxScale()
{ {
return AZ::Vector3(GetWorldTM().GetUniformScale()); return AZ::Vector3::CreateOne();
}
AZ::Vector3 EditorColliderComponent::GetCurrentNonUniformScale()
{
return m_cachedNonUniformScale;
} }
void EditorColliderComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world) void EditorColliderComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world)
@ -1202,7 +1211,7 @@ namespace PhysX
AZ::Transform EditorColliderComponent::GetColliderWorldTransform() AZ::Transform EditorColliderComponent::GetColliderWorldTransform()
{ {
return AzToolsFramework::TransformNormalizedScale(GetWorldTM()) * GetColliderLocalTransform(); return GetWorldTM() * GetColliderLocalTransform();
} }
bool EditorColliderComponent::ShouldUpdateCollisionMeshFromRender() const bool EditorColliderComponent::ShouldUpdateCollisionMeshFromRender() const

@ -171,7 +171,9 @@ namespace PhysX
AZ::Vector3 GetDimensions() override; AZ::Vector3 GetDimensions() override;
void SetDimensions(const AZ::Vector3& dimensions) override; void SetDimensions(const AZ::Vector3& dimensions) override;
AZ::Transform GetCurrentTransform() override; AZ::Transform GetCurrentTransform() override;
AZ::Transform GetCurrentLocalTransform() override;
AZ::Vector3 GetBoxScale() override; AZ::Vector3 GetBoxScale() override;
AZ::Vector3 GetCurrentNonUniformScale() override;
// AZ::Render::MeshComponentNotificationBus // AZ::Render::MeshComponentNotificationBus
void OnModelReady(const AZ::Data::Asset<AZ::RPI::ModelAsset>& modelAsset, void OnModelReady(const AZ::Data::Asset<AZ::RPI::ModelAsset>& modelAsset,

Loading…
Cancel
Save