diff options
author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/mecanim/animation/curvedata.cpp |
Diffstat (limited to 'Runtime/mecanim/animation/curvedata.cpp')
-rw-r--r-- | Runtime/mecanim/animation/curvedata.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/Runtime/mecanim/animation/curvedata.cpp b/Runtime/mecanim/animation/curvedata.cpp new file mode 100644 index 0000000..210bbe8 --- /dev/null +++ b/Runtime/mecanim/animation/curvedata.cpp @@ -0,0 +1,118 @@ +#include "UnityPrefix.h" +#include "Runtime/mecanim/animation/curvedata.h" + +namespace mecanim +{ + +namespace animation +{ + Clip* CreateClipSimple(uint32_t count, memory::Allocator& alloc) + { + SETPROFILERLABEL(Clip); + + // Allocate data. + Clip* clip = alloc.Construct<Clip>(); + return clip; + } + + + void DestroyClip(Clip* clip, memory::Allocator& alloc) + { + if(clip) + { + DestroyStreamedClip(clip->m_StreamedClip, alloc); + DestroyDenseClip(clip->m_DenseClip, alloc); + + alloc.Deallocate(clip); + } + } + + ClipMemory* CreateClipMemory(Clip const* clip, memory::Allocator& alloc) + { + return CreateClipMemory(clip, GetClipCurveCount(*clip), alloc); + } + + ClipMemory* CreateClipMemory(Clip const* clip, int32_t totalUsedCurves, memory::Allocator& alloc) + { + SETPROFILERLABEL(ClipMemory); + + ClipMemory* mem = alloc.Construct<ClipMemory>(); + mem->m_ConstantClipValueCount = totalUsedCurves - (GetClipCurveCount(*clip) - clip->m_ConstantClip.curveCount); + Assert(mem->m_ConstantClipValueCount >= 0 && mem->m_ConstantClipValueCount <= clip->m_ConstantClip.curveCount); + + CreateStreamedClipMemory(clip->m_StreamedClip, mem->m_StreamedClipCache, alloc); + + return mem; + } + + void DestroyClipMemory(ClipMemory* memory, memory::Allocator& alloc) + { + if(memory) + { + DestroyStreamedClipMemory(memory->m_StreamedClipCache, alloc); + alloc.Deallocate(memory); + } + } + + ClipOutput* CreateClipOutput(Clip const* clip, memory::Allocator& alloc) + { + return CreateClipOutput(GetClipCurveCount(*clip), alloc); + } + + ClipOutput* CreateClipOutput(int32_t totalUsedCurves, memory::Allocator& alloc) + { + SETPROFILERLABEL(ClipOutput); + + ClipOutput* out = alloc.Construct<ClipOutput>(); + out->m_Values = alloc.ConstructArray<float> (totalUsedCurves); + + return out; + } + + void DestroyClipOutput(ClipOutput* output, memory::Allocator& alloc) + { + if(output) + { + alloc.Deallocate(output->m_Values); + alloc.Deallocate(output); + } + } + + float EvaluateClipAtIndex(Clip const* clip, ClipInput const* input, ClipMemory* memory, uint32_t index) + { + if (index < clip->m_StreamedClip.curveCount) + return SampleClipAtIndex(clip->m_StreamedClip, memory->m_StreamedClipCache, index, input->m_Time); + index -= clip->m_StreamedClip.curveCount; + + if (index < clip->m_DenseClip.m_CurveCount) + return SampleClipAtIndex(clip->m_DenseClip, index, input->m_Time); + index -= clip->m_DenseClip.m_CurveCount; + + return SampleClipAtIndex(clip->m_ConstantClip, index); + } + + void EvaluateClip(Clip const* clip, ClipInput const* input, ClipMemory* memory, ClipOutput* output ) + { + float* outputData = output->m_Values; + + if (clip->m_StreamedClip.curveCount != 0) + { + SampleClip(clip->m_StreamedClip, memory->m_StreamedClipCache, input->m_Time, outputData); + outputData += clip->m_StreamedClip.curveCount; + } + + if (clip->m_DenseClip.m_CurveCount != 0) + { + SampleClip(clip->m_DenseClip, input->m_Time, outputData); + outputData += clip->m_DenseClip.m_CurveCount; + } + + if (memory->m_ConstantClipValueCount != 0) + { + // Constant clips are not sampling based on the total curve count + SampleClip(clip->m_ConstantClip, memory->m_ConstantClipValueCount, outputData); + } + } +} + +} |