|
@@ -1,101 +1,63 @@
|
|
|
-#include "../Tests.h"
|
|
|
-#include "core/Generic.h"
|
|
|
-#include "core/Utility.h"
|
|
|
+#include "../Tests.hpp"
|
|
|
+#include "core/Quaternion.hpp"
|
|
|
+#include "core/Test.hpp"
|
|
|
|
|
|
-#define CV3(a, b, c) (&(Vector3){{a, b, c}})
|
|
|
-#define CV30 CV3(0.0f, 0.0f, 0.0f)
|
|
|
+using Q = Core::Quaternion;
|
|
|
+using V3 = Core::Vector3;
|
|
|
|
|
|
static void testInit() {
|
|
|
- Quaternion q = UNIT_QUATERNION;
|
|
|
- char buffer[128];
|
|
|
- toStringQ(&q, buffer, sizeof(buffer));
|
|
|
- TEST_STRING("(0.000 i + 0.000 j + 0.000 k + 1.000)", buffer);
|
|
|
+ Q q;
|
|
|
+ TEST_STRING("(0.000 i + 0.000 j + 0.000 k + 1.000)", q);
|
|
|
}
|
|
|
|
|
|
static void testAxisAndDegreesInit() {
|
|
|
- Quaternion q = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q, CV3(1.0f, 2.0f, 3.0f), degreeToRadian(142.0f));
|
|
|
- char buffer[128];
|
|
|
- toStringQ(&q, buffer, sizeof(buffer));
|
|
|
- TEST_STRING("(0.253 i + 0.505 j + 0.758 k + 0.326)", buffer);
|
|
|
+ Q q(V3(1.0f, 2.0f, 3.0f), Core::degreeToRadian(142.0f));
|
|
|
+ TEST_STRING("(0.253 i + 0.505 j + 0.758 k + 0.326)", q);
|
|
|
}
|
|
|
|
|
|
static void testLerp() {
|
|
|
- Quaternion q1 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(130.0f));
|
|
|
- Quaternion q2 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q2, CV3(1.0f, 2.0f, 4.0f), degreeToRadian(260.0f));
|
|
|
- Quaternion q3;
|
|
|
- lerpQ(&q3, &q1, 0.3f, &q2);
|
|
|
-
|
|
|
- char buffer[128];
|
|
|
- toStringQ(&q3, buffer, sizeof(buffer));
|
|
|
- TEST_STRING("(0.223 i + 0.529 j + 0.810 k + 0.119)", buffer);
|
|
|
+ Q q1(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(130.0f));
|
|
|
+ Q q2(V3(1.0f, 2.0f, 4.0f), Core::degreeToRadian(260.0f));
|
|
|
+ Q q3 = q1.lerp(0.3f, q2);
|
|
|
+ TEST_STRING("(0.223 i + 0.529 j + 0.810 k + 0.119)", q3);
|
|
|
}
|
|
|
|
|
|
static void testMulSet() {
|
|
|
- Quaternion q1 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(50.0f));
|
|
|
- Quaternion q2 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(60.0f));
|
|
|
- Quaternion q3 = UNIT_QUATERNION;
|
|
|
- mulSet(&q3, &q1);
|
|
|
-
|
|
|
- char bufferQ1[128];
|
|
|
- toStringQ(&q1, bufferQ1, sizeof(bufferQ1));
|
|
|
- char bufferQ3[128];
|
|
|
- toStringQ(&q3, bufferQ3, sizeof(bufferQ3));
|
|
|
- TEST_STRING(bufferQ1, bufferQ3);
|
|
|
-
|
|
|
- mulSet(&q3, &q2);
|
|
|
- toStringQ(&q3, bufferQ3, sizeof(bufferQ3));
|
|
|
-
|
|
|
- axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(110.0f));
|
|
|
- toStringQ(&q1, bufferQ1, sizeof(bufferQ1));
|
|
|
-
|
|
|
- TEST_STRING(bufferQ1, bufferQ3);
|
|
|
+ Q q1(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(50.0f));
|
|
|
+ Q q2(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(60.0f));
|
|
|
+ Q q3;
|
|
|
+ q3 *= q1;
|
|
|
+ TEST_STRING(q1, q3);
|
|
|
+ q3 *= q2;
|
|
|
+ TEST_STRING(Q(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(110.0f)), q3);
|
|
|
}
|
|
|
|
|
|
static void testMul() {
|
|
|
- Quaternion q1 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(50.0f));
|
|
|
- Quaternion q2 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(60.0f));
|
|
|
- Quaternion q3 = UNIT_QUATERNION;
|
|
|
- mul(&q3, &q1, &q2);
|
|
|
-
|
|
|
- char bufferQ3[128];
|
|
|
- toStringQ(&q3, bufferQ3, sizeof(bufferQ3));
|
|
|
-
|
|
|
- Quaternion q = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q, CV3(2.0f, 5.0f, 7.0f), degreeToRadian(110.0f));
|
|
|
- char bufferQ[128];
|
|
|
- toStringQ(&q, bufferQ, sizeof(bufferQ));
|
|
|
-
|
|
|
- TEST_STRING(bufferQ, bufferQ3);
|
|
|
+ Q q1(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(50.0f));
|
|
|
+ Q q2(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(60.0f));
|
|
|
+ Q q3;
|
|
|
+ q3 = q1 * q2;
|
|
|
+ TEST_STRING(Q(V3(2.0f, 5.0f, 7.0f), Core::degreeToRadian(110.0f)), q3);
|
|
|
}
|
|
|
|
|
|
static void testMulVector() {
|
|
|
- Quaternion q1 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q1, CV3(1.0f, 0.0f, 0.0f), degreeToRadian(90.0f));
|
|
|
- Quaternion q2 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q2, CV3(0.0f, 1.0f, 0.0f), degreeToRadian(90.0f));
|
|
|
- Quaternion q3 = UNIT_QUATERNION;
|
|
|
- axisAngleQ(&q3, CV3(0.0f, 0.0f, 1.0f), degreeToRadian(90.0f));
|
|
|
-
|
|
|
- Vector3 v1 = {{1.0f, 0.0f, 0.0f}};
|
|
|
- Vector3 v2 = {{0.0f, 1.0f, 0.0f}};
|
|
|
- Vector3 v3 = {{0.0f, 0.0f, 1.0f}};
|
|
|
-
|
|
|
- TEST_V3(CV3(1.0f, 0.0f, 0.0f), mul(CV30, &q1, &v1));
|
|
|
- TEST_V3(CV3(0.0f, 0.0f, 1.0f), mul(CV30, &q1, &v2));
|
|
|
- TEST_V3(CV3(0.0f, -1.0f, 0.0f), mul(CV30, &q1, &v3));
|
|
|
- TEST_V3(CV3(0.0f, 0.0f, -1.0f), mul(CV30, &q2, &v1));
|
|
|
- TEST_V3(CV3(0.0f, 1.0f, 0.0f), mul(CV30, &q2, &v2));
|
|
|
- TEST_V3(CV3(1.0f, 0.0f, 0.0f), mul(CV30, &q2, &v3));
|
|
|
- TEST_V3(CV3(0.0f, 1.0f, 0.0f), mul(CV30, &q3, &v1));
|
|
|
- TEST_V3(CV3(-1.0f, 0.0f, 0.0f), mul(CV30, &q3, &v2));
|
|
|
- TEST_V3(CV3(0.0f, 0.0f, 1.0f), mul(CV30, &q3, &v3));
|
|
|
+ Q q1(V3(1.0f, 0.0f, 0.0f), Core::degreeToRadian(90.0f));
|
|
|
+ Q q2(V3(0.0f, 1.0f, 0.0f), Core::degreeToRadian(90.0f));
|
|
|
+ Q q3(V3(0.0f, 0.0f, 1.0f), Core::degreeToRadian(90.0f));
|
|
|
+
|
|
|
+ V3 v1(1.0f, 0.0f, 0.0f);
|
|
|
+ V3 v2(0.0f, 1.0f, 0.0f);
|
|
|
+ V3 v3(0.0f, 0.0f, 1.0f);
|
|
|
+
|
|
|
+ TEST(V3(1.0f, 0.0f, 0.0f), q1 * v1);
|
|
|
+ TEST(V3(0.0f, 0.0f, 1.0f), q1 * v2);
|
|
|
+ TEST(V3(0.0f, -1.0f, 0.0f), q1 * v3);
|
|
|
+ TEST(V3(0.0f, 0.0f, -1.0f), q2 * v1);
|
|
|
+ TEST(V3(0.0f, 1.0f, 0.0f), q2 * v2);
|
|
|
+ TEST(V3(1.0f, 0.0f, 0.0f), q2 * v3);
|
|
|
+ TEST(V3(0.0f, 1.0f, 0.0f), q3 * v1);
|
|
|
+ TEST(V3(-1.0f, 0.0f, 0.0f), q3 * v2);
|
|
|
+ TEST(V3(0.0f, 0.0f, 1.0f), q3 * v3);
|
|
|
}
|
|
|
|
|
|
void testQuaternion() {
|