babylon.easing.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. module BABYLON {
  2. export interface IEasingFunction {
  3. ease(gradient: number): number;
  4. }
  5. export class EasingFunction implements IEasingFunction {
  6. //Statics
  7. private static _EASINGMODE_EASEIN = 0;
  8. private static _EASINGMODE_EASEOUT = 1;
  9. private static _EASINGMODE_EASEINOUT = 2;
  10. public static get EASINGMODE_EASEIN(): number {
  11. return EasingFunction._EASINGMODE_EASEIN;
  12. }
  13. public static get EASINGMODE_EASEOUT(): number {
  14. return EasingFunction._EASINGMODE_EASEOUT;
  15. }
  16. public static get EASINGMODE_EASEINOUT(): number {
  17. return EasingFunction._EASINGMODE_EASEINOUT;
  18. }
  19. // Properties
  20. private _easingMode = EasingFunction.EASINGMODE_EASEIN;
  21. public setEasingMode(easingMode: number) {
  22. var n = Math.min(Math.max(easingMode, 0), 2);
  23. this._easingMode = n;
  24. }
  25. public getEasingMode(): number {
  26. return this._easingMode;
  27. }
  28. public easeInCore(gradient: number): number {
  29. throw new Error('You must implement this method');
  30. }
  31. public ease(gradient: number): number {
  32. switch (this._easingMode) {
  33. case EasingFunction.EASINGMODE_EASEIN:
  34. return this.easeInCore(gradient);
  35. case EasingFunction.EASINGMODE_EASEOUT:
  36. return (1 - this.easeInCore(1 - gradient));
  37. }
  38. if (gradient >= 0.5) {
  39. return (((1 - this.easeInCore((1 - gradient) * 2)) * 0.5) + 0.5);
  40. }
  41. return (this.easeInCore(gradient * 2) * 0.5);
  42. }
  43. }
  44. export class CircleEase extends EasingFunction implements IEasingFunction {
  45. public easeInCore(gradient: number): number {
  46. gradient = Math.max(0, Math.min(1, gradient));
  47. return (1.0 - Math.sqrt(1.0 - (gradient * gradient)));
  48. }
  49. }
  50. export class BackEase extends EasingFunction implements IEasingFunction {
  51. constructor(public amplitude: number = 1) {
  52. super();
  53. }
  54. public easeInCore(gradient: number): number {
  55. var num = Math.max(0, this.amplitude);
  56. return (Math.pow(gradient, 3.0) - ((gradient * num) * Math.sin(3.1415926535897931 * gradient)));
  57. }
  58. }
  59. export class BounceEase extends EasingFunction implements IEasingFunction {
  60. constructor(public bounces: number= 3, public bounciness: number= 2) {
  61. super();
  62. }
  63. public easeInCore(gradient: number): number {
  64. var y = Math.max(0.0, this.bounces);
  65. var bounciness = this.bounciness;
  66. if (bounciness <= 1.0) {
  67. bounciness = 1.001;
  68. }
  69. var num9 = Math.pow(bounciness, y);
  70. var num5 = 1.0 - bounciness;
  71. var num4 = ((1.0 - num9) / num5) + (num9 * 0.5);
  72. var num15 = gradient * num4;
  73. var num65 = Math.log((-num15 * (1.0 - bounciness)) + 1.0) / Math.log(bounciness);
  74. var num3 = Math.floor(num65);
  75. var num13 = num3 + 1.0;
  76. var num8 = (1.0 - Math.pow(bounciness, num3)) / (num5 * num4);
  77. var num12 = (1.0 - Math.pow(bounciness, num13)) / (num5 * num4);
  78. var num7 = (num8 + num12) * 0.5;
  79. var num6 = gradient - num7;
  80. var num2 = num7 - num8;
  81. return (((-Math.pow(1.0 / bounciness, y - num3) / (num2 * num2)) * (num6 - num2)) * (num6 + num2));
  82. }
  83. }
  84. export class CubicEase extends EasingFunction implements IEasingFunction {
  85. public easeInCore(gradient: number): number {
  86. return (gradient * gradient * gradient);
  87. }
  88. }
  89. export class ElasticEase extends EasingFunction implements IEasingFunction {
  90. constructor(public oscillations: number= 3, public springiness: number= 3) {
  91. super();
  92. }
  93. public easeInCore(gradient: number): number {
  94. var num2;
  95. var num3 = Math.max(0.0, this.oscillations);
  96. var num = Math.max(0.0, this.springiness);
  97. if (num == 0) {
  98. num2 = gradient;
  99. }else {
  100. num2 = (Math.exp(num * gradient) - 1.0) / (Math.exp(num) - 1.0);
  101. }
  102. return (num2 * Math.sin(((6.2831853071795862 * num3) + 1.5707963267948966) * gradient));
  103. }
  104. }
  105. export class ExponentialEase extends EasingFunction implements IEasingFunction {
  106. constructor(public exponent: number= 2) {
  107. super();
  108. }
  109. public easeInCore(gradient: number): number {
  110. if (this.exponent <= 0) {
  111. return gradient;
  112. }
  113. return ((Math.exp(this.exponent * gradient) - 1.0) / (Math.exp(this.exponent) - 1.0));
  114. }
  115. }
  116. export class PowerEase extends EasingFunction implements IEasingFunction {
  117. constructor(public power: number= 2) {
  118. super();
  119. }
  120. public easeInCore(gradient: number): number {
  121. var y = Math.max(0.0, this.power);
  122. return Math.pow(gradient, y);
  123. }
  124. }
  125. export class QuadraticEase extends EasingFunction implements IEasingFunction {
  126. public easeInCore(gradient: number): number {
  127. return (gradient * gradient);
  128. }
  129. }
  130. export class QuarticEase extends EasingFunction implements IEasingFunction {
  131. public easeInCore(gradient: number): number {
  132. return (gradient * gradient * gradient * gradient);
  133. }
  134. }
  135. export class QuinticEase extends EasingFunction implements IEasingFunction {
  136. public easeInCore(gradient: number): number {
  137. return (gradient * gradient * gradient * gradient * gradient);
  138. }
  139. }
  140. export class SineEase extends EasingFunction implements IEasingFunction {
  141. public easeInCore(gradient: number): number {
  142. return (1.0 - Math.sin(1.5707963267948966 * (1.0 - gradient)));
  143. }
  144. }
  145. export class BezierCurveEase extends EasingFunction implements IEasingFunction {
  146. constructor(public x1: number= 0, public y1: number= 0, public x2: number= 1, public y2: number= 1) {
  147. super();
  148. }
  149. public easeInCore(gradient: number): number {
  150. return BezierCurve.interpolate(gradient, this.x1, this.y1, this.x2, this.y2);
  151. }
  152. }
  153. }