Pioneer
Loading...
Searching...
No Matches
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
16namespace 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_zero_general(T x, T tol=IEEEFloatTraits< T >::DefaultRelTolerance())
Definition FloatComparison.h:154
IEEEFloatTraits< T >::bool_type is_equal_general(T a, T b, T rel_tol, T abs_tol)
Definition FloatComparison.h:142
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