EditorArticulationLinkComponent.h 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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/TransformBus.h>
  10. #include <AzCore/Settings/SettingsRegistry.h>
  11. #include <AzFramework/Entity/EntityDebugDisplayBus.h>
  12. #include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
  13. #include <Editor/EditorJointConfiguration.h>
  14. #include <Source/Articulation/ArticulationLinkConfiguration.h>
  15. #include <Source/EditorRigidBodyComponent.h>
  16. namespace PhysX
  17. {
  18. //! Feature flag for work in progress on PhysX reduced co-ordinate articulations (see https://github.com/o3de/sig-simulation/issues/60).
  19. constexpr AZStd::string_view ReducedCoordinateArticulationsFlag = "/Amazon/Physics/EnableReducedCoordinateArticulations";
  20. //! Helper function for checking whether feature flag for in progress PhysX reduced co-ordinate articulations work is enabled.
  21. //! See https://github.com/o3de/sig-simulation/issues/60 for more details.
  22. inline bool ReducedCoordinateArticulationsEnabled()
  23. {
  24. bool reducedCoordinateArticulationsEnabled = false;
  25. if (auto* registry = AZ::SettingsRegistry::Get())
  26. {
  27. registry->Get(reducedCoordinateArticulationsEnabled, ReducedCoordinateArticulationsFlag);
  28. }
  29. return reducedCoordinateArticulationsEnabled;
  30. }
  31. class EditorArticulationLinkComponent;
  32. //! Configuration data for EditorRigidBodyComponent.
  33. struct EditorArticulationLinkConfiguration
  34. : public ArticulationLinkConfiguration
  35. {
  36. AZ_CLASS_ALLOCATOR(EditorArticulationLinkConfiguration, AZ::SystemAllocator);
  37. AZ_RTTI(
  38. EditorArticulationLinkConfiguration,
  39. "{8FFA0EC2-E850-4562-AB3D-08D157E07B81}",
  40. ArticulationLinkConfiguration);
  41. static void Reflect(AZ::ReflectContext* context);
  42. };
  43. //! Class for in-editor PhysX Articulation Link Component.
  44. class EditorArticulationLinkComponent
  45. : public AzToolsFramework::Components::EditorComponentBase
  46. , protected AZ::TransformNotificationBus::Handler
  47. , protected AzFramework::EntityDebugDisplayEventBus::Handler
  48. {
  49. public:
  50. AZ_EDITOR_COMPONENT(
  51. EditorArticulationLinkComponent, "{7D23169B-3214-4A32-ABFC-FCCE6E31F2CF}", AzToolsFramework::Components::EditorComponentBase);
  52. static void Reflect(AZ::ReflectContext* context);
  53. EditorArticulationLinkComponent() = default;
  54. explicit EditorArticulationLinkComponent(const EditorArticulationLinkConfiguration& configuration);
  55. ~EditorArticulationLinkComponent() = default;
  56. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
  57. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
  58. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
  59. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
  60. // EditorComponentBase overrides ...
  61. void Activate() override;
  62. void Deactivate() override;
  63. void BuildGameEntity(AZ::Entity* gameEntity) override;
  64. bool IsRootArticulation() const;
  65. private:
  66. // TransformNotificationBus overrides ...
  67. void OnTransformChanged(const AZ::Transform& localTM, const AZ::Transform& worldTM) override;
  68. // AzFramework::EntityDebugDisplayEventBus overrides ...
  69. void DisplayEntityViewport(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override;
  70. bool ShowSetupDisplay() const;
  71. void ShowJointHierarchy(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) const;
  72. void ShowHingeJoint(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) const;
  73. void ShowPrismaticJoint(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) const;
  74. EditorArticulationLinkConfiguration m_config;
  75. AZ::Transform m_cachedWorldTM;
  76. };
  77. } // namespace PhysX