789 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			789 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using UnityEngine; | |||
|  | 
 | |||
|  | public static partial class SRMath | |||
|  | { | |||
|  |     /** | |||
|  | 	 *  | |||
|  | 	 *  These tweening functions taken from https://wpf-animation.googlecode.com/svn/trunk/src/WPF/Animation/PennerDoubleAnimation.cs | |||
|  | 	 *  Licensed under the new BSD License | |||
|  | 	 *  | |||
|  | 	 * @author		Darren David darren-code@lookorfeel.com | |||
|  | 	 * @version		1.0 | |||
|  | 	 * | |||
|  | 	 * Credit/Thanks: | |||
|  | 	 * Robert Penner - The easing equations we all know and love  | |||
|  | 	 *   (http://robertpenner.com/easing/) [See License.txt for license info] | |||
|  | 	 *  | |||
|  | 	 * Lee Brimelow - initial port of Penner's equations to WPF  | |||
|  | 	 *   (http://thewpfblog.com/?p=12) | |||
|  | 	 *  | |||
|  | 	 * Zeh Fernando - additional equations (out/in) from  | |||
|  | 	 *   caurina.transitions.Tweener (http://code.google.com/p/tweener/) | |||
|  | 	 *   [See License.txt for license info] | |||
|  | 	 *    | |||
|  | 	 */ | |||
|  | 
 | |||
|  |     private static class TweenFunctions | |||
|  |     { | |||
|  |         #region Equations | |||
|  | 
 | |||
|  |         #region Linear | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a simple linear tweening, with no easing. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float Linear(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*t/d + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Expo | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an exponential (2^t) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ExpoEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return (t == d) ? b + c : c*(-Mathf.Pow(2, -10*t/d) + 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an exponential (2^t) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ExpoEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return (t == 0) ? b : c*Mathf.Pow(2, 10*(t/d - 1)) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an exponential (2^t) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ExpoEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t == 0) | |||
|  |             { | |||
|  |                 return b; | |||
|  |             } | |||
|  | 
 | |||
|  |             if (t == d) | |||
|  |             { | |||
|  |                 return b + c; | |||
|  |             } | |||
|  | 
 | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*Mathf.Pow(2, 10*(t - 1)) + b; | |||
|  |             } | |||
|  | 
 | |||
|  |             return c/2*(-Mathf.Pow(2, -10*--t) + 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an exponential (2^t) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ExpoEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return ExpoEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  | 
 | |||
|  |             return ExpoEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Circular | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a circular (sqrt(1-t^2)) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CircEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*Mathf.Sqrt(1 - (t = t/d - 1)*t) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a circular (sqrt(1-t^2)) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CircEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return -c*(Mathf.Sqrt(1 - (t /= d)*t) - 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CircEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return -c/2*(Mathf.Sqrt(1 - t*t) - 1) + b; | |||
|  |             } | |||
|  | 
 | |||
|  |             return c/2*(Mathf.Sqrt(1 - (t -= 2)*t) + 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CircEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return CircEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  | 
 | |||
|  |             return CircEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Quad | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quadratic (t^2) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuadEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return -c*(t /= d)*(t - 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quadratic (t^2) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuadEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*(t /= d)*t + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quadratic (t^2) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuadEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*t*t + b; | |||
|  |             } | |||
|  | 
 | |||
|  |             return -c/2*((--t)*(t - 2) - 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quadratic (t^2) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuadEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return QuadEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  | 
 | |||
|  |             return QuadEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Sine | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a sinusoidal (sin(t)) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float SineEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*Mathf.Sin(t/d*(Mathf.PI/2)) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a sinusoidal (sin(t)) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float SineEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return -c*Mathf.Cos(t/d*(Mathf.PI/2)) + c + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a sinusoidal (sin(t)) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float SineEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*(Mathf.Sin(Mathf.PI*t/2)) + b; | |||
|  |             } | |||
|  | 
 | |||
|  |             return -c/2*(Mathf.Cos(Mathf.PI*--t/2) - 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a sinusoidal (sin(t)) easing in/out: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float SineEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return SineEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  | 
 | |||
|  |             return SineEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Cubic | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a cubic (t^3) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CubicEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*((t = t/d - 1)*t*t + 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a cubic (t^3) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CubicEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*(t /= d)*t*t + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a cubic (t^3) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CubicEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*t*t*t + b; | |||
|  |             } | |||
|  | 
 | |||
|  |             return c/2*((t -= 2)*t*t + 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a cubic (t^3) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float CubicEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return CubicEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  | 
 | |||
|  |             return CubicEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Quartic | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quartic (t^4) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuartEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return -c*((t = t/d - 1)*t*t*t - 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quartic (t^4) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuartEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*(t /= d)*t*t*t + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quartic (t^4) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuartEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*t*t*t*t + b; | |||
|  |             } | |||
|  | 
 | |||
|  |             return -c/2*((t -= 2)*t*t*t - 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quartic (t^4) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuartEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return QuartEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  | 
 | |||
|  |             return QuartEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Quintic | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quintic (t^5) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuintEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*((t = t/d - 1)*t*t*t*t + 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quintic (t^5) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuintEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*(t /= d)*t*t*t*t + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quintic (t^5) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuintEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*t*t*t*t*t + b; | |||
|  |             } | |||
|  |             return c/2*((t -= 2)*t*t*t*t + 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a quintic (t^5) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float QuintEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return QuintEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  |             return QuintEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Elastic | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an elastic (exponentially decaying sine wave) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ElasticEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d) == 1) | |||
|  |             { | |||
|  |                 return b + c; | |||
|  |             } | |||
|  | 
 | |||
|  |             var p = d*.3f; | |||
|  |             var s = p/4; | |||
|  | 
 | |||
|  |             return (c*Mathf.Pow(2, -10*t)*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p) + c + b); | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an elastic (exponentially decaying sine wave) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ElasticEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d) == 1) | |||
|  |             { | |||
|  |                 return b + c; | |||
|  |             } | |||
|  | 
 | |||
|  |             var p = d*.3f; | |||
|  |             var s = p/4; | |||
|  | 
 | |||
|  |             return -(c*Mathf.Pow(2, 10*(t -= 1))*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p)) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an elastic (exponentially decaying sine wave) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ElasticEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d/2) == 2) | |||
|  |             { | |||
|  |                 return b + c; | |||
|  |             } | |||
|  | 
 | |||
