summaryrefslogtreecommitdiff
path: root/Runtime/Animation/AnimatorOverrideController.h
blob: 48d2905b762ca44afdff454070bf6437d2ca08f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;
};