3
0

AnimAZEntityNode.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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 "AnimAZEntityNode.h"
  9. #include "AnimComponentNode.h"
  10. #include <AzFramework/Components/CameraBus.h> // for definition of EditorCameraComponentTypeId
  11. #include <AzCore/Component/TransformBus.h>
  12. #include <AzCore/Serialization/SerializeContext.h>
  13. #include <AzFramework/Components/TransformComponent.h>
  14. #include <AzCore/Component/ComponentApplicationBus.h>
  15. #include <Maestro/Bus/SequenceComponentBus.h>
  16. #include <Maestro/Types/AnimParamType.h>
  17. #include <Maestro/Types/AnimNodeType.h>
  18. //////////////////////////////////////////////////////////////////////////
  19. CAnimAzEntityNode::CAnimAzEntityNode(const int id)
  20. : CAnimNode(id, AnimNodeType::AzEntity)
  21. {
  22. SetFlags(GetFlags() | eAnimNodeFlags_CanChangeName);
  23. }
  24. //////////////////////////////////////////////////////////////////////////
  25. CAnimAzEntityNode::CAnimAzEntityNode()
  26. : CAnimAzEntityNode(0)
  27. {
  28. }
  29. //////////////////////////////////////////////////////////////////////////
  30. CAnimAzEntityNode::~CAnimAzEntityNode()
  31. {
  32. }
  33. //////////////////////////////////////////////////////////////////////////
  34. /// @deprecated Serialization for Sequence data in Component Entity Sequences now occurs through AZ::SerializeContext and the Sequence Component
  35. void CAnimAzEntityNode::Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks)
  36. {
  37. CAnimNode::Serialize(xmlNode, bLoading, bLoadEmptyTracks);
  38. if (bLoading)
  39. {
  40. AZ::u64 id64;
  41. if (xmlNode->getAttr("AnimatedEntityId", id64))
  42. {
  43. m_entityId = AZ::EntityId(id64);
  44. }
  45. }
  46. else
  47. {
  48. // saving
  49. if (m_entityId.IsValid())
  50. {
  51. AZ::u64 id64 = static_cast<AZ::u64>(m_entityId);
  52. xmlNode->setAttr("AnimatedEntityId", id64);
  53. }
  54. }
  55. }
  56. //////////////////////////////////////////////////////////////////////////
  57. void CAnimAzEntityNode::SetSkipInterpolatedCameraNode(const bool skipNodeCameraAnimation)
  58. {
  59. // Skip animations on transforms
  60. CAnimComponentNode* transformNode = GetTransformComponentNode();
  61. if (transformNode)
  62. {
  63. transformNode->SetSkipComponentAnimationUpdates(skipNodeCameraAnimation);
  64. }
  65. // Skip animations on cameras
  66. CAnimComponentNode* cameraComponentNode = GetComponentNodeForComponentWithTypeId(AZ::Uuid(EditorCameraComponentTypeId));
  67. if (!cameraComponentNode)
  68. {
  69. cameraComponentNode = GetComponentNodeForComponentWithTypeId(AZ::Uuid(CameraComponentTypeId));
  70. }
  71. if (cameraComponentNode)
  72. {
  73. cameraComponentNode->SetSkipComponentAnimationUpdates(skipNodeCameraAnimation);
  74. }
  75. }
  76. //////////////////////////////////////////////////////////////////////////
  77. void CAnimAzEntityNode::Reflect(AZ::ReflectContext* context)
  78. {
  79. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  80. {
  81. serializeContext->Class<CAnimAzEntityNode, CAnimNode>()
  82. ->Version(1)
  83. ->Field("Entity", &CAnimAzEntityNode::m_entityId);
  84. }
  85. }
  86. //////////////////////////////////////////////////////////////////////////
  87. CAnimParamType CAnimAzEntityNode::GetParamType([[maybe_unused]] unsigned int nIndex) const
  88. {
  89. return AnimParamType::Invalid;
  90. }
  91. CAnimComponentNode* CAnimAzEntityNode::GetComponentNodeForComponentWithTypeId(const AZ::Uuid& componentTypeId) const
  92. {
  93. CAnimComponentNode* retTransformNode = nullptr;
  94. for (int i = m_pSequence->GetNodeCount(); --i >= 0;)
  95. {
  96. IAnimNode* node = m_pSequence->GetNode(i);
  97. if (node && node->GetParent() == this && node->GetType() == AnimNodeType::Component)
  98. {
  99. if (static_cast<CAnimComponentNode*>(node)->GetComponentTypeId() == componentTypeId)
  100. {
  101. retTransformNode = static_cast<CAnimComponentNode*>(node);
  102. break;
  103. }
  104. }
  105. }
  106. return retTransformNode;
  107. }
  108. //////////////////////////////////////////////////////////////////////////
  109. CAnimComponentNode* CAnimAzEntityNode::GetTransformComponentNode() const
  110. {
  111. CAnimComponentNode* retTransformNode = GetComponentNodeForComponentWithTypeId(AZ::Uuid(AZ::EditorTransformComponentTypeId));
  112. if (!retTransformNode)
  113. {
  114. // if not Editor transform, try run-time transform
  115. retTransformNode = GetComponentNodeForComponentWithTypeId(AzFramework::TransformComponent::TYPEINFO_Uuid());
  116. }
  117. return retTransformNode;
  118. }
  119. //////////////////////////////////////////////////////////////////////////
  120. void CAnimAzEntityNode::SetPos(float time, const Vec3& pos)
  121. {
  122. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  123. if (transformComponent)
  124. {
  125. transformComponent->SetPos(time, pos);
  126. }
  127. }
  128. Vec3 CAnimAzEntityNode::GetPos()
  129. {
  130. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  131. if (transformComponent)
  132. {
  133. return transformComponent->GetPos();
  134. }
  135. return Vec3(.0f, .0f, .0f);
  136. }
  137. //////////////////////////////////////////////////////////////////////////
  138. void CAnimAzEntityNode::SetRotate(float time, const Quat& rotation)
  139. {
  140. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  141. if (transformComponent)
  142. {
  143. transformComponent->SetRotate(time, rotation);
  144. }
  145. }
  146. Quat CAnimAzEntityNode::GetRotate()
  147. {
  148. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  149. if (transformComponent)
  150. {
  151. return transformComponent->GetRotate();
  152. }
  153. return Quat::CreateIdentity();
  154. }
  155. Quat CAnimAzEntityNode::GetRotate(float time)
  156. {
  157. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  158. if (transformComponent)
  159. {
  160. return transformComponent->GetRotate(time);
  161. }
  162. return Quat::CreateIdentity();
  163. }
  164. //////////////////////////////////////////////////////////////////////////
  165. void CAnimAzEntityNode::SetScale(float time, const Vec3& scale)
  166. {
  167. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  168. if (transformComponent)
  169. {
  170. transformComponent->SetScale(time, scale);
  171. }
  172. }
  173. Vec3 CAnimAzEntityNode::GetScale()
  174. {
  175. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  176. if (transformComponent)
  177. {
  178. return transformComponent->GetScale();
  179. }
  180. return Vec3(.0f, .0f, .0f);
  181. }
  182. Vec3 CAnimAzEntityNode::GetOffsetPosition(const Vec3& position)
  183. {
  184. CAnimComponentNode* transformComponent = GetTransformComponentNode();
  185. if (transformComponent)
  186. {
  187. return position - transformComponent->GetPos();
  188. }
  189. return Vec3(.0f, .0f, .0f);
  190. }