ColliderAssetScaleMode.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "ColliderAssetScaleMode.h"
  9. #include <PhysX/EditorColliderComponentRequestBus.h>
  10. #include <AzToolsFramework/Manipulators/ManipulatorManager.h>
  11. #include <AzCore/Component/TransformBus.h>
  12. #include <AzFramework/Viewport/ViewportColors.h>
  13. #include <AzFramework/Viewport/ViewportConstants.h>
  14. #include <AzToolsFramework/Manipulators/AngularManipulator.h>
  15. #include <AzToolsFramework/ViewportSelection/EditorSelectionUtil.h>
  16. namespace PhysX
  17. {
  18. AZ_CLASS_ALLOCATOR_IMPL(ColliderAssetScaleMode, AZ::SystemAllocator);
  19. namespace
  20. {
  21. const float MinAssetScale = 0.001f;
  22. const AZ::Vector3 ResetScale = AZ::Vector3::CreateOne();
  23. }
  24. ColliderAssetScaleMode::ColliderAssetScaleMode()
  25. : m_dimensionsManipulators(AZ::Transform::Identity())
  26. {
  27. }
  28. void ColliderAssetScaleMode::Setup(const AZ::EntityComponentIdPair& idPair)
  29. {
  30. AZ::Transform colliderWorldTransform = AZ::Transform::Identity();
  31. PhysX::EditorColliderComponentRequestBus::EventResult(colliderWorldTransform, idPair, &PhysX::EditorColliderComponentRequests::GetColliderWorldTransform);
  32. m_dimensionsManipulators.SetSpace(colliderWorldTransform);
  33. m_dimensionsManipulators.AddEntityComponentIdPair(idPair);
  34. m_dimensionsManipulators.Register(AzToolsFramework::g_mainManipulatorManagerId);
  35. m_dimensionsManipulators.SetAxes(
  36. AZ::Vector3::CreateAxisX(),
  37. AZ::Vector3::CreateAxisY(),
  38. AZ::Vector3::CreateAxisZ());
  39. m_dimensionsManipulators.ConfigureView(
  40. AzFramework::ViewportConstants::DefaultLinearManipulatorAxisLength,
  41. AzFramework::ViewportColors::XAxisColor,
  42. AzFramework::ViewportColors::YAxisColor,
  43. AzFramework::ViewportColors::ZAxisColor);
  44. m_dimensionsManipulators.InstallAxisLeftMouseDownCallback(
  45. [this, idPair] (const AzToolsFramework::LinearManipulator::Action& action)
  46. {
  47. AZ_UNUSED(action);
  48. OnManipulatorDown(idPair);
  49. });
  50. m_dimensionsManipulators.InstallAxisMouseMoveCallback(
  51. [this, idPair] (const AzToolsFramework::LinearManipulator::Action& action)
  52. {
  53. OnManipulatorMoved(action.m_start.m_sign * action.LocalScaleOffset() + m_initialScale, idPair);
  54. });
  55. m_dimensionsManipulators.InstallUniformLeftMouseDownCallback(
  56. [this, idPair](const AzToolsFramework::LinearManipulator::Action& action)
  57. {
  58. AZ_UNUSED(action);
  59. OnManipulatorDown(idPair);
  60. });
  61. m_dimensionsManipulators.InstallUniformMouseMoveCallback(
  62. [this, idPair] (const AzToolsFramework::LinearManipulator::Action& action)
  63. {
  64. // Uniform scale manipulator will only set the Z value for the offset, use this to create uniform scale.
  65. const AZ::Vector3 uniformScale(action.LocalScaleOffset().GetZ());
  66. OnManipulatorMoved(uniformScale + m_initialScale, idPair);
  67. });
  68. }
  69. void ColliderAssetScaleMode::Refresh(const AZ::EntityComponentIdPair& idPair)
  70. {
  71. AZ::Transform colliderWorldTransform = AZ::Transform::Identity();
  72. PhysX::EditorColliderComponentRequestBus::EventResult(colliderWorldTransform, idPair, &PhysX::EditorColliderComponentRequests::GetColliderWorldTransform);
  73. m_dimensionsManipulators.SetSpace(colliderWorldTransform);
  74. }
  75. void ColliderAssetScaleMode::Teardown(const AZ::EntityComponentIdPair& idPair)
  76. {
  77. m_dimensionsManipulators.RemoveEntityComponentIdPair(idPair);
  78. m_dimensionsManipulators.Unregister();
  79. }
  80. void ColliderAssetScaleMode::OnManipulatorDown(const AZ::EntityComponentIdPair& idPair)
  81. {
  82. // Remember the initial asset scale here.
  83. PhysX::EditorMeshColliderComponentRequestBus::EventResult(m_initialScale, idPair, &PhysX::EditorMeshColliderComponentRequests::GetAssetScale);
  84. }
  85. void ColliderAssetScaleMode::OnManipulatorMoved(const AZ::Vector3& scale, const AZ::EntityComponentIdPair& idPair)
  86. {
  87. AZ::Vector3 clampedScale = scale.GetMax(AZ::Vector3(MinAssetScale));
  88. PhysX::EditorMeshColliderComponentRequestBus::Event(idPair, &PhysX::EditorMeshColliderComponentRequests::SetAssetScale, clampedScale);
  89. }
  90. void ColliderAssetScaleMode::ResetValues(const AZ::EntityComponentIdPair& idPair)
  91. {
  92. PhysX::EditorMeshColliderComponentRequestBus::Event(idPair, &PhysX::EditorMeshColliderComponentRequests::SetAssetScale, ResetScale);
  93. }
  94. } // namespace PhysX