summaryrefslogtreecommitdiff
path: root/Runtime/mecanim/animation/avatar.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/mecanim/animation/avatar.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/mecanim/animation/avatar.h')
-rw-r--r--Runtime/mecanim/animation/avatar.h706
1 files changed, 706 insertions, 0 deletions
diff --git a/Runtime/mecanim/animation/avatar.h b/Runtime/mecanim/animation/avatar.h
new file mode 100644
index 0000000..e90be7a
--- /dev/null
+++ b/Runtime/mecanim/animation/avatar.h
@@ -0,0 +1,706 @@
+#pragma once
+
+#include "Runtime/mecanim/defs.h"
+#include "Runtime/mecanim/memory.h"
+#include "Runtime/mecanim/types.h"
+#include "Runtime/mecanim/bind.h"
+#include "Runtime/Math/Simd/float4.h"
+
+#include "Runtime/mecanim/skeleton/skeleton.h"
+#include "Runtime/mecanim/human/human.h"
+#include "Runtime/mecanim/animation/clipmuscle.h"
+#include "Runtime/mecanim/animation/curvedata.h"
+#include "Runtime/mecanim/statemachine/statemachine.h"
+
+#include "Runtime/Serialize/Blobification/offsetptr.h"
+#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
+#include "Runtime/Animation/MecanimArraySerialization.h"
+
+typedef UInt32 BindingHash;
+
+namespace mecanim
+{
+
+ static const uint32_t DISABLED_SYNCED_LAYER_IN_NON_PRO = 0xffffffff;
+ struct ValueArrayConstant;
+
+ typedef int ProcessString(mecanim::String const&);
+
+ namespace animation
+ {
+ struct ClipMuscleConstant;
+ struct AvatarConstant;
+ struct ControllerConstant;
+
+ enum LayerBlendingMode
+ {
+ kLayerBlendingModeOverride,
+ kLayerBlendingModeAdditive
+ };
+
+ struct LayerConstant
+ {
+ DEFINE_GET_TYPESTRING(LayerConstant)
+
+ LayerConstant():m_IKPass(true), m_SyncedLayerAffectsTiming(false), m_LayerBlendingMode(kLayerBlendingModeOverride){}
+
+ uint32_t m_StateMachineIndex;
+ uint32_t m_StateMachineMotionSetIndex;
+
+ human::HumanPoseMask m_BodyMask;
+ OffsetPtr<skeleton::SkeletonMask> m_SkeletonMask;
+
+ uint32_t m_Binding;
+ uint32_t m_LayerBlendingMode; //LayerBlendingMode
+ float m_DefaultWeight;
+ bool m_IKPass;
+ bool m_SyncedLayerAffectsTiming;
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+
+ TRANSFER(m_StateMachineIndex);
+ TRANSFER(m_StateMachineMotionSetIndex);
+ TRANSFER(m_BodyMask);
+ TRANSFER(m_SkeletonMask);
+ TRANSFER(m_Binding);
+ TRANSFER((int&)m_LayerBlendingMode);
+ TRANSFER(m_DefaultWeight);
+ TRANSFER(m_IKPass);
+ TRANSFER(m_SyncedLayerAffectsTiming);
+ transfer.Align();
+
+
+ }
+ };
+
+ struct ControllerConstant
+ {
+ DEFINE_GET_TYPESTRING(ControllerConstant)
+
+ ControllerConstant(): m_LayerCount(0),
+ m_StateMachineCount(0) {}
+
+ uint32_t m_LayerCount;
+ OffsetPtr< OffsetPtr<LayerConstant> > m_LayerArray;
+
+ uint32_t m_StateMachineCount;
+ OffsetPtr< OffsetPtr<statemachine::StateMachineConstant> > m_StateMachineArray;
+
+ OffsetPtr<ValueArrayConstant> m_Values;
+ OffsetPtr<ValueArray> m_DefaultValues;
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+ TRANSFER_BLOB_ONLY(m_LayerCount);
+ MANUAL_ARRAY_TRANSFER2( OffsetPtr<mecanim::animation::LayerConstant>, m_LayerArray, m_LayerCount);
+
+ TRANSFER_BLOB_ONLY(m_StateMachineCount);
+ MANUAL_ARRAY_TRANSFER2( OffsetPtr<mecanim::statemachine::StateMachineConstant>, m_StateMachineArray, m_StateMachineCount);
+
+ TRANSFER(m_Values);
+ TRANSFER(m_DefaultValues);
+
+ }
+
+ static void InitializeClass();
+ };
+
+ struct SkeletonTQSMap
+ {
+ SkeletonTQSMap() : m_TIndex(-1), m_QIndex(-1), m_SIndex(-1) {};
+
+ int32_t m_TIndex;
+ int32_t m_QIndex;
+ int32_t m_SIndex;
+ };
+
+ struct ClipBindings
+ {
+ ClipBindings () : m_PositionIndex(0), m_QuaternionIndex(0), m_ScaleIndex(0), m_FloatIndex(0), m_IntIndex(0), m_IntegerRemap(0) {}
+
+ // Maps from the curve float array of the clip to the ValueArrayConstant.
+ // This allows us to bring the curve float array into a ValueArray that has the same layout between all clips.
+ int16_t* m_PositionIndex;
+ int16_t* m_QuaternionIndex;
+ int16_t* m_ScaleIndex;
+ int16_t* m_FloatIndex;
+ int16_t* m_IntIndex;
+
+ // Points directly to AnimationClipBindingConstant pptrCurveMapping.
+ int32_t* m_IntegerRemap;
+ };
+
+ struct AnimationSet
+ {
+ struct Clip
+ {
+ Clip() : m_Clip(0), m_TotalUsedOptimizedCurveCount(0), m_ClipIndex(-1) {}
+
+ // The referenced constant clip
+ ClipMuscleConstant* m_Clip;
+ int32_t m_ClipIndex;
+ // The amount of ConstantClip curves that need to be sampled (Constant curves are often ignored during binding if they are determined to have no impact)
+ uint32_t m_TotalUsedOptimizedCurveCount;
+ // Binding indices to index from the curve float[] to the ValueArray
+ ClipBindings m_Bindings;
+ };
+
+ AnimationSet() : m_MaxBlendState(0),
+ m_LayerCount(0),
+ m_ClipPerLayer(0),
+ m_ClipConstant(0),
+ m_AdditionalCount(0),
+ m_AdditionalIndexArray(0),
+ m_DynamicFullValuesConstant(0),
+ m_DynamicValuesMaskArray(0),
+ m_GravityWeightIndex(-1),
+ m_IntegerRemapStride(-1)
+ {}
+
+ uint32_t m_MaxBlendState;
+ uint32_t m_LayerCount;
+ uint32_t* m_ClipPerLayer;
+
+ Clip** m_ClipConstant;
+
+ uint32_t m_AdditionalCount;
+ int32_t* m_AdditionalIndexArray;
+
+ mecanim::ValueArrayConstant* m_DynamicFullValuesConstant;
+ mecanim::ValueArrayMask** m_DynamicValuesMaskArray;
+
+ int32_t m_GravityWeightIndex;
+ int32_t m_IntegerRemapStride;
+ };
+
+ struct ControllerBindingConstant
+ {
+ ControllerBindingConstant(): m_DynamicValuesDefault(0),
+ m_SkeletonTQSMap(0),
+ m_RootMotionLayerMask(0),
+ m_Avatar(0),
+ m_Controller(0),
+ m_DynamicValuesConstant(0),
+ m_AnimationSet(0) {}
+
+ ValueArrayConstant* m_DynamicValuesConstant;
+ ValueArray* m_DynamicValuesDefault;
+
+ SkeletonTQSMap* m_SkeletonTQSMap;
+
+ bool* m_RootMotionLayerMask;
+
+ AvatarConstant const* m_Avatar;
+ ControllerConstant const* m_Controller;
+ AnimationSet const* m_AnimationSet;
+ };
+
+ struct AnimationSetMemory
+ {
+ AnimationSetMemory() : m_LayerCount(0), m_ClipPerLayer(0), m_ClipMemory(0), m_ClipOutput(0) {}
+
+ uint32_t m_LayerCount;
+ uint32_t* m_ClipPerLayer;
+ ClipMemory*** m_ClipMemory;
+ ClipOutput* m_ClipOutput;
+ };
+
+ template<bool dynamic>
+ struct BlendingState
+ {
+ BlendingState():
+ m_DynamicValuesBlending(0),
+ m_MotionBlending(0),
+ m_HumanPoseBlending(0),
+ m_BlendFactor(0)
+ {}
+
+ ValueArray** m_DynamicValuesBlending;
+ MotionOutput** m_MotionBlending;
+ human::HumanPose** m_HumanPoseBlending;
+ float* m_BlendFactor;
+
+ uint32_t m_Size;
+ };
+
+ template<>
+ struct BlendingState<false>
+ {
+ BlendingState(): m_BlendFactor(0) {}
+
+ OffsetPtr<ValueArray> m_DynamicValuesBlending;
+ OffsetPtr<ValueArrayMask> m_DynamicValuesBlendingMask;
+ OffsetPtr<MotionOutput> m_MotionBlending;
+ OffsetPtr<human::HumanPose> m_HumanPoseBlending;
+ float m_BlendFactor;
+ };
+
+ struct BlendingClip
+ {
+ BlendingClip() : m_ClipIndex(-1), m_LayerIndex(-1), m_Weight(0), m_PrevTime(0), m_Time(0), m_Reverse(false) {}
+
+ int m_ClipIndex;
+ int m_LayerIndex;
+ float m_Weight;
+ float m_PrevTime;
+ float m_Time;
+ bool m_Reverse;
+ };
+
+ struct ControllerMemory
+ {
+ DEFINE_GET_TYPESTRING(ControllerMemory)
+
+ ControllerMemory(): m_StateMachineCount(0),
+ m_LayerCount(0) {}
+
+ uint32_t m_StateMachineCount;
+ OffsetPtr< OffsetPtr<statemachine::StateMachineMemory> > m_StateMachineMemory;
+
+ uint32_t m_LayerCount;
+ OffsetPtr<BlendingState<false> > m_InteruptedTransitionsBlendingStateArray;
+ OffsetPtr<float> m_LayerWeights;
+
+ OffsetPtr<ValueArray> m_Values;
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+ TRANSFER_BLOB_ONLY(m_StateMachineCount);
+ MANUAL_ARRAY_TRANSFER2( OffsetPtr<mecanim::statemachine::StateMachineMemory>, m_StateMachineMemory, m_StateMachineCount);
+
+ TRANSFER_BLOB_ONLY(m_LayerCount);
+ MANUAL_ARRAY_TRANSFER2( BlendingState<false>, m_InteruptedTransitionsBlendingStateArray, m_LayerCount);
+ MANUAL_ARRAY_TRANSFER2( float, m_LayerWeights, m_LayerCount);
+
+ TRANSFER(m_Values);
+ }
+ };
+
+ struct ControllerWorkspace
+ {
+ ControllerWorkspace() : m_StateMachineWorkspace(0),
+ m_StateMachineOutput(0),
+ m_BlendingState(0),
+ m_BlendingClipCount(0),
+ m_BlendingClipArray(0),
+ m_ValueArrayStart(0),
+ m_ValueArrayStop(0),
+ m_ReadMask(0),
+ m_BlendMask(0),
+ m_DefaultMask(0),
+ m_DoIK(false),
+ m_DoWrite(false) {}
+
+ statemachine::StateMachineWorkspace** m_StateMachineWorkspace;
+ statemachine::StateMachineOutput** m_StateMachineOutput;
+
+ uint32_t m_StateMachineCount;
+
+ float* m_MotionSetTimingWeightArray;
+
+ BlendingState<true>* m_BlendingState;
+ BlendingState<false> m_BlendingStateWs;
+
+ int m_BlendingClipCount;
+ BlendingClip* m_BlendingClipArray;
+
+ ValueArray *m_ValueArrayStart;
+ ValueArray *m_ValueArrayStop;
+
+ ValueArrayMask *m_ReadMask;
+ ValueArrayMask *m_BlendMask;
+ ValueArrayMask *m_DefaultMask;
+
+ bool m_DoIK;
+ bool m_DoWrite;
+ };
+
+ struct ExposedTransform
+ {
+ DEFINE_GET_TYPESTRING(ExposedTransform);
+
+ // For SkinnedMeshRenderer, the following two indices are different
+ // - 'skeletonIndex'
+ // corresponds to the SkinnedMeshRenderer itself
+ // - 'skeletonIndexForUpdateTransform'
+ // corresponds to the root bone of the SkinnedMeshRenderer
+ uint32_t skeletonIndex;
+ uint32_t skeletonIndexForUpdateTransform;
+
+ BindingHash transformPath; // flattened path
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+ TRANSFER(skeletonIndex);
+ TRANSFER(skeletonIndexForUpdateTransform);
+ TRANSFER(transformPath);
+ }
+ };
+
+ struct AvatarConstant
+ {
+ DEFINE_GET_TYPESTRING(AvatarConstant)
+
+ AvatarConstant() : m_SkeletonNameIDCount(0),
+ m_HumanSkeletonIndexCount(0),
+ m_HumanSkeletonReverseIndexCount(0),
+ m_RootMotionBoneIndex(-1),
+ m_RootMotionBoneX(math::xformIdentity()),
+ m_RootMotionSkeletonIndexCount(0) {}
+
+ OffsetPtr<skeleton::Skeleton> m_AvatarSkeleton;
+ OffsetPtr<skeleton::SkeletonPose> m_AvatarSkeletonPose;
+
+ OffsetPtr<skeleton::SkeletonPose> m_DefaultPose; // The default pose when model is imported.
+
+ uint32_t m_SkeletonNameIDCount;
+ OffsetPtr<uint32_t> m_SkeletonNameIDArray; // CRC(name)
+
+ OffsetPtr<human::Human> m_Human;
+
+ uint32_t m_HumanSkeletonIndexCount;
+ OffsetPtr<int32_t> m_HumanSkeletonIndexArray;
+
+ // needed to update human pose and additonal bones in optimize mode
+ // decided to put the info in constant for perf and memory reason vs doing masking at runtime
+ uint32_t m_HumanSkeletonReverseIndexCount;
+ OffsetPtr<int32_t> m_HumanSkeletonReverseIndexArray;
+
+ int32_t m_RootMotionBoneIndex;
+ math::xform m_RootMotionBoneX;
+ OffsetPtr<skeleton::Skeleton> m_RootMotionSkeleton;
+ OffsetPtr<skeleton::SkeletonPose> m_RootMotionSkeletonPose;
+ uint32_t m_RootMotionSkeletonIndexCount;
+ OffsetPtr<int32_t> m_RootMotionSkeletonIndexArray;
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+ transfer.SetVersion(3);
+
+ TRANSFER(m_AvatarSkeleton);
+
+ TRANSFER(m_AvatarSkeletonPose);
+ TRANSFER(m_DefaultPose);
+
+ TRANSFER_BLOB_ONLY(m_SkeletonNameIDCount);
+ MANUAL_ARRAY_TRANSFER2(uint32_t,m_SkeletonNameIDArray,m_SkeletonNameIDCount);
+
+ TRANSFER(m_Human);
+
+ TRANSFER_BLOB_ONLY(m_HumanSkeletonIndexCount);
+ MANUAL_ARRAY_TRANSFER2(int32_t,m_HumanSkeletonIndexArray,m_HumanSkeletonIndexCount);
+
+ TRANSFER_BLOB_ONLY(m_HumanSkeletonReverseIndexCount);
+ MANUAL_ARRAY_TRANSFER2(int32_t,m_HumanSkeletonReverseIndexArray,m_HumanSkeletonReverseIndexCount);
+
+ TRANSFER(m_RootMotionBoneIndex);
+ TRANSFER(m_RootMotionBoneX);
+ TRANSFER(m_RootMotionSkeleton);
+ TRANSFER(m_RootMotionSkeletonPose);
+
+ TRANSFER_BLOB_ONLY(m_RootMotionSkeletonIndexCount);
+ MANUAL_ARRAY_TRANSFER2(int32_t,m_RootMotionSkeletonIndexArray,m_RootMotionSkeletonIndexCount);
+
+ transfer.Align();
+
+ if (transfer.IsVersionSmallerOrEqual (1))
+ {
+ if(m_RootMotionBoneIndex != -1)
+ {
+ mecanim::memory::Allocator *alloc = reinterpret_cast<mecanim::memory::Allocator *>(transfer.GetUserData());
+
+ m_RootMotionSkeleton = skeleton::CreateSkeleton(m_AvatarSkeleton->m_Count,m_AvatarSkeleton->m_AxesCount,*alloc);
+ skeleton::SkeletonCopy(m_AvatarSkeleton.Get(),m_RootMotionSkeleton.Get());
+
+ m_RootMotionSkeletonPose = skeleton::CreateSkeletonPose(m_RootMotionSkeleton.Get(),*alloc);
+ skeleton::SkeletonPoseCopy(m_AvatarSkeletonPose.Get(),m_RootMotionSkeletonPose.Get());
+
+ m_RootMotionSkeletonIndexCount = m_AvatarSkeleton->m_Count;
+ m_RootMotionSkeletonIndexArray = alloc->ConstructArray<mecanim::int32_t>(m_RootMotionSkeletonIndexCount);
+
+ for(int i = 0; i < m_RootMotionSkeletonIndexCount; i++)
+ {
+ m_RootMotionSkeletonIndexArray[i] = i;
+ }
+ }
+ }
+
+ if (transfer.IsVersionSmallerOrEqual (2))
+ {
+ if(isHuman())
+ {
+ mecanim::memory::Allocator *alloc = reinterpret_cast<mecanim::memory::Allocator *>(transfer.GetUserData());
+
+ m_HumanSkeletonReverseIndexCount = m_AvatarSkeleton->m_Count;
+ m_HumanSkeletonReverseIndexArray = alloc->ConstructArray<mecanim::int32_t>(m_HumanSkeletonReverseIndexCount);
+ skeleton::SkeletonBuildReverseIndexArray(m_HumanSkeletonReverseIndexArray.Get(),m_HumanSkeletonIndexArray.Get(),m_Human->m_Skeleton.Get(),m_AvatarSkeleton.Get());
+ }
+ }
+ }
+
+ bool isHuman() const { return !m_Human.IsNull() && m_Human->GetTypeString() != 0 && m_Human->m_Skeleton->m_Count > 0; };
+
+ static void InitializeClass();
+ };
+
+ struct AvatarInput
+ {
+ AvatarInput() : m_GotoStateInfos(0), m_DeltaTime(0), m_TargetIndex(-1), m_TargetTime(1), m_FeetPivotActive(1), m_StabilizeFeet(false), m_ForceStateTime(false), m_StateTime(0), m_LayersAffectMassCenter(false) {}
+
+ statemachine::GotoStateInfo* m_GotoStateInfos;
+ float m_DeltaTime;
+ int m_TargetIndex;
+ float m_TargetTime;
+
+ float m_FeetPivotActive;
+ bool m_StabilizeFeet;
+
+ bool m_ForceStateTime;
+ float m_StateTime;
+ bool m_LayersAffectMassCenter;
+ };
+
+ struct AvatarMemory
+ {
+ DEFINE_GET_TYPESTRING(AvatarMemory)
+
+ AvatarMemory() : m_AvatarX(math::xformIdentity()),
+ m_LeftFootX(math::xformIdentity()),
+ m_RightFootX(math::xformIdentity()),
+ m_Pivot(math::float4::zero()),
+ m_PivotWeight(0.5),
+ m_FirstEval(1),
+ m_SkeletonPoseOutputReady(0) {}
+
+ OffsetPtr<ControllerMemory> m_ControllerMemory;
+
+ math::xform m_AvatarX;
+
+ math::xform m_LeftFootX;
+ math::xform m_RightFootX;
+ math::float4 m_Pivot;
+
+ float m_PivotWeight;
+ UInt8 m_FirstEval;
+ UInt8 m_SkeletonPoseOutputReady;
+
+
+ template<class TransferFunction>
+ inline void Transfer (TransferFunction& transfer)
+ {
+ TRANSFER(m_ControllerMemory);
+ TRANSFER(m_AvatarX);
+ TRANSFER(m_LeftFootX);
+ TRANSFER(m_RightFootX);
+ TRANSFER(m_Pivot);
+ TRANSFER(m_PivotWeight);
+ TRANSFER(m_FirstEval);
+ TRANSFER(m_SkeletonPoseOutputReady);
+ transfer.Align();
+ }
+ };
+
+ struct AvatarWorkspace
+ {
+ AvatarWorkspace() : m_BodySkeletonPoseWs(0),
+ m_BodySkeletonPoseWsA(0),
+ m_BodySkeletonPoseWsB(0),
+ m_RootMotionSkeletonPoseWsA(0),
+ m_RootMotionSkeletonPoseWsB(0),
+ m_HumanPoseWs(0),
+ m_ControllerWorkspace(0),
+ m_LeftFootSpeedT(0),
+ m_LeftFootSpeedQ(0),
+ m_RightFootSpeedT(0),
+ m_RightFootSpeedQ(0),
+ m_IKOnFeet(false)
+ {}
+
+ skeleton::SkeletonPose* m_BodySkeletonPoseWs;
+ skeleton::SkeletonPose* m_BodySkeletonPoseWsA;
+ skeleton::SkeletonPose* m_BodySkeletonPoseWsB;
+
+ skeleton::SkeletonPose* m_RootMotionSkeletonPoseWsA;
+ skeleton::SkeletonPose* m_RootMotionSkeletonPoseWsB;
+
+ human::HumanPose* m_HumanPoseWs;
+
+ ControllerWorkspace* m_ControllerWorkspace;
+
+ math::xform m_AvatarX;
+
+ float m_LeftFootSpeedT;
+ float m_LeftFootSpeedQ;
+ float m_RightFootSpeedT;
+ float m_RightFootSpeedQ;
+ bool m_IKOnFeet;
+ };
+
+ struct AvatarOutput
+ {
+ AvatarOutput() : m_DynamicValuesOutput(0),
+ m_SkeletonPoseOutput(0),
+ m_MotionOutput(0),
+ m_HumanPoseBaseOutput(0),
+ m_HumanPoseOutput(0) {}
+
+ ValueArray* m_DynamicValuesOutput;
+
+ skeleton::SkeletonPose* m_SkeletonPoseOutput;
+
+ MotionOutput* m_MotionOutput;
+ human::HumanPose* m_HumanPoseBaseOutput;
+ human::HumanPose* m_HumanPoseOutput;
+ };
+
+ AvatarConstant* CreateAvatarConstant( skeleton::Skeleton* skeleton,
+ skeleton::SkeletonPose* skeletonPose,
+ skeleton::SkeletonPose* defaultPose,
+ human::Human* human,
+ skeleton::Skeleton* rootMotionSkeleton,
+ int rootMotionIndex,
+ math::xform const& rootMotionX,
+ memory::Allocator& alloc);
+
+ void DestroyAvatarConstant(AvatarConstant* constant, memory::Allocator& alloc);
+
+ void InitializeAvatarConstant(AvatarConstant * constant, memory::Allocator& alloc);
+ void ClearAvatarConstant(AvatarConstant * constant, memory::Allocator& alloc);
+
+ ControllerConstant* CreateControllerConstant( uint32_t LayerCount, LayerConstant** layerArray,
+ uint32_t stateMachineCount, statemachine::StateMachineConstant** stateMachineConstant,
+ ValueArrayConstant* values, ValueArray* defaultValues,
+ memory::Allocator& alloc);
+
+ void DestroyControllerConstant(ControllerConstant* controller, memory::Allocator& alloc);
+
+ void InitializeControllerConstant(ControllerConstant * controller, memory::Allocator& alloc);
+ void ClearControllerConstant(ControllerConstant * controller, memory::Allocator& alloc);
+
+ LayerConstant* CreateLayerConstant(mecanim::uint32_t stateMachineIndex, mecanim::uint32_t motionSetIndex, memory::Allocator& alloc);
+ void DestroyLayerConstant(LayerConstant* constant, memory::Allocator& alloc);
+
+ ControllerMemory* CreateControllerMemory(ControllerConstant const* controller, AvatarConstant const *avatar, AnimationSet const *animationSet, const ValueArrayConstant* dynamicValueConstant, memory::Allocator& alloc);
+ void DestroyControllerMemory(ControllerMemory* memory, memory::Allocator& alloc);
+
+ ControllerWorkspace* CreateControllerWorkspace(ControllerConstant const* controller, AvatarConstant const *avatar, AnimationSet const *animationSet, const ValueArrayConstant* dynamicValueConstant, memory::Allocator& alloc);
+ void DestroyControllerWorkspace(ControllerWorkspace* workspace, memory::Allocator& alloc);
+
+ AvatarInput* CreateAvatarInput(AvatarConstant const* constant, memory::Allocator& alloc);
+ void DestroyAvatarInput(AvatarInput* input, memory::Allocator& alloc);
+
+ AvatarMemory* CreateAvatarMemory(AvatarConstant const* constant, memory::Allocator& alloc);
+ void DestroyAvatarMemory(AvatarMemory* memory, memory::Allocator& alloc);
+
+ AvatarWorkspace* CreateAvatarWorkspace(AvatarConstant const* constant, memory::Allocator& alloc);
+ void DestroyAvatarWorkspace(AvatarWorkspace* workspace, memory::Allocator& alloc);
+
+ AvatarOutput* CreateAvatarOutput(AvatarConstant const* constant, bool hasTransformHierarchy, memory::Allocator& alloc);
+ void DestroyAvatarOutput(AvatarOutput* output, memory::Allocator& alloc);
+
+ AnimationSet* CreateAnimationSet(ControllerConstant const* controller, memory::Allocator& alloc);
+ void DestroyAnimationSet(AnimationSet* animationSet, memory::Allocator& alloc);
+
+ AnimationSetMemory* CreateAnimationSetMemory(AnimationSet const* animationSet, bool allowConstantCurveOptimization, memory::Allocator& alloc);
+ void DestroyAnimationSetMemory(AnimationSetMemory* animationSetMemory, memory::Allocator& alloc);
+
+ void UpdateLeafNodeDuration(const ControllerConstant &controllerConstant, const AnimationSet &animationSet, ControllerMemory &controllerMemory);
+
+ void SetIKOnFeet( bool left,
+ AvatarConstant const &avatar,
+ const AvatarInput &input,
+ AvatarMemory &memory,
+ AvatarWorkspace &workspace,
+ AvatarOutput &output);
+
+ void EvaluateAvatarSM( AvatarConstant const* constant,
+ AvatarInput const* input,
+ AvatarOutput * output,
+ AvatarMemory * memory,
+ AvatarWorkspace * workspace,
+ ControllerConstant const* controllerConstant);
+
+ void EvaluateAvatarLayers( ControllerBindingConstant const* controllerBindingConstant,
+ AvatarInput const* input,
+ AvatarOutput *output,
+ AvatarMemory *memory,
+ AvatarWorkspace *workspace,
+ AnimationSetMemory* animationSetMemory);
+
+ void EvaluateAvatarX( AvatarConstant const* constant,
+ AvatarInput const* input,
+ AvatarOutput *output,
+ AvatarMemory *memory,
+ AvatarWorkspace *workspace);
+
+ void EvaluateAvatarRetarget( AvatarConstant const* constant,
+ AvatarInput const* input,
+ AvatarOutput *output,
+ AvatarMemory *memory,
+ AvatarWorkspace *workspace,
+ ControllerConstant const* controllerConstant);
+
+ void EvaluateAvatarIK( AvatarConstant const* constant,
+ AvatarInput const* input,
+ AvatarOutput *output,
+ AvatarMemory *memory,
+ AvatarWorkspace *workspace,
+ ControllerConstant const* controllerConstant);
+
+ void EvaluateAvatarEnd( AvatarConstant const* constant,
+ AvatarInput const* input,
+ AvatarOutput *output,
+ AvatarMemory *memory,
+ AvatarWorkspace *workspace,
+ ControllerConstant const* controllerConstant);
+
+ void ValuesFromClip( mecanim::ValueArray const &valuesDefault,
+ mecanim::animation::ClipMuscleConstant const &cst,
+ mecanim::animation::ClipOutput const &out,
+ const ClipBindings& bindings,
+ int32_t integerRemapStride,
+ mecanim::ValueArray &values,
+ mecanim::ValueArrayMask &mask);
+
+ void DeltasFromClip( mecanim::animation::ClipMuscleConstant const &cst,
+ const ClipBindings& bindings,
+ const ValueArrayMask& mask,
+ mecanim::ValueArray &starts,
+ mecanim::ValueArray &stops);
+
+ void SkeletonPoseFromValue(skeleton::Skeleton const &skeleton, skeleton::SkeletonPose const &defaultPose, ValueArray const &values, SkeletonTQSMap const *skeletonTQSMap, skeleton::SkeletonPose &pose,int32_t const *humanReverseIndex,bool skipRoot);
+ void SkeletonPoseFromValue(skeleton::Skeleton const &skeleton, skeleton::SkeletonPose const &defaultPose, ValueArray const &values, SkeletonTQSMap const *skeletonTQSMap, int32_t const *indexArray, skeleton::SkeletonPose &pose,int index, int stopIndex);
+ void ValueFromSkeletonPose(skeleton::Skeleton const &skeleton, skeleton::SkeletonPose const &pose, SkeletonTQSMap const *skeletonTQSMap, ValueArray &values);
+ void ValueFromSkeletonPose(skeleton::Skeleton const &skeleton, skeleton::SkeletonPose const &pose, SkeletonTQSMap const *skeletonTQSMap, int32_t const *indexArray, ValueArray &values, int index, int stopIndex);
+ }
+}
+
+template<>
+class SerializeTraits< mecanim::animation::BlendingState<false> > : public SerializeTraitsBase< mecanim::animation::BlendingState<false> >
+{
+ public:
+
+ typedef mecanim::animation::BlendingState<false> value_type;
+ inline static const char* GetTypeString (void*) { return "BlendingState<1>"; }
+ inline static bool IsAnimationChannel () { return false; }
+ inline static bool MightContainPPtr () { return true; }
+ inline static bool AllowTransferOptimization () { return false; }
+
+ template<class TransferFunction> inline
+ static void Transfer (value_type& data, TransferFunction& transfer)
+ {
+ transfer.Transfer(data.m_DynamicValuesBlending, "m_DynamicValuesBlending");
+ transfer.Transfer(data.m_DynamicValuesBlendingMask, "m_DynamicValuesBlendingMask");
+ transfer.Transfer(data.m_MotionBlending, "m_MotionBlending");
+ transfer.Transfer(data.m_HumanPoseBlending, "m_HumanPoseBlending");
+ transfer.Transfer(data.m_BlendFactor, "m_BlendFactor");
+ }
+};
+
+