/// <summary>
        /// Forces a recalculation of curve samples.
        /// This needs to be called if the wrapped curve
        /// is changed.
        /// </summary>
        public void ResampleCurve()
        {
            //TODO: Call this from curve if add/remove/timechange/valuechange happens
            //Could hide it then.
            samples.Clear();
            float firstTime, lastTime;
            int   minIndex, maxIndex;

            curve.GetCurveBoundsInformation(out firstTime, out lastTime, out minIndex, out maxIndex);

            //Curve isn't valid.
            if (minIndex < 0 || maxIndex < 0)
            {
                return;
            }

            float timeElapsed = 0;
            //TODO: useless calculation due to this
            TValue currentValue  = Curve.ControlPoints[minIndex].Value;
            TValue previousValue = currentValue;

            float inverseSampleCount = 1f / (SamplesPerInterval + 1);

            float speed         = GetSpeedAtCurveTime(Curve.ControlPoints[minIndex].Time);
            float previousSpeed = speed;

            for (int i = minIndex; i < maxIndex; i++)
            {
                previousValue = currentValue;
                currentValue  = Curve.ControlPoints[i].Value;

                if (speed != 0)
                {
                    timeElapsed += GetDistance(previousValue, currentValue) / speed;
                }
                previousSpeed = speed;
                speed         = GetSpeedAtCurveTime(Curve.ControlPoints[i].Time);

                samples.Add(new Vector2(timeElapsed, Curve.ControlPoints[i].Time));

                float curveTime          = Curve.ControlPoints[i].Time;
                float intervalLength     = Curve.ControlPoints[i + 1].Time - curveTime;
                float curveTimePerSample = intervalLength / (SamplesPerInterval + 1);
                for (int j = 1; j <= SamplesPerInterval; j++)
                {
                    previousValue = currentValue;
                    Curve.Evaluate(i, j * inverseSampleCount, out currentValue);

                    curveTime += curveTimePerSample;
                    if (speed != 0)
                    {
                        timeElapsed += GetDistance(previousValue, currentValue) / speed;
                    }

                    previousSpeed = speed;
                    speed         = GetSpeedAtCurveTime(curveTime);

                    samples.Add(new Vector2(timeElapsed, curveTime));
                }
            }
            timeElapsed += GetDistance(previousValue, currentValue) / previousSpeed;
            samples.Add(new Vector2(timeElapsed, Curve.ControlPoints[maxIndex].Time));
        }
 /// <summary>
 /// Computes the value of the curve at a given time.
 /// </summary>
 /// <param name="time">Time to evaluate the curve at.</param>
 /// <param name="value">Value of the curve at the given time.</param>
 /// <param name="innerTime">Time at which the internal curve was evaluated to get the value.</returns>
 public void Evaluate(double time, out TValue value, out double innerTime)
 {
     Curve.Evaluate(innerTime = GetInnerTime(time), out value);
 }
 /// <summary>
 /// Computes the value of the curve at a given time.
 /// </summary>
 /// <param name="time">Time to evaluate the curve at.</param>
 /// <param name="value">Value of the curve at the given time.</param>
 public override void Evaluate(double time, out TValue value)
 {
     Curve.Evaluate(GetInnerTime(time), out value);
 }
 /// <summary>
 /// Computes the value of the curve at a given time.
 /// </summary>
 /// <param name="time">Time to evaluate the curve at.</param>
 /// <param name="value">Value of the curve at the given time.</param>
 /// <param name="innerTime">Time at which the internal curve was evaluated to get the value.</param>
 public void Evaluate(Fix64 time, out TValue value, out Fix64 innerTime)
 {
     Curve.Evaluate(innerTime = GetInnerTime(time), out value);
 }