/// <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); }