/// <summary> /// Function to interpolate a new key frame from the nearest previous and next key frames. /// </summary> /// <param name="keyValues">Nearest previous and next key frames.</param> /// <param name="keyTime">The time to assign to the key.</param> /// <param name="unitTime">The time, expressed in unit time.</param> /// <returns> /// The interpolated key frame containing the interpolated values. /// </returns> protected override IKeyFrame GetTweenKey(ref NearestKeys keyValues, float keyTime, float unitTime) { var next = (GorgonKeyUInt32)keyValues.NextKey; var prev = (GorgonKeyUInt32)keyValues.PreviousKey; switch (InterpolationMode) { case TrackInterpolationMode.Linear: return(new GorgonKeyUInt32(keyTime, (UInt32)(prev.Value + (next.Value - prev.Value) * unitTime))); case TrackInterpolationMode.Spline: return(new GorgonKeyUInt32(keyTime, (UInt32)Spline.GetInterpolatedValue(keyValues.PreviousKeyIndex, unitTime).X)); default: return(prev); } }
/// <summary> /// Function to interpolate a new key frame from the nearest previous and next key frames. /// </summary> /// <param name="keyValues">Nearest previous and next key frames.</param> /// <param name="keyTime">The time to assign to the key.</param> /// <param name="unitTime">The time, expressed in unit time.</param> /// <returns> /// The interpolated key frame containing the interpolated values. /// </returns> protected override IKeyFrame GetTweenKey(ref NearestKeys keyValues, float keyTime, float unitTime) { var prev = (GorgonKeyTexture2D)keyValues.PreviousKey; if (InterpolationMode != TrackInterpolationMode.Linear) { return(prev); } var next = (GorgonKeyTexture2D)keyValues.NextKey; var regionStart = new Vector4(prev.TextureRegion.X, prev.TextureRegion.Y, prev.TextureRegion.Width, prev.TextureRegion.Height); var regionEnd = new Vector4(next.TextureRegion.X, next.TextureRegion.Y, next.TextureRegion.Width, next.TextureRegion.Height); Vector4 result; Vector4.Lerp(ref regionStart, ref regionEnd, unitTime, out result); return(new GorgonKeyTexture2D(keyTime, prev.Value, new RectangleF(result.X, result.Y, result.Z, result.W))); }
/// <summary> /// Function to retrieve a key frame for a given time. /// </summary> /// <param name="time">Time to look up.</param> /// <returns>A keyframe at that time. Note that this can return an interpolated key frame and therefore not actually exist in the <see cref="GorgonLibrary.Animation.GorgonAnimationTrack{T}.KeyFrames">key frames collection</see>.</returns> public IKeyFrame GetKeyAtTime(float time) { IKeyFrame result; if (KeyFrames.Times.TryGetValue(time, out result)) { return(result); } if (time >= KeyFrames[KeyFrames.Count - 1].Time) { return(KeyFrames[KeyFrames.Count - 1]); } if (time <= 0) { return(KeyFrames[0]); } var keys = new NearestKeys(this, time); return(keys.KeyTimeDelta.EqualsEpsilon(0.0f) ? keys.PreviousKey : GetTweenKey(ref keys, time, keys.KeyTimeDelta)); }
/// <summary> /// Function to interpolate a new key frame from the nearest previous and next key frames. /// </summary> /// <param name="keyValues">Nearest previous and next key frames.</param> /// <param name="keyTime">The time to assign to the key.</param> /// <param name="unitTime">The time, expressed in unit time.</param> /// <returns>The interpolated key frame containing the interpolated values.</returns> protected abstract IKeyFrame GetTweenKey(ref NearestKeys keyValues, float keyTime, float unitTime);