SRMath.Tweening.Functions.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. using UnityEngine;
  2. public static partial class SRMath
  3. {
  4. /**
  5. *
  6. * These tweening functions taken from https://wpf-animation.googlecode.com/svn/trunk/src/WPF/Animation/PennerDoubleAnimation.cs
  7. * Licensed under the new BSD License
  8. *
  9. * @author Darren David darren-code@lookorfeel.com
  10. * @version 1.0
  11. *
  12. * Credit/Thanks:
  13. * Robert Penner - The easing equations we all know and love
  14. * (http://robertpenner.com/easing/) [See License.txt for license info]
  15. *
  16. * Lee Brimelow - initial port of Penner's equations to WPF
  17. * (http://thewpfblog.com/?p=12)
  18. *
  19. * Zeh Fernando - additional equations (out/in) from
  20. * caurina.transitions.Tweener (http://code.google.com/p/tweener/)
  21. * [See License.txt for license info]
  22. *
  23. */
  24. private static class TweenFunctions
  25. {
  26. #region Equations
  27. #region Linear
  28. /// <summary>
  29. /// Easing equation function for a simple linear tweening, with no easing.
  30. /// </summary>
  31. /// <param name="t">Current time in seconds.</param>
  32. /// <param name="b">Starting value.</param>
  33. /// <param name="c">Final value.</param>
  34. /// <param name="d">Duration of animation.</param>
  35. /// <returns>The correct value.</returns>
  36. public static float Linear(float t, float b, float c, float d)
  37. {
  38. return c*t/d + b;
  39. }
  40. #endregion
  41. #region Expo
  42. /// <summary>
  43. /// Easing equation function for an exponential (2^t) easing out:
  44. /// decelerating from zero velocity.
  45. /// </summary>
  46. /// <param name="t">Current time in seconds.</param>
  47. /// <param name="b">Starting value.</param>
  48. /// <param name="c">Final value.</param>
  49. /// <param name="d">Duration of animation.</param>
  50. /// <returns>The correct value.</returns>
  51. public static float ExpoEaseOut(float t, float b, float c, float d)
  52. {
  53. return (t == d) ? b + c : c*(-Mathf.Pow(2, -10*t/d) + 1) + b;
  54. }
  55. /// <summary>
  56. /// Easing equation function for an exponential (2^t) easing in:
  57. /// accelerating from zero velocity.
  58. /// </summary>
  59. /// <param name="t">Current time in seconds.</param>
  60. /// <param name="b">Starting value.</param>
  61. /// <param name="c">Final value.</param>
  62. /// <param name="d">Duration of animation.</param>
  63. /// <returns>The correct value.</returns>
  64. public static float ExpoEaseIn(float t, float b, float c, float d)
  65. {
  66. return (t == 0) ? b : c*Mathf.Pow(2, 10*(t/d - 1)) + b;
  67. }
  68. /// <summary>
  69. /// Easing equation function for an exponential (2^t) easing in/out:
  70. /// acceleration until halfway, then deceleration.
  71. /// </summary>
  72. /// <param name="t">Current time in seconds.</param>
  73. /// <param name="b">Starting value.</param>
  74. /// <param name="c">Final value.</param>
  75. /// <param name="d">Duration of animation.</param>
  76. /// <returns>The correct value.</returns>
  77. public static float ExpoEaseInOut(float t, float b, float c, float d)
  78. {
  79. if (t == 0)
  80. {
  81. return b;
  82. }
  83. if (t == d)
  84. {
  85. return b + c;
  86. }
  87. if ((t /= d/2) < 1)
  88. {
  89. return c/2*Mathf.Pow(2, 10*(t - 1)) + b;
  90. }
  91. return c/2*(-Mathf.Pow(2, -10*--t) + 2) + b;
  92. }
  93. /// <summary>
  94. /// Easing equation function for an exponential (2^t) easing out/in:
  95. /// deceleration until halfway, then acceleration.
  96. /// </summary>
  97. /// <param name="t">Current time in seconds.</param>
  98. /// <param name="b">Starting value.</param>
  99. /// <param name="c">Final value.</param>
  100. /// <param name="d">Duration of animation.</param>
  101. /// <returns>The correct value.</returns>
  102. public static float ExpoEaseOutIn(float t, float b, float c, float d)
  103. {
  104. if (t < d/2)
  105. {
  106. return ExpoEaseOut(t*2, b, c/2, d);
  107. }
  108. return ExpoEaseIn((t*2) - d, b + c/2, c/2, d);
  109. }
  110. #endregion
  111. #region Circular
  112. /// <summary>
  113. /// Easing equation function for a circular (sqrt(1-t^2)) easing out:
  114. /// decelerating from zero velocity.
  115. /// </summary>
  116. /// <param name="t">Current time in seconds.</param>
  117. /// <param name="b">Starting value.</param>
  118. /// <param name="c">Final value.</param>
  119. /// <param name="d">Duration of animation.</param>
  120. /// <returns>The correct value.</returns>
  121. public static float CircEaseOut(float t, float b, float c, float d)
  122. {
  123. return c*Mathf.Sqrt(1 - (t = t/d - 1)*t) + b;
  124. }
  125. /// <summary>
  126. /// Easing equation function for a circular (sqrt(1-t^2)) easing in:
  127. /// accelerating from zero velocity.
  128. /// </summary>
  129. /// <param name="t">Current time in seconds.</param>
  130. /// <param name="b">Starting value.</param>
  131. /// <param name="c">Final value.</param>
  132. /// <param name="d">Duration of animation.</param>
  133. /// <returns>The correct value.</returns>
  134. public static float CircEaseIn(float t, float b, float c, float d)
  135. {
  136. return -c*(Mathf.Sqrt(1 - (t /= d)*t) - 1) + b;
  137. }
  138. /// <summary>
  139. /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out:
  140. /// acceleration until halfway, then deceleration.
  141. /// </summary>
  142. /// <param name="t">Current time in seconds.</param>
  143. /// <param name="b">Starting value.</param>
  144. /// <param name="c">Final value.</param>
  145. /// <param name="d">Duration of animation.</param>
  146. /// <returns>The correct value.</returns>
  147. public static float CircEaseInOut(float t, float b, float c, float d)
  148. {
  149. if ((t /= d/2) < 1)
  150. {
  151. return -c/2*(Mathf.Sqrt(1 - t*t) - 1) + b;
  152. }
  153. return c/2*(Mathf.Sqrt(1 - (t -= 2)*t) + 1) + b;
  154. }
  155. /// <summary>
  156. /// Easing equation function for a circular (sqrt(1-t^2)) easing in/out:
  157. /// acceleration until halfway, then deceleration.
  158. /// </summary>
  159. /// <param name="t">Current time in seconds.</param>
  160. /// <param name="b">Starting value.</param>
  161. /// <param name="c">Final value.</param>
  162. /// <param name="d">Duration of animation.</param>
  163. /// <returns>The correct value.</returns>
  164. public static float CircEaseOutIn(float t, float b, float c, float d)
  165. {
  166. if (t < d/2)
  167. {
  168. return CircEaseOut(t*2, b, c/2, d);
  169. }
  170. return CircEaseIn((t*2) - d, b + c/2, c/2, d);
  171. }
  172. #endregion
  173. #region Quad
  174. /// <summary>
  175. /// Easing equation function for a quadratic (t^2) easing out:
  176. /// decelerating from zero velocity.
  177. /// </summary>
  178. /// <param name="t">Current time in seconds.</param>
  179. /// <param name="b">Starting value.</param>
  180. /// <param name="c">Final value.</param>
  181. /// <param name="d">Duration of animation.</param>
  182. /// <returns>The correct value.</returns>
  183. public static float QuadEaseOut(float t, float b, float c, float d)
  184. {
  185. return -c*(t /= d)*(t - 2) + b;
  186. }
  187. /// <summary>
  188. /// Easing equation function for a quadratic (t^2) easing in:
  189. /// accelerating from zero velocity.
  190. /// </summary>
  191. /// <param name="t">Current time in seconds.</param>
  192. /// <param name="b">Starting value.</param>
  193. /// <param name="c">Final value.</param>
  194. /// <param name="d">Duration of animation.</param>
  195. /// <returns>The correct value.</returns>
  196. public static float QuadEaseIn(float t, float b, float c, float d)
  197. {
  198. return c*(t /= d)*t + b;
  199. }
  200. /// <summary>
  201. /// Easing equation function for a quadratic (t^2) easing in/out:
  202. /// acceleration until halfway, then deceleration.
  203. /// </summary>
  204. /// <param name="t">Current time in seconds.</param>
  205. /// <param name="b">Starting value.</param>
  206. /// <param name="c">Final value.</param>
  207. /// <param name="d">Duration of animation.</param>
  208. /// <returns>The correct value.</returns>
  209. public static float QuadEaseInOut(float t, float b, float c, float d)
  210. {
  211. if ((t /= d/2) < 1)
  212. {
  213. return c/2*t*t + b;
  214. }
  215. return -c/2*((--t)*(t - 2) - 1) + b;
  216. }
  217. /// <summary>
  218. /// Easing equation function for a quadratic (t^2) easing out/in:
  219. /// deceleration until halfway, then acceleration.
  220. /// </summary>
  221. /// <param name="t">Current time in seconds.</param>
  222. /// <param name="b">Starting value.</param>
  223. /// <param name="c">Final value.</param>
  224. /// <param name="d">Duration of animation.</param>
  225. /// <returns>The correct value.</returns>
  226. public static float QuadEaseOutIn(float t, float b, float c, float d)
  227. {
  228. if (t < d/2)
  229. {
  230. return QuadEaseOut(t*2, b, c/2, d);
  231. }
  232. return QuadEaseIn((t*2) - d, b + c/2, c/2, d);
  233. }
  234. #endregion
  235. #region Sine
  236. /// <summary>
  237. /// Easing equation function for a sinusoidal (sin(t)) easing out:
  238. /// decelerating from zero velocity.
  239. /// </summary>
  240. /// <param name="t">Current time in seconds.</param>
  241. /// <param name="b">Starting value.</param>
  242. /// <param name="c">Final value.</param>
  243. /// <param name="d">Duration of animation.</param>
  244. /// <returns>The correct value.</returns>
  245. public static float SineEaseOut(float t, float b, float c, float d)
  246. {
  247. return c*Mathf.Sin(t/d*(Mathf.PI/2)) + b;
  248. }
  249. /// <summary>
  250. /// Easing equation function for a sinusoidal (sin(t)) easing in:
  251. /// accelerating from zero velocity.
  252. /// </summary>
  253. /// <param name="t">Current time in seconds.</param>
  254. /// <param name="b">Starting value.</param>
  255. /// <param name="c">Final value.</param>
  256. /// <param name="d">Duration of animation.</param>
  257. /// <returns>The correct value.</returns>
  258. public static float SineEaseIn(float t, float b, float c, float d)
  259. {
  260. return -c*Mathf.Cos(t/d*(Mathf.PI/2)) + c + b;
  261. }
  262. /// <summary>
  263. /// Easing equation function for a sinusoidal (sin(t)) easing in/out:
  264. /// acceleration until halfway, then deceleration.
  265. /// </summary>
  266. /// <param name="t">Current time in seconds.</param>
  267. /// <param name="b">Starting value.</param>
  268. /// <param name="c">Final value.</param>
  269. /// <param name="d">Duration of animation.</param>
  270. /// <returns>The correct value.</returns>
  271. public static float SineEaseInOut(float t, float b, float c, float d)
  272. {
  273. if ((t /= d/2) < 1)
  274. {
  275. return c/2*(Mathf.Sin(Mathf.PI*t/2)) + b;
  276. }
  277. return -c/2*(Mathf.Cos(Mathf.PI*--t/2) - 2) + b;
  278. }
  279. /// <summary>
  280. /// Easing equation function for a sinusoidal (sin(t)) easing in/out:
  281. /// deceleration until halfway, then acceleration.
  282. /// </summary>
  283. /// <param name="t">Current time in seconds.</param>
  284. /// <param name="b">Starting value.</param>
  285. /// <param name="c">Final value.</param>
  286. /// <param name="d">Duration of animation.</param>
  287. /// <returns>The correct value.</returns>
  288. public static float SineEaseOutIn(float t, float b, float c, float d)
  289. {
  290. if (t < d/2)
  291. {
  292. return SineEaseOut(t*2, b, c/2, d);
  293. }
  294. return SineEaseIn((t*2) - d, b + c/2, c/2, d);
  295. }
  296. #endregion
  297. #region Cubic
  298. /// <summary>
  299. /// Easing equation function for a cubic (t^3) easing out:
  300. /// decelerating from zero velocity.
  301. /// </summary>
  302. /// <param name="t">Current time in seconds.</param>
  303. /// <param name="b">Starting value.</param>
  304. /// <param name="c">Final value.</param>
  305. /// <param name="d">Duration of animation.</param>
  306. /// <returns>The correct value.</returns>
  307. public static float CubicEaseOut(float t, float b, float c, float d)
  308. {
  309. return c*((t = t/d - 1)*t*t + 1) + b;
  310. }
  311. /// <summary>
  312. /// Easing equation function for a cubic (t^3) easing in:
  313. /// accelerating from zero velocity.
  314. /// </summary>
  315. /// <param name="t">Current time in seconds.</param>
  316. /// <param name="b">Starting value.</param>
  317. /// <param name="c">Final value.</param>
  318. /// <param name="d">Duration of animation.</param>
  319. /// <returns>The correct value.</returns>
  320. public static float CubicEaseIn(float t, float b, float c, float d)
  321. {
  322. return c*(t /= d)*t*t + b;
  323. }
  324. /// <summary>
  325. /// Easing equation function for a cubic (t^3) easing in/out:
  326. /// acceleration until halfway, then deceleration.
  327. /// </summary>
  328. /// <param name="t">Current time in seconds.</param>
  329. /// <param name="b">Starting value.</param>
  330. /// <param name="c">Final value.</param>
  331. /// <param name="d">Duration of animation.</param>
  332. /// <returns>The correct value.</returns>
  333. public static float CubicEaseInOut(float t, float b, float c, float d)
  334. {
  335. if ((t /= d/2) < 1)
  336. {
  337. return c/2*t*t*t + b;
  338. }
  339. return c/2*((t -= 2)*t*t + 2) + b;
  340. }
  341. /// <summary>
  342. /// Easing equation function for a cubic (t^3) easing out/in:
  343. /// deceleration until halfway, then acceleration.
  344. /// </summary>
  345. /// <param name="t">Current time in seconds.</param>
  346. /// <param name="b">Starting value.</param>
  347. /// <param name="c">Final value.</param>
  348. /// <param name="d">Duration of animation.</param>
  349. /// <returns>The correct value.</returns>
  350. public static float CubicEaseOutIn(float t, float b, float c, float d)
  351. {
  352. if (t < d/2)
  353. {
  354. return CubicEaseOut(t*2, b, c/2, d);
  355. }
  356. return CubicEaseIn((t*2) - d, b + c/2, c/2, d);
  357. }
  358. #endregion
  359. #region Quartic
  360. /// <summary>
  361. /// Easing equation function for a quartic (t^4) easing out:
  362. /// decelerating from zero velocity.
  363. /// </summary>
  364. /// <param name="t">Current time in seconds.</param>
  365. /// <param name="b">Starting value.</param>
  366. /// <param name="c">Final value.</param>
  367. /// <param name="d">Duration of animation.</param>
  368. /// <returns>The correct value.</returns>
  369. public static float QuartEaseOut(float t, float b, float c, float d)
  370. {
  371. return -c*((t = t/d - 1)*t*t*t - 1) + b;
  372. }
  373. /// <summary>
  374. /// Easing equation function for a quartic (t^4) easing in:
  375. /// accelerating from zero velocity.
  376. /// </summary>
  377. /// <param name="t">Current time in seconds.</param>
  378. /// <param name="b">Starting value.</param>
  379. /// <param name="c">Final value.</param>
  380. /// <param name="d">Duration of animation.</param>
  381. /// <returns>The correct value.</returns>
  382. public static float QuartEaseIn(float t, float b, float c, float d)
  383. {
  384. return c*(t /= d)*t*t*t + b;
  385. }
  386. /// <summary>
  387. /// Easing equation function for a quartic (t^4) easing in/out:
  388. /// acceleration until halfway, then deceleration.
  389. /// </summary>
  390. /// <param name="t">Current time in seconds.</param>
  391. /// <param name="b">Starting value.</param>
  392. /// <param name="c">Final value.</param>
  393. /// <param name="d">Duration of animation.</param>
  394. /// <returns>The correct value.</returns>
  395. public static float QuartEaseInOut(float t, float b, float c, float d)
  396. {
  397. if ((t /= d/2) < 1)
  398. {
  399. return c/2*t*t*t*t + b;
  400. }
  401. return -c/2*((t -= 2)*t*t*t - 2) + b;
  402. }
  403. /// <summary>
  404. /// Easing equation function for a quartic (t^4) easing out/in:
  405. /// deceleration until halfway, then acceleration.
  406. /// </summary>
  407. /// <param name="t">Current time in seconds.</param>
  408. /// <param name="b">Starting value.</param>
  409. /// <param name="c">Final value.</param>
  410. /// <param name="d">Duration of animation.</param>
  411. /// <returns>The correct value.</returns>
  412. public static float QuartEaseOutIn(float t, float b, float c, float d)
  413. {
  414. if (t < d/2)
  415. {
  416. return QuartEaseOut(t*2, b, c/2, d);
  417. }
  418. return QuartEaseIn((t*2) - d, b + c/2, c/2, d);
  419. }
  420. #endregion
  421. #region Quintic
  422. /// <summary>
  423. /// Easing equation function for a quintic (t^5) easing out:
  424. /// decelerating from zero velocity.
  425. /// </summary>
  426. /// <param name="t">Current time in seconds.</param>
  427. /// <param name="b">Starting value.</param>
  428. /// <param name="c">Final value.</param>
  429. /// <param name="d">Duration of animation.</param>
  430. /// <returns>The correct value.</returns>
  431. public static float QuintEaseOut(float t, float b, float c, float d)
  432. {
  433. return c*((t = t/d - 1)*t*t*t*t + 1) + b;
  434. }
  435. /// <summary>
  436. /// Easing equation function for a quintic (t^5) easing in:
  437. /// accelerating from zero velocity.
  438. /// </summary>
  439. /// <param name="t">Current time in seconds.</param>
  440. /// <param name="b">Starting value.</param>
  441. /// <param name="c">Final value.</param>
  442. /// <param name="d">Duration of animation.</param>
  443. /// <returns>The correct value.</returns>
  444. public static float QuintEaseIn(float t, float b, float c, float d)
  445. {
  446. return c*(t /= d)*t*t*t*t + b;
  447. }
  448. /// <summary>
  449. /// Easing equation function for a quintic (t^5) easing in/out:
  450. /// acceleration until halfway, then deceleration.
  451. /// </summary>
  452. /// <param name="t">Current time in seconds.</param>
  453. /// <param name="b">Starting value.</param>
  454. /// <param name="c">Final value.</param>
  455. /// <param name="d">Duration of animation.</param>
  456. /// <returns>The correct value.</returns>
  457. public static float QuintEaseInOut(float t, float b, float c, float d)
  458. {
  459. if ((t /= d/2) < 1)
  460. {
  461. return c/2*t*t*t*t*t + b;
  462. }
  463. return c/2*((t -= 2)*t*t*t*t + 2) + b;
  464. }
  465. /// <summary>
  466. /// Easing equation function for a quintic (t^5) easing in/out:
  467. /// acceleration until halfway, then deceleration.
  468. /// </summary>
  469. /// <param name="t">Current time in seconds.</param>
  470. /// <param name="b">Starting value.</param>
  471. /// <param name="c">Final value.</param>
  472. /// <param name="d">Duration of animation.</param>
  473. /// <returns>The correct value.</returns>
  474. public static float QuintEaseOutIn(float t, float b, float c, float d)
  475. {
  476. if (t < d/2)
  477. {
  478. return QuintEaseOut(t*2, b, c/2, d);
  479. }
  480. return QuintEaseIn((t*2) - d, b + c/2, c/2, d);
  481. }
  482. #endregion
  483. #region Elastic
  484. /// <summary>
  485. /// Easing equation function for an elastic (exponentially decaying sine wave) easing out:
  486. /// decelerating from zero velocity.
  487. /// </summary>
  488. /// <param name="t">Current time in seconds.</param>
  489. /// <param name="b">Starting value.</param>
  490. /// <param name="c">Final value.</param>
  491. /// <param name="d">Duration of animation.</param>
  492. /// <returns>The correct value.</returns>
  493. public static float ElasticEaseOut(float t, float b, float c, float d)
  494. {
  495. if ((t /= d) == 1)
  496. {
  497. return b + c;
  498. }
  499. var p = d*.3f;
  500. var s = p/4;
  501. return (c*Mathf.Pow(2, -10*t)*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p) + c + b);
  502. }
  503. /// <summary>
  504. /// Easing equation function for an elastic (exponentially decaying sine wave) easing in:
  505. /// accelerating from zero velocity.
  506. /// </summary>
  507. /// <param name="t">Current time in seconds.</param>
  508. /// <param name="b">Starting value.</param>
  509. /// <param name="c">Final value.</param>
  510. /// <param name="d">Duration of animation.</param>
  511. /// <returns>The correct value.</returns>
  512. public static float ElasticEaseIn(float t, float b, float c, float d)
  513. {
  514. if ((t /= d) == 1)
  515. {
  516. return b + c;
  517. }
  518. var p = d*.3f;
  519. var s = p/4;
  520. return -(c*Mathf.Pow(2, 10*(t -= 1))*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p)) + b;
  521. }
  522. /// <summary>
  523. /// Easing equation function for an elastic (exponentially decaying sine wave) easing in/out:
  524. /// acceleration until halfway, then deceleration.
  525. /// </summary>
  526. /// <param name="t">Current time in seconds.</param>
  527. /// <param name="b">Starting value.</param>
  528. /// <param name="c">Final value.</param>
  529. /// <param name="d">Duration of animation.</param>
  530. /// <returns>The correct value.</returns>
  531. public static float ElasticEaseInOut(float t, float b, float c, float d)
  532. {
  533. if ((t /= d/2) == 2)
  534. {
  535. return b + c;
  536. }
  537. var p = d*(.3f*1.5f);
  538. var s = p/4;
  539. if (t < 1)
  540. {
  541. return -.5f*(c*Mathf.Pow(2, 10*(t -= 1))*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p)) + b;
  542. }
  543. return c*Mathf.Pow(2, -10*(t -= 1))*Mathf.Sin((t*d - s)*(2*Mathf.PI)/p)*.5f + c + b;
  544. }
  545. /// <summary>
  546. /// Easing equation function for an elastic (exponentially decaying sine wave) easing out/in:
  547. /// deceleration until halfway, then acceleration.
  548. /// </summary>
  549. /// <param name="t">Current time in seconds.</param>
  550. /// <param name="b">Starting value.</param>
  551. /// <param name="c">Final value.</param>
  552. /// <param name="d">Duration of animation.</param>
  553. /// <returns>The correct value.</returns>
  554. public static float ElasticEaseOutIn(float t, float b, float c, float d)
  555. {
  556. if (t < d/2)
  557. {
  558. return ElasticEaseOut(t*2, b, c/2, d);
  559. }
  560. return ElasticEaseIn((t*2) - d, b + c/2, c/2, d);
  561. }
  562. #endregion
  563. #region Bounce
  564. /// <summary>
  565. /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out:
  566. /// decelerating from zero velocity.
  567. /// </summary>
  568. /// <param name="t">Current time in seconds.</param>
  569. /// <param name="b">Starting value.</param>
  570. /// <param name="c">Final value.</param>
  571. /// <param name="d">Duration of animation.</param>
  572. /// <returns>The correct value.</returns>
  573. public static float BounceEaseOut(float t, float b, float c, float d)
  574. {
  575. if ((t /= d) < (1/2.75f))
  576. {
  577. return c*(7.5625f*t*t) + b;
  578. }
  579. if (t < (2/2.75))
  580. {
  581. return c*(7.5625f*(t -= (1.5f/2.75f))*t + .75f) + b;
  582. }
  583. if (t < (2.5/2.75))
  584. {
  585. return c*(7.5625f*(t -= (2.25f/2.75f))*t + .9375f) + b;
  586. }
  587. return c*(7.5625f*(t -= (2.625f/2.75f))*t + .984375f) + b;
  588. }
  589. /// <summary>
  590. /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in:
  591. /// accelerating from zero velocity.
  592. /// </summary>
  593. /// <param name="t">Current time in seconds.</param>
  594. /// <param name="b">Starting value.</param>
  595. /// <param name="c">Final value.</param>
  596. /// <param name="d">Duration of animation.</param>
  597. /// <returns>The correct value.</returns>
  598. public static float BounceEaseIn(float t, float b, float c, float d)
  599. {
  600. return c - BounceEaseOut(d - t, 0, c, d) + b;
  601. }
  602. /// <summary>
  603. /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out:
  604. /// acceleration until halfway, then deceleration.
  605. /// </summary>
  606. /// <param name="t">Current time in seconds.</param>
  607. /// <param name="b">Starting value.</param>
  608. /// <param name="c">Final value.</param>
  609. /// <param name="d">Duration of animation.</param>
  610. /// <returns>The correct value.</returns>
  611. public static float BounceEaseInOut(float t, float b, float c, float d)
  612. {
  613. if (t < d/2)
  614. {
  615. return BounceEaseIn(t*2, 0, c, d)*.5f + b;
  616. }
  617. return BounceEaseOut(t*2 - d, 0, c, d)*.5f + c*.5f + b;
  618. }
  619. /// <summary>
  620. /// Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out/in:
  621. /// deceleration until halfway, then acceleration.
  622. /// </summary>
  623. /// <param name="t">Current time in seconds.</param>
  624. /// <param name="b">Starting value.</param>
  625. /// <param name="c">Final value.</param>
  626. /// <param name="d">Duration of animation.</param>
  627. /// <returns>The correct value.</returns>
  628. public static float BounceEaseOutIn(float t, float b, float c, float d)
  629. {
  630. if (t < d/2)
  631. {
  632. return BounceEaseOut(t*2, b, c/2, d);
  633. }
  634. return BounceEaseIn((t*2) - d, b + c/2, c/2, d);
  635. }
  636. #endregion
  637. #region Back
  638. /// <summary>
  639. /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out:
  640. /// decelerating from zero velocity.
  641. /// </summary>
  642. /// <param name="t">Current time in seconds.</param>
  643. /// <param name="b">Starting value.</param>
  644. /// <param name="c">Final value.</param>
  645. /// <param name="d">Duration of animation.</param>
  646. /// <returns>The correct value.</returns>
  647. public static float BackEaseOut(float t, float b, float c, float d)
  648. {
  649. return c*((t = t/d - 1)*t*((1.70158f + 1)*t + 1.70158f) + 1) + b;
  650. }
  651. /// <summary>
  652. /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in:
  653. /// accelerating from zero velocity.
  654. /// </summary>
  655. /// <param name="t">Current time in seconds.</param>
  656. /// <param name="b">Starting value.</param>
  657. /// <param name="c">Final value.</param>
  658. /// <param name="d">Duration of animation.</param>
  659. /// <returns>The correct value.</returns>
  660. public static float BackEaseIn(float t, float b, float c, float d)
  661. {
  662. return c*(t /= d)*t*((1.70158f + 1)*t - 1.70158f) + b;
  663. }
  664. /// <summary>
  665. /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in/out:
  666. /// acceleration until halfway, then deceleration.
  667. /// </summary>
  668. /// <param name="t">Current time in seconds.</param>
  669. /// <param name="b">Starting value.</param>
  670. /// <param name="c">Final value.</param>
  671. /// <param name="d">Duration of animation.</param>
  672. /// <returns>The correct value.</returns>
  673. public static float BackEaseInOut(float t, float b, float c, float d)
  674. {
  675. var s = 1.70158f;
  676. if ((t /= d/2) < 1)
  677. {
  678. return c/2*(t*t*(((s *= (1.525f)) + 1)*t - s)) + b;
  679. }
  680. return c/2*((t -= 2)*t*(((s *= (1.525f)) + 1)*t + s) + 2) + b;
  681. }
  682. /// <summary>
  683. /// Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in:
  684. /// deceleration until halfway, then acceleration.
  685. /// </summary>
  686. /// <param name="t">Current time in seconds.</param>
  687. /// <param name="b">Starting value.</param>
  688. /// <param name="c">Final value.</param>
  689. /// <param name="d">Duration of animation.</param>
  690. /// <returns>The correct value.</returns>
  691. public static float BackEaseOutIn(float t, float b, float c, float d)
  692. {
  693. if (t < d/2)
  694. {
  695. return BackEaseOut(t*2, b, c/2, d);
  696. }
  697. return BackEaseIn((t*2) - d, b + c/2, c/2, d);
  698. }
  699. #endregion
  700. #endregion
  701. }
  702. }