123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788 |
- 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
- }
- }
|