private void RebuildTransition(AtomAnimationClip clip) { bool realign = false; var previous = clips.FirstOrDefault(c => c.nextAnimationName == clip.animationName); if (previous != null && (previous.IsDirty() || clip.IsDirty())) { clip.Paste(0f, previous.Copy(previous.animationLength, previous.GetAllCurveTargets().Cast <IAtomAnimationTarget>()), false); realign = true; } var next = GetClip(clip.nextAnimationName); if (next != null && (next.IsDirty() || clip.IsDirty())) { clip.Paste(clip.animationLength, next.Copy(0f, next.GetAllCurveTargets().Cast <IAtomAnimationTarget>()), false); realign = true; } if (realign) { foreach (var target in clip.targetControllers) { if (clip.ensureQuaternionContinuity) { UnitySpecific.EnsureQuaternionContinuityAndRecalculateSlope( target.rotX, target.rotY, target.rotZ, target.rotW); } } } }
private static void RebuildClip(AtomAnimationClip clip, AtomAnimationClip previous) { foreach (var target in clip.targetControllers) { if (!target.dirty) { continue; } if (clip.loop) { target.SetCurveSnapshot(clip.animationLength, target.GetCurveSnapshot(0f), false); } target.ComputeCurves(); if (clip.ensureQuaternionContinuity) { var lastMatching = previous?.targetControllers.FirstOrDefault(t => t.TargetsSameAs(target)); var q = lastMatching?.GetRotationAtKeyframe(lastMatching.rotX.length - 1) ?? target.GetRotationAtKeyframe(target.rotX.length - 1); UnitySpecific.EnsureQuaternionContinuityAndRecalculateSlope( target.rotX, target.rotY, target.rotZ, target.rotW, q); } foreach (var curve in target.GetCurves()) { curve.ComputeCurves(); } } foreach (var target in clip.targetFloatParams) { if (!target.dirty) { continue; } if (clip.loop) { target.SetCurveSnapshot(clip.animationLength, target.GetCurveSnapshot(0), false); } target.value.ComputeCurves(); } foreach (var target in clip.targetTriggers) { if (!target.dirty) { continue; } target.RebuildKeyframes(clip.animationLength); } }
private void RebuildClip(AtomAnimationClip clip) { foreach (var target in clip.targetControllers) { if (!target.dirty) { continue; } if (clip.loop) { target.SetCurveSnapshot(clip.animationLength, target.GetCurveSnapshot(0f), false); } target.ReapplyCurveTypes(clip.loop); if (clip.ensureQuaternionContinuity) { UnitySpecific.EnsureQuaternionContinuityAndRecalculateSlope( target.rotX, target.rotY, target.rotZ, target.rotW); } RebuildClipLoop(clip, target); } foreach (var target in clip.targetFloatParams) { if (!target.dirty) { continue; } if (clip.loop) { target.value.SetKeyframe(clip.animationLength, target.value[0].value); } target.ReapplyCurveTypes(clip.loop); RebuildClipLoop(clip, target); } foreach (var target in clip.targetTriggers) { if (!target.dirty) { continue; } target.RebuildKeyframes(clip.animationLength); } }
private void PrepareClipCurves(AtomAnimationClip clip) { foreach (var target in clip.TargetControllers) { if (!target.dirty) { continue; } target.dirty = false; if (clip.loop) { target.SetCurveSnapshot(clip.animationLength, target.GetCurveSnapshot(0f), false); } target.ReapplyCurveTypes(); if (clip.loop) { target.SmoothLoop(); } if (clip.EnsureQuaternionContinuity) { UnitySpecific.EnsureQuaternionContinuityAndRecalculateSlope( target.rotX, target.rotY, target.rotZ, target.rotW); } } foreach (var target in clip.TargetFloatParams) { if (!target.dirty) { continue; } target.dirty = false; if (clip.loop) { target.value.SetKeyframe(clip.animationLength, target.value[0].value); } target.value.FlatAllFrames(); } }