Beispiel #1
0
            public float Evaluate(CompressedTimeSpan time)
            {
                SetTime(time);

                var startTime = data.ValueStart.Time;
                var endTime   = data.ValueEnd.Time;

                if (currentTime < startTime || currentTime > endTime)
                {
                }

                // Sampling before start (should not really happen because we add a keyframe at TimeSpan.Zero, but let's keep it in case it changes later.
                if (currentTime <= startTime)
                {
                    return(data.ValueStart.Value);
                }

                // Sampling after end
                if (currentTime >= endTime)
                {
                    return(data.ValueEnd.Value);
                }

                // Sampling with catmull rom implicit approximation
                float factor = (float)(currentTime - startTime).Ticks / (float)(endTime - startTime).Ticks;

                return(data.Evaluate(factor));
            }
Beispiel #2
0
        public float EvaluateCubic(CompressedTimeSpan time)
        {
            int keyIndex;

            for (keyIndex = 0; keyIndex < KeyFrames.Count - 1; ++keyIndex)
            {
                if (time < KeyFrames[keyIndex + 1].Time)
                {
                    break;
                }
            }

            // TODO: Check if before or after curve (and on those limits)

            // Exact value, just returns it.
            if (time == KeyFrames[keyIndex].Time)
            {
                return(KeyFrames[keyIndex].Value);
            }

            // http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Interpolation_on_the_unit_interval_without_exact_derivatives
            long timeStart = KeyFrames[keyIndex + 0].Time.Ticks;
            long timeEnd   = KeyFrames[keyIndex + 1].Time.Ticks;

            float t = ((float)time.Ticks - (float)timeStart) / ((float)timeEnd - (float)timeStart);

            var evaluator = new EvaluatorData();

            evaluator.ValuePrev  = KeyFrames[keyIndex > 0 ? keyIndex - 1 : 0];
            evaluator.ValueStart = KeyFrames[keyIndex + 0];
            evaluator.ValueEnd   = KeyFrames[keyIndex + 1];
            evaluator.ValueNext  = KeyFrames[keyIndex + 2 < KeyFrames.Count ? keyIndex + 2 : KeyFrames.Count - 1];

            return(evaluator.Evaluate(t));
        }