mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 17:09:40 +00:00
tests: add some tests for quat
This commit is contained in:
@@ -71,6 +71,10 @@ main(int argc, const char * argv[]) {
|
|||||||
fprintf(stderr, "\n" RESET);
|
fprintf(stderr, "\n" RESET);
|
||||||
passed++;
|
passed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct timespec t;
|
||||||
|
t.tv_nsec = 100000000 * 0.5;
|
||||||
|
// nanosleep(&t, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (failed == 0) {
|
if (failed == 0) {
|
||||||
|
@@ -272,3 +272,14 @@ test_assert_quat_eq(versor v1, versor v2) {
|
|||||||
TEST_SUCCESS
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_quat_eq_identity(versor q) {
|
||||||
|
versor p = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
|
||||||
|
ASSERT(fabsf(q[0] - p[0]) <= 0.000009); /* rounding errors */
|
||||||
|
ASSERT(fabsf(q[1] - p[1]) <= 0.000009);
|
||||||
|
ASSERT(fabsf(q[2] - p[2]) <= 0.000009);
|
||||||
|
ASSERT(fabsf(q[3] - p[3]) <= 0.000009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
@@ -61,6 +61,9 @@ test_assert_vec4s_eq(vec4s v1, vec4s v2);
|
|||||||
test_status_t
|
test_status_t
|
||||||
test_assert_quat_eq(versor v1, versor v2);
|
test_assert_quat_eq(versor v1, versor v2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_quat_eq_identity(versor q) ;
|
||||||
|
|
||||||
test_status_t
|
test_status_t
|
||||||
test_assert_quat_eq_abs(versor v1, versor v2);
|
test_assert_quat_eq_abs(versor v1, versor v2);
|
||||||
|
|
||||||
|
@@ -7,6 +7,26 @@
|
|||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
|
|
||||||
|
/* test inline quat */
|
||||||
|
|
||||||
|
#define GLM_PREFIX glm_
|
||||||
|
#define GLM(X) (glm_ ## X)
|
||||||
|
|
||||||
|
#include "test_quat.h"
|
||||||
|
|
||||||
|
#undef GLM
|
||||||
|
#undef GLM_PREFIX
|
||||||
|
|
||||||
|
/* test pre-compiled quat */
|
||||||
|
|
||||||
|
#define GLM_PREFIX glmc_
|
||||||
|
#define GLM(X) (glmc_ ## X)
|
||||||
|
|
||||||
|
#include "test_quat.h"
|
||||||
|
|
||||||
|
#undef GLM
|
||||||
|
#undef GLM_PREFIX
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
test_quat_mul_raw(versor p, versor q, versor dest) {
|
test_quat_mul_raw(versor p, versor q, versor dest) {
|
||||||
|
233
test/src/test_quat.h
Normal file
233
test/src/test_quat.h
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
#ifndef CGLM_TEST_QUAT_ONCE
|
||||||
|
#define CGLM_TEST_QUAT_ONCE
|
||||||
|
|
||||||
|
/* Macros */
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_QUAT_IDENTITY_INIT) {
|
||||||
|
versor v = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v[2], 0.0f))
|
||||||
|
ASSERT(test_eq(v[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_QUAT_IDENTITY) {
|
||||||
|
ASSERT(test_eq(GLM_QUAT_IDENTITY[0], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_QUAT_IDENTITY[1], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_QUAT_IDENTITY[2], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_QUAT_IDENTITY[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CGLM_TEST_QUAT_ONCE */
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_identity) {
|
||||||
|
versor a = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
versor b = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
versor c;
|
||||||
|
mat4 r;
|
||||||
|
|
||||||
|
GLM(quat_identity)(c);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(a))
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(b))
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(c))
|
||||||
|
|
||||||
|
glm_quat_identity(c);
|
||||||
|
ASSERT(test_eq(glm_quat_real(c), cosf(glm_rad(0.0f) * 0.5f)))
|
||||||
|
|
||||||
|
glm_quat_mat4(c, r);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq2(r, GLM_MAT4_IDENTITY, 0.000009f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_identity_array) {
|
||||||
|
int i, count;
|
||||||
|
versor quats[4] = {
|
||||||
|
{1.0f, 2.0f, 3.0f, 4.0f},
|
||||||
|
{1.0f, 2.0f, 3.0f, 4.0f},
|
||||||
|
{1.0f, 2.0f, 3.0f, 4.0f},
|
||||||
|
{1.0f, 2.0f, 3.0f, 4.0f},
|
||||||
|
};
|
||||||
|
|
||||||
|
count = 4;
|
||||||
|
|
||||||
|
GLM(quat_identity_array)(quats, count);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(quats[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_init) {
|
||||||
|
versor q1 = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
versor q2 = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
versor q3 = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
|
||||||
|
GLM(quat_init)(q1, 10.0f, 11.0f, 12.0f, 13.0f);
|
||||||
|
GLM(quat_init)(q2, 100.0f, 110.0f, 120.0f, 130.0f);
|
||||||
|
GLM(quat_init)(q3, 1000.0f, 1100.0f, 1200.0f, 1300.0f);
|
||||||
|
|
||||||
|
ASSERT(q1[0] == 10.0f)
|
||||||
|
ASSERT(q1[1] == 11.0f)
|
||||||
|
ASSERT(q1[2] == 12.0f)
|
||||||
|
ASSERT(q1[3] == 13.0f)
|
||||||
|
|
||||||
|
ASSERT(q2[0] == 100.0f)
|
||||||
|
ASSERT(q2[1] == 110.0f)
|
||||||
|
ASSERT(q2[2] == 120.0f)
|
||||||
|
ASSERT(q2[3] == 130.0f)
|
||||||
|
|
||||||
|
ASSERT(q3[0] == 1000.0f)
|
||||||
|
ASSERT(q3[1] == 1100.0f)
|
||||||
|
ASSERT(q3[2] == 1200.0f)
|
||||||
|
ASSERT(q3[3] == 1300.0f)
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quatv) {
|
||||||
|
versor q1 = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
vec3 v1, v2;
|
||||||
|
float a1;
|
||||||
|
|
||||||
|
test_rand_vec3(v1);
|
||||||
|
GLM(quatv)(q1, glm_rad(60.0f), v1);
|
||||||
|
|
||||||
|
glm_quat_axis(q1, v2);
|
||||||
|
a1 = glm_quat_angle(q1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(a1, glm_rad(60.0f)))
|
||||||
|
|
||||||
|
glm_vec3_normalize(v1);
|
||||||
|
ASSERTIFY(test_assert_vec3_eq(v1, v2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat) {
|
||||||
|
versor q1 = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
vec3 v1, v2;
|
||||||
|
float a1;
|
||||||
|
|
||||||
|
test_rand_vec3(v1);
|
||||||
|
GLM(quat)(q1, glm_rad(60.0f), v1[0], v1[1], v1[2]);
|
||||||
|
|
||||||
|
glm_quat_axis(q1, v2);
|
||||||
|
a1 = glm_quat_angle(q1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(a1, glm_rad(60.0f)))
|
||||||
|
|
||||||
|
glm_vec3_normalize(v1);
|
||||||
|
ASSERTIFY(test_assert_vec3_eq(v1, v2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_copy) {
|
||||||
|
versor v1 = {10.0f, 9.0f, 8.0f, 78.0f};
|
||||||
|
versor v2 = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
|
||||||
|
GLM(quat_copy)(v1, v2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(v1, v2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_norm) {
|
||||||
|
versor a = {10.0f, 9.0f, 8.0f, 78.0f};
|
||||||
|
float n1, n2;
|
||||||
|
|
||||||
|
n1 = GLM(quat_norm)(a);
|
||||||
|
n2 = sqrtf(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]);
|
||||||
|
|
||||||
|
ASSERT(test_eq(n1, n2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_normalize_to) {
|
||||||
|
versor v1 = {2.0f, -3.0f, 4.0f, 5.0f}, v2;
|
||||||
|
float s = 1.0f;
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
GLM(quat_normalize_to)(v1, v2);
|
||||||
|
|
||||||
|
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2] + v1[3] * v1[3]);
|
||||||
|
if (norm <= 0.0f) {
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(v1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
norm = s / norm;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * norm, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * norm, v2[1]))
|
||||||
|
ASSERT(test_eq(v1[2] * norm, v2[2]))
|
||||||
|
ASSERT(test_eq(v1[3] * norm, v2[3]))
|
||||||
|
|
||||||
|
glm_vec4_zero(v1);
|
||||||
|
GLM(quat_normalize_to)(v1, v2);
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(v2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_normalize) {
|
||||||
|
versor v1 = {2.0f, -3.0f, 4.0f, 5.0f}, v2 = {2.0f, -3.0f, 4.0f, 5.0f};
|
||||||
|
float s = 1.0f;
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
GLM(quat_normalize)(v2);
|
||||||
|
|
||||||
|
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2] + v1[3] * v1[3]);
|
||||||
|
if (norm <= 0.0f) {
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(v1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
norm = s / norm;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * norm, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * norm, v2[1]))
|
||||||
|
ASSERT(test_eq(v1[2] * norm, v2[2]))
|
||||||
|
ASSERT(test_eq(v1[3] * norm, v2[3]))
|
||||||
|
|
||||||
|
glm_vec4_zero(v1);
|
||||||
|
GLM(quat_normalize)(v1);
|
||||||
|
ASSERTIFY(test_assert_quat_eq_identity(v1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, quat_dot) {
|
||||||
|
versor a = {10.0f, 9.0f, 8.0f, 78.0f};
|
||||||
|
versor b = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
float dot1, dot2;
|
||||||
|
|
||||||
|
dot1 = GLM(quat_dot)(a, b);
|
||||||
|
dot2 = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
||||||
|
|
||||||
|
ASSERT(test_eq(dot1, dot2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
48
test/tests.h
48
test/tests.h
@@ -128,6 +128,30 @@ TEST_DECLARE(euler)
|
|||||||
|
|
||||||
/* quat */
|
/* quat */
|
||||||
TEST_DECLARE(quat)
|
TEST_DECLARE(quat)
|
||||||
|
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY_INIT)
|
||||||
|
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY)
|
||||||
|
|
||||||
|
TEST_DECLARE(glm_quat_identity)
|
||||||
|
TEST_DECLARE(glm_quat_identity_array)
|
||||||
|
TEST_DECLARE(glm_quat_init)
|
||||||
|
TEST_DECLARE(glm_quatv)
|
||||||
|
TEST_DECLARE(glm_quat)
|
||||||
|
TEST_DECLARE(glm_quat_copy)
|
||||||
|
TEST_DECLARE(glm_quat_norm)
|
||||||
|
TEST_DECLARE(glm_quat_normalize_to)
|
||||||
|
TEST_DECLARE(glm_quat_normalize)
|
||||||
|
TEST_DECLARE(glm_quat_dot)
|
||||||
|
|
||||||
|
TEST_DECLARE(glmc_quat_identity)
|
||||||
|
TEST_DECLARE(glmc_quat_identity_array)
|
||||||
|
TEST_DECLARE(glmc_quat_init)
|
||||||
|
TEST_DECLARE(glmc_quatv)
|
||||||
|
TEST_DECLARE(glmc_quat)
|
||||||
|
TEST_DECLARE(glmc_quat_copy)
|
||||||
|
TEST_DECLARE(glmc_quat_norm)
|
||||||
|
TEST_DECLARE(glmc_quat_normalize_to)
|
||||||
|
TEST_DECLARE(glmc_quat_normalize)
|
||||||
|
TEST_DECLARE(glmc_quat_dot)
|
||||||
|
|
||||||
/* bezier */
|
/* bezier */
|
||||||
TEST_DECLARE(bezier)
|
TEST_DECLARE(bezier)
|
||||||
@@ -557,6 +581,30 @@ TEST_LIST {
|
|||||||
|
|
||||||
/* quat */
|
/* quat */
|
||||||
TEST_ENTRY(quat)
|
TEST_ENTRY(quat)
|
||||||
|
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY_INIT)
|
||||||
|
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY)
|
||||||
|
|
||||||
|
TEST_ENTRY(glm_quat_identity)
|
||||||
|
TEST_ENTRY(glm_quat_identity_array)
|
||||||
|
TEST_ENTRY(glm_quat_init)
|
||||||
|
TEST_ENTRY(glm_quatv)
|
||||||
|
TEST_ENTRY(glm_quat)
|
||||||
|
TEST_ENTRY(glm_quat_copy)
|
||||||
|
TEST_ENTRY(glm_quat_norm)
|
||||||
|
TEST_ENTRY(glm_quat_normalize_to)
|
||||||
|
TEST_ENTRY(glm_quat_normalize)
|
||||||
|
TEST_ENTRY(glm_quat_dot)
|
||||||
|
|
||||||
|
TEST_ENTRY(glmc_quat_identity)
|
||||||
|
TEST_ENTRY(glmc_quat_identity_array)
|
||||||
|
TEST_ENTRY(glmc_quat_init)
|
||||||
|
TEST_ENTRY(glmc_quatv)
|
||||||
|
TEST_ENTRY(glmc_quat)
|
||||||
|
TEST_ENTRY(glmc_quat_copy)
|
||||||
|
TEST_ENTRY(glmc_quat_norm)
|
||||||
|
TEST_ENTRY(glmc_quat_normalize_to)
|
||||||
|
TEST_ENTRY(glmc_quat_normalize)
|
||||||
|
TEST_ENTRY(glmc_quat_dot)
|
||||||
|
|
||||||
/* bezier */
|
/* bezier */
|
||||||
TEST_ENTRY(bezier)
|
TEST_ENTRY(bezier)
|
||||||
|
Reference in New Issue
Block a user