|
@@ -0,0 +1,109 @@
|
|
|
|
+#include "../Tests.h"
|
|
|
|
+#include "core/Quaternion.h"
|
|
|
|
+
|
|
|
|
+typedef CoreQuaternion Q;
|
|
|
|
+#define Q(a, b, c, d) (&(Q){{a, b, c}, d})
|
|
|
|
+#define CV3(a, b, c) (&(CoreVector3){a, b, c})
|
|
|
|
+#define CV30 CV3(0.0f, 0.0f, 0.0f)
|
|
|
|
+
|
|
|
|
+static void testInit() {
|
|
|
|
+ Q q = CORE_UNIT_QUATERNION;
|
|
|
|
+ char buffer[128];
|
|
|
|
+ coreToStringQ(&q, buffer, sizeof(buffer));
|
|
|
|
+ CORE_TEST_STRING("(0.000 i + 0.000 j + 0.000 k + 1.000)", buffer);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void testAxisAndDegreesInit() {
|
|
|
|
+ Q q = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q, CV3(1.0f, 2.0f, 3.0f), 142.0f);
|
|
|
|
+ char buffer[128];
|
|
|
|
+ coreToStringQ(&q, buffer, sizeof(buffer));
|
|
|
|
+ CORE_TEST_STRING("(0.253 i + 0.505 j + 0.758 k + 0.326)", buffer);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void testLerp() {
|
|
|
|
+ Q q1 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 130.0f);
|
|
|
|
+ Q q2 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q2, CV3(1.0f, 2.0f, 4.0f), 260.0f);
|
|
|
|
+ Q q3;
|
|
|
|
+ coreLerpQ(&q3, &q1, 0.3f, &q2);
|
|
|
|
+
|
|
|
|
+ char buffer[128];
|
|
|
|
+ coreToStringQ(&q3, buffer, sizeof(buffer));
|
|
|
|
+ CORE_TEST_STRING("(0.223 i + 0.529 j + 0.810 k + 0.119)", buffer);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void testMulSet() {
|
|
|
|
+ Q q1 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 50.0f);
|
|
|
|
+ Q q2 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), 60.0f);
|
|
|
|
+ Q q3 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreMulSetQ(&q3, &q1);
|
|
|
|
+
|
|
|
|
+ char bufferQ1[128];
|
|
|
|
+ coreToStringQ(&q1, bufferQ1, sizeof(bufferQ1));
|
|
|
|
+ char bufferQ3[128];
|
|
|
|
+ coreToStringQ(&q3, bufferQ3, sizeof(bufferQ3));
|
|
|
|
+ CORE_TEST_STRING(bufferQ1, bufferQ3);
|
|
|
|
+
|
|
|
|
+ coreMulSetQ(&q3, &q2);
|
|
|
|
+ coreToStringQ(&q3, bufferQ3, sizeof(bufferQ3));
|
|
|
|
+
|
|
|
|
+ coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 110.0f);
|
|
|
|
+ coreToStringQ(&q1, bufferQ1, sizeof(bufferQ1));
|
|
|
|
+
|
|
|
|
+ CORE_TEST_STRING(bufferQ1, bufferQ3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void testMul() {
|
|
|
|
+ Q q1 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 50.0f);
|
|
|
|
+ Q q2 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), 60.0f);
|
|
|
|
+ Q q3 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreMulQ(&q3, &q1, &q2);
|
|
|
|
+
|
|
|
|
+ char bufferQ3[128];
|
|
|
|
+ coreToStringQ(&q3, bufferQ3, sizeof(bufferQ3));
|
|
|
|
+
|
|
|
|
+ Q q = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q, CV3(2.0f, 5.0f, 7.0f), 110.0f);
|
|
|
|
+ char bufferQ[128];
|
|
|
|
+ coreToStringQ(&q, bufferQ, sizeof(bufferQ));
|
|
|
|
+
|
|
|
|
+ CORE_TEST_STRING(bufferQ, bufferQ3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void testMulVector() {
|
|
|
|
+ Q q1 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q1, CV3(1.0f, 0.0f, 0.0f), 90.0f);
|
|
|
|
+ Q q2 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q2, CV3(0.0f, 1.0f, 0.0f), 90.0f);
|
|
|
|
+ Q q3 = CORE_UNIT_QUATERNION;
|
|
|
|
+ coreAxisAngleQ(&q3, CV3(0.0f, 0.0f, 1.0f), 90.0f);
|
|
|
|
+
|
|
|
|
+ CoreVector3 v1 = {1.0f, 0.0f, 0.0f};
|
|
|
|
+ CoreVector3 v2 = {0.0f, 1.0f, 0.0f};
|
|
|
|
+ CoreVector3 v3 = {0.0f, 0.0f, 1.0f};
|
|
|
|
+
|
|
|
|
+ CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f), coreMulQV3(CV30, &q1, &v1));
|
|
|
|
+ CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f), coreMulQV3(CV30, &q1, &v2));
|
|
|
|
+ CORE_TEST_V3(CV3(0.0f, -1.0f, 0.0f), coreMulQV3(CV30, &q1, &v3));
|
|
|
|
+ CORE_TEST_V3(CV3(0.0f, 0.0f, -1.0f), coreMulQV3(CV30, &q2, &v1));
|
|
|
|
+ CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f), coreMulQV3(CV30, &q2, &v2));
|
|
|
|
+ CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f), coreMulQV3(CV30, &q2, &v3));
|
|
|
|
+ CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f), coreMulQV3(CV30, &q3, &v1));
|
|
|
|
+ CORE_TEST_V3(CV3(-1.0f, 0.0f, 0.0f), coreMulQV3(CV30, &q3, &v2));
|
|
|
|
+ CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f), coreMulQV3(CV30, &q3, &v3));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void coreTestQuaternion() {
|
|
|
|
+ testInit();
|
|
|
|
+ testAxisAndDegreesInit();
|
|
|
|
+ testLerp();
|
|
|
|
+ testMulSet();
|
|
|
|
+ testMul();
|
|
|
|
+ testMulVector();
|
|
|
|
+}
|