Pioneer
Easing.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 // Adapted from Robert Penner's easing equations
5 // and Jesus Gollonet's implementation for C++
6 //
7 // http://www.robertpenner.com/easing/
8 // https://github.com/jesusgollonet/ofpennereasing
9 
10 #ifndef EASING_H
11 #define EASING_H
12 
13 #include "FloatComparison.h"
14 #include <cmath>
15 
16 namespace Easing {
17 
18  // args are:
19  // t: time point to calculate
20  // b: value at beginning of range
21  // c: change over range (ie end-begin)
22  // d: duration of range
23 
24  template <typename T>
25  struct Function {
26  typedef T (*Type)(T t, T b, T c, T d);
27  };
28 
29  // p(t) = t
30  namespace Linear {
31  template <typename T>
32  T EaseIn(T t, T b, T c, T d)
33  {
34  return c * t / d + b;
35  }
36  template <typename T>
37  T EaseOut(T t, T b, T c, T d)
38  {
39  return c * t / d + b;
40  }
41  template <typename T>
42  T EaseInOut(T t, T b, T c, T d)
43  {
44  return c * t / d + b;
45  }
46  } // namespace Linear
47 
48  // p(t) = t^2
49  namespace Quad {
50  template <typename T>
51  T EaseIn(T t, T b, T c, T d)
52  {
53  t /= d;
54  return c * t * t + b;
55  }
56  template <typename T>
57  T EaseOut(T t, T b, T c, T d)
58  {
59  t /= d;
60  return -c * t * (t - 2) + b;
61  }
62  template <typename T>
63  T EaseInOut(T t, T b, T c, T d)
64  {
65  t /= d / 2;
66  if (t < 1) return ((c / 2) * (t * t)) + b;
67  return -c / 2 * ((t - 1) * (t - 3) - 1) + b;
68  }
69  } // namespace Quad
70 
71  // p(t) = t^3
72  namespace Cubic {
73  template <typename T>
74  T EaseIn(T t, T b, T c, T d)
75  {
76  t /= d;
77  return c * t * t * t + b;
78  }
79  template <typename T>
80  T EaseOut(T t, T b, T c, T d)
81  {
82  t = t / d - 1;
83  return c * (t * t * t + 1) + b;
84  }
85  template <typename T>
86  T EaseInOut(T t, T b, T c, T d)
87  {
88  t /= d / 2;
89  if (t < 1) return c / 2 * t * t * t + b;
90  t -= 2;
91  return c / 2 * (t * t * t + 2) + b;
92  }
93  } // namespace Cubic
94 
95  // p(t) = t^4
96  namespace Quart {
97  template <typename T>
98  T EaseIn(T t, T b, T c, T d)
99  {
100  t /= d;
101  return c * t * t * t * t + b;
102  }
103  template <typename T>
104  T EaseOut(T t, T b, T c, T d)
105  {
106  t = t / d - 1;
107  return -c * (t * t * t * t - 1) + b;
108  }
109  template <typename T>
110  T EaseInOut(T t, T b, T c, T d)
111  {
112  t /= d / 2;
113  if (t < 1) return c / 2 * t * t * t * t + b;
114  t -= 2;
115  return -c / 2 * (t * t * t * t - 2) + b;
116  }
117  } // namespace Quart
118 
119  // p(t) = t^5
120  namespace Quint {
121  template <typename T>
122  T EaseIn(T t, T b, T c, T d)
123  {
124  t /= d;
125  return c * t * t * t * t * t + b;
126  }
127  template <typename T>
128  T EaseOut(T t, T b, T c, T d)
129  {
130  t = t / d - 1;
131  return c * (t * t * t * t * t + 1) + b;
132  }
133  template <typename T>
134  T EaseInOut(T t, T b, T c, T d)
135  {
136  t /= d / 2;
137  if (t < 1) return c / 2 * t * t * t * t * t + b;
138  t -= 2;
139  return c / 2 * (t * t * t * t * t + 2) + b;
140  }
141  } // namespace Quint
142 
143  // p(t) = sin(t*pi/2)
144  namespace Sine {
145  template <typename T>
146  T EaseIn(T t, T b, T c, T d)
147  {
148  return -c * cos(t / d * (M_PI / 2)) + c + b;
149  }
150  template <typename T>
151  T EaseOut(T t, T b, T c, T d)
152  {
153  return c * sin(t / d * (M_PI / 2)) + b;
154  }
155  template <typename T>
156  T EaseInOut(T t, T b, T c, T d)
157  {
158  return -c / 2 * (cos(M_PI * t / d) - 1) + b;
159  }
160  } // namespace Sine
161 
162  // p(t) = 2^(10*(t-1))
163  namespace Expo {
164  template <typename T>
165  T EaseIn(T t, T b, T c, T d)
166  {
167  return (is_zero_general(t)) ? b : c * pow(2, 10 * (t / d - 1)) + b;
168  }
169  template <typename T>
170  T EaseOut(T t, T b, T c, T d)
171  {
172  return (is_equal_general(t, d)) ? b + c : c * (-pow(2, -10 * t / d) + 1) + b;
173  }
174  template <typename T>
175  T EaseInOut(T t, T b, T c, T d)
176  {
177  if (is_zero_general(t)) return b;
178  if (is_equal_general(t, d)) return b + c;
179  t /= d / 2;
180  if (t < 1) return c / 2 * pow(2, 10 * (t - 1)) + b;
181  return c / 2 * (-pow(2, -10 * --t) + 2) + b;
182  }
183  } // namespace Expo
184 
185  // p(t) = 1-sqrt(1-t^2)
186  namespace Circ {
187  template <typename T>
188  T EaseIn(T t, T b, T c, T d)
189  {
190  t /= d;
191  return -c * (sqrt(1 - t * t) - 1) + b;
192  }
193  template <typename T>
194  T EaseOut(T t, T b, T c, T d)
195  {
196  t /= d;
197  return c * (sqrt(1 - (t - 1) * (t - 1))) + b;
198  }
199  template <typename T>
200  T EaseInOut(T t, T b, T c, T d)
201  {
202  t /= d / 2;
203  if (t < 1) return -c / 2 * (sqrt(1 - t * t) - 1) + b;
204  return c / 2 * (sqrt(1 - (t - 2) * (t - 2)) + 1) + b;
205  }
206  } // namespace Circ
207 
208 } // namespace Easing
209 
210 #endif
IEEEFloatTraits< T >::bool_type is_equal_general(T a, T b, T rel_tol, T abs_tol)
Definition: FloatComparison.h:142
IEEEFloatTraits< T >::bool_type is_zero_general(T x, T tol=IEEEFloatTraits< T >::DefaultRelTolerance())
Definition: FloatComparison.h:154
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:188
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:200
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:194
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:80
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:86
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:74
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:175
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:170
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:165
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:42
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:32
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:37
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:63
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:51
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:57
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:110
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:104
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:98
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:122
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:128
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:134
T EaseOut(T t, T b, T c, T d)
Definition: Easing.h:151
T EaseIn(T t, T b, T c, T d)
Definition: Easing.h:146
T EaseInOut(T t, T b, T c, T d)
Definition: Easing.h:156
Definition: Easing.h:16
Definition: Easing.h:25
T(* Type)(T t, T b, T c, T d)
Definition: Easing.h:26