public static int Bake(AnimationCurve curve, float frameRate, InterpolationMode mode) { var keys = new NativeArray <Keyframe>(curve.keys, Allocator.Temp); float duration = keys[keys.Length - 1].time - keys[0].time; int frameCount = (int)math.ceil(frameRate * duration); var bakedKeys = new NativeArray <Keyframe>(frameCount, Allocator.Temp); switch (mode) { case InterpolationMode.Linear: KeyframeUtilities.AlignTangentsLinear(bakedKeys); break; case InterpolationMode.Auto: KeyframeUtilities.AlignTangentsSmooth(bakedKeys); break; case InterpolationMode.ClampedAuto: KeyframeUtilities.AlignTangentsClamped(bakedKeys); break; default: throw new System.InvalidOperationException("Not Implemented"); } curve.keys = bakedKeys.ToArray(); keys.Dispose(); bakedKeys.Dispose(); return(frameCount); }
public static int Bake(ref Keyframe[] keys, float frameRate, InterpolationMode mode = InterpolationMode.Auto) { var nativeKeys = new NativeArray <Keyframe>(keys, Allocator.Temp); float duration = keys[keys.Length - 1].time - keys[0].time; int frameCount = (int)math.ceil(frameRate * duration); var bakedKeys = new NativeArray <Keyframe>(frameCount, Allocator.Temp); ThreadSafe.Bake(nativeKeys, frameRate, bakedKeys, new SampleRange() { startFrameIndex = 0, numFrames = frameCount }); switch (mode) { case InterpolationMode.Linear: KeyframeUtilities.AlignTangentsLinear(bakedKeys); break; case InterpolationMode.Auto: KeyframeUtilities.AlignTangentsSmooth(bakedKeys); break; case InterpolationMode.ClampedAuto: KeyframeUtilities.AlignTangentsClamped(bakedKeys); break; default: throw new System.InvalidOperationException("Not Implemented"); } keys = bakedKeys.ToArray(); bakedKeys.Dispose(); return(frameCount); }
public void AlignTangents_Smooth_ProducesSame_LinearCurve(float start, float startValue, float end, float endValue) { var curve = AnimationCurve.Linear(start, startValue, end, endValue); var keys = new NativeArray <Keyframe>(30, Allocator.Temp); for (int i = 0; i < 30; i++) { float time = 1 / 30 * i; keys[i] = new Keyframe(time, curve.Evaluate(time)); } KeyframeUtilities.AlignTangentsSmooth(keys); var alignedCurve = new AnimationCurve(keys.ToArray()); for (int i = 0; i < 60; i++) { float time = 1 / 60 * i; Assert.AreEqual(curve.Evaluate(time), alignedCurve.Evaluate(time)); } keys.Dispose(); }