FuncDoodle
Loading...
Searching...
No Matches
Anim.h
Go to the documentation of this file.
1#pragma once
2
3namespace FuncDoodle {
4 namespace Anim {
5 constexpr float PI = 3.14159265358979323846;
6 constexpr float C1 = 1.70158;
7 constexpr float C2 = C1 * 1.525;
8 constexpr float C3 = C1 + 1.0;
9 constexpr float C4 = (2.0 * PI) / 3.0;
10 constexpr float C5 = (2.0 * PI) / 4.5;
11
23 inline double Animate(bool forward, double duration, double& from,
24 double dt, double (*ease)(double)) {
25 from = std::clamp(from + (forward ? dt : -dt), 0.0, duration);
26 return ease(from / duration);
27 }
28
29 // thats so springy, mate (springimate) (heheheheheheheheheheheheheh)
44 inline double Springimate(double& v, double& current, double target,
45 double stiffness, double damping, double dt) {
46 double force = (target - current) * stiffness - v * damping;
47 v += force * dt;
48 current += v * dt;
49 return current;
50 }
51
52 // Linear
53 inline double Linear(double t) {
54 return t;
55 }
56
57 // Sine
58 inline double InSine(double t) {
59 return 1.0 - cosf(t * PI / 2.0);
60 }
61 inline double OutSine(double t) {
62 return sinf(t * PI / 2.0);
63 }
64 inline double InOutSine(double t) {
65 return -(cosf(PI * t) - 1.0) / 2.0;
66 }
67
68 // Quad
69 inline double InQuad(double t) {
70 return t * t;
71 }
72 inline double OutQuad(double t) {
73 return 1.0 - (1.0 - t) * (1.0 - t);
74 }
75 inline double InOutQuad(double t) {
76 return t < 0.5 ? 2.0 * t * t
77 : 1.0 - powf(-2.0 * t + 2.0, 2.0) / 2.0;
78 }
79
80 // Cubic
81 inline double InCubic(double t) {
82 return t * t * t;
83 }
84 inline double OutCubic(double t) {
85 return 1.0 - powf(1.0 - t, 3.0);
86 }
87 inline double InOutCubic(double t) {
88 return t < 0.5 ? 4.0 * t * t * t
89 : 1.0 - powf(-2.0 * t + 2.0, 3.0) / 2.0;
90 }
91
92 // Quart
93 inline double InQuart(double t) {
94 return t * t * t * t;
95 }
96 inline double OutQuart(double t) {
97 return 1.0 - powf(1.0 - t, 4.0);
98 }
99 inline double InOutQuart(double t) {
100 return t < 0.5 ? 8.0 * t * t * t * t
101 : 1.0 - powf(-2.0 * t + 2.0, 4.0) / 2.0;
102 }
103
104 // Quint
105 inline double InQuint(double t) {
106 return t * t * t * t * t;
107 }
108 inline double OutQuint(double t) {
109 return 1.0 - powf(1.0 - t, 5.0);
110 }
111 inline double InOutQuint(double t) {
112 return t < 0.5 ? 16.0 * t * t * t * t * t
113 : 1.0 - powf(-2.0 * t + 2.0, 5.0) / 2.0;
114 }
115
116 // Expo
117 inline double InExpo(double t) {
118 return t == 0.0 ? 0.0 : powf(2.0, 10.0 * t - 10.0);
119 }
120 inline double OutExpo(double t) {
121 return t == 1.0 ? 1.0 : 1.0 - powf(2.0, -10.0 * t);
122 }
123 inline double InOutExpo(double t) {
124 if (t == 0.0)
125 return 0.0;
126 if (t == 1.0)
127 return 1.0;
128 return t < 0.5 ? powf(2.0, 20.0 * t - 10.0) / 2.0
129 : (2.0 - powf(2.0, -20.0 * t + 10.0)) / 2.0;
130 }
131
132 // Circ
133 inline double InCirc(double t) {
134 return 1.0 - sqrtf(1.0 - t * t);
135 }
136 inline double OutCirc(double t) {
137 return sqrtf(1.0 - powf(t - 1.0, 2.0));
138 }
139 inline double InOutCirc(double t) {
140 return t < 0.5
141 ? (1.0 - sqrtf(1.0 - powf(2.0 * t, 2.0))) / 2.0
142 : (sqrtf(1.0 - powf(-2.0 * t + 2.0, 2.0)) + 1.0) / 2.0;
143 }
144
145 // Back
146 inline double InBack(double t) {
147 return C3 * t * t * t - C1 * t * t;
148 }
149 inline double OutBack(double t) {
150 return 1.0 + C3 * powf(t - 1.0, 3.0) + C1 * powf(t - 1.0, 2.0);
151 }
152 inline double InOutBack(double t) {
153 return t < 0.5
154 ? (powf(2.0 * t, 2.0) * ((C2 + 1.0) * 2.0 * t - C2)) /
155 2.0
156 : (powf(2.0 * t - 2.0, 2.0) *
157 ((C2 + 1.0) * (2.0 * t - 2.0) + C2) +
158 2.0) /
159 2.0;
160 }
161
162 // Elastic
163 inline double InElastic(double t) {
164 if (t == 0.0)
165 return 0.0;
166 if (t == 1.0)
167 return 1.0;
168 return -powf(2.0, 10.0 * t - 10.0) * sinf((t * 10.0 - 10.75) * C4);
169 }
170 inline double OutElastic(double t) {
171 if (t == 0.0)
172 return 0.0;
173 if (t == 1.0)
174 return 1.0;
175 return powf(2.0, -10.0 * t) * sinf((t * 10.0 - 0.75) * C4) + 1.0;
176 }
177 inline double InOutElastic(double t) {
178 if (t == 0.0)
179 return 0.0;
180 if (t == 1.0)
181 return 1.0;
182 return t < 0.5 ? -(powf(2.0, 20.0 * t - 10.0) *
183 sinf((20.0 * t - 11.125) * C5)) /
184 2.0
185 : (powf(2.0, -20.0 * t + 10.0) *
186 sinf((20.0 * t - 11.125) * C5)) /
187 2.0 +
188 1.0;
189 }
190
191 // Bounce
192 inline double OutBounce(double t) {
193 constexpr double n1 = 7.5625, d1 = 2.75;
194 if (t < 1.0 / d1)
195 return n1 * t * t;
196 if (t < 2.0 / d1) {
197 t -= 1.5 / d1;
198 return n1 * t * t + 0.75;
199 }
200 if (t < 2.5 / d1) {
201 t -= 2.25 / d1;
202 return n1 * t * t + 0.9375;
203 }
204 t -= 2.625 / d1;
205 return n1 * t * t + 0.984375;
206 }
207
208 inline double InBounce(double t) {
209 return 1.0 - OutBounce(1.0 - t);
210 }
211 inline double InOutBounce(double t) {
212 return t < 0.5 ? (1.0 - OutBounce(1.0 - 2.0 * t)) / 2.0
213 : (1.0 + OutBounce(2.0 * t - 1.0)) / 2.0;
214 }
215
216 // Steps
217 inline double StepStart(double t) {
218 return t > 0.0 ? 1.0 : 0.0;
219 }
220 inline double StepEnd(double t) {
221 return t >= 1.0 ? 1.0 : 0.0;
222 }
223 inline double Steps(double t, int steps) {
224 return floorf(t * (double)steps) / (double)steps;
225 }
226
227 // Smooth
228 inline double SmoothStep(double t) {
229 return t * t * (3.0 - 2.0 * t);
230 }
231 inline double SmootherStep(double t) {
232 return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
233 }
234
235 // Spring (simple damped)
236 inline double Spring(double t, double mass = 1.0,
237 double stiffness = 100.0, double damping = 10.0) {
238 double w = sqrtf(stiffness / mass);
239 double d = damping / (2.0 * mass);
240 if (d < w) {
241 double wd = sqrtf(w * w - d * d);
242 return 1.0 -
243 expf(-d * t) * (cosf(wd * t) + (d / wd) * sinf(wd * t));
244 }
245 return 1.0 - expf(-d * t) * (1.0 + d * t);
246 }
247
248 } // namespace Anim
249} // namespace FuncDoodle
Definition Anim.h:4
double InOutCirc(double t)
Definition Anim.h:139
double OutSine(double t)
Definition Anim.h:61
double InQuad(double t)
Definition Anim.h:69
double StepEnd(double t)
Definition Anim.h:220
double OutCirc(double t)
Definition Anim.h:136
double Linear(double t)
Definition Anim.h:53
double InOutBack(double t)
Definition Anim.h:152
constexpr float C5
Definition Anim.h:10
double OutQuart(double t)
Definition Anim.h:96
double OutQuint(double t)
Definition Anim.h:108
double InElastic(double t)
Definition Anim.h:163
double StepStart(double t)
Definition Anim.h:217
double InOutCubic(double t)
Definition Anim.h:87
double Steps(double t, int steps)
Definition Anim.h:223
double InExpo(double t)
Definition Anim.h:117
double Animate(bool forward, double duration, double &from, double dt, double(*ease)(double))
Definition Anim.h:23
double OutElastic(double t)
Definition Anim.h:170
double SmootherStep(double t)
Definition Anim.h:231
constexpr float C1
Definition Anim.h:6
double InOutBounce(double t)
Definition Anim.h:211
constexpr float PI
Definition Anim.h:5
double InOutSine(double t)
Definition Anim.h:64
constexpr float C3
Definition Anim.h:8
constexpr float C2
Definition Anim.h:7
double InBounce(double t)
Definition Anim.h:208
double SmoothStep(double t)
Definition Anim.h:228
double InOutElastic(double t)
Definition Anim.h:177
double InOutQuint(double t)
Definition Anim.h:111
constexpr float C4
Definition Anim.h:9
double OutExpo(double t)
Definition Anim.h:120
double InSine(double t)
Definition Anim.h:58
double Spring(double t, double mass=1.0, double stiffness=100.0, double damping=10.0)
Definition Anim.h:236
double OutCubic(double t)
Definition Anim.h:84
double OutBounce(double t)
Definition Anim.h:192
double InCubic(double t)
Definition Anim.h:81
double OutQuad(double t)
Definition Anim.h:72
double InBack(double t)
Definition Anim.h:146
double InCirc(double t)
Definition Anim.h:133
double Springimate(double &v, double &current, double target, double stiffness, double damping, double dt)
Definition Anim.h:44
double InOutQuart(double t)
Definition Anim.h:99
double InOutExpo(double t)
Definition Anim.h:123
double InOutQuad(double t)
Definition Anim.h:75
double InQuart(double t)
Definition Anim.h:93
double OutBack(double t)
Definition Anim.h:149
double InQuint(double t)
Definition Anim.h:105
The FuncDoodle C++ namespace.
Definition Common.h:12