ColliderTranslationManipulators.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 <EMotionFX/CommandSystem/Source/ColliderCommands.h>
  9. #include <EMotionFX/Source/Actor.h>
  10. #include <EMotionFX/Source/Node.h>
  11. #include <EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
  12. #include <Editor/ColliderContainerWidget.h>
  13. #include <Editor/Plugins/Ragdoll/ColliderTranslationManipulators.h>
  14. namespace EMotionFX
  15. {
  16. ColliderTranslationManipulators::ColliderTranslationManipulators()
  17. : m_translationManipulators(
  18. AzToolsFramework::TranslationManipulators::Dimensions::Three, AZ::Transform::CreateIdentity(), AZ::Vector3::CreateOne())
  19. {
  20. }
  21. void ColliderTranslationManipulators::Setup(const PhysicsSetupManipulatorData& physicsSetupManipulatorData)
  22. {
  23. m_physicsSetupManipulatorData = physicsSetupManipulatorData;
  24. if (!m_physicsSetupManipulatorData.HasColliders())
  25. {
  26. return;
  27. }
  28. m_translationManipulators.SetSpace(m_physicsSetupManipulatorData.m_nodeWorldTransform);
  29. m_translationManipulators.SetLocalPosition(
  30. m_physicsSetupManipulatorData.m_colliderNodeConfiguration->m_shapes[0].first->m_position);
  31. m_translationManipulators.Register(EMStudio::g_animManipulatorManagerId);
  32. AzToolsFramework::ConfigureTranslationManipulatorAppearance3d(&m_translationManipulators);
  33. // mouse down callbacks
  34. m_translationManipulators.InstallLinearManipulatorMouseDownCallback(
  35. [this](const AzToolsFramework::LinearManipulator::Action& action)
  36. {
  37. BeginEditing(action.m_start.m_localPosition, action.m_current.m_localPositionOffset);
  38. });
  39. m_translationManipulators.InstallPlanarManipulatorMouseDownCallback(
  40. [this](const AzToolsFramework::PlanarManipulator::Action& action)
  41. {
  42. BeginEditing(action.m_start.m_localPosition, action.m_current.m_localOffset);
  43. });
  44. m_translationManipulators.InstallSurfaceManipulatorMouseDownCallback(
  45. [this](const AzToolsFramework::SurfaceManipulator::Action& action)
  46. {
  47. BeginEditing(action.m_start.m_localPosition, action.m_current.m_localOffset);
  48. });
  49. // mouse move callbacks
  50. m_translationManipulators.InstallLinearManipulatorMouseMoveCallback(
  51. [this](const AzToolsFramework::LinearManipulator::Action& action)
  52. {
  53. OnManipulatorMoved(action.m_start.m_localPosition, action.m_current.m_localPositionOffset);
  54. });
  55. m_translationManipulators.InstallPlanarManipulatorMouseMoveCallback(
  56. [this](const AzToolsFramework::PlanarManipulator::Action& action)
  57. {
  58. OnManipulatorMoved(action.m_start.m_localPosition, action.m_current.m_localOffset);
  59. });
  60. m_translationManipulators.InstallSurfaceManipulatorMouseMoveCallback(
  61. [this](const AzToolsFramework::SurfaceManipulator::Action& action)
  62. {
  63. OnManipulatorMoved(action.m_start.m_localPosition, action.m_current.m_localOffset);
  64. });
  65. // mouse up callbacks
  66. m_translationManipulators.InstallLinearManipulatorMouseUpCallback(
  67. [this](const AzToolsFramework::LinearManipulator::Action& action)
  68. {
  69. EndEditing(action.m_start.m_localPosition, action.m_current.m_localPositionOffset);
  70. });
  71. m_translationManipulators.InstallPlanarManipulatorMouseUpCallback(
  72. [this](const AzToolsFramework::PlanarManipulator::Action& action)
  73. {
  74. EndEditing(action.m_start.m_localPosition, action.m_current.m_localOffset);
  75. });
  76. m_translationManipulators.InstallSurfaceManipulatorMouseUpCallback(
  77. [this](const AzToolsFramework::SurfaceManipulator::Action& action)
  78. {
  79. EndEditing(action.m_start.m_localPosition, action.m_current.m_localOffset);
  80. });
  81. PhysicsSetupManipulatorRequestBus::Handler::BusConnect();
  82. m_adjustColliderCallback = AZStd::make_unique<PhysicsSetupManipulatorCommandCallback>(this, false);
  83. EMStudio::GetCommandManager()->RegisterCommandCallback("AdjustCollider", m_adjustColliderCallback.get());
  84. }
  85. void ColliderTranslationManipulators::Refresh()
  86. {
  87. if (m_physicsSetupManipulatorData.HasColliders())
  88. {
  89. m_translationManipulators.SetLocalPosition(
  90. m_physicsSetupManipulatorData.m_colliderNodeConfiguration->m_shapes[0].first->m_position);
  91. }
  92. }
  93. void ColliderTranslationManipulators::Teardown()
  94. {
  95. if (!m_physicsSetupManipulatorData.HasColliders())
  96. {
  97. return;
  98. }
  99. EMStudio::GetCommandManager()->RemoveCommandCallback(m_adjustColliderCallback.get(), false);
  100. m_adjustColliderCallback.reset();
  101. PhysicsSetupManipulatorRequestBus::Handler::BusDisconnect();
  102. m_translationManipulators.Unregister();
  103. }
  104. void ColliderTranslationManipulators::ResetValues()
  105. {
  106. if (m_physicsSetupManipulatorData.HasColliders())
  107. {
  108. BeginEditing(
  109. m_physicsSetupManipulatorData.m_colliderNodeConfiguration->m_shapes[0].first->m_position, AZ::Vector3::CreateZero());
  110. EndEditing(AZ::Vector3::CreateZero(), AZ::Vector3::CreateZero());
  111. Refresh();
  112. }
  113. }
  114. AZ::Vector3 ColliderTranslationManipulators::GetPosition(const AZ::Vector3& startPosition, const AZ::Vector3& offset) const
  115. {
  116. const float scale = AZ::GetMax(AZ::MinTransformScale, m_physicsSetupManipulatorData.m_nodeWorldTransform.GetUniformScale());
  117. return startPosition + offset / scale;
  118. }
  119. void ColliderTranslationManipulators::OnManipulatorMoved(const AZ::Vector3& startPosition, const AZ::Vector3& offset)
  120. {
  121. AZ::Vector3 newPosition = GetPosition(startPosition, offset);
  122. if (m_physicsSetupManipulatorData.HasColliders())
  123. {
  124. m_physicsSetupManipulatorData.m_colliderNodeConfiguration->m_shapes[0].first->m_position = newPosition;
  125. }
  126. m_translationManipulators.SetLocalPosition(newPosition);
  127. m_physicsSetupManipulatorData.m_collidersWidget->Update();
  128. }
  129. void ColliderTranslationManipulators::BeginEditing(const AZ::Vector3& startPosition, const AZ::Vector3& offset)
  130. {
  131. if (!m_commandGroup.IsEmpty())
  132. {
  133. return;
  134. }
  135. m_commandGroup.SetGroupName("Adjust collider");
  136. const AZ::u32 actorId = m_physicsSetupManipulatorData.m_actor->GetID();
  137. const AZStd::string& nodeName = m_physicsSetupManipulatorData.m_node->GetNameString();
  138. auto colliderType = PhysicsSetup::ColliderConfigType::Ragdoll;
  139. const size_t colliderIndex = 0;
  140. CommandAdjustCollider* command = aznew CommandAdjustCollider(actorId, nodeName, colliderType, colliderIndex);
  141. m_commandGroup.AddCommand(command);
  142. command->SetOldPosition(GetPosition(startPosition, offset));
  143. }
  144. void ColliderTranslationManipulators::EndEditing(const AZ::Vector3& startPosition, const AZ::Vector3& offset)
  145. {
  146. if (m_commandGroup.IsEmpty())
  147. {
  148. return;
  149. }
  150. if (CommandAdjustCollider* command = azdynamic_cast<CommandAdjustCollider*>(m_commandGroup.GetCommand(0)))
  151. {
  152. command->SetPosition(GetPosition(startPosition, offset));
  153. }
  154. AZStd::string result;
  155. CommandSystem::GetCommandManager()->ExecuteCommandGroup(m_commandGroup, result);
  156. m_commandGroup.Clear();
  157. }
  158. void ColliderTranslationManipulators::OnUnderlyingPropertiesChanged()
  159. {
  160. Refresh();
  161. }
  162. } // namespace EMotionFX