Cogs.Core
EasingFn.cpp
1#include "EasingFn.h"
2
3#include "Setup.hpp"
4
5#include <glm/glm.hpp>
6#include <glm/gtc/constants.hpp>
7#include <cmath>
8
9float Cogs::EasingFn::linear(float t) {
10 return t;
11}
12
13float Cogs::EasingFn::quadraticIn(float t) {
14 return t * t;
15}
16
17float Cogs::EasingFn::quadraticOut(float t) {
18 return t * (2.0f - t);
19}
20
21float Cogs::EasingFn::quadraticInOut(float t) {
22 t *= 2.0f;
23
24 if (t < 1.0f) {
25 return 0.5f * t * t;
26 }
27
28 t -= 1.0f;
29 return -0.5f * (t * (t - 2.0f) - 1.0f);
30}
31
32float Cogs::EasingFn::cubicIn(float t) {
33 return t * t * t;
34}
35
36float Cogs::EasingFn::cubicOut(float t) {
37 t -= 1.0f;
38 return (t * t * t) + 1.0f;
39}
40
41float Cogs::EasingFn::cubicInOut(float t) {
42 t *= 2.0f;
43
44 if (t < 1.0f) {
45 return 0.5f * t * t * t;
46 }
47
48 t -= 2.0f;
49 return 0.5f * ((t * t * t) + 2.0f);
50}
51
52float Cogs::EasingFn::quarticIn(float t) {
53 return t * t * t * t;
54}
55
56float Cogs::EasingFn::quarticOut(float t) {
57 t -= 1;
58 return 1 - (t * t * t * t);
59}
60
61float Cogs::EasingFn::quarticInOut(float t) {
62 t *= 2.0f;
63
64 if (t < 1.0f) {
65 return 0.5f * t * t * t * t;
66 }
67
68 t -= 2.0f;
69 return -0.5f * ((t * t * t * t) - 2.0f);
70}
71
72float Cogs::EasingFn::quinticIn(float t) {
73 return t * t * t * t * t;
74}
75
76float Cogs::EasingFn::quinticOut(float t) {
77 t -= 1.0f;
78 return (t * t * t * t * t) + 1.0f;
79}
80
81float Cogs::EasingFn::quinticInOut(float t) {
82 t *= 2.0f;
83
84 if (t < 1.0f) {
85 return 0.5f * t * t * t * t * t;
86 }
87
88 t -= 2.0f;
89 return 0.5f * ((t * t * t * t * t) + 2.0f);
90}
91
92float Cogs::EasingFn::sinusoidalIn(float t) {
93 return 1.0f - std::cos(t * glm::pi<float>() * 0.5f);
94}
95
96float Cogs::EasingFn::sinusoidalOut(float t) {
97 return std::sin(t * glm::pi<float>() * 0.5f);
98}
99
100float Cogs::EasingFn::sinusoidalInOut(float t) {
101 return 0.5f * (1.0f - std::cos(glm::pi<float>() * t));
102}
103
104float Cogs::EasingFn::exponentialIn(float t) {
105 return (t == 0.0f) ? 0.0f : std::pow(1024.0f, t - 1.0f);
106}
107
108float Cogs::EasingFn::exponentialOut(float t) {
109 return (t == 1.0f) ? 1.0f : (1.0f - std::pow(2.0f, -10.0f * t));
110}
111
112float Cogs::EasingFn::exponentialInOut(float t) {
113 if (t == 0.0f) {
114 return 0.0f;
115 }
116 else if (t == 1.0f) {
117 return 1.0f;
118 }
119
120 t *= 2.0f;
121
122 if (t < 1.0f) {
123 return 0.5f * std::pow(1024.0f, t - 1.0f);
124 }
125 return 0.5f * (-std::pow(2.0f, -10.0f * (t - 1.0f)) + 2.0f);
126}
127
128float Cogs::EasingFn::circularIn(float t) {
129 return 1.0f - std::sqrt(1.0f - (t * t));
130}
131
132float Cogs::EasingFn::circularOut(float t) {
133 t -= 1.0f;
134 return std::sqrt(1.0f - (t * t));
135}
136
137float Cogs::EasingFn::circularInOut(float t) {
138 t *= 2.0f;
139
140 if (t < 1.0f) {
141 return -0.5f * (std::sqrt(1.0f - (t * t)) - 1.0f);
142 }
143 t -= 2.0f;
144 return 0.5f * (std::sqrt(1.0f - (t * t)) + 1.0f);
145}
146
147float Cogs::EasingFn::elasticIn(float t) {
148 if (t == 0.0f) {
149 return 0.0f;
150 }
151 else if (t == 1.0f) {
152 return 1.0f;
153 }
154
155 t -= 1.0f;
156 return -std::pow(2.0f, 10.0f * t) * std::sin((t - 0.1f) * (2.0f * glm::pi<float>()) * 2.5f);
157}
158
159float Cogs::EasingFn::elasticOut(float t) {
160 if (t == 0.0f) {
161 return 0.0f;
162 }
163 else if (t == 1.0f) {
164 return 1.0f;
165 }
166
167 return (std::pow(2.0f, -10.0f * t) * std::sin((t - 0.1f) * (2.0f * glm::pi<float>()) * 2.5f)) + 1.0f;
168}
169
170float Cogs::EasingFn::elasticInOut(float t) {
171 if (t == 0.0f) {
172 return 0.0f;
173 }
174 else if (t == 1.0f) {
175 return 1.0f;
176 }
177
178 t = (t * 2.0f) - 1.0f;
179
180 if (t < 0.0f) {
181 return -0.5f * std::pow(2.0f, 10.0f * t) * std::sin((t - 0.1f) * (2.0f * glm::pi<float>()) * 2.5f);
182 }
183
184 return (std::pow(2.0f, -10.0f * t) * std::sin((t - 0.1f) * (2.0f * glm::pi<float>()) * 2.5f) * 0.5f) + 1.0f;
185}
186
187float Cogs::EasingFn::backIn(float t) {
188 return t * t * ((2.70158f * t) - 1.70158f);
189}
190
191float Cogs::EasingFn::backOut(float t) {
192 t -= 1.0f;
193 return (t * t * ((2.70158f * t) + 1.70158f)) + 1.0f;
194}
195
196float Cogs::EasingFn::backInOut(float t) {
197 float s = 1.70158f * 1.525f;
198
199 t *= 2.0f;
200
201 if (t < 1.0f) {
202 return 0.5f * (t * t * (((s + 1.0f) * t) - s));
203 }
204
205 t -= 2.0f;
206 return 0.5f * (t * t * (((s + 1.0f) * t) + s) + 2.0f);
207}
208
209float Cogs::EasingFn::bounceIn(float t) {
210 return 1.0f - bounceOut(1.0f - t);
211}
212
213float Cogs::EasingFn::bounceOut(float t) {
214 if (t < (1.0f / 2.75f)) {
215 return 7.5625f * t * t;
216 }
217 else if (t < (2.0f / 2.75f)) {
218 t -= 1.5f / 2.75f;
219 return (7.5625f * t * t) + 0.75f;
220 }
221 else if (t < (2.5f / 2.75f)) {
222 t -= 2.25f / 2.75f;
223 return (7.562f * t * t) + 0.9375f;
224 }
225 else {
226 t -= 2.625f / 2.75f;
227 return (7.5625f * t * t) + 0.984375f;
228 }
229}
230
231float Cogs::EasingFn::bounceInOut(float t) {
232 if (t < 0.5f) {
233 return bounceIn(t * 2.0f) * 0.5f;
234 }
235 return (bounceOut((t * 2.0f) - 1.0f) * 0.5f) + 0.5f;
236}