EditorRigidBodyComponent.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. #pragma once
  9. #include <AzCore/Component/NonUniformScaleBus.h>
  10. #include <AzCore/Component/TransformBus.h>
  11. #include <AzCore/Component/EntityBus.h>
  12. #include <AzFramework/Entity/EntityDebugDisplayBus.h>
  13. #include <AzFramework/Physics/Common/PhysicsEvents.h>
  14. #include <AzFramework/Physics/Common/PhysicsTypes.h>
  15. #include <AzFramework/Physics/Components/SimulatedBodyComponentBus.h>
  16. #include <AzFramework/Physics/SimulatedBodies/RigidBody.h>
  17. #include <AzFramework/Visibility/BoundsBus.h>
  18. #include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
  19. #include <AzToolsFramework/API/ComponentEntitySelectionBus.h>
  20. #include <PhysX/ColliderComponentBus.h>
  21. #include <PhysX/Debug/PhysXDebugConfiguration.h>
  22. #include <PhysX/Debug/PhysXDebugInterface.h>
  23. #include <Source/RigidBody.h>
  24. namespace PhysX
  25. {
  26. //! Configuration data for EditorRigidBodyComponent.
  27. struct EditorRigidBodyConfiguration
  28. : public AzPhysics::RigidBodyConfiguration
  29. {
  30. AZ_CLASS_ALLOCATOR(PhysX::EditorRigidBodyConfiguration, AZ::SystemAllocator);
  31. AZ_RTTI(PhysX::EditorRigidBodyConfiguration, "{27297024-5A99-4C58-8614-4EF18137CE69}", AzPhysics::RigidBodyConfiguration);
  32. static void Reflect(AZ::ReflectContext* context);
  33. // Debug properties.
  34. bool m_centerOfMassDebugDraw = false;
  35. };
  36. //! Class for in-editor PhysX Dynamic Rigid Body Component.
  37. class EditorRigidBodyComponent
  38. : public AzToolsFramework::Components::EditorComponentBase
  39. , public AZ::EntityBus::Handler
  40. , protected AzFramework::EntityDebugDisplayEventBus::Handler
  41. , private AZ::TransformNotificationBus::Handler
  42. , private Physics::ColliderComponentEventBus::Handler
  43. , private AzPhysics::SimulatedBodyComponentRequestsBus::Handler
  44. , public AzFramework::BoundsRequestBus::Handler
  45. , public AzToolsFramework::EditorComponentSelectionRequestsBus::Handler
  46. {
  47. public:
  48. AZ_EDITOR_COMPONENT(EditorRigidBodyComponent, "{F2478E6B-001A-4006-9D7E-DCB5A6B041DD}", AzToolsFramework::Components::EditorComponentBase);
  49. static void Reflect(AZ::ReflectContext* context);
  50. EditorRigidBodyComponent();
  51. explicit EditorRigidBodyComponent(const EditorRigidBodyConfiguration& configuration);
  52. EditorRigidBodyComponent(const EditorRigidBodyConfiguration& configuration, const RigidBodyConfiguration& physxSpecificConfiguration);
  53. ~EditorRigidBodyComponent() = default;
  54. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  55. {
  56. provided.push_back(AZ_CRC_CE("PhysicsWorldBodyService"));
  57. provided.push_back(AZ_CRC_CE("PhysicsRigidBodyService"));
  58. provided.push_back(AZ_CRC_CE("PhysicsDynamicRigidBodyService"));
  59. }
  60. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  61. {
  62. incompatible.push_back(AZ_CRC_CE("PhysicsRigidBodyService"));
  63. }
  64. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  65. {
  66. required.push_back(AZ_CRC_CE("TransformService"));
  67. }
  68. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  69. {
  70. dependent.push_back(AZ_CRC_CE("NonUniformScaleService"));
  71. }
  72. // AZ::Component
  73. void Activate() override;
  74. void Deactivate() override;
  75. // AZ::EntityBus overrides ...
  76. void OnEntityActivated(const AZ::EntityId& entityId) override;
  77. // BoundsRequestBus overrides ...
  78. AZ::Aabb GetWorldBounds() const override;
  79. AZ::Aabb GetLocalBounds() const override;
  80. // EditorComponentBase
  81. void BuildGameEntity(AZ::Entity* gameEntity) override;
  82. const AzPhysics::RigidBody* GetRigidBody() const;
  83. private:
  84. // AzFramework::EntityDebugDisplayEventBus
  85. void DisplayEntityViewport(
  86. const AzFramework::ViewportInfo& viewportInfo,
  87. AzFramework::DebugDisplayRequests& debugDisplay) override;
  88. // TransformBus
  89. void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override;
  90. // non-uniform scale handling
  91. void OnNonUniformScaleChanged(const AZ::Vector3& scale);
  92. // Physics::ColliderComponentEventBus
  93. void OnColliderChanged() override;
  94. // AzPhysics::SimulatedBodyComponentRequestsBus::Handler overrides ...
  95. void EnablePhysics() override;
  96. void DisablePhysics() override;
  97. bool IsPhysicsEnabled() const override;
  98. AZ::Aabb GetAabb() const override;
  99. AzPhysics::SimulatedBody* GetSimulatedBody() override;
  100. AzPhysics::SimulatedBodyHandle GetSimulatedBodyHandle() const override;
  101. AzPhysics::SceneQueryHit RayCast(const AzPhysics::RayCastRequest& request) override;
  102. // EditorComponentSelectionRequestsBus overrides ...
  103. AZ::Aabb GetEditorSelectionBoundsViewport(const AzFramework::ViewportInfo& viewportInfo) override;
  104. bool EditorSelectionIntersectRayViewport(
  105. const AzFramework::ViewportInfo& viewportInfo, const AZ::Vector3& src, const AZ::Vector3& dir, float& distance) override;
  106. bool SupportsEditorRayIntersect() override;
  107. void CreateEditorWorldRigidBody();
  108. void UpdateDebugDrawSettings(const Debug::DebugDisplayData& data);
  109. void SetShouldBeRecreated();
  110. void InitPhysicsTickHandler();
  111. void PrePhysicsTick();
  112. void OnConfigurationChanged();
  113. Debug::DebugDisplayDataChangedEvent::Handler m_debugDisplayDataChangeHandler;
  114. EditorRigidBodyConfiguration m_config; //!< Generic properties from AzPhysics.
  115. RigidBodyConfiguration
  116. m_physxSpecificConfig; //!< Properties specific to PhysX which might not have exact equivalents in other physics engines.
  117. AzPhysics::SimulatedBodyHandle m_editorRigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
  118. AzPhysics::SceneHandle m_editorSceneHandle = AzPhysics::InvalidSceneHandle;
  119. AZ::Color m_centerOfMassDebugColor = AZ::Colors::White;
  120. float m_centerOfMassDebugSize = 0.1f;
  121. bool m_shouldBeRecreated = false;
  122. AzPhysics::SceneEvents::OnSceneSimulationStartHandler m_sceneStartSimHandler;
  123. AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler; //!< Responds to changes in non-uniform scale.
  124. AzPhysics::SystemEvents::OnDefaultSceneConfigurationChangedEvent::Handler m_sceneConfigChangedHandler; //!< Responds to changes in Scene Config.
  125. };
  126. } // namespace PhysX