3
0

AnimGraphComponent.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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/Component.h>
  10. #include <AzCore/Component/TransformBus.h>
  11. #include <AzCore/Component/TickBus.h>
  12. #include <AzCore/Asset/AssetCommon.h>
  13. #include <AzCore/Script/ScriptProperty.h>
  14. #include <AzCore/std/smart_ptr/unique_ptr.h>
  15. #include <Integration/Assets/AnimGraphAsset.h>
  16. #include <Integration/Assets/MotionSetAsset.h>
  17. #include <Integration/ActorComponentBus.h>
  18. #include <Integration/AnimGraphComponentBus.h>
  19. #include <Integration/AnimGraphNetworkingBus.h>
  20. namespace EMotionFX
  21. {
  22. namespace Integration
  23. {
  24. class AnimGraphComponent
  25. : public AZ::Component
  26. , private AZ::Data::AssetBus::MultiHandler
  27. , private ActorComponentNotificationBus::Handler
  28. , private AnimGraphComponentRequestBus::Handler
  29. , private AnimGraphComponentNotificationBus::Handler
  30. , private AnimGraphComponentNetworkRequestBus::Handler
  31. {
  32. public:
  33. friend class EditorAnimGraphComponent;
  34. AZ_COMPONENT(AnimGraphComponent, "{77624349-D5C4-4902-9F08-665814520999}");
  35. /**
  36. * Structure containing data-driven properties extracted from the anim graph,
  37. * to allow override control per-entity via the component inspector UI.
  38. */
  39. struct ParameterDefaults
  40. {
  41. AZ_TYPE_INFO(ParameterDefaults, "{E6826EB9-C79B-43F3-A03F-3298DD3C724E}")
  42. ~ParameterDefaults();
  43. ParameterDefaults& operator=(const ParameterDefaults& rhs)
  44. {
  45. if (this == &rhs)
  46. {
  47. return *this;
  48. }
  49. Reset();
  50. m_parameters.reserve(rhs.m_parameters.size());
  51. for (AZ::ScriptProperty* p : rhs.m_parameters)
  52. {
  53. if (p)
  54. {
  55. m_parameters.push_back(p->Clone());
  56. }
  57. }
  58. return *this;
  59. }
  60. using ParameterList = AZStd::vector<AZ::ScriptProperty*>;
  61. ParameterList m_parameters;
  62. void Reset();
  63. static void Reflect(AZ::ReflectContext* context);
  64. };
  65. /**
  66. * Configuration struct for procedural configuration of Actor Components.
  67. */
  68. struct Configuration
  69. {
  70. AZ_TYPE_INFO(Configuration, "{F5A93340-60CD-4A16-BEF3-1014D762B217}")
  71. AZ::Data::Asset<AnimGraphAsset> m_animGraphAsset; ///< Selected anim graph.
  72. AZ::Data::Asset<MotionSetAsset> m_motionSetAsset; ///< Selected motion set asset.
  73. AZStd::string m_activeMotionSetName; ///< Selected motion set.
  74. bool m_visualize = false; ///< Debug visualization.
  75. ParameterDefaults m_parameterDefaults; ///< Defaults for parameter values.
  76. static void Reflect(AZ::ReflectContext* context);
  77. };
  78. AnimGraphComponent(const Configuration* config = nullptr);
  79. ~AnimGraphComponent() override;
  80. //////////////////////////////////////////////////////////////////////////
  81. // AZ::Component interface implementation
  82. void Init() override;
  83. void Activate() override;
  84. void Deactivate() override;
  85. //////////////////////////////////////////////////////////////////////////
  86. //////////////////////////////////////////////////////////////////////////
  87. // AnimGraphComponentRequestBus::Handler
  88. EMotionFX::AnimGraphInstance* GetAnimGraphInstance() override;
  89. size_t FindParameterIndex(const char* parameterName) override;
  90. const char* FindParameterName(size_t parameterIndex) override;
  91. void SetParameterFloat(size_t parameterIndex, float value) override;
  92. void SetParameterBool(size_t parameterIndex, bool value) override;
  93. void SetParameterString(size_t parameterIndex, const char* value) override;
  94. void SetParameterVector2(size_t parameterIndex, const AZ::Vector2& value) override;
  95. void SetParameterVector3(size_t parameterIndex, const AZ::Vector3& value) override;
  96. void SetParameterRotationEuler(size_t parameterIndex, const AZ::Vector3& value) override;
  97. void SetParameterRotation(size_t parameterIndex, const AZ::Quaternion& value) override;
  98. void SetNamedParameterFloat(const char* parameterName, float value) override;
  99. void SetNamedParameterBool(const char* parameterName, bool value) override;
  100. void SetNamedParameterString(const char* parameterName, const char* value) override;
  101. void SetNamedParameterVector2(const char* parameterName, const AZ::Vector2& value) override;
  102. void SetNamedParameterVector3(const char* parameterName, const AZ::Vector3& value) override;
  103. void SetNamedParameterRotationEuler(const char* parameterName, const AZ::Vector3& value) override;
  104. void SetNamedParameterRotation(const char* parameterName, const AZ::Quaternion& value) override;
  105. void SetVisualizeEnabled(bool enabled) override;
  106. float GetParameterFloat(size_t parameterIndex) override;
  107. bool GetParameterBool(size_t parameterIndex) override;
  108. AZStd::string GetParameterString(size_t parameterIndex) override;
  109. AZ::Vector2 GetParameterVector2(size_t parameterIndex) override;
  110. AZ::Vector3 GetParameterVector3(size_t parameterIndex) override;
  111. AZ::Vector3 GetParameterRotationEuler(size_t parameterIndex) override;
  112. AZ::Quaternion GetParameterRotation(size_t parameterIndex) override;
  113. float GetNamedParameterFloat(const char* parameterName) override;
  114. bool GetNamedParameterBool(const char* parameterName) override;
  115. AZStd::string GetNamedParameterString(const char* parameterName) override;
  116. AZ::Vector2 GetNamedParameterVector2(const char* parameterName) override;
  117. AZ::Vector3 GetNamedParameterVector3(const char* parameterName) override;
  118. AZ::Vector3 GetNamedParameterRotationEuler(const char* parameterName) override;
  119. AZ::Quaternion GetNamedParameterRotation(const char* parameterName) override;
  120. bool GetVisualizeEnabled() override;
  121. void SyncAnimGraph(AZ::EntityId leaderEntityId) override;
  122. void DesyncAnimGraph(AZ::EntityId leaderEntityId) override;
  123. void SetActiveMotionSet(const char* activeMotionSetName) override;
  124. //////////////////////////////////////////////////////////////////////////
  125. //////////////////////////////////////////////////////////////////////////
  126. // ActorComponentNotificationBus::Handler
  127. void OnActorInstanceCreated(EMotionFX::ActorInstance* /*actorInstance*/) override;
  128. void OnActorInstanceDestroyed(EMotionFX::ActorInstance* /*actorInstance*/) override;
  129. //////////////////////////////////////////////////////////////////////////
  130. // AnimGraphComponentNetworkRequestBus
  131. bool IsAssetReady() const override;
  132. bool HasSnapshot() const override;
  133. void CreateSnapshot(bool isAuthoritative) override;
  134. void SetActiveStates(const NodeIndexContainer& activeStates) override;
  135. static NodeIndexContainer s_emptyNodeIndexContainer;
  136. const NodeIndexContainer& GetActiveStates() const override;
  137. static MotionNodePlaytimeContainer s_emptyMotionNodePlaytimeContainer;
  138. void SetMotionPlaytimes(const MotionNodePlaytimeContainer& motionNodePlaytimes) override;
  139. const MotionNodePlaytimeContainer& GetMotionPlaytimes() const override;
  140. void UpdateActorExternal(float deltatime) override;
  141. void SetNetworkRandomSeed(AZ::u64 seed) override;
  142. AZ::u64 GetNetworkRandomSeed() const override;
  143. void SetActorThreadIndex(AZ::u32 threadIndex) override;
  144. AZ::u32 GetActorThreadIndex() const override;
  145. //////////////////////////////////////////////////////////////////////////
  146. // AnimGraphComponentNotificationBus::Handler
  147. void OnAnimGraphSynced(EMotionFX::AnimGraphInstance* /*animGraphInstance(Follower)*/) override;
  148. void OnAnimGraphDesynced(EMotionFX::AnimGraphInstance* /*animGraphInstance(Follower)*/) override;
  149. //////////////////////////////////////////////////////////////////////////
  150. //////////////////////////////////////////////////////////////////////////
  151. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  152. {
  153. provided.push_back(AZ_CRC("EMotionFXAnimGraphService", 0x9ec3c819));
  154. }
  155. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  156. {
  157. incompatible.push_back(AZ_CRC("EMotionFXAnimGraphService", 0x9ec3c819));
  158. incompatible.push_back(AZ_CRC("EMotionFXSimpleMotionService", 0xea7a05d8));
  159. }
  160. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  161. {
  162. dependent.push_back(AZ_CRC("MeshService", 0x71d8a455));
  163. }
  164. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  165. {
  166. required.push_back(AZ_CRC("TransformService", 0x8ee22c50));
  167. required.push_back(AZ_CRC("EMotionFXActorService", 0xd6e8f48d));
  168. }
  169. static void Reflect(AZ::ReflectContext* context);
  170. //////////////////////////////////////////////////////////////////////////
  171. // AZ::Data::AssetBus::Handler
  172. void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  173. void OnAssetReloaded(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  174. void SetAnimGraphAssetId(const AZ::Data::AssetId& assetId);
  175. void SetMotionSetAssetId(const AZ::Data::AssetId& assetId);
  176. private:
  177. void CheckCreateAnimGraphInstance();
  178. void DestroyAnimGraphInstance();
  179. // Helper functions to wrap special logic required for EMFX anim graph ref-counting.
  180. void AnimGraphInstancePostCreate();
  181. void AnimGraphInstancePreDestroy();
  182. Configuration m_configuration; ///< Component configuration.
  183. EMotionFXPtr<EMotionFX::ActorInstance> m_actorInstance; ///< Associated actor instance (retrieved from Actor Component).
  184. EMotionFXPtr<EMotionFX::AnimGraphInstance> m_animGraphInstance; ///< Live anim graph instance.
  185. };
  186. } // namespace Integration
  187. } // namespace EMotionFX