summaryrefslogtreecommitdiff
path: root/include/cglm/ease.h
diff options
context:
space:
mode:
authorAaditya Dhruv <[email protected]>2026-01-25 15:10:37 -0600
committerAaditya Dhruv <[email protected]>2026-01-25 15:10:37 -0600
commit118980e02e59ff31871df59dce257075394f3533 (patch)
tree26fba4492bb4b561d21bf49b35d892a821d54fab /include/cglm/ease.h
parent0e6e1245b70df4dfcba135d50e1b53d1a8ef7eb8 (diff)
wip
Diffstat (limited to 'include/cglm/ease.h')
-rw-r--r--include/cglm/ease.h317
1 files changed, 317 insertions, 0 deletions
diff --git a/include/cglm/ease.h b/include/cglm/ease.h
new file mode 100644
index 0000000..e26b48c
--- /dev/null
+++ b/include/cglm/ease.h
@@ -0,0 +1,317 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+#ifndef cglm_ease_h
+#define cglm_ease_h
+
+#include "common.h"
+
+CGLM_INLINE
+float
+glm_ease_linear(float t) {
+ return t;
+}
+
+CGLM_INLINE
+float
+glm_ease_sine_in(float t) {
+ return sinf((t - 1.0f) * GLM_PI_2f) + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_sine_out(float t) {
+ return sinf(t * GLM_PI_2f);
+}
+
+CGLM_INLINE
+float
+glm_ease_sine_inout(float t) {
+ return 0.5f * (1.0f - cosf(t * GLM_PIf));
+}
+
+CGLM_INLINE
+float
+glm_ease_quad_in(float t) {
+ return t * t;
+}
+
+CGLM_INLINE
+float
+glm_ease_quad_out(float t) {
+ return -(t * (t - 2.0f));
+}
+
+CGLM_INLINE
+float
+glm_ease_quad_inout(float t) {
+ float tt;
+
+ tt = t * t;
+ if (t < 0.5f)
+ return 2.0f * tt;
+
+ return (-2.0f * tt) + (4.0f * t) - 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_cubic_in(float t) {
+ return t * t * t;
+}
+
+CGLM_INLINE
+float
+glm_ease_cubic_out(float t) {
+ float f;
+ f = t - 1.0f;
+ return f * f * f + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_cubic_inout(float t) {
+ float f;
+
+ if (t < 0.5f)
+ return 4.0f * t * t * t;
+
+ f = 2.0f * t - 2.0f;
+
+ return 0.5f * f * f * f + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_quart_in(float t) {
+ float f;
+ f = t * t;
+ return f * f;
+}
+
+CGLM_INLINE
+float
+glm_ease_quart_out(float t) {
+ float f;
+
+ f = t - 1.0f;
+
+ return f * f * f * (1.0f - t) + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_quart_inout(float t) {
+ float f, g;
+
+ if (t < 0.5f) {
+ f = t * t;
+ return 8.0f * f * f;
+ }
+
+ f = t - 1.0f;
+ g = f * f;
+
+ return -8.0f * g * g + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_quint_in(float t) {
+ float f;
+ f = t * t;
+ return f * f * t;
+}
+
+CGLM_INLINE
+float
+glm_ease_quint_out(float t) {
+ float f, g;
+
+ f = t - 1.0f;
+ g = f * f;
+
+ return g * g * f + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_quint_inout(float t) {
+ float f, g;
+
+ if (t < 0.5f) {
+ f = t * t;
+ return 16.0f * f * f * t;
+ }
+
+ f = 2.0f * t - 2.0f;
+ g = f * f;
+
+ return 0.5f * g * g * f + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_exp_in(float t) {
+ if (t == 0.0f)
+ return t;
+
+ return powf(2.0f, 10.0f * (t - 1.0f));
+}
+
+CGLM_INLINE
+float
+glm_ease_exp_out(float t) {
+ if (t == 1.0f)
+ return t;
+
+ return 1.0f - powf(2.0f, -10.0f * t);
+}
+
+CGLM_INLINE
+float
+glm_ease_exp_inout(float t) {
+ if (t == 0.0f || t == 1.0f)
+ return t;
+
+ if (t < 0.5f)
+ return 0.5f * powf(2.0f, (20.0f * t) - 10.0f);
+
+ return -0.5f * powf(2.0f, (-20.0f * t) + 10.0f) + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_circ_in(float t) {
+ return 1.0f - sqrtf(1.0f - (t * t));
+}
+
+CGLM_INLINE
+float
+glm_ease_circ_out(float t) {
+ return sqrtf((2.0f - t) * t);
+}
+
+CGLM_INLINE
+float
+glm_ease_circ_inout(float t) {
+ if (t < 0.5f)
+ return 0.5f * (1.0f - sqrtf(1.0f - 4.0f * (t * t)));
+
+ return 0.5f * (sqrtf(-((2.0f * t) - 3.0f) * ((2.0f * t) - 1.0f)) + 1.0f);
+}
+
+CGLM_INLINE
+float
+glm_ease_back_in(float t) {
+ float o, z;
+
+ o = 1.70158f;
+ z = ((o + 1.0f) * t) - o;
+
+ return t * t * z;
+}
+
+CGLM_INLINE
+float
+glm_ease_back_out(float t) {
+ float o, z, n;
+
+ o = 1.70158f;
+ n = t - 1.0f;
+ z = (o + 1.0f) * n + o;
+
+ return n * n * z + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_back_inout(float t) {
+ float o, z, n, m, s, x;
+
+ o = 1.70158f;
+ s = o * 1.525f;
+ x = 0.5f;
+ n = t / 0.5f;
+
+ if (n < 1.0f) {
+ z = (s + 1) * n - s;
+ m = n * n * z;
+ return x * m;
+ }
+
+ n -= 2.0f;
+ z = (s + 1.0f) * n + s;
+ m = (n * n * z) + 2;
+
+ return x * m;
+}
+
+CGLM_INLINE
+float
+glm_ease_elast_in(float t) {
+ return sinf(13.0f * GLM_PI_2f * t) * powf(2.0f, 10.0f * (t - 1.0f));
+}
+
+CGLM_INLINE
+float
+glm_ease_elast_out(float t) {
+ return sinf(-13.0f * GLM_PI_2f * (t + 1.0f)) * powf(2.0f, -10.0f * t) + 1.0f;
+}
+
+CGLM_INLINE
+float
+glm_ease_elast_inout(float t) {
+ float a;
+
+ a = 2.0f * t;
+
+ if (t < 0.5f)
+ return 0.5f * sinf(13.0f * GLM_PI_2f * a)
+ * powf(2.0f, 10.0f * (a - 1.0f));
+
+ return 0.5f * (sinf(-13.0f * GLM_PI_2f * a)
+ * powf(2.0f, -10.0f * (a - 1.0f)) + 2.0f);
+}
+
+CGLM_INLINE
+float
+glm_ease_bounce_out(float t) {
+ float tt;
+
+ tt = t * t;
+
+ if (t < (4.0f / 11.0f))
+ return (121.0f * tt) / 16.0f;
+
+ if (t < 8.0f / 11.0f)
+ return ((363.0f / 40.0f) * tt) - ((99.0f / 10.0f) * t) + (17.0f / 5.0f);
+
+ if (t < (9.0f / 10.0f))
+ return (4356.0f / 361.0f) * tt
+ - (35442.0f / 1805.0f) * t
+ + (16061.0f / 1805.0f);
+
+ return ((54.0f / 5.0f) * tt) - ((513.0f / 25.0f) * t) + (268.0f / 25.0f);
+}
+
+CGLM_INLINE
+float
+glm_ease_bounce_in(float t) {
+ return 1.0f - glm_ease_bounce_out(1.0f - t);
+}
+
+CGLM_INLINE
+float
+glm_ease_bounce_inout(float t) {
+ if (t < 0.5f)
+ return 0.5f * (1.0f - glm_ease_bounce_out(t * 2.0f));
+
+ return 0.5f * glm_ease_bounce_out(t * 2.0f - 1.0f) + 0.5f;
+}
+
+#endif /* cglm_ease_h */