|  |             var p = d*(.3f*1.5f); | |||
|  |             var s = p/4; | |||
|  | 
 | |||
|  |             if (t < 1) | |||
|  |             { | |||
|  |                 return -.5f*(c*Mathf.Pow(2, 10*(t -= 1))*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p)) + b; | |||
|  |             } | |||
|  |             return c*Mathf.Pow(2, -10*(t -= 1))*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p)*.5f + c + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for an elastic (exponentially decaying sine wave) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float ElasticEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return ElasticEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  |             return ElasticEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Bounce | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BounceEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if ((t /= d) < (1/2.75f)) | |||
|  |             { | |||
|  |                 return c*(7.5625f*t*t) + b; | |||
|  |             } | |||
|  |             if (t < (2/2.75)) | |||
|  |             { | |||
|  |                 return c*(7.5625f*(t -= (1.5f/2.75f))*t + .75f) + b; | |||
|  |             } | |||
|  |             if (t < (2.5/2.75)) | |||
|  |             { | |||
|  |                 return c*(7.5625f*(t -= (2.25f/2.75f))*t + .9375f) + b; | |||
|  |             } | |||
|  |             return c*(7.5625f*(t -= (2.625f/2.75f))*t + .984375f) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BounceEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c - BounceEaseOut(d - t, 0, c, d) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BounceEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return BounceEaseIn(t*2, 0, c, d)*.5f + b; | |||
|  |             } | |||
|  |             return BounceEaseOut(t*2 - d, 0, c, d)*.5f + c*.5f + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BounceEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return BounceEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  |             return BounceEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #region Back | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out: | |||
|  |         /// decelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BackEaseOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*((t = t/d - 1)*t*((1.70158f + 1)*t + 1.70158f) + 1) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in: | |||
|  |         /// accelerating from zero velocity. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BackEaseIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             return c*(t /= d)*t*((1.70158f + 1)*t - 1.70158f) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in/out: | |||
|  |         /// acceleration until halfway, then deceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BackEaseInOut(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             var s = 1.70158f; | |||
|  |             if ((t /= d/2) < 1) | |||
|  |             { | |||
|  |                 return c/2*(t*t*(((s *= (1.525f)) + 1)*t - s)) + b; | |||
|  |             } | |||
|  |             return c/2*((t -= 2)*t*(((s *= (1.525f)) + 1)*t + s) + 2) + b; | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in: | |||
|  |         /// deceleration until halfway, then acceleration. | |||
|  |         /// </summary> | |||
|  |         /// <param name="t">Current time in seconds.</param> | |||
|  |         /// <param name="b">Starting value.</param> | |||
|  |         /// <param name="c">Final value.</param> | |||
|  |         /// <param name="d">Duration of animation.</param> | |||
|  |         /// <returns>The correct value.</returns> | |||
|  |         public static float BackEaseOutIn(float t, float b, float c, float d) | |||
|  |         { | |||
|  |             if (t < d/2) | |||
|  |             { | |||
|  |                 return BackEaseOut(t*2, b, c/2, d); | |||
|  |             } | |||
|  |             return BackEaseIn((t*2) - d, b + c/2, c/2, d); | |||
|  |         } | |||
|  | 
 | |||
|  |         #endregion | |||
|  | 
 | |||
|  |         #endregion | |||
|  |     } | |||
|  | } |