Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
easing.c
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025-2026 Igal Alkon
2// SPDX-FileCopyrightText: 2026 ALKONTEK <git@alkontek.com>
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <vecmat.h>
6
8 const vm_float_t f,
9 const vm_float_t exp_mult,
10 const vm_float_t sin_mult,
11 const vm_float_t sin_offset,
12 const vm_float_t period)
13{
14 return VECMAT_POW(2, exp_mult * f) * VECMAT_SIN((sin_mult * f - sin_offset) * (2.0f * M_PI) / period);
15}
16
18{
19 return VECMAT_POW(f, n);
20}
21
23{
24 return 1 - VECMAT_POW(1 - f, n);
25}
26
28{
29 return f < 0.5 ? VECMAT_POW(2 * f, n) / 2 : 1 - VECMAT_POW(2 - 2 * f, n) / 2;
30}
31
33{
34 return poly_ease_out(f, 2);
35}
36
38{
39 return poly_ease_in(f, 2);
40}
41
46
48{
49 return poly_ease_out(f, 3);
50}
51
53{
54 return poly_ease_in(f, 3);
55}
56
58{
59 return poly_ease_in_out(f, 3);
60}
61
63{
64 return poly_ease_out(f, 4);
65}
66
68{
69 return poly_ease_in(f, 4);
70}
71
76
78{
79 return poly_ease_out(f, 5);
80}
81
83{
84 return poly_ease_in(f, 5);
85}
86
91
93{
94 return VECMAT_SIN(f * M_PI / 2);
95}
96
98{
99 return 1 - VECMAT_COS(f * M_PI / 2);
100}
101
103{
104 return -(VECMAT_COS(M_PI * f) - 1) / 2;
105}
106
108{
109 return VECMAT_SQRT(1 - (1 - f) * (1 - f));
110}
111
113{
114 return 1.f - VECMAT_SQRT(1 - f * f);
115}
116
118{
119 return f < 0.5f ? (1.0f - VECMAT_SQRT(1.0f - 4.0f * f * f)) / 2.0f :
120 (VECMAT_SQRT(1.0f - (-2.0f * f + 2.0f) * (-2.0f * f + 2.0f)) + 1.0f) / 2.0f;
121}
122
124{
125 return 1 - VECMAT_POW(2, -10 * f);
126}
127
129{
130 return VECMAT_POW(2, 10 * (f - 1));
131}
132
134{
135 return f == 0.0f ? 0.f : f == 1.f ? 1.f :
136 f < 0.5f ? VECMAT_POW(2, 20 * f - 10) / 2.0f : (2 - VECMAT_POW(2, -20 * f + 10)) / 2.0f;
137}
138
140{
141 return f == 0.0f ? 0.f : f == 1.0f ? 1.f :
142 elastic_oscillation(f, -10, 10, 0.75f, 3.f) + 1;
143}
144
146{
147 return f == 0.0f ? 0.f : f == 1.0f ? 1.f :
148 -elastic_oscillation(f, 10, 10, 10.75f, 3.f);
149}
150
152{
153 return f == 0.0f ? 0.f :
154 f == 1.0f ? 1.f : f < 0.5f ?
155 -elastic_oscillation(f, 20, 20, 11.125f, 4.5f) / 2.f :
156 elastic_oscillation(f, -20, 20, 11.125f, 4.5f) / 2.f + 1.f;
157}
158
160{
161 return 1.f + 1.70158f * VECMAT_POW(f - 1, 3) + 1.70158f * VECMAT_POW(f - 1.f, 2.f);
162}
163
165{
166 return 1.70158f * f * f * f - 1.70158f * f * f;
167}
168
170{
171 return f < 0.5f ? (VECMAT_POW(2 * f, 2) * ((2.5949095f + 1.0f)
172 * 2.0f * f - 2.5949095f)) / 2.0f :
173 (VECMAT_POW(2 * f - 2, 2) * ((2.5949095f + 1.0f)
174 * (f * 2.0f - 2.0f) + 2.5949095f) + 2.0f) / 2.0f;
175}
176
178{
179 if (f < 1.0f / 2.75f) return 7.5625f * f * f;
180
181 if (f < 2.0f / 2.75f) {
182 const vm_float_t t = f - 1.5f / 2.75f;
183 return 7.5625f * t * t + 0.75f;
184 }
185
186 if (f < 2.5f / 2.75f) {
187 const vm_float_t t = f - 2.25f / 2.75f;
188 return 7.5625f * t * t + 0.9375f;
189 }
190
191 const vm_float_t t = f - 2.625f / 2.75f;
192 return 7.5625f * t * t + 0.984375f;
193}
194
196{
197 return 1 - bounce_ease_out(1 - f);
198}
199
201{
202 return f < 0.5 ? (1 - bounce_ease_out(1 - 2 * f)) / 2 : (1 + bounce_ease_out(2 * f - 1)) / 2;
203}
vm_float_t elastic_ease_in_out(const vm_float_t f)
Definition easing.c:151
vm_float_t quadratic_ease_out(const vm_float_t f)
Definition easing.c:32
vm_float_t quartic_ease_in(const vm_float_t f)
Definition easing.c:67
vm_float_t quadratic_ease_in_out(const vm_float_t f)
Definition easing.c:42
vm_float_t circular_ease_in(const vm_float_t f)
Definition easing.c:112
vm_float_t exponential_ease_out(const vm_float_t f)
Definition easing.c:123
vm_float_t quintic_ease_in(const vm_float_t f)
Definition easing.c:82
vm_float_t back_ease_in_out(const vm_float_t f)
Definition easing.c:169
vm_float_t bounce_ease_in(const vm_float_t f)
Definition easing.c:195
vm_float_t elastic_ease_in(const vm_float_t f)
Definition easing.c:145
vm_float_t back_ease_out(const vm_float_t f)
Definition easing.c:159
vm_float_t bounce_ease_in_out(const vm_float_t f)
Definition easing.c:200
vm_float_t bounce_ease_out(const vm_float_t f)
Definition easing.c:177
vm_float_t exponential_ease_in_out(const vm_float_t f)
Definition easing.c:133
vm_float_t poly_ease_in_out(const vm_float_t f, const vm_float_t n)
Definition easing.c:27
vm_float_t quartic_ease_out(const vm_float_t f)
Definition easing.c:62
vm_float_t cubic_ease_in_out(const vm_float_t f)
Definition easing.c:57
vm_float_t poly_ease_out(const vm_float_t f, const vm_float_t n)
Definition easing.c:22
vm_float_t sine_ease_in_out(const vm_float_t f)
Definition easing.c:102
vm_float_t sine_ease_in(const vm_float_t f)
Definition easing.c:97
vm_float_t circular_ease_out(const vm_float_t f)
Definition easing.c:107
vm_float_t quartic_ease_in_out(const vm_float_t f)
Definition easing.c:72
vm_float_t quintic_ease_out(const vm_float_t f)
Definition easing.c:77
vm_float_t poly_ease_in(const vm_float_t f, const vm_float_t n)
Definition easing.c:17
vm_float_t exponential_ease_in(const vm_float_t f)
Definition easing.c:128
vm_float_t cubic_ease_out(const vm_float_t f)
Definition easing.c:47
vm_float_t back_ease_in(const vm_float_t f)
Definition easing.c:164
vm_float_t elastic_ease_out(const vm_float_t f)
Definition easing.c:139
vm_float_t cubic_ease_in(const vm_float_t f)
Definition easing.c:52
vm_float_t circular_ease_in_out(const vm_float_t f)
Definition easing.c:117
vm_float_t quadratic_ease_in(const vm_float_t f)
Definition easing.c:37
vm_float_t quintic_ease_in_out(const vm_float_t f)
Definition easing.c:87
vm_float_t elastic_oscillation(const vm_float_t f, const vm_float_t exp_mult, const vm_float_t sin_mult, const vm_float_t sin_offset, const vm_float_t period)
Definition easing.c:7
vm_float_t sine_ease_out(const vm_float_t f)
Definition easing.c:92
#define VECMAT_POW(x, y)
Definition vecmat.h:427
#define VECMAT_SIN(x)
Definition vecmat.h:415
double vm_float_t
Definition vecmat.h:79
#define VECMAT_SQRT(x)
Definition vecmat.h:414
#define VECMAT_COS(x)
Definition vecmat.h:416
#define M_PI
Definition vecmat.h:43