3
0

UiAnimationSystem.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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 <LyShine/Animation/IUiAnimation.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <AzCore/std/containers/map.h>
  12. #include <AzCore/Time/ITime.h>
  13. #include <CryCommon/StlUtils.h>
  14. struct PlayingUIAnimSequence
  15. {
  16. //! Sequence playing
  17. AZStd::intrusive_ptr<IUiAnimSequence> sequence;
  18. //! Start/End/Current playing time for this sequence.
  19. float startTime;
  20. float endTime;
  21. float currentTime;
  22. float currentSpeed;
  23. //! Sequence from other sequence's sequence track
  24. bool trackedSequence;
  25. bool bSingleFrame;
  26. };
  27. struct IConsoleCmdArgs;
  28. class UiAnimationSystem
  29. : public IUiAnimationSystem
  30. {
  31. typedef AZStd::vector<PlayingUIAnimSequence> PlayingSequences;
  32. public:
  33. AZ_CLASS_ALLOCATOR(UiAnimationSystem, AZ::SystemAllocator)
  34. AZ_RTTI(UiAnimationSystem, "{2592269B-EF74-4409-B29F-682DC0B45DAF}", IUiAnimationSystem)
  35. UiAnimationSystem();
  36. void Release() override { delete this; };
  37. bool Load(const char* pszFile, const char* pszMission) override;
  38. ISystem* GetSystem() override { return m_pSystem; }
  39. IUiAnimTrack* CreateTrack(EUiAnimCurveType type) override;
  40. IUiAnimSequence* CreateSequence(const char* sequence, bool bLoad = false, uint32 id = 0) override;
  41. IUiAnimSequence* LoadSequence(const char* pszFilePath);
  42. IUiAnimSequence* LoadSequence(XmlNodeRef& xmlNode, bool bLoadEmpty = true) override;
  43. void AddSequence(IUiAnimSequence* pSequence) override;
  44. void RemoveSequence(IUiAnimSequence* pSequence) override;
  45. IUiAnimSequence* FindSequence(const char* sequence) const override;
  46. IUiAnimSequence* FindSequenceById(uint32 id) const override;
  47. IUiAnimSequence* GetSequence(int i) const override;
  48. int GetNumSequences() const override;
  49. IUiAnimSequence* GetPlayingSequence(int i) const override;
  50. int GetNumPlayingSequences() const override;
  51. bool IsCutScenePlaying() const override;
  52. uint32 GrabNextSequenceId() override
  53. { return m_nextSequenceId++; }
  54. int OnSequenceRenamed(const char* before, const char* after) override;
  55. int OnCameraRenamed(const char* before, const char* after) override;
  56. bool AddUiAnimationListener(IUiAnimSequence* pSequence, IUiAnimationListener* pListener) override;
  57. bool RemoveUiAnimationListener(IUiAnimSequence* pSequence, IUiAnimationListener* pListener) override;
  58. void RemoveAllSequences() override;
  59. //////////////////////////////////////////////////////////////////////////
  60. // Sequence playback.
  61. //////////////////////////////////////////////////////////////////////////
  62. void PlaySequence(const char* sequence, IUiAnimSequence* parentSeq = NULL, bool bResetFX = true,
  63. bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX) override;
  64. void PlaySequence(IUiAnimSequence* seq, IUiAnimSequence* parentSeq = NULL, bool bResetFX = true,
  65. bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX) override;
  66. void PlayOnLoadSequences() override;
  67. bool StopSequence(const char* sequence) override;
  68. bool StopSequence(IUiAnimSequence* seq) override;
  69. bool AbortSequence(IUiAnimSequence* seq, bool bLeaveTime = false) override;
  70. void StopAllSequences() override;
  71. void StopAllCutScenes() override;
  72. void Pause(bool bPause);
  73. void Reset(bool bPlayOnReset, bool bSeekToStart) override;
  74. void StillUpdate() override;
  75. void PreUpdate(const float dt) override;
  76. void PostUpdate(const float dt) override;
  77. void Render() override;
  78. bool IsPlaying(IUiAnimSequence* seq) const override;
  79. void Pause() override;
  80. void Resume() override;
  81. void SetRecording(bool recording) override { m_bRecording = recording; };
  82. bool IsRecording() const override { return m_bRecording; };
  83. void SetCallback(IUiAnimationCallback* pCallback) override { m_pCallback = pCallback; }
  84. IUiAnimationCallback* GetCallback() override { return m_pCallback; }
  85. void Callback(IUiAnimationCallback::ECallbackReason Reason, IUiAnimNode* pNode);
  86. void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bRemoveOldNodes = false, bool bLoadEmpty = true) override;
  87. void InitPostLoad(bool remapIds, LyShine::EntityIdMap* entityIdMap) override;
  88. void SetSequenceStopBehavior(ESequenceStopBehavior behavior) override;
  89. IUiAnimationSystem::ESequenceStopBehavior GetSequenceStopBehavior() override;
  90. float GetPlayingTime(IUiAnimSequence* pSeq) override;
  91. bool SetPlayingTime(IUiAnimSequence* pSeq, float fTime) override;
  92. float GetPlayingSpeed(IUiAnimSequence* pSeq) override;
  93. bool SetPlayingSpeed(IUiAnimSequence* pSeq, float fTime) override;
  94. bool GetStartEndTime(IUiAnimSequence* pSeq, float& fStartTime, float& fEndTime) override;
  95. bool SetStartEndTime(IUiAnimSequence* pSeq, const float fStartTime, const float fEndTime) override;
  96. void GoToFrame(const char* seqName, float targetFrame) override;
  97. void SerializeNodeType(EUiAnimNodeType& animNodeType, XmlNodeRef& xmlNode, bool bLoading, const uint version, int flags);
  98. void SerializeParamType(CUiAnimParamType& animParamType, XmlNodeRef& xmlNode, bool bLoading, const uint version) override;
  99. void SerializeParamData(UiAnimParamData& animParamData, XmlNodeRef& xmlNode, bool bLoading) override;
  100. const char* GetParamTypeName(const CUiAnimParamType& animParamType);
  101. void OnCameraCut();
  102. static void Reflect(AZ::SerializeContext* serializeContext);
  103. void NotifyTrackEventListeners(const char* eventName, const char* valueName, IUiAnimSequence* pSequence) override;
  104. private:
  105. void NotifyListeners(IUiAnimSequence* pSequence, IUiAnimationListener::EUiAnimationEvent event);
  106. void InternalStopAllSequences(bool bIsAbort, bool bAnimate);
  107. bool InternalStopSequence(IUiAnimSequence* seq, bool bIsAbort, bool bAnimate);
  108. bool FindSequence(IUiAnimSequence* sequence, PlayingSequences::const_iterator& sequenceIteratorOut) const;
  109. bool FindSequence(IUiAnimSequence* sequence, PlayingSequences::iterator& sequenceIteratorOut);
  110. void UpdateInternal(const float dt, const bool bPreUpdate);
  111. #ifdef UI_ANIMATION_SYSTEM_SUPPORT_EDITING
  112. EUiAnimNodeType GetNodeTypeFromString(const char* pString) const override;
  113. CUiAnimParamType GetParamTypeFromString(const char* pString) const override;
  114. #endif
  115. ISystem* m_pSystem;
  116. IUiAnimationCallback* m_pCallback;
  117. AZ::TimeUs m_lastUpdateTime;
  118. using Sequences = AZStd::vector<AZStd::intrusive_ptr<IUiAnimSequence> >;
  119. Sequences m_sequences;
  120. PlayingSequences m_playingSequences;
  121. using TUiAnimationListenerVec = AZStd::vector<IUiAnimationListener*>;
  122. using TUiAnimationListenerMap = AZStd::map<IUiAnimSequence*, TUiAnimationListenerVec> ;
  123. // a container which maps sequences to all interested listeners
  124. // listeners is a vector (could be a set in case we have a lot of listeners, stl::push_back_unique!)
  125. TUiAnimationListenerMap m_animationListenerMap;
  126. bool m_bRecording;
  127. bool m_bPaused;
  128. ESequenceStopBehavior m_sequenceStopBehavior;
  129. // A sequence which turned on the early animation update last time
  130. uint32 m_nextSequenceId;
  131. using UiAnimParamSystemString = AZStd::string;
  132. template <typename KeyType, typename MappedType, typename Compare = stl::less_stricmp<KeyType>>
  133. using UiAnimSystemOrderedMap = AZStd::map<KeyType, MappedType, Compare>;
  134. template <typename KeyType, typename MappedType, typename Hasher = AZStd::hash<KeyType>, typename EqualKey = AZStd::equal_to<>>
  135. using UiAnimSystemUnorderedMap = AZStd::unordered_map<KeyType, MappedType, Hasher, EqualKey>;
  136. UiAnimSystemUnorderedMap<int, UiAnimParamSystemString> m_animNodeEnumToStringMap;
  137. UiAnimSystemOrderedMap<UiAnimParamSystemString, EUiAnimNodeType> m_animNodeStringToEnumMap;
  138. UiAnimSystemUnorderedMap<int, UiAnimParamSystemString> m_animParamEnumToStringMap;
  139. UiAnimSystemOrderedMap<UiAnimParamSystemString, EUiAnimParamType> m_animParamStringToEnumMap;
  140. void RegisterNodeTypes();
  141. void RegisterParamTypes();
  142. void ShowPlayedSequencesDebug();
  143. };