Parcourir la source

Add mul case for matrix

Kajetan Johannes Hammerle il y a 11 mois
Parent
commit
a6a6da5f2b
2 fichiers modifiés avec 33 ajouts et 36 suppressions
  1. 1 0
      include/core/Generic.h
  2. 32 36
      test/modules/MatrixTests.c

+ 1 - 0
include/core/Generic.h

@@ -25,6 +25,7 @@
 
 #define ZERO_VECTOR(a)                                                         \
     _Generic((a),                                                              \
+        GENERIC_PAIR(Matrix*, &(Vector3){0}),                                  \
         GENERIC_PAIR(Vector2*, &(Vector2){0}),                                 \
         GENERIC_PAIR(Vector3*, &(Vector3){0}),                                 \
         GENERIC_PAIR(Vector4*, &(Vector4){0}),                                 \

+ 32 - 36
test/modules/MatrixTests.c

@@ -2,10 +2,6 @@
 #include "core/Generic.h"
 #include "core/ToString.h"
 
-typedef CoreVector3 V3;
-#define CV3(a, b, c) (&(V3){{a, b, c}})
-#define CV30 CV3(0.0f, 0.0f, 0.0f)
-
 static void testInit() {
     Matrix m = UNIT_MATRIX;
     const float* data = (float*)&m;
@@ -42,38 +38,38 @@ static void testTranspose() {
 
 static void testScale() {
     Matrix m = UNIT_MATRIX;
-    scaleMatrix(&m, CV3(2.0f, 3.0f, 4.0f));
-    TEST_V3(CV3(-8.0f, 18.0f, 28.0f), mul(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
+    scaleMatrix(&m, &V(2.0f, 3.0f, 4.0f));
+    TEST_V3(&V(-8.0f, 18.0f, 28.0f), mul(&m, &V(-4.0f, 6.0f, 7.0f)));
 }
 
 static void testUniformScale() {
     Matrix m = UNIT_MATRIX;
     scaleMatrixF(&m, 2.0f);
-    TEST_V3(CV3(-8.0f, 12.0f, 14.0f), mul(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
+    TEST_V3(&V(-8.0f, 12.0f, 14.0f), mul(&m, &V(-4.0f, 6.0f, 7.0f)));
 }
 
 static void testTranslateX() {
     Matrix m = UNIT_MATRIX;
     translateMatrixX(&m, 5.0f);
-    TEST_V3(CV3(1.0f, 6.0f, 7.0f), mul(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
+    TEST_V3(&V(1.0f, 6.0f, 7.0f), mul(&m, &V(-4.0f, 6.0f, 7.0f)));
 }
 
 static void testTranslateY() {
     Matrix m = UNIT_MATRIX;
     translateMatrixY(&m, 6.0f);
-    TEST_V3(CV3(-4.0f, 12.0f, 7.0f), mul(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
+    TEST_V3(&V(-4.0f, 12.0f, 7.0f), mul(&m, &V(-4.0f, 6.0f, 7.0f)));
 }
 
 static void testTranslateZ() {
     Matrix m = UNIT_MATRIX;
     translateMatrixZ(&m, 7.0f);
-    TEST_V3(CV3(-4.0f, 6.0f, 14.0f), mul(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
+    TEST_V3(&V(-4.0f, 6.0f, 14.0f), mul(&m, &V(-4.0f, 6.0f, 7.0f)));
 }
 
 static void testTranslate() {
     Matrix m = UNIT_MATRIX;
-    translateMatrix(&m, CV3(1.0f, 2.0f, 3.0f));
-    TEST_V3(CV3(-3.0f, 8.0f, 10.0f), mul(CV30, &m, CV3(-4.0f, 6.0f, 7.0f)));
+    translateMatrix(&m, &V(1.0f, 2.0f, 3.0f));
+    TEST_V3(&V(-3.0f, 8.0f, 10.0f), mul(&m, &V(-4.0f, 6.0f, 7.0f)));
 }
 
 static void testTranslateTo() {
@@ -82,7 +78,7 @@ static void testTranslateTo() {
     for(int i = 0; i < 16; i++) {
         ((float*)&m)[i] = (float)i + 1.0f;
     }
-    translateMatrixTo(&m, CV3(6.0f, 8.0f, 9.0f));
+    translateMatrixTo(&m, &V(6.0f, 8.0f, 9.0f));
     toStringMatrix(&m, buffer, sizeof(buffer));
     TEST_STRING("[[1.000, 0.000, 0.000, 6.000], [0.000, 1.000, 0.000, 8.000], "
                 "[0.000, 0.000, 1.000, 9.000], [0.000, 0.000, 0.000, 1.000]]",
@@ -95,74 +91,74 @@ static void testCombination() {
     translateMatrixX(&m, 1.0f);
     translateMatrixY(&m, 2.0f);
     translateMatrixZ(&m, 3.0f);
-    translateMatrix(&m, CV3(-4.0f, 2.0f, 3.0f));
-    scaleMatrix(&m, CV3(2.0f, 3.0f, 4.0f));
+    translateMatrix(&m, &V(-4.0f, 2.0f, 3.0f));
+    scaleMatrix(&m, &V(2.0f, 3.0f, 4.0f));
     scaleMatrixF(&m, 0.5f);
-    TEST_V3(CV3(-1.0f, 9.0f, 16.0f), mul(CV30, &m, CV3(1.0f, 1.0f, 1.0f)));
+    TEST_V3(&V(-1.0f, 9.0f, 16.0f), mul(&m, &V(1.0f, 1.0f, 1.0f)));
 }
 
 static void testMatrixCombination() {
     Matrix a = UNIT_MATRIX;
     scaleMatrixF(&a, 2.0f);
-    translateMatrix(&a, CV3(1.0f, 2.0f, 3.0f));
+    translateMatrix(&a, &V(1.0f, 2.0f, 3.0f));
 
     Matrix b = UNIT_MATRIX;
     scaleMatrixF(&b, 3.0f);
-    translateMatrix(&b, CV3(1.0f, 1.0f, 1.0f));
+    translateMatrix(&b, &V(1.0f, 1.0f, 1.0f));
 
     Matrix c = UNIT_MATRIX;
-    translateMatrix(&c, CV3(-1.0f, -2.0f, -3.0f));
+    translateMatrix(&c, &V(-1.0f, -2.0f, -3.0f));
 
     mulSet(&c, mul(&ZERO_MATRIX, &b, &a));
 
-    TEST_V3(CV3(9.0f, 11.0f, 13.0f), mul(CV30, &c, CV3(1.0f, 1.0f, 1.0f)));
+    TEST_V3(&V(9.0f, 11.0f, 13.0f), mul(&c, &V(1.0f, 1.0f, 1.0f)));
 }
 
 static void testRotateX() {
     Matrix m = UNIT_MATRIX;
     rotateMatrixX(&m, 90.0f);
-    TEST_V3(CV3(1.0f, 0.0f, 0.0f), mul(CV30, &m, CV3(1.0f, 0.0f, 0.0f)));
-    TEST_V3(CV3(0.0f, 0.0f, 1.0f), mul(CV30, &m, CV3(0.0f, 1.0f, 0.0f)));
-    TEST_V3(CV3(0.0f, -1.0f, 0.0f), mul(CV30, &m, CV3(0.0f, 0.0f, 1.0f)));
+    TEST_V3(&V(1.0f, 0.0f, 0.0f), mul(&m, &V(1.0f, 0.0f, 0.0f)));
+    TEST_V3(&V(0.0f, 0.0f, 1.0f), mul(&m, &V(0.0f, 1.0f, 0.0f)));
+    TEST_V3(&V(0.0f, -1.0f, 0.0f), mul(&m, &V(0.0f, 0.0f, 1.0f)));
 }
 
 static void testRotateY() {
     Matrix m = UNIT_MATRIX;
     rotateMatrixY(&m, 90.0f);
-    TEST_V3(CV3(0.0f, 0.0f, -1.0f), mul(CV30, &m, CV3(1.0f, 0.0f, 0.0f)));
-    TEST_V3(CV3(0.0f, 1.0f, 0.0f), mul(CV30, &m, CV3(0.0f, 1.0f, 0.0f)));
-    TEST_V3(CV3(1.0f, 0.0f, 0.0f), mul(CV30, &m, CV3(0.0f, 0.0f, 1.0f)));
+    TEST_V3(&V(0.0f, 0.0f, -1.0f), mul(&m, &V(1.0f, 0.0f, 0.0f)));
+    TEST_V3(&V(0.0f, 1.0f, 0.0f), mul(&m, &V(0.0f, 1.0f, 0.0f)));
+    TEST_V3(&V(1.0f, 0.0f, 0.0f), mul(&m, &V(0.0f, 0.0f, 1.0f)));
 }
 
 static void testRotateZ() {
     Matrix m = UNIT_MATRIX;
     rotateMatrixZ(&m, 90.0f);
-    TEST_V3(CV3(0.0f, 1.0f, 0.0f), mul(CV30, &m, CV3(1.0f, 0.0f, 0.0f)));
-    TEST_V3(CV3(-1.0f, 0.0f, 0.0f), mul(CV30, &m, CV3(0.0f, 1.0f, 0.0f)));
-    TEST_V3(CV3(0.0f, 0.0f, 1.0f), mul(CV30, &m, CV3(0.0f, 0.0f, 1.0f)));
+    TEST_V3(&V(0.0f, 1.0f, 0.0f), mul(&m, &V(1.0f, 0.0f, 0.0f)));
+    TEST_V3(&V(-1.0f, 0.0f, 0.0f), mul(&m, &V(0.0f, 1.0f, 0.0f)));
+    TEST_V3(&V(0.0f, 0.0f, 1.0f), mul(&m, &V(0.0f, 0.0f, 1.0f)));
 }
 
 static void testQuaternionMatrix() {
     Quaternion q1 = UNIT_QUATERNION;
-    axisAngleQ(&q1, CV3(1.0f, 0.0f, 0.0f), 48.0f);
+    axisAngleQ(&q1, &V(1.0f, 0.0f, 0.0f), 48.0f);
     Quaternion q2 = UNIT_QUATERNION;
-    axisAngleQ(&q2, CV3(0.0f, 1.0f, 0.0f), 52.0f);
+    axisAngleQ(&q2, &V(0.0f, 1.0f, 0.0f), 52.0f);
     Quaternion q3 = UNIT_QUATERNION;
-    axisAngleQ(&q3, CV3(0.0f, 0.0f, 1.0f), 60.0f);
+    axisAngleQ(&q3, &V(0.0f, 0.0f, 1.0f), 60.0f);
 
     Matrix m = UNIT_MATRIX;
-    translateMatrix(&m, CV3(1.0f, 2.0f, 3.0f));
+    translateMatrix(&m, &V(1.0f, 2.0f, 3.0f));
     rotateMatrix(&m, &q1);
     rotateMatrix(&m, &q2);
     rotateMatrix(&m, &q3);
-    translateMatrix(&m, CV3(1.0f, 2.0f, 3.0f));
+    translateMatrix(&m, &V(1.0f, 2.0f, 3.0f));
 
     Matrix check = UNIT_MATRIX;
-    translateMatrix(&check, CV3(1.0f, 2.0f, 3.0f));
+    translateMatrix(&check, &V(1.0f, 2.0f, 3.0f));
     rotateMatrixX(&check, 48.0f);
     rotateMatrixY(&check, 52.0f);
     rotateMatrixZ(&check, 60.0f);
-    translateMatrix(&check, CV3(1.0f, 2.0f, 3.0f));
+    translateMatrix(&check, &V(1.0f, 2.0f, 3.0f));
 
     for(int i = 0; i < 16; i++) {
         TEST_FLOAT(((float*)&check)[i], ((float*)&m)[i], 0.0001f);