NAP
easing.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 #include <mathutils.h>
8 #include <cmath>
9 
14 namespace nap
15 {
16  namespace math
17  {
18  namespace Back
19  {
20  template <typename T>
21  T easeIn(T t, T b, T c, T d);
22 
23  template <typename T>
24  T easeOut(T t, T b, T c, T d);
25 
26  template <typename T>
27  T easeInOut(T t, T b, T c, T d);
28  }
29 
30  namespace Bounce
31  {
32  template <typename T>
33  T easeIn(T t, T b, T c, T d);
34 
35  template <typename T>
36  T easeOut(T t, T b, T c, T d);
37 
38  template <typename T>
39  T easeInOut(T t, T b, T c, T d);
40  }
41 
42  namespace Circ
43  {
44 
45  template <typename T>
46  T easeIn(T t, T b, T c, T d);
47 
48  template <typename T>
49  T easeOut(T t, T b, T c, T d);
50 
51  template <typename T>
52  T easeInOut(T t, T b, T c, T d);
53  }
54 
55  namespace Cubic
56  {
57 
58  template <typename T>
59  T easeIn(T t, T b, T c, T d);
60 
61  template <typename T>
62  T easeOut(T t, T b, T c, T d);
63 
64  template <typename T>
65  T easeInOut(T t, T b, T c, T d);
66  }
67 
68  namespace Elastic
69  {
70  template <typename T>
71  T easeIn(T t, T b, T c, T d);
72 
73  template <typename T>
74  T easeOut(T t, T b, T c, T d);
75 
76  template <typename T>
77  T easeInOut(T t, T b, T c, T d);
78  }
79 
80  namespace Expo
81  {
82 
83  template <typename T>
84  T easeIn(T t, T b, T c, T d);
85 
86  template <typename T>
87  T easeOut(T t, T b, T c, T d);
88 
89  template <typename T>
90  T easeInOut(T t, T b, T c, T d);
91  }
92 
93  namespace Linear
94  {
95 
96  template <typename T>
97  T easeNone(T t, T b, T c, T d);
98 
99  template <typename T>
100  T easeIn(T t, T b, T c, T d);
101 
102  template <typename T>
103  T easeOut(T t, T b, T c, T d);
104 
105  template <typename T>
106  T easeInOut(T t, T b, T c, T d);
107  }
108 
109  namespace Quad
110  {
111  template <typename T>
112  T easeIn(T t, T b, T c, T d);
113 
114  template <typename T>
115  T easeOut(T t, T b, T c, T d);
116 
117  template <typename T>
118  T easeInOut(T t, T b, T c, T d);
119  }
120 
121  namespace Quart
122  {
123  template <typename T>
124  T easeIn(T t, T b, T c, T d);
125 
126  template <typename T>
127  T easeOut(T t, T b, T c, T d);
128 
129  template <typename T>
130  T easeInOut(T t, T b, T c, T d);
131  }
132 
133  namespace Quint
134  {
135  template <typename T>
136  T easeIn(T t, T b, T c, T d);
137 
138  template <typename T>
139  T easeOut(T t, T b, T c, T d);
140 
141  template <typename T>
142  T easeInOut(T t, T b, T c, T d);
143  }
144 
145  namespace Sine
146  {
147 
148  template <typename T>
149  T easeIn(T t, T b, T c, T d);
150 
151  template <typename T>
152  T easeOut(T t, T b, T c, T d);
153 
154  template <typename T>
155  T easeInOut(T t, T b, T c, T d);
156  }
157  }
158 }
159 
161 // Definitions
163 
164 template <typename T>
165 T nap::math::Back::easeIn(T t, T b, T c, T d)
166 {
167  T s = 1.70158f;
168  T postFix = t /= d;
169  return c * (postFix)*t * ((s + 1) * t - s) + b;
170 }
171 
172 
173 template <typename T>
174 T nap::math::Back::easeOut(T t, T b, T c, T d)
175 {
176  T s = 1.70158f;
177  return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
178 }
179 
180 template <typename T>
181 T nap::math::Back::easeInOut(T t, T b, T c, T d)
182 {
183  T s = 1.70158f;
184  if ((t /= d / 2) < 1)
185  return c / 2 * (t * t * (((s *= (1.525f)) + 1) * t - s)) + b;
186  T postFix = t -= 2;
187  return c / 2 * ((postFix)*t * (((s *= (1.525f)) + 1) * t + s) + 2) + b;
188 }
189 
190 template <typename T>
191 T nap::math::Bounce::easeIn(T t, T b, T c, T d)
192 {
193  return c - easeOut<T>(d - t, 0, c, d) + b;
194 }
195 
196 template <typename T>
197 T nap::math::Bounce::easeOut(T t, T b, T c, T d)
198 {
199  if ((t /= d) < (1 / 2.75f)) {
200  return c * (7.5625f * t * t) + b;
201  }
202  else if (t < (2 / 2.75f)) {
203  T postFix = t -= (1.5f / 2.75f);
204  return c * (7.5625f * (postFix)*t + .75f) + b;
205  }
206  else if (t < (2.5 / 2.75)) {
207  T postFix = t -= (2.25f / 2.75f);
208  return c * (7.5625f * (postFix)*t + .9375f) + b;
209  }
210  else {
211  T postFix = t -= (2.625f / 2.75f);
212  return c * (7.5625f * (postFix)*t + .984375f) + b;
213  }
214 }
215 
216 template <typename T>
217 T nap::math::Bounce::easeInOut(T t, T b, T c, T d)
218 {
219  if (t < d / 2)
220  return easeIn<T>(t * 2, 0, c, d) * .5f + b;
221  else
222  return easeOut<T>(t * 2 - d, 0, c, d) * .5f + c * .5f + b;
223 }
224 
225 template <typename T>
226 T nap::math::Circ::easeIn(T t, T b, T c, T d)
227 {
228  return -c * (sqrt(1 - (t /= d) * t) - 1) + b;
229 }
230 
231 template <typename T>
232 T nap::math::Circ::easeOut(T t, T b, T c, T d)
233 {
234  return c * sqrt(1 - (t = t / d - 1) * t) + b;
235 }
236 
237 template <typename T>
238 T nap::math::Circ::easeInOut(T t, T b, T c, T d)
239 {
240  if ((t /= d / 2) < 1)
241  return -c / 2 * (sqrt(1 - t * t) - 1) + b;
242  return c / 2 * (sqrt(1 - t * (t -= 2)) + 1) + b;
243 }
244 
245 template <typename T>
246 T nap::math::Cubic::easeIn(T t, T b, T c, T d)
247 {
248  return c * (t /= d) * t * t + b;
249 }
250 
251 template <typename T>
252 T nap::math::Cubic::easeOut(T t, T b, T c, T d)
253 {
254  return c * ((t = t / d - 1) * t * t + 1) + b;
255 }
256 
257 template <typename T>
258 T nap::math::Cubic::easeInOut(T t, T b, T c, T d)
259 {
260  if ((t /= d / 2) < 1)
261  return c / 2 * t * t * t + b;
262  return c / 2 * ((t -= 2) * t * t + 2) + b;
263 }
264 
265 template <typename T>
266 T nap::math::Elastic::easeIn(T t, T b, T c, T d)
267 {
268  if (t == 0)
269  return b;
270  if ((t /= d) == 1)
271  return b + c;
272  T p = d * .3f;
273  T a = c;
274  T s = p / 4;
275  T postFix = a * pow(2, 10 * (t -= 1)); // this is a fix, again, with post-increment operators
276  return -(postFix * sin((t * d - s) * nap::math::PIX2 / p)) + b;
277 }
278 
279 template <typename T>
280 T nap::math::Elastic::easeOut(T t, T b, T c, T d)
281 {
282  if (t == 0)
283  return b;
284  if ((t /= d) == 1)
285  return b + c;
286  T p = d * .3f;
287  T a = c;
288  T s = p / 4;
289  return (a * pow(2, -10 * t) * sin((t * d - s) * nap::math::PIX2 / p) + c + b);
290 }
291 
292 template <typename T>
293 T nap::math::Elastic::easeInOut(T t, T b, T c, T d)
294 {
295  if (t == 0)
296  return b;
297  if ((t /= d / 2) == 2)
298  return b + c;
299  T p = d * (.3f * 1.5f);
300  T a = c;
301  T s = p / 4;
302 
303  if (t < 1) {
304  T postFix = a * pow(2, 10 * (t -= 1)); // postIncrement is evil
305  return -.5f * (postFix * sin((t * d - s) * nap::math::PIX2 / p)) + b;
306  }
307  T postFix = a * pow(2, -10 * (t -= 1)); // postIncrement is evil
308  return postFix * sin((t * d - s) * nap::math::PIX2 / p) * .5f + c + b;
309 }
310 
311 template <typename T>
312 T nap::math::Expo::easeIn(T t, T b, T c, T d)
313 {
314  return (t == 0) ? b : c * pow(2, 10 * (t / d - 1)) + b;
315 }
316 
317 template <typename T>
318 T nap::math::Expo::easeOut(T t, T b, T c, T d)
319 {
320  return (t == d) ? b + c : c * (-pow(2, -10 * t / d) + 1) + b;
321 }
322 
323 template <typename T>
324 T nap::math::Expo::easeInOut(T t, T b, T c, T d)
325 {
326  if (t == 0)
327  return b;
328  if (t == d)
329  return b + c;
330  if ((t /= d / 2) < 1)
331  return c / 2 * pow(2, 10 * (t - 1)) + b;
332  return c / 2 * (-pow(2, -10 * --t) + 2) + b;
333 }
334 
335 template <typename T>
336 T nap::math::Linear::easeNone(T t, T b, T c, T d)
337 {
338  return c * t / d + b;
339 }
340 
341 template <typename T>
342 T nap::math::Linear::easeIn(T t, T b, T c, T d)
343 {
344  return c * t / d + b;
345 }
346 
347 template <typename T>
348 T nap::math::Linear::easeOut(T t, T b, T c, T d)
349 {
350  return c * t / d + b;
351 }
352 
353 template <typename T>
354 T nap::math::Linear::easeInOut(T t, T b, T c, T d)
355 {
356  return c * t / d + b;
357 }
358 
359 template <typename T>
360 T nap::math::Quad::easeIn(T t, T b, T c, T d)
361 {
362  return c * (t /= d) * t + b;
363 }
364 
365 template <typename T>
366 T nap::math::Quad::easeOut(T t, T b, T c, T d)
367 {
368  return -c * (t /= d) * (t - 2) + b;
369 }
370 
371 template <typename T>
372 T nap::math::Quad::easeInOut(T t, T b, T c, T d)
373 {
374  if ((t /= d / 2) < 1)
375  return ((c / 2) * (t * t)) + b;
376  return -c / 2 * (((t - 2) * (--t)) - 1) + b;
377  /*
378  originally return -c/2 * (((t-2)*(--t)) - 1) + b;
379 
380  I've had to swap (--t)*(t-2) due to diffence in behaviour in
381  pre-increment operators between java and c++, after hours
382  of joy
383  */
384 }
385 
386 template <typename T>
387 T nap::math::Quart::easeIn(T t, T b, T c, T d)
388 {
389  return c * (t /= d) * t * t * t + b;
390 }
391 
392 template <typename T>
393 T nap::math::Quart::easeOut(T t, T b, T c, T d)
394 {
395  return -c * ((t = t / d - 1) * t * t * t - 1) + b;
396 }
397 
398 template <typename T>
399 T nap::math::Quart::easeInOut(T t, T b, T c, T d)
400 {
401  if ((t /= d / 2) < 1)
402  return c / 2 * t * t * t * t + b;
403  return -c / 2 * ((t -= 2) * t * t * t - 2) + b;
404 }
405 
406 template <typename T>
407 T nap::math::Quint::easeIn(T t, T b, T c, T d)
408 {
409  return c * (t /= d) * t * t * t * t + b;
410 }
411 
412 template <typename T>
413 T nap::math::Quint::easeOut(T t, T b, T c, T d)
414 {
415  return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
416 }
417 
418 template <typename T>
419 T nap::math::Quint::easeInOut(T t, T b, T c, T d)
420 {
421  if ((t /= d / 2) < 1)
422  return c / 2 * t * t * t * t * t + b;
423  return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
424 }
425 
426 template <typename T>
427 T nap::math::Sine::easeIn(T t, T b, T c, T d)
428 {
429  return -c * cos(t / d * nap::math::PI_2) + c + b;
430 }
431 
432 template <typename T>
433 T nap::math::Sine::easeOut(T t, T b, T c, T d)
434 {
435  return c * sin(t / d * nap::math::PI_2) + b;
436 }
437 
438 template <typename T>
439 T nap::math::Sine::easeInOut(T t, T b, T c, T d)
440 {
441  return -c / 2 * (cos(nap::math::PI * t / d) - 1) + b;
442 }
nap::math::Quint::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:413
nap::math::Quad::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:372
nap::math::Circ::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:226
nap::math::Cubic::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:246
nap::math::Bounce::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:191
nap::math::Sine::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:439
nap::math::Quad::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:366
nap::math::Expo::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:312
nap::math::Quart::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:387
nap::math::Elastic::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:266
nap::math::Expo::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:324
nap::math::Quint::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:407
nap::math::Elastic::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:293
nap::math::Back::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:181
nap::math::Quart::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:399
nap::math::Expo::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:318
nap::math::Linear::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:354
nap::math::Sine::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:427
nap::math::Linear::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:342
nap::math::Circ::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:238
nap::math::Back::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:174
nap::math::Linear::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:348
nap::math::Circ::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:232
nap::math::PIX2
constexpr double PIX2
Definition: mathutils.h:25
nap::math::Cubic::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:258
nap::ECullMode::Back
@ Back
Cull back facing triangles.
nap::math::PI_2
constexpr double PI_2
Definition: mathutils.h:26
nap::math::Elastic::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:280
nap::math::Cubic::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:252
nap::math::Bounce::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:197
nap::math::PI
constexpr double PI
Definition: mathutils.h:24
nap::math::Back::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:165
nap
Definition: templateapp.h:17
nap::math::Bounce::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:217
nap::math::Quart::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:393
nap::math::Quint::easeInOut
T easeInOut(T t, T b, T c, T d)
Definition: easing.h:419
nap::math::Linear::easeNone
T easeNone(T t, T b, T c, T d)
Definition: easing.h:336
nap::math::Quad::easeIn
T easeIn(T t, T b, T c, T d)
Definition: easing.h:360
nap::math::Sine::easeOut
T easeOut(T t, T b, T c, T d)
Definition: easing.h:433
nap::EShadowMapType::Quad
@ Quad