public void Bake_Keyframes_IsAccurateInBetweenKeys()
            {
                var frames = new Keyframe[]
                {
                    new Keyframe(0, 0),
                    new Keyframe(1, 1),
                    new Keyframe(2, 2),
                    new Keyframe(3, 3),
                    new Keyframe(4, 4),
                    new Keyframe(5, 5)
                };

                var newFrames = new Keyframe[6];

                frames.CopyTo(newFrames, 0);

                AnimationCurveBake.Bake(ref newFrames, 30);
                int index1 = 0;
                int index2 = 0;

                float deltaTime = 5 / 900;

                for (int i = 0; i < 900; i++)
                {
                    float actual   = KeyframeUtilities.Evaluate(i * deltaTime, ref index1, newFrames);
                    float expected = KeyframeUtilities.Evaluate(i * deltaTime, ref index2, frames);
                    Assert.AreEqual(expected, actual);
                }
            }
            public void Bake_Keyframes_IsAccurateOnBakedKeys()
            {
                var frames = new Keyframe[]
                {
                    new Keyframe(0, 0),
                    new Keyframe(1, 1),
                    new Keyframe(2, 2),
                    new Keyframe(3, 3),
                    new Keyframe(4, 4),
                    new Keyframe(5, 5)
                };

                var newFrames = new Keyframe[6];

                frames.CopyTo(newFrames, 0);

                AnimationCurveBake.Bake(ref newFrames, 30);
                int seekIndex = 0;

                for (int i = 0; i < newFrames.Length; i++)
                {
                    float actual   = KeyframeUtilities.Evaluate(newFrames[i].time, ref i, newFrames);
                    float expected = KeyframeUtilities.Evaluate(newFrames[i].time, ref seekIndex, frames);
                    Assert.AreEqual(expected, actual, 0.000001f);
                }
            }
            public void Bake_LinearCurve_IsAccurate(AnimationCurveBake.InterpolationMode mode)
            {
                float frameRate  = 7;
                float sampleRate = 30;

                var sourceCurve = AnimationCurve.Linear(0, 0, 5, 5);
                var curveKeys   = sourceCurve.keys;
                var destCurve   = new AnimationCurve(curveKeys);

                float start    = KeyframeUtilities.StartTime(curveKeys);
                float end      = KeyframeUtilities.EndTime(curveKeys);
                float duration = end - start;

                AnimationCurveBake.Bake(destCurve, frameRate, mode);


                float delta      = (end - start) / sampleRate;
                int   numSamples = (int)math.ceil(duration * frameRate) + 1;

                for (int i = 0; i <= numSamples; i++)
                {
                    float time     = math.clamp(start + i * delta, start, end);
                    float expected = sourceCurve.Evaluate(time);
                    float actual   = destCurve.Evaluate(time);
                }
            }
        public void Baked_LinearCurve_Reduction_ProducesZeroError()
        {
            var curve        = AnimationCurve.Linear(0, 0, 2, 2);
            var keys         = curve.keys;
            var reducedCurve = new AnimationCurve(keys);

            AnimationCurveBake.Bake(reducedCurve, 30, AnimationCurveBake.InterpolationMode.Linear);

            float error = AnimationCurveReducer.ReduceWithMaximumAbsoluteError(reducedCurve, 0.01f);

            Assert.Zero(error);
            Assert.AreEqual(curve.length, reducedCurve.length);
        }
            public void Bake_Keyframes_ProducesExpectedNumberOfKeyframes()
            {
                var frames = new Keyframe[]
                {
                    new Keyframe(0, 0),
                    new Keyframe(1, 1),
                    new Keyframe(2, 2),
                    new Keyframe(3, 3),
                    new Keyframe(4, 4),
                    new Keyframe(5, 5)
                };

                Assert.AreEqual(30 * 5 + 1, AnimationCurveBake.Bake(ref frames, 30));
            }