// from: http://www.robertpenner.com/easing/ // Removed animation stuff - not needed for Unity. // Fixed documentation erroneously calling param "c" Final value. If c == 0 then fuck all happens. Therefore: // c is not the final value and the person who wrote that it is, happens to be an asshole that wasted me an hour // figuring out why. using System; /// /// Animates the change in value of a double property using /// Robert Penner's easing equations for interpolation over a specified duration. /// public class Easing{ /// /// Linear change in value. /// Useful when assigning delegates to control animation. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double Linear( double t, double b, double c, double d ) { return c * t / d + b; } /// /// Easing equation function for an exponential (2^t) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ExpoEaseOut( double t, double b, double c, double d ) { return ( t == d ) ? b + c : c * ( -Math.Pow( 2, -10 * t / d ) + 1 ) + b; } /// /// Easing equation function for an exponential (2^t) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ExpoEaseIn( double t, double b, double c, double d ) { return ( t == 0 ) ? b : c * Math.Pow( 2, 10 * ( t / d - 1 ) ) + b; } /// /// Easing equation function for an exponential (2^t) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ExpoEaseInOut( double t, double b, double c, double d ) { if ( t == 0 ) return b; if ( t == d ) return b + c; if ( ( t /= d / 2 ) < 1 ) return c / 2 * Math.Pow( 2, 10 * ( t - 1 ) ) + b; return c / 2 * ( -Math.Pow( 2, -10 * --t ) + 2 ) + b; } /// /// Easing equation function for an exponential (2^t) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ExpoEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return ExpoEaseOut( t * 2, b, c / 2, d ); return ExpoEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a circular (sqrt(1-t^2)) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CircEaseOut( double t, double b, double c, double d ) { return c * Math.Sqrt( 1 - ( t = t / d - 1 ) * t ) + b; } /// /// Easing equation function for a circular (sqrt(1-t^2)) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CircEaseIn( double t, double b, double c, double d ) { return -c * ( Math.Sqrt( 1 - ( t /= d ) * t ) - 1 ) + b; } /// /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CircEaseInOut( double t, double b, double c, double d ) { if ( ( t /= d / 2 ) < 1 ) return -c / 2 * ( Math.Sqrt( 1 - t * t ) - 1 ) + b; return c / 2 * ( Math.Sqrt( 1 - ( t -= 2 ) * t ) + 1 ) + b; } /// /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CircEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return CircEaseOut( t * 2, b, c / 2, d ); return CircEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a quadratic (t^2) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuadEaseOut( double t, double b, double c, double d ) { return -c * ( t /= d ) * ( t - 2 ) + b; } /// /// Easing equation function for a quadratic (t^2) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuadEaseIn( double t, double b, double c, double d ) { return c * ( t /= d ) * t + b; } /// /// Easing equation function for a quadratic (t^2) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuadEaseInOut( double t, double b, double c, double d ) { if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t + b; return -c / 2 * ( ( --t ) * ( t - 2 ) - 1 ) + b; } /// /// Easing equation function for a quadratic (t^2) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuadEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return QuadEaseOut( t * 2, b, c / 2, d ); return QuadEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a sinusoidal (sin(t)) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double SineEaseOut( double t, double b, double c, double d ) { return c * Math.Sin( t / d * ( Math.PI / 2 ) ) + b; } /// /// Easing equation function for a sinusoidal (sin(t)) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double SineEaseIn( double t, double b, double c, double d ) { return -c * Math.Cos( t / d * ( Math.PI / 2 ) ) + c + b; } /// /// Easing equation function for a sinusoidal (sin(t)) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double SineEaseInOut( double t, double b, double c, double d ) { if ( ( t /= d / 2 ) < 1 ) return c / 2 * ( Math.Sin( Math.PI * t / 2 ) ) + b; return -c / 2 * ( Math.Cos( Math.PI * --t / 2 ) - 2 ) + b; } /// /// Easing equation function for a sinusoidal (sin(t)) easing in/out: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double SineEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return SineEaseOut( t * 2, b, c / 2, d ); return SineEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a cubic (t^3) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CubicEaseOut( double t, double b, double c, double d ) { return c * ( ( t = t / d - 1 ) * t * t + 1 ) + b; } /// /// Easing equation function for a cubic (t^3) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CubicEaseIn( double t, double b, double c, double d ) { return c * ( t /= d ) * t * t + b; } /// /// Easing equation function for a cubic (t^3) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CubicEaseInOut( double t, double b, double c, double d ) { if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t * t + b; return c / 2 * ( ( t -= 2 ) * t * t + 2 ) + b; } /// /// Easing equation function for a cubic (t^3) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double CubicEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return CubicEaseOut( t * 2, b, c / 2, d ); return CubicEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a quartic (t^4) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuartEaseOut( double t, double b, double c, double d ) { return -c * ( ( t = t / d - 1 ) * t * t * t - 1 ) + b; } /// /// Easing equation function for a quartic (t^4) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuartEaseIn( double t, double b, double c, double d ) { return c * ( t /= d ) * t * t * t + b; } /// /// Easing equation function for a quartic (t^4) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuartEaseInOut( double t, double b, double c, double d ) { if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t * t * t + b; return -c / 2 * ( ( t -= 2 ) * t * t * t - 2 ) + b; } /// /// Easing equation function for a quartic (t^4) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuartEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return QuartEaseOut( t * 2, b, c / 2, d ); return QuartEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a quintic (t^5) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuintEaseOut( double t, double b, double c, double d ) { return c * ( ( t = t / d - 1 ) * t * t * t * t + 1 ) + b; } /// /// Easing equation function for a quintic (t^5) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuintEaseIn( double t, double b, double c, double d ) { return c * ( t /= d ) * t * t * t * t + b; } /// /// Easing equation function for a quintic (t^5) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuintEaseInOut( double t, double b, double c, double 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; } /// /// Easing equation function for a quintic (t^5) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double QuintEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return QuintEaseOut( t * 2, b, c / 2, d ); return QuintEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for an elastic (exponentially decaying sine wave) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ElasticEaseOut( double t, double b, double c, double d ) { if ( ( t /= d ) == 1 ) return b + c; double p = d * .3; double s = p / 4; return ( c * Math.Pow( 2, -10 * t ) * Math.Sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) + c + b ); } /// /// Easing equation function for an elastic (exponentially decaying sine wave) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ElasticEaseIn( double t, double b, double c, double d ) { if ( ( t /= d ) == 1 ) return b + c; double p = d * .3; double s = p / 4; return -( c * Math.Pow( 2, 10 * ( t -= 1 ) ) * Math.Sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) ) + b; } /// /// Easing equation function for an elastic (exponentially decaying sine wave) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ElasticEaseInOut( double t, double b, double c, double d ) { if ( ( t /= d / 2 ) == 2 ) return b + c; double p = d * ( .3 * 1.5 ); double s = p / 4; if ( t < 1 ) return -.5 * ( c * Math.Pow( 2, 10 * ( t -= 1 ) ) * Math.Sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) ) + b; return c * Math.Pow( 2, -10 * ( t -= 1 ) ) * Math.Sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) * .5 + c + b; } /// /// Easing equation function for an elastic (exponentially decaying sine wave) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double ElasticEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return ElasticEaseOut( t * 2, b, c / 2, d ); return ElasticEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BounceEaseOut( double t, double b, double c, double d ) { if ( ( t /= d ) < ( 1 / 2.75 ) ) return c * ( 7.5625 * t * t ) + b; else if ( t < ( 2 / 2.75 ) ) return c * ( 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + .75 ) + b; else if ( t < ( 2.5 / 2.75 ) ) return c * ( 7.5625 * ( t -= ( 2.25 / 2.75 ) ) * t + .9375 ) + b; else return c * ( 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + .984375 ) + b; } /// /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BounceEaseIn( double t, double b, double c, double d ) { return c - BounceEaseOut( d - t, 0, c, d ) + b; } /// /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BounceEaseInOut( double t, double b, double c, double d ) { if ( t < d / 2 ) return BounceEaseIn( t * 2, 0, c, d ) * .5 + b; else return BounceEaseOut( t * 2 - d, 0, c, d ) * .5 + c * .5 + b; } /// /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BounceEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return BounceEaseOut( t * 2, b, c / 2, d ); return BounceEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } /// /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out: /// decelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BackEaseOut( double t, double b, double c, double d ) { return c * ( ( t = t / d - 1 ) * t * ( ( 1.70158 + 1 ) * t + 1.70158 ) + 1 ) + b; } /// /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in: /// accelerating from zero velocity. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BackEaseIn( double t, double b, double c, double d ) { return c * ( t /= d ) * t * ( ( 1.70158 + 1 ) * t - 1.70158 ) + b; } /// /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in/out: /// acceleration until halfway, then deceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BackEaseInOut( double t, double b, double c, double d ) { double s = 1.70158; if ( ( t /= d / 2 ) < 1 ) return c / 2 * ( t * t * ( ( ( s *= ( 1.525 ) ) + 1 ) * t - s ) ) + b; return c / 2 * ( ( t -= 2 ) * t * ( ( ( s *= ( 1.525 ) ) + 1 ) * t + s ) + 2 ) + b; } /// /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in: /// deceleration until halfway, then acceleration. /// /// Current time in seconds. /// Starting value. /// Change in value. /// Duration of animation. /// The correct value. public static double BackEaseOutIn( double t, double b, double c, double d ) { if ( t < d / 2 ) return BackEaseOut( t * 2, b, c / 2, d ); return BackEaseIn( ( t * 2 ) - d, b + c / 2, c / 2, d ); } }