mirror of
https://github.com/recp/cglm.git
synced 2025-12-24 20:34:58 +00:00
quaternion multiplication
* convert quaternion multiplication to xyzw * previous implementation may be wrong, wikipedia version implemented * implement SSE version
This commit is contained in:
@@ -92,10 +92,18 @@ test_assert_vec3_eq(vec3 v1, vec3 v2) {
|
||||
}
|
||||
|
||||
void
|
||||
test_assert_quat_eq(versor v1, versor v2) {
|
||||
assert_true(fabsf(v1[0] - v2[0]) <= 0.0009); /* rounding errors */
|
||||
assert_true(fabsf(v1[1] - v2[1]) <= 0.0009);
|
||||
assert_true(fabsf(v1[2] - v2[2]) <= 0.0009);
|
||||
assert_true(fabsf(v1[3] - v2[3]) <= 0.0009);
|
||||
test_assert_quat_eq_abs(versor v1, versor v2) {
|
||||
assert_true(fabsf(fabsf(v1[0]) - fabsf(v2[0])) <= 0.0009); /* rounding errors */
|
||||
assert_true(fabsf(fabsf(v1[1]) - fabsf(v2[1])) <= 0.0009);
|
||||
assert_true(fabsf(fabsf(v1[2]) - fabsf(v2[2])) <= 0.0009);
|
||||
assert_true(fabsf(fabsf(v1[3]) - fabsf(v2[3])) <= 0.0009);
|
||||
}
|
||||
|
||||
void
|
||||
test_assert_quat_eq(versor v1, versor v2) {
|
||||
assert_true(fabsf(v1[0] - v2[0]) <= 0.0000009); /* rounding errors */
|
||||
assert_true(fabsf(v1[1] - v2[1]) <= 0.0000009);
|
||||
assert_true(fabsf(v1[2] - v2[2]) <= 0.0000009);
|
||||
assert_true(fabsf(v1[3] - v2[3]) <= 0.0000009);
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,9 @@ test_assert_vec3_eq(vec3 v1, vec3 v2);
|
||||
void
|
||||
test_assert_quat_eq(versor v1, versor v2);
|
||||
|
||||
void
|
||||
test_assert_quat_eq_abs(versor v1, versor v2);
|
||||
|
||||
void
|
||||
test_rand_vec3(vec3 dest);
|
||||
|
||||
|
||||
@@ -7,10 +7,19 @@
|
||||
|
||||
#include "test_common.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
test_quat_mul_raw(versor p, versor q, versor dest) {
|
||||
dest[0] = p[3] * q[0] + p[0] * q[3] + p[1] * q[2] - p[2] * q[1];
|
||||
dest[1] = p[3] * q[1] - p[0] * q[2] + p[1] * q[3] + p[2] * q[0];
|
||||
dest[2] = p[3] * q[2] + p[0] * q[1] - p[1] * q[0] + p[2] * q[3];
|
||||
dest[3] = p[3] * q[3] - p[0] * q[0] - p[1] * q[1] - p[2] * q[2];
|
||||
}
|
||||
|
||||
void
|
||||
test_quat(void **state) {
|
||||
mat4 inRot, outRot;
|
||||
versor inQuat, outQuat;
|
||||
versor inQuat, outQuat, q3, q4;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
@@ -18,7 +27,12 @@ test_quat(void **state) {
|
||||
glmc_quat_mat4(inQuat, inRot);
|
||||
glmc_mat4_quat(inRot, outQuat);
|
||||
glmc_quat_mat4(outQuat, outRot);
|
||||
test_assert_quat_eq(inQuat, outQuat);
|
||||
test_assert_quat_eq_abs(inQuat, outQuat);
|
||||
test_assert_mat4_eq2(inRot, outRot, 0.000009); /* almost equal */
|
||||
|
||||
test_quat_mul_raw(inQuat, outQuat, q3);
|
||||
glm_quat_mul_sse2(inQuat, outQuat, q4);
|
||||
|
||||
test_assert_quat_eq(q3, q4);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user