コード例 #1
0
    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);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
            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();
            }