summaryrefslogtreecommitdiff
path: root/libs/cglm/test/src/test_bezier.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/cglm/test/src/test_bezier.c')
-rw-r--r--libs/cglm/test/src/test_bezier.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/libs/cglm/test/src/test_bezier.c b/libs/cglm/test/src/test_bezier.c
new file mode 100644
index 0000000..3089dd5
--- /dev/null
+++ b/libs/cglm/test/src/test_bezier.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+#include "test_common.h"
+
+CGLM_INLINE
+float
+test_bezier_plain(float s, float p0, float c0, float c1, float p1) {
+ float x, xx, xxx, ss, sss;
+
+ x = 1.0f - s;
+ xx = x * x;
+ xxx = xx * x;
+ ss = s * s;
+ sss = ss * s;
+
+ return p0 * xxx + 3.0f * (c0 * s * xx + c1 * ss * x) + p1 * sss;
+}
+
+CGLM_INLINE
+float
+test_hermite_plain(float s, float p0, float t0, float t1, float p1) {
+ float ss, sss;
+
+ ss = s * s;
+ sss = ss * s;
+
+ return p0 * (2.0f * sss - 3.0f * ss + 1.0f)
+ + t0 * (sss - 2.0f * ss + s)
+ + p1 * (-2.0f * sss + 3.0f * ss)
+ + t1 * (sss - ss);
+}
+
+TEST_IMPL(bezier) {
+ float s, p0, p1, c0, c1, smc, Bs, Bs_plain;
+
+ s = test_rand();
+ p0 = test_rand();
+ p1 = test_rand();
+ c0 = test_rand();
+ c1 = test_rand();
+
+ /* test cubic bezier */
+ smc = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1});
+ Bs = glm_bezier(s, p0, c0, c1, p1);
+ Bs_plain = test_bezier_plain(s, p0, c0, c1, p1);
+
+ ASSERT(test_eq(Bs, Bs_plain));
+ ASSERTIFY(test_assert_eqf(smc, Bs_plain))
+ ASSERTIFY(test_assert_eqf(Bs, smc))
+
+ /* test cubic hermite */
+ smc = glm_smc(s, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1});
+ Bs = glm_hermite(s, p0, c0, c1, p1);
+ Bs_plain = test_hermite_plain(s, p0, c0, c1, p1);
+
+ ASSERT(test_eq(Bs, Bs_plain));
+ ASSERT(test_eq(smc, Bs_plain));
+ ASSERT(test_eq(Bs, smc));
+
+ TEST_SUCCESS
+}