You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
5.6 KiB

  1. use super::{angle::Angle, numeric::Float};
  2. pub fn animate<T, F>(low: T, high: T, value: T, f: F) -> T
  3. where
  4. T: Float,
  5. F: FnOnce(T) -> T,
  6. {
  7. low + f(value) * (high - low)
  8. }
  9. pub fn zero<T: Float>(_: T) -> T {
  10. T::zero()
  11. }
  12. pub fn one<T: Float>(_: T) -> T {
  13. T::one()
  14. }
  15. pub fn step<T: Float + Ord>(value: T) -> T {
  16. if value < T::new(0.5) {
  17. T::zero()
  18. } else {
  19. T::one()
  20. }
  21. }
  22. pub fn linear<T: Float>(value: T) -> T {
  23. value
  24. }
  25. pub fn invert<T: Float>(value: T) -> T {
  26. T::one() - value
  27. }
  28. pub fn sinus<T: Float>(value: T) -> T {
  29. Angle::Deg(T::new(360.0) * value)
  30. .into_rad()
  31. .into_inner()
  32. .sin()
  33. }
  34. pub fn cosinus<T: Float>(value: T) -> T {
  35. Angle::Deg(T::new(360.0) * value)
  36. .into_rad()
  37. .into_inner()
  38. .cos()
  39. }
  40. pub fn ease_in_quadric<T: Float>(value: T) -> T {
  41. value * value
  42. }
  43. pub fn ease_in_cubic<T: Float>(value: T) -> T {
  44. value * value * value
  45. }
  46. pub fn ease_in_quartic<T: Float>(value: T) -> T {
  47. value * value * value * value
  48. }
  49. pub fn ease_in_quintic<T: Float>(value: T) -> T {
  50. value * value * value * value * value
  51. }
  52. pub fn ease_in_sinusoidal<T: Float>(value: T) -> T {
  53. Angle::Deg(T::new(90.0) * value + T::one())
  54. .into_rad()
  55. .into_inner()
  56. .cos()
  57. .neg()
  58. }
  59. pub fn ease_in_circular<T: Float + Ord>(value: T) -> T {
  60. if value > T::one() {
  61. T::one()
  62. } else {
  63. T::one() - (T::one() - value * value)
  64. }
  65. }
  66. pub fn ease_in_back_cubic<T: Float>(value: T) -> T {
  67. T::new(4.0) * value * value * value - T::new(3.0) * value * value
  68. }
  69. pub fn ease_in_back_quadric<T: Float>(value: T) -> T {
  70. T::new(2.0) * value * value * value * value + T::new(2.0) * value * value * value
  71. - T::new(3.0) * value * value
  72. }
  73. pub fn ease_in_elastic_small<T: Float>(value: T) -> T {
  74. T::new(33.0) * value * value * value * value * value
  75. - T::new(59.0) * value * value * value * value
  76. + T::new(32.0) * value * value * value
  77. - T::new(5.0) * value * value
  78. }
  79. pub fn ease_in_elastic_big<T: Float>(value: T) -> T {
  80. T::new(56.0) * value * value * value * value * value
  81. - T::new(105.0) * value * value * value * value
  82. + T::new(60.0) * value * value * value
  83. - T::new(10.0) * value * value
  84. }
  85. pub fn ease_out_quadric<T: Float>(value: T) -> T {
  86. -value * (value - T::new(2.0))
  87. }
  88. pub fn ease_out_cubic<T: Float>(value: T) -> T {
  89. let value = value - T::one();
  90. value * value * value + T::one()
  91. }
  92. pub fn ease_out_quartic<T: Float>(value: T) -> T {
  93. let value = value - T::one();
  94. -value * value * value * value + T::one()
  95. }
  96. pub fn ease_out_quintic<T: Float>(value: T) -> T {
  97. let value = value - T::one();
  98. value * value * value * value * value + T::one()
  99. }
  100. pub fn ease_out_sinusoidal<T: Float>(value: T) -> T {
  101. Angle::Deg(T::new(90.0) * value)
  102. .into_rad()
  103. .into_inner()
  104. .sin()
  105. }
  106. pub fn ease_out_circular<T: Float + Ord>(value: T) -> T {
  107. if value < T::zero() {
  108. T::zero()
  109. } else {
  110. let value = value - T::one();
  111. (T::one() - value * value).sqrt()
  112. }
  113. }
  114. pub fn ease_out_back_cubic<T: Float>(value: T) -> T {
  115. T::new(4.0) * value * value * value - T::new(9.0) * value * value + T::new(6.0) * value
  116. }
  117. pub fn ease_out_back_quadric<T: Float>(value: T) -> T {
  118. -T::new(2.0) * value * value * value * value + T::new(10.0) * value * value * value
  119. - T::new(15.0) * value * value
  120. + T::new(8.0) * value
  121. }
  122. pub fn ease_out_elastic_small<T: Float>(value: T) -> T {
  123. T::new(33.0) * value * value * value * value * value
  124. - T::new(106.0) * value * value * value * value
  125. + T::new(126.0) * value * value * value
  126. - T::new(67.0) * value * value
  127. + T::new(15.0) * value
  128. }
  129. pub fn ease_out_elastic_big<T: Float>(value: T) -> T {
  130. T::new(56.0) * value * value * value * value * value
  131. - T::new(175.0) * value * value * value * value
  132. + T::new(200.0) * value * value * value
  133. - T::new(100.0) * value * value
  134. + T::new(20.0) * value
  135. }
  136. pub fn ease_in_out_quadric<T: Float + Ord>(value: T) -> T {
  137. ease_in_out(value, ease_in_quadric, ease_out_quadric)
  138. }
  139. pub fn ease_in_out_cubic<T: Float + Ord>(value: T) -> T {
  140. ease_in_out(value, ease_in_cubic, ease_out_cubic)
  141. }
  142. pub fn ease_in_out_quartic<T: Float + Ord>(value: T) -> T {
  143. ease_in_out(value, ease_in_quartic, ease_out_quartic)
  144. }
  145. pub fn ease_in_out_quintic<T: Float + Ord>(value: T) -> T {
  146. ease_in_out(value, ease_in_quintic, ease_out_quintic)
  147. }
  148. pub fn ease_in_out_sinusodial<T: Float>(value: T) -> T {
  149. -T::new(0.5)
  150. * (Angle::Deg(T::new(180.0) * value)
  151. .into_rad()
  152. .into_inner()
  153. .cos()
  154. - T::one())
  155. }
  156. pub fn ease_in_out_circular<T: Float + Ord>(value: T) -> T {
  157. ease_in_out(value, ease_in_circular, ease_out_circular)
  158. }
  159. pub fn ease_in_out_back_cubic<T: Float + Ord>(value: T) -> T {
  160. ease_in_out(value, ease_in_back_cubic, ease_out_back_cubic)
  161. }
  162. pub fn ease_in_out_back_quadtric<T: Float + Ord>(value: T) -> T {
  163. ease_in_out(value, ease_in_back_quadric, ease_out_back_quadric)
  164. }
  165. pub fn ease_in_out_elasic_small<T: Float + Ord>(value: T) -> T {
  166. ease_in_out(value, ease_in_elastic_small, ease_out_elastic_small)
  167. }
  168. pub fn ease_in_out_elasic_big<T: Float + Ord>(value: T) -> T {
  169. ease_in_out(value, ease_in_elastic_big, ease_out_elastic_big)
  170. }
  171. pub fn ease_in_out<T, F1, F2>(value: T, f1: F1, f2: F2) -> T
  172. where
  173. T: Float + Ord,
  174. F1: FnOnce(T) -> T,
  175. F2: FnOnce(T) -> T,
  176. {
  177. if value < T::new(0.5) {
  178. T::new(0.5) * f1(T::new(2.0) * value)
  179. } else {
  180. T::new(0.5) * f2(T::new(2.0) * (value - T::new(0.5))) + T::new(0.5)
  181. }
  182. }