src/3rdparty/easing/easing.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /*
       
     2 Disclaimer for Robert Penner's Easing Equations license:
       
     3 
       
     4 TERMS OF USE - EASING EQUATIONS
       
     5 
       
     6 Open source under the BSD License.
       
     7 
       
     8 Copyright © 2001 Robert Penner
       
     9 All rights reserved.
       
    10 
       
    11 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
       
    12 
       
    13     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
       
    14     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
       
    15     * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
       
    16 
       
    17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    18 */
       
    19 
       
    20 #include <QtCore/qmath.h>
       
    21 #include <math.h>
       
    22 #ifndef M_PI
       
    23 #define M_PI 3.14159265358979323846
       
    24 #endif
       
    25 #ifndef M_PI_2
       
    26 #define M_PI_2 (M_PI / 2)
       
    27 #endif
       
    28 
       
    29 QT_USE_NAMESPACE
       
    30 
       
    31 /**
       
    32  * Easing equation function for a simple linear tweening, with no easing.
       
    33  *
       
    34  * @param t		Current time (in frames or seconds).
       
    35  * @return		The correct value.
       
    36  */
       
    37 static qreal easeNone(qreal progress)
       
    38 {
       
    39     return progress;
       
    40 }
       
    41 
       
    42 /**
       
    43  * Easing equation function for a quadratic (t^2) easing in: accelerating from zero velocity.
       
    44  *
       
    45  * @param t		Current time (in frames or seconds).
       
    46  * @return		The correct value.
       
    47  */
       
    48 static qreal easeInQuad(qreal t)
       
    49 {
       
    50     return t*t;
       
    51 }
       
    52 
       
    53 /**
       
    54 * Easing equation function for a quadratic (t^2) easing out: decelerating to zero velocity.
       
    55 *
       
    56 * @param t		Current time (in frames or seconds).
       
    57 * @return		The correct value.
       
    58 */
       
    59 static qreal easeOutQuad(qreal t)
       
    60 {
       
    61     return -t*(t-2);
       
    62 }
       
    63 
       
    64 /**
       
    65  * Easing equation function for a quadratic (t^2) easing in/out: acceleration until halfway, then deceleration.
       
    66  *
       
    67  * @param t		Current time (in frames or seconds).
       
    68  * @return		The correct value.
       
    69  */
       
    70 static qreal easeInOutQuad(qreal t)
       
    71 {
       
    72     t*=2.0;
       
    73     if (t < 1) {
       
    74         return t*t/qreal(2);
       
    75     } else {
       
    76         --t;
       
    77         return -0.5 * (t*(t-2) - 1);
       
    78     }
       
    79 }
       
    80 
       
    81 /**
       
    82  * Easing equation function for a quadratic (t^2) easing out/in: deceleration until halfway, then acceleration.
       
    83  *
       
    84  * @param t		Current time (in frames or seconds).
       
    85  * @return		The correct value.
       
    86  */
       
    87 static qreal easeOutInQuad(qreal t)
       
    88 {
       
    89     if (t < 0.5) return easeOutQuad (t*2)/2;
       
    90     return easeInQuad((2*t)-1)/2 + 0.5;
       
    91 }
       
    92 
       
    93 /**
       
    94  * Easing equation function for a cubic (t^3) easing in: accelerating from zero velocity.
       
    95  *
       
    96  * @param t		Current time (in frames or seconds).
       
    97  * @return		The correct value.
       
    98  */
       
    99 static qreal easeInCubic(qreal t)
       
   100 {
       
   101     return t*t*t;
       
   102 }
       
   103 
       
   104 /**
       
   105  * Easing equation function for a cubic (t^3) easing out: decelerating from zero velocity.
       
   106  *
       
   107  * @param t		Current time (in frames or seconds).
       
   108  * @return		The correct value.
       
   109  */
       
   110 static qreal easeOutCubic(qreal t)
       
   111 {
       
   112     t-=1.0;
       
   113     return t*t*t + 1;
       
   114 }
       
   115 
       
   116 /**
       
   117  * Easing equation function for a cubic (t^3) easing in/out: acceleration until halfway, then deceleration.
       
   118  *
       
   119  * @param t		Current time (in frames or seconds).
       
   120  * @return		The correct value.
       
   121  */
       
   122 static qreal easeInOutCubic(qreal t)
       
   123 {
       
   124     t*=2.0;
       
   125     if(t < 1) {
       
   126         return 0.5*t*t*t;
       
   127     } else {
       
   128         t -= qreal(2.0);
       
   129         return 0.5*(t*t*t + 2);
       
   130     }
       
   131 }
       
   132 
       
   133 /**
       
   134  * Easing equation function for a cubic (t^3) easing out/in: deceleration until halfway, then acceleration.
       
   135  *
       
   136  * @param t		Current time (in frames or seconds).
       
   137  * @return		The correct value.
       
   138  */
       
   139 static qreal easeOutInCubic(qreal t)
       
   140 {
       
   141     if (t < 0.5) return easeOutCubic (2*t)/2;
       
   142     return easeInCubic(2*t - 1)/2 + 0.5;
       
   143 }
       
   144 
       
   145 /**
       
   146  * Easing equation function for a quartic (t^4) easing in: accelerating from zero velocity.
       
   147  *
       
   148  * @param t		Current time (in frames or seconds).
       
   149  * @return		The correct value.
       
   150  */
       
   151 static qreal easeInQuart(qreal t)
       
   152 {
       
   153     return t*t*t*t;
       
   154 }
       
   155 
       
   156 /**
       
   157  * Easing equation function for a quartic (t^4) easing out: decelerating from zero velocity.
       
   158  *
       
   159  * @param t		Current time (in frames or seconds).
       
   160  * @return		The correct value.
       
   161  */
       
   162 static qreal easeOutQuart(qreal t)
       
   163 {
       
   164     t-= qreal(1.0);
       
   165     return - (t*t*t*t- 1);
       
   166 }
       
   167 
       
   168 /**
       
   169  * Easing equation function for a quartic (t^4) easing in/out: acceleration until halfway, then deceleration.
       
   170  *
       
   171  * @param t		Current time (in frames or seconds).
       
   172  * @return		The correct value.
       
   173  */
       
   174 static qreal easeInOutQuart(qreal t)
       
   175 {
       
   176     t*=2;
       
   177     if (t < 1) return 0.5*t*t*t*t;
       
   178     else {
       
   179         t -= 2.0f;
       
   180         return -0.5 * (t*t*t*t- 2);
       
   181     }
       
   182 }
       
   183 
       
   184 /**
       
   185  * Easing equation function for a quartic (t^4) easing out/in: deceleration until halfway, then acceleration.
       
   186  *
       
   187  * @param t		Current time (in frames or seconds).
       
   188  * @return		The correct value.
       
   189  */
       
   190 static qreal easeOutInQuart(qreal t)
       
   191 {
       
   192     if (t < 0.5) return easeOutQuart (2*t)/2;
       
   193     return easeInQuart(2*t-1)/2 + 0.5;
       
   194 }
       
   195 
       
   196 /**
       
   197  * Easing equation function for a quintic (t^5) easing in: accelerating from zero velocity.
       
   198  *
       
   199  * @param t		Current time (in frames or seconds).
       
   200  * @return		The correct value.
       
   201  */
       
   202 static qreal easeInQuint(qreal t)
       
   203 {
       
   204     return t*t*t*t*t;
       
   205 }
       
   206 
       
   207 /**
       
   208  * Easing equation function for a quintic (t^5) easing out: decelerating from zero velocity.
       
   209  *
       
   210  * @param t		Current time (in frames or seconds).
       
   211  * @return		The correct value.
       
   212  */
       
   213 static qreal easeOutQuint(qreal t)
       
   214 {
       
   215     t-=1.0;
       
   216     return t*t*t*t*t + 1;
       
   217 }
       
   218 
       
   219 /**
       
   220  * Easing equation function for a quintic (t^5) easing in/out: acceleration until halfway, then deceleration.
       
   221  *
       
   222  * @param t		Current time (in frames or seconds).
       
   223  * @return		The correct value.
       
   224  */
       
   225 static qreal easeInOutQuint(qreal t)
       
   226 {
       
   227     t*=2.0;
       
   228     if (t < 1) return 0.5*t*t*t*t*t;
       
   229     else {
       
   230         t -= 2.0;
       
   231         return 0.5*(t*t*t*t*t + 2);
       
   232     }
       
   233 }
       
   234 
       
   235 /**
       
   236  * Easing equation function for a quintic (t^5) easing out/in: deceleration until halfway, then acceleration.
       
   237  *
       
   238  * @param t		Current time (in frames or seconds).
       
   239  * @return		The correct value.
       
   240  */
       
   241 static qreal easeOutInQuint(qreal t)
       
   242 {
       
   243     if (t < 0.5) return easeOutQuint (2*t)/2;
       
   244     return easeInQuint(2*t - 1)/2 + 0.5;
       
   245 }
       
   246 
       
   247 /**
       
   248  * Easing equation function for a sinusoidal (sin(t)) easing in: accelerating from zero velocity.
       
   249  *
       
   250  * @param t		Current time (in frames or seconds).
       
   251  * @return		The correct value.
       
   252  */
       
   253 static qreal easeInSine(qreal t)
       
   254 {
       
   255     return (t == 1.0) ? 1.0 : -::cos(t * M_PI_2) + 1.0;
       
   256 }
       
   257 
       
   258 /**
       
   259  * Easing equation function for a sinusoidal (sin(t)) easing out: decelerating from zero velocity.
       
   260  *
       
   261  * @param t		Current time (in frames or seconds).
       
   262  * @return		The correct value.
       
   263  */
       
   264 static qreal easeOutSine(qreal t)
       
   265 {
       
   266     return ::sin(t* M_PI_2);
       
   267 }
       
   268 
       
   269 /**
       
   270  * Easing equation function for a sinusoidal (sin(t)) easing in/out: acceleration until halfway, then deceleration.
       
   271  *
       
   272  * @param t		Current time (in frames or seconds).
       
   273  * @return		The correct value.
       
   274  */
       
   275 static qreal easeInOutSine(qreal t)
       
   276 {
       
   277     return -0.5 * (::cos(M_PI*t) - 1);
       
   278 }
       
   279 
       
   280 /**
       
   281  * Easing equation function for a sinusoidal (sin(t)) easing out/in: deceleration until halfway, then acceleration.
       
   282  *
       
   283  * @param t		Current time (in frames or seconds).
       
   284  * @return		The correct value.
       
   285  */
       
   286 static qreal easeOutInSine(qreal t)
       
   287 {
       
   288     if (t < 0.5) return easeOutSine (2*t)/2;
       
   289     return easeInSine(2*t - 1)/2 + 0.5;
       
   290 }
       
   291 
       
   292 /**
       
   293  * Easing equation function for an exponential (2^t) easing in: accelerating from zero velocity.
       
   294  *
       
   295  * @param t		Current time (in frames or seconds).
       
   296  * @return		The correct value.
       
   297  */
       
   298 static qreal easeInExpo(qreal t)
       
   299 {
       
   300     return (t==0 || t == 1.0) ? t : ::qPow(2.0, 10 * (t - 1)) - qreal(0.001);
       
   301 }
       
   302 
       
   303 /**
       
   304  * Easing equation function for an exponential (2^t) easing out: decelerating from zero velocity.
       
   305  *
       
   306  * @param t		Current time (in frames or seconds).
       
   307  * @return		The correct value.
       
   308  */
       
   309 static qreal easeOutExpo(qreal t)
       
   310 {
       
   311     return (t==1.0) ? 1.0 : 1.001 * (-::qPow(2.0f, -10 * t) + 1);
       
   312 }
       
   313 
       
   314 /**
       
   315  * Easing equation function for an exponential (2^t) easing in/out: acceleration until halfway, then deceleration.
       
   316  *
       
   317  * @param t		Current time (in frames or seconds).
       
   318  * @return		The correct value.
       
   319  */
       
   320 static qreal easeInOutExpo(qreal t)
       
   321 {
       
   322     if (t==0.0) return qreal(0.0);
       
   323     if (t==1.0) return qreal(1.0);
       
   324     t*=2.0;
       
   325     if (t < 1) return 0.5 * ::qPow(qreal(2.0), 10 * (t - 1)) - 0.0005;
       
   326     return 0.5 * 1.0005 * (-::qPow(qreal(2.0), -10 * (t - 1)) + 2);
       
   327 }
       
   328 
       
   329 /**
       
   330  * Easing equation function for an exponential (2^t) easing out/in: deceleration until halfway, then acceleration.
       
   331  *
       
   332  * @param t		Current time (in frames or seconds).
       
   333  * @return		The correct value.
       
   334  */
       
   335 static qreal easeOutInExpo(qreal t)
       
   336 {
       
   337     if (t < 0.5) return easeOutExpo (2*t)/2;
       
   338     return easeInExpo(2*t - 1)/2 + 0.5;
       
   339 }
       
   340 
       
   341 /**
       
   342  * Easing equation function for a circular (sqrt(1-t^2)) easing in: accelerating from zero velocity.
       
   343  *
       
   344  * @param t		Current time (in frames or seconds).
       
   345  * @return		The correct value.
       
   346  */
       
   347 static qreal easeInCirc(qreal t)
       
   348 {
       
   349     return -(::sqrt(1 - t*t) - 1);
       
   350 }
       
   351 
       
   352 /**
       
   353  * Easing equation function for a circular (sqrt(1-t^2)) easing out: decelerating from zero velocity.
       
   354  *
       
   355  * @param t		Current time (in frames or seconds).
       
   356  * @return		The correct value.
       
   357  */
       
   358 static qreal easeOutCirc(qreal t)
       
   359 {
       
   360     t-= qreal(1.0);
       
   361     return ::sqrt(1 - t* t);
       
   362 }
       
   363 
       
   364 /**
       
   365  * Easing equation function for a circular (sqrt(1-t^2)) easing in/out: acceleration until halfway, then deceleration.
       
   366  *
       
   367  * @param t		Current time (in frames or seconds).
       
   368  * @return		The correct value.
       
   369  */
       
   370 static qreal easeInOutCirc(qreal t)
       
   371 {
       
   372     t*=qreal(2.0);
       
   373     if (t < 1) {
       
   374         return -0.5 * (::sqrt(1 - t*t) - 1);
       
   375     } else {
       
   376         t -= qreal(2.0);
       
   377         return 0.5 * (::sqrt(1 - t*t) + 1);
       
   378     }
       
   379 }
       
   380 
       
   381 /**
       
   382  * Easing equation function for a circular (sqrt(1-t^2)) easing out/in: deceleration until halfway, then acceleration.
       
   383  *
       
   384  * @param t		Current time (in frames or seconds).
       
   385  * @return		The correct value.
       
   386  */
       
   387 static qreal easeOutInCirc(qreal t)
       
   388 {
       
   389     if (t < 0.5) return easeOutCirc (2*t)/2;
       
   390     return easeInCirc(2*t - 1)/2 + 0.5;
       
   391 }
       
   392 
       
   393 static qreal easeInElastic_helper(qreal t, qreal b, qreal c, qreal d, qreal a, qreal p)
       
   394 {
       
   395     if (t==0) return b;
       
   396     qreal t_adj = (qreal)t / (qreal)d;
       
   397     if (t_adj==1) return b+c;
       
   398 
       
   399     qreal s;
       
   400     if(a < ::fabs(c)) {
       
   401         a = c;
       
   402         s = p / 4.0f;
       
   403     } else {
       
   404         s = p / (2 * M_PI) * ::asin(c / a);
       
   405     }
       
   406 
       
   407     t_adj -= 1.0f;
       
   408     return -(a*::qPow(2.0f,10*t_adj) * ::sin( (t_adj*d-s)*(2*M_PI)/p )) + b;
       
   409 }
       
   410 
       
   411 /**
       
   412  * Easing equation function for an elastic (exponentially decaying sine wave) easing in: accelerating from zero velocity.
       
   413  *
       
   414  * @param t		Current time (in frames or seconds).
       
   415  * @param a		Amplitude.
       
   416  * @param p		Period.
       
   417  * @return		The correct value.
       
   418  */
       
   419 static qreal easeInElastic(qreal t, qreal a, qreal p)
       
   420 {
       
   421     return easeInElastic_helper(t, 0, 1, 1, a, p);
       
   422 }
       
   423 
       
   424 static qreal easeOutElastic_helper(qreal t, qreal /*b*/, qreal c, qreal /*d*/, qreal a, qreal p)
       
   425 {
       
   426     if (t==0) return 0;
       
   427     if (t==1) return c;
       
   428 
       
   429     qreal s;
       
   430     if(a < c) {
       
   431         a = c;
       
   432         s = p / 4.0f;
       
   433     } else {
       
   434         s = p / (2 * M_PI) * ::asin(c / a);
       
   435     }
       
   436 
       
   437     return (a*::qPow(2.0f,-10*t) * ::sin( (t-s)*(2*M_PI)/p ) + c);
       
   438 }
       
   439 
       
   440 /**
       
   441  * Easing equation function for an elastic (exponentially decaying sine wave) easing out: decelerating from zero velocity.
       
   442  *
       
   443  * @param t		Current time (in frames or seconds).
       
   444  * @param a		Amplitude.
       
   445  * @param p		Period.
       
   446  * @return		The correct value.
       
   447  */
       
   448 static qreal easeOutElastic(qreal t, qreal a, qreal p)
       
   449 {
       
   450     return easeOutElastic_helper(t, 0, 1, 1, a, p);
       
   451 }
       
   452 
       
   453 /**
       
   454  * Easing equation function for an elastic (exponentially decaying sine wave) easing in/out: acceleration until halfway, then deceleration.
       
   455  *
       
   456  * @param t		Current time (in frames or seconds).
       
   457  * @param a		Amplitude.
       
   458  * @param p		Period.
       
   459  * @return		The correct value.
       
   460  */
       
   461 static qreal easeInOutElastic(qreal t, qreal a, qreal p)
       
   462 {
       
   463     if (t==0) return 0.0;
       
   464     t*=2.0;
       
   465     if (t==2) return 1.0;
       
   466 
       
   467     qreal s;
       
   468     if(a < 1.0) {
       
   469         a = 1.0;
       
   470         s = p / 4.0f;
       
   471     } else {
       
   472         s = p / (2 * M_PI) * ::asin(1.0 / a);
       
   473     }
       
   474 
       
   475     if (t < 1) return -.5*(a*::qPow(2.0f,10*(t-1)) * ::sin( (t-1-s)*(2*M_PI)/p ));
       
   476     return a*::qPow(2.0f,-10*(t-1)) * ::sin( (t-1-s)*(2*M_PI)/p )*.5 + 1.0;
       
   477 }
       
   478 
       
   479 /**
       
   480  * Easing equation function for an elastic (exponentially decaying sine wave) easing out/in: deceleration until halfway, then acceleration.
       
   481  *
       
   482  * @param t		Current time (in frames or seconds).
       
   483  * @param a		Amplitude.
       
   484  * @param p		Period.
       
   485  * @return		The correct value.
       
   486  */
       
   487 static qreal easeOutInElastic(qreal t, qreal a, qreal p)
       
   488 {
       
   489     if (t < 0.5) return easeOutElastic_helper(t*2, 0, 0.5, 1.0, a, p);
       
   490     return easeInElastic_helper(2*t - 1.0, 0.5, 0.5, 1.0, a, p);
       
   491 }
       
   492 
       
   493 /**
       
   494  * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in: accelerating from zero velocity.
       
   495  *
       
   496  * @param t		Current time (in frames or seconds).
       
   497  * @param s		Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent).
       
   498  * @return		The correct value.
       
   499  */
       
   500 static qreal easeInBack(qreal t, qreal s)
       
   501 {
       
   502     return t*t*((s+1)*t - s);
       
   503 }
       
   504 
       
   505 /**
       
   506  * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out: decelerating from zero velocity.
       
   507  *
       
   508  * @param t		Current time (in frames or seconds).
       
   509  * @param s		Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent).
       
   510  * @return		The correct value.
       
   511  */
       
   512 static qreal easeOutBack(qreal t, qreal s)
       
   513 {
       
   514     t-= qreal(1.0);
       
   515     return t*t*((s+1)*t+ s) + 1;
       
   516 }
       
   517 
       
   518 /**
       
   519  * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in/out: acceleration until halfway, then deceleration.
       
   520  *
       
   521  * @param t		Current time (in frames or seconds).
       
   522  * @param s		Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent).
       
   523  * @return		The correct value.
       
   524  */
       
   525 static qreal easeInOutBack(qreal t, qreal s)
       
   526 {
       
   527     t *= 2.0;
       
   528     if (t < 1) {
       
   529         s *= 1.525f;
       
   530         return 0.5*(t*t*((s+1)*t - s));
       
   531     } else {
       
   532         t -= 2;
       
   533         s *= 1.525f;
       
   534         return 0.5*(t*t*((s+1)*t+ s) + 2);
       
   535     }
       
   536 }
       
   537 
       
   538 /**
       
   539  * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in: deceleration until halfway, then acceleration.
       
   540  *
       
   541  * @param t		Current time (in frames or seconds).
       
   542  * @param s		Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent).
       
   543  * @return		The correct value.
       
   544  */
       
   545 static qreal easeOutInBack(qreal t, qreal s)
       
   546 {
       
   547     if (t < 0.5) return easeOutBack (2*t, s)/2;
       
   548     return easeInBack(2*t - 1, s)/2 + 0.5;
       
   549 }
       
   550 
       
   551 static qreal easeOutBounce_helper(qreal t, qreal c, qreal a)
       
   552 {
       
   553     if (t == 1.0) return c;
       
   554     if (t < (4/11.0)) {
       
   555         return c*(7.5625*t*t);
       
   556     } else if (t < (8/11.0)) {
       
   557         t -= (6/11.0);
       
   558         return -a * (1. - (7.5625*t*t + .75)) + c;
       
   559     } else if (t < (10/11.0)) {
       
   560         t -= (9/11.0);
       
   561         return -a * (1. - (7.5625*t*t + .9375)) + c;
       
   562     } else {
       
   563         t -= (21/22.0);
       
   564         return -a * (1. - (7.5625*t*t + .984375)) + c;
       
   565     }
       
   566 }
       
   567 
       
   568 /**
       
   569  * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: decelerating from zero velocity.
       
   570  *
       
   571  * @param t		Current time (in frames or seconds).
       
   572  * @param a		Amplitude.
       
   573  * @return		The correct value.
       
   574  */
       
   575 static qreal easeOutBounce(qreal t, qreal a)
       
   576 {
       
   577     return easeOutBounce_helper(t, 1, a);
       
   578 }
       
   579 
       
   580 /**
       
   581  * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: accelerating from zero velocity.
       
   582  *
       
   583  * @param t		Current time (in frames or seconds).
       
   584  * @param a		Amplitude.
       
   585  * @return		The correct value.
       
   586  */
       
   587 static qreal easeInBounce(qreal t, qreal a)
       
   588 {
       
   589     return 1.0 - easeOutBounce_helper(1.0-t, 1.0, a);
       
   590 }
       
   591 
       
   592 
       
   593 /**
       
   594  * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: acceleration until halfway, then deceleration.
       
   595  *
       
   596  * @param t		Current time (in frames or seconds).
       
   597  * @param a		Amplitude.
       
   598  * @return		The correct value.
       
   599  */
       
   600 static qreal easeInOutBounce(qreal t, qreal a)
       
   601 {
       
   602     if (t < 0.5) return easeInBounce (2*t, a)/2;
       
   603     else return (t == 1.0) ? 1.0 : easeOutBounce (2*t - 1, a)/2 + 0.5;
       
   604 }
       
   605 
       
   606 /**
       
   607  * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out/in: deceleration until halfway, then acceleration.
       
   608  *
       
   609  * @param t		Current time (in frames or seconds).
       
   610  * @param a		Amplitude.
       
   611  * @return		The correct value.
       
   612  */
       
   613 static qreal easeOutInBounce(qreal t, qreal a)
       
   614 {
       
   615     if (t < 0.5) return easeOutBounce_helper(t*2, 0.5, a);
       
   616     return 1.0 - easeOutBounce_helper (2.0-2*t, 0.5, a);
       
   617 }
       
   618 
       
   619 static inline qreal qt_sinProgress(qreal value)
       
   620 {
       
   621     return qSin((value * M_PI) - M_PI_2) / 2 + qreal(0.5);
       
   622 }
       
   623 
       
   624 static inline qreal qt_smoothBeginEndMixFactor(qreal value)
       
   625 {
       
   626     return qMin(qMax(1 - value * 2 + qreal(0.3), qreal(0.0)), qreal(1.0));
       
   627 }
       
   628 
       
   629 // SmoothBegin blends Smooth and Linear Interpolation.
       
   630 // Progress 0 - 0.3      : Smooth only
       
   631 // Progress 0.3 - ~ 0.5  : Mix of Smooth and Linear
       
   632 // Progress ~ 0.5  - 1   : Linear only
       
   633 
       
   634 /**
       
   635  * Easing function that starts growing slowly, then increases in speed. At the end of the curve the speed will be constant.
       
   636  */
       
   637 static qreal easeInCurve(qreal t)
       
   638 {
       
   639     const qreal sinProgress = qt_sinProgress(t);
       
   640     const qreal mix = qt_smoothBeginEndMixFactor(t);
       
   641     return sinProgress * mix + t * (1 - mix);
       
   642 }
       
   643 
       
   644 /**
       
   645  * Easing function that starts growing steadily, then ends slowly. The speed will be constant at the beginning of the curve.
       
   646  */
       
   647 static qreal easeOutCurve(qreal t)
       
   648 {
       
   649     const qreal sinProgress = qt_sinProgress(t);
       
   650     const qreal mix = qt_smoothBeginEndMixFactor(1 - t);
       
   651     return sinProgress * mix + t * (1 - mix);
       
   652 }
       
   653 
       
   654 /**
       
   655  * Easing function where the value grows sinusoidally. Note that the calculated  end value will be 0 rather than 1.
       
   656  */
       
   657 static qreal easeSineCurve(qreal t)
       
   658 {
       
   659     return (qSin(((t * M_PI * 2)) - M_PI_2) + 1) / 2;
       
   660 }
       
   661 
       
   662 /**
       
   663  * Easing function where the value grows cosinusoidally. Note that the calculated start value will be 0.5 and the end value will be 0.5
       
   664  * contrary to the usual 0 to 1 easing curve.
       
   665  */
       
   666 static qreal easeCosineCurve(qreal t)
       
   667 {
       
   668     return (qCos(((t * M_PI * 2)) - M_PI_2) + 1) / 2;
       
   669 }
       
   670