using System.Collections.Generic; using KINEMATION.KAnimationCore.Runtime.Rig; using Unity.Collections; using UnityEngine; using UnityEngine.Animations; using UnityEngine.Playables; namespace KINEMATION.MagicBlend.Runtime { public class MagicBlendLibrary { public static NativeArray SetupBlendAtoms(Animator animator, KRigComponent rigComponent) { Transform[] rigTransforms = rigComponent.GetRigTransforms(); int num = rigTransforms.Length; NativeArray result = new NativeArray(num, Allocator.Persistent); for (int i = 0; i < num; i++) { Transform transform = rigTransforms[i]; result[i] = new BlendStreamAtom { handle = animator.BindStreamTransform(transform) }; } return result; } public static void ConnectPose(AnimationScriptPlayable playable, PlayableGraph graph, AnimationClip pose, float speed = 0f) { if (playable.GetInput(0).IsValid()) { playable.DisconnectInput(0); } AnimationClipPlayable animationClipPlayable = AnimationClipPlayable.Create(graph, pose); animationClipPlayable.SetSpeed(speed); animationClipPlayable.SetApplyFootIK(value: false); playable.ConnectInput(0, animationClipPlayable, 0, 1f); } public static void ConnectOverlays(AnimationScriptPlayable playable, PlayableGraph graph, AnimationClip pose, List overrides, float speed = 0f) { if (playable.GetInput(0).IsValid()) { playable.DisconnectInput(0); } if (overrides == null || overrides.Count == 0) { ConnectPose(playable, graph, pose, speed); return; } AnimationLayerMixerPlayable animationLayerMixerPlayable = AnimationLayerMixerPlayable.Create(graph); AnimationClipPlayable animationClipPlayable = AnimationClipPlayable.Create(graph, pose); animationClipPlayable.SetDuration(pose.length); animationClipPlayable.SetSpeed(speed); animationClipPlayable.SetApplyFootIK(value: false); animationLayerMixerPlayable.AddInput(animationClipPlayable, 0, 1f); foreach (OverrideOverlay @override in overrides) { AnimationClipPlayable animationClipPlayable2 = AnimationClipPlayable.Create(graph, @override.overlay); animationClipPlayable2.SetDuration(@override.overlay.length); animationClipPlayable2.SetSpeed(speed); animationClipPlayable2.SetApplyFootIK(value: false); int layerIndex = animationLayerMixerPlayable.AddInput(animationClipPlayable2, 0, @override.weight); AvatarMask mask = ((@override.mask == null) ? new AvatarMask() : @override.mask); animationLayerMixerPlayable.SetLayerMaskFromAvatarMask((uint)layerIndex, mask); } playable.ConnectInput(0, animationLayerMixerPlayable, 0, 1f); } } }