Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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)));
        }
Exemplo n.º 3
0
        /// <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));
        }
Exemplo n.º 4
0
 /// <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);