summaryrefslogtreecommitdiff
path: root/Runtime/mecanim/animation/curvedata.h
blob: 0244684d4d303d3febecc91c26248b733a4c7e37 (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
#pragma once

#include "Runtime/mecanim/defs.h"
#include "Runtime/mecanim/memory.h"
#include "Runtime/mecanim/types.h" 
#include "Runtime/mecanim/generic/valuearray.h"

#include "Runtime/Serialize/Blobification/offsetptr.h"
#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
#include "Runtime/Animation/MecanimArraySerialization.h"
#include "streamedclip.h"
#include "denseclip.h"
#include "constantclip.h"

namespace mecanim
{
	
namespace animation
{
	struct Clip
	{
		DEFINE_GET_TYPESTRING(Clip)

		Clip() {}

		StreamedClip					m_StreamedClip;
		DenseClip                       m_DenseClip;
		ConstantClip                    m_ConstantClip;
		
		OffsetPtr<ValueArrayConstant>	m_DeprecatedBinding;
		
		template<class TransferFunction>
		inline void Transfer (TransferFunction& transfer)
		{			
			TRANSFER (m_StreamedClip);
			TRANSFER (m_DenseClip);
			TRANSFER (m_ConstantClip);
			
			transfer.Transfer(m_DeprecatedBinding, "m_Binding");
		}
	};

	struct ClipInput
	{
		float	m_Time;
	};

	struct ClipMemory
	{	
		StreamedClipMemory m_StreamedClipCache;
		int                m_ConstantClipValueCount;
	};

	struct ClipOutput
	{
	public:
		float* m_Values;
		
	};

	Clip* CreateClipSimple(uint32_t count, memory::Allocator& alloc);	
	void DestroyClip(Clip* clip, memory::Allocator& alloc);

	ClipMemory* CreateClipMemory(Clip const* clip, memory::Allocator& alloc);
	ClipMemory* CreateClipMemory(Clip const* clip, int32_t totalUsedCurves, memory::Allocator& alloc);	
	void DestroyClipMemory(ClipMemory* memory, memory::Allocator& alloc);	

	ClipOutput* CreateClipOutput(int32_t usedConstantCurves, memory::Allocator& alloc);	
	ClipOutput* CreateClipOutput(Clip const* clip, memory::Allocator& alloc);

	void DestroyClipOutput(ClipOutput* output, memory::Allocator& alloc);	

	float EvaluateClipAtIndex(Clip const* clip, ClipInput const* input, ClipMemory* memory, uint32_t index);
	void EvaluateClip(Clip const* clip, ClipInput const* input, ClipMemory* memory, ClipOutput* output);
	
	inline size_t GetClipCurveCount (const Clip& clip) { return clip.m_StreamedClip.curveCount + clip.m_DenseClip.m_CurveCount + clip.m_ConstantClip.curveCount; }
	inline bool IsValidClip (const Clip& clip) { return GetClipCurveCount (clip) != 0; }
	

} // namespace animation

}