summaryrefslogtreecommitdiff
path: root/Runtime/Animation/AnimatorOverrideController.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Animation/AnimatorOverrideController.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Animation/AnimatorOverrideController.h')
-rw-r--r--Runtime/Animation/AnimatorOverrideController.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/Runtime/Animation/AnimatorOverrideController.h b/Runtime/Animation/AnimatorOverrideController.h
new file mode 100644
index 0000000..48d2905
--- /dev/null
+++ b/Runtime/Animation/AnimatorOverrideController.h
@@ -0,0 +1,97 @@
+#pragma once
+
+
+#include "Runtime/Animation/RuntimeAnimatorController.h"
+#include "Runtime/Utilities/dynamic_array.h"
+#include "Runtime/mecanim/memory.h"
+#include "Runtime/Misc/UserList.h"
+#include <vector>
+
+
+class AnimationClip;
+
+typedef std::vector<PPtr<AnimationClip> > AnimationClipVector;
+
+namespace UnityEngine{namespace Animation{struct AnimationSetBindings;}}
+
+struct AnimationClipOverride
+{
+ DEFINE_GET_TYPESTRING(AnimationClipOverride)
+
+ PPtr<AnimationClip> m_OriginalClip;
+ PPtr<AnimationClip> m_OverrideClip;
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+ TRANSFER(m_OriginalClip);
+ TRANSFER(m_OverrideClip);
+ }
+
+ bool operator== (AnimationClipOverride const& other){return m_OriginalClip == other.m_OriginalClip && m_OverrideClip == other.m_OverrideClip; }
+
+ PPtr<AnimationClip> GetEffectiveClip() const {return !m_OverrideClip.IsNull() ? m_OverrideClip : m_OriginalClip; }
+};
+
+class AnimatorOverrideController : public RuntimeAnimatorController
+{
+public:
+ REGISTER_DERIVED_CLASS (AnimatorOverrideController, RuntimeAnimatorController)
+ DECLARE_OBJECT_SERIALIZE (AnimatorOverrideController)
+
+ static void InitializeClass ();
+ static void CleanupClass () {}
+
+ AnimatorOverrideController (MemLabelId label, ObjectCreationMode mode);
+
+ virtual void AwakeFromLoad(AwakeFromLoadMode mode);
+
+ virtual mecanim::animation::ControllerConstant* GetAsset();
+ virtual void BuildAsset();
+ virtual void ClearAsset ();
+
+ virtual UnityEngine::Animation::AnimationSetBindings* GetAnimationSetBindings();
+ virtual AnimationClipVector GetAnimationClips()const;
+
+ virtual std::string StringFromID(unsigned int ID) const ;
+
+ PPtr<RuntimeAnimatorController> GetAnimatorController()const;
+ void SetAnimatorController(PPtr<RuntimeAnimatorController> controller);
+
+ AnimationClipVector GetOriginalClips()const;
+ AnimationClipVector GetOverrideClips()const;
+
+ PPtr<AnimationClip> GetClip(std::string const& name, bool returnEffectiveClip)const;
+ void SetClip(std::string const& name, PPtr<AnimationClip> clip);
+ PPtr<AnimationClip> GetClip(PPtr<AnimationClip> originalClip, bool returnEffectiveClip)const;
+ void SetClip(PPtr<AnimationClip> originalClip, PPtr<AnimationClip> overrideClip);
+
+ void PerformOverrideClipListCleanup();
+protected:
+
+ typedef dynamic_array<AnimationClipOverride> AnimationClipOverrideVector;
+
+ PPtr<RuntimeAnimatorController> m_Controller;
+
+ // This list is a map between m_Controller clips and override clips.
+ // We should never rely on this list to return m_Controller clip list because this list may become
+ // offsync when an user edit the controller's clip list(either adding or removing a state).
+ //
+ // The map should only be updated by PerformOverrideClipListCleanup() when user edit the
+ // AnimatorOverrideController in the inspector.
+ AnimationClipOverrideVector m_Clips;
+
+ UnityEngine::Animation::AnimationSetBindings* m_AnimationSetBindings;
+ mecanim::memory::MecanimAllocator m_Allocator;
+ UserListNode m_AnimationSetNode;
+
+private:
+
+ virtual AnimationClipVector GetAnimationClipsToRegister() const;
+
+ PPtr<AnimationClip> GetOriginalClip(std::string const& name)const;
+
+ template<class Functor> PPtr<AnimationClip> FindAnimationClipInMap(PPtr<AnimationClip> const& clip, Functor functor, PPtr<AnimationClip> const& defaultClip = PPtr<AnimationClip>() )const;
+};
+
+