mirror of
https://github.com/recp/cglm.git
synced 2025-12-26 02:25:02 +00:00
67 lines
1.5 KiB
C
67 lines
1.5 KiB
C
/*
|
|
* 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
|
|
}
|