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/Animation/AnimatorGenericBindings.h |
Diffstat (limited to 'Runtime/Animation/AnimatorGenericBindings.h')
-rw-r--r-- | Runtime/Animation/AnimatorGenericBindings.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/Runtime/Animation/AnimatorGenericBindings.h b/Runtime/Animation/AnimatorGenericBindings.h new file mode 100644 index 0000000..4e2023b --- /dev/null +++ b/Runtime/Animation/AnimatorGenericBindings.h @@ -0,0 +1,95 @@ +#pragma once + +#include <limits> +#include "Runtime/Graphics/Transform.h" +#include "Runtime/Utilities/dynamic_array.h" +#include "Runtime/mecanim/generic/valuearray.h" +#include "Runtime/mecanim/skeleton/skeleton.h" +#include "Runtime/mecanim/animation/avatar.h" + +typedef UInt32 BindingHash; + +namespace Unity { class GameObject; } + +namespace UnityEngine +{ +namespace Animation +{ + struct AnimationClipBindingConstant; + struct AnimationSetBindings; + struct BoundCurve; + + + struct ExposedTransform + { + Transform* transform; + int skeletonIndex; + int skeletonIndexForUpdateTransform; + }; + + struct AvatarBindingConstant + { + // For non-optimized mode (the Transform hierarchy is there) + size_t skeletonBindingsCount; + Transform** skeletonBindings; + + int transformChangedMask; + + // For optimized mode + size_t exposedTransformCount; + ExposedTransform* exposedTransforms; + }; + + struct AnimatorGenericBindingConstant + { + size_t transformBindingsCount; + BoundCurve* transformBindings; + + size_t genericBindingsCount; + BoundCurve* genericBindings; + + size_t genericPPtrBindingsCount; + BoundCurve* genericPPtrBindings; + + int transformChangedMask; + + mecanim::animation::ControllerBindingConstant* controllerBindingConstant; + + bool allowConstantClipSamplingOptimization; + }; + + AvatarBindingConstant* CreateAvatarBindingConstant (Transform& root, const mecanim::animation::AvatarConstant* avatar, mecanim::memory::Allocator& allocator); + AvatarBindingConstant* CreateAvatarBindingConstantOpt (Transform& root, const mecanim::animation::AvatarConstant* avatar, mecanim::memory::Allocator& allocator); + void DestroyAvatarBindingConstant (AvatarBindingConstant* bindingConstant, mecanim::memory::Allocator& allocator); + + /// Bind multiple animation clips against a GameObject + /// outputCurveIndexToBindingIndex is an array of arrays that remaps from the curve index of each clip into the bound curves array + /// returns a binding constant. + AnimatorGenericBindingConstant* CreateAnimatorGenericBindings (const AnimationSetBindings& animationSet, Transform& root, const mecanim::animation::AvatarConstant* avatar, const mecanim::animation::ControllerConstant* controller, mecanim::memory::Allocator& allocator); + AnimatorGenericBindingConstant* CreateAnimatorGenericBindingsOpt (const AnimationSetBindings& animationSet, Transform& root, const mecanim::animation::AvatarConstant* avatar, const mecanim::animation::ControllerConstant* controller, mecanim::memory::Allocator& allocator); + void DestroyAnimatorGenericBindings (AnimatorGenericBindingConstant* bindingConstant, mecanim::memory::Allocator& allocator); + + /// Batch assign an array of values to the bound locations (Also calls AwakeFromLoad) + /// Must always be called from the main thread + void SetGenericFloatPropertyValues (const AnimatorGenericBindingConstant& bindings, const mecanim::ValueArray& values); + void SetGenericPPtrPropertyValues (const AnimatorGenericBindingConstant& bindings, const mecanim::ValueArray& values); + + /// Batch assign transform properties to the bound Transform components + /// Can be invoked from another thread if we are sure no one will delete Transforms at the same time on another thread. + void SetGenericTransformPropertyValues (const AnimatorGenericBindingConstant& bindings, const mecanim::ValueArray& values, Transform *skipTransform); + void SetHumanTransformPropertyValues (const AvatarBindingConstant& bindings, const mecanim::skeleton::SkeletonPose& pose); + + /// Invoke TransformChanged callbacks and SetDirty + /// Must always be called from the main thread + void SetTransformPropertyApplyMainThread (Transform& root, const AnimatorGenericBindingConstant& bindings, const AvatarBindingConstant& avatarBindings, bool skipRoot); + void SetTransformPropertyApplyMainThread (Transform& root, const AvatarBindingConstant& avatarBindings, bool skipRoot, int mask = std::numeric_limits<int>::max() ); + + /// Set transforms for optimized characters + /// Must always be called from the main thread + void SetFlattenedSkeletonTransformsMainThread (const AvatarBindingConstant& bindings, const mecanim::skeleton::SkeletonPose& globalSpacePose, const mecanim::animation::AvatarConstant& avatar); + + void UnregisterAvatarBindingObjects(AvatarBindingConstant* bindingConstant); + void UnregisterGenericBindingObjects(AnimatorGenericBindingConstant* bindingConstant); + +} +} |