فهرست منبع

Make use of generic operator functions

Kajetan Johannes Hammerle 11 ماه پیش
والد
کامیت
8c082ab324
5فایلهای تغییر یافته به همراه53 افزوده شده و 54 حذف شده
  1. 9 2
      include/core/Generic.h
  2. 18 19
      src/Matrix.c
  3. 1 3
      src/Plane.c
  4. 8 13
      src/Quaternion.c
  5. 17 17
      test/modules/VectorTests.c

+ 9 - 2
include/core/Generic.h

@@ -98,12 +98,20 @@
 #define div(...) SELECT_OP(__VA_ARGS__, div3, div2, 0)(__VA_ARGS__)
 
 #define invertSet(a) GENERIC_VECTOR(a, invertSet)(a)
-#define invert(a, b) GENERIC_VECTOR(a, invert)(a, b)
+#define invert2(a, b) GENERIC_VECTOR(a, invert)(a, b)
+#define invert1(a) invert2(ZERO_VECTOR(a), a)
+#define invert(...) SELECT_OP(0, __VA_ARGS__, invert2, invert1, 0)(__VA_ARGS__)
 #define dot(a, b) GENERIC_FLOAT_VECTOR(a, dot)(a, b)
 #define squareLength(a) GENERIC_FLOAT_VECTOR(a, squareLength)(a)
 #define length(a) GENERIC_FLOAT_VECTOR(a, length)(a)
 #define normalize(a) GENERIC_FLOAT_VECTOR(a, normalize)(a)
 
+#undef cross
+#define SELECT_OP(_1, _2, _3, name, ...) name
+#define cross3(a, b, c) coreCross(a, b, c)
+#define cross2(a, b) coreCross(&(Vector3){0}, a, b)
+#define cross(...) SELECT_OP(__VA_ARGS__, cross3, cross2, 0)(__VA_ARGS__)
+
 #define convert(a, b)                                                          \
     _Generic((a),                                                              \
         Vector2 *: convertIV2,                                                 \
@@ -113,7 +121,6 @@
         IntVector3 *: convertV3,                                               \
         IntVector4 *: convertV4)(a, b)
 
-// #define toStringV2 coreToStringV2
 #endif
 
 #endif

+ 18 - 19
src/Matrix.c

@@ -6,7 +6,6 @@
 #include "core/Utility.h"
 
 #define M(m, x, y) ((m)->data[x].data[y])
-#define CV40 (&VECTOR4)
 
 Matrix* transposeMatrix(Matrix* m) {
     Matrix c = ZERO_MATRIX;
@@ -22,10 +21,10 @@ Matrix* transposeMatrix(Matrix* m) {
 Matrix* mulSetMatrix(Matrix* m, const Matrix* a) {
     for(int i = 0; i < 4; i++) {
         Vector4 d = VECTOR4;
-        addSet(&d, mul(CV40, a->data + 0, m->data[i].data[0]));
-        addSet(&d, mul(CV40, a->data + 1, m->data[i].data[1]));
-        addSet(&d, mul(CV40, a->data + 2, m->data[i].data[2]));
-        addSet(&d, mul(CV40, a->data + 3, m->data[i].data[3]));
+        addSet(&d, mul(a->data + 0, m->data[i].data[0]));
+        addSet(&d, mul(a->data + 1, m->data[i].data[1]));
+        addSet(&d, mul(a->data + 2, m->data[i].data[2]));
+        addSet(&d, mul(a->data + 3, m->data[i].data[3]));
         m->data[i] = d;
     }
     return m;
@@ -38,7 +37,7 @@ Matrix* mulMatrix(Matrix* m, const Matrix* a, const Matrix* b) {
 }
 
 Vector3* mulMatrixV3(Vector3* v, const Matrix* m, const Vector3* a) {
-    Vector4 v4 = {{a->data[0], a->data[1], a->data[2], 1.0f}};
+    Vector4 v4 = V(a->data[0], a->data[1], a->data[2], 1.0f);
     v->data[0] = dot(m->data + 0, &v4);
     v->data[1] = dot(m->data + 1, &v4);
     v->data[2] = dot(m->data + 2, &v4);
@@ -54,7 +53,7 @@ Matrix* scaleMatrix(Matrix* m, const Vector3* v) {
 }
 
 Matrix* scaleMatrixF(Matrix* m, float f) {
-    return scaleMatrix(m, &(Vector3){{f, f, f}});
+    return scaleMatrix(m, &V(f, f, f));
 }
 
 Matrix* translateMatrix(Matrix* m, const Vector3* v) {
@@ -65,25 +64,25 @@ Matrix* translateMatrix(Matrix* m, const Vector3* v) {
 }
 
 Matrix* translateMatrixX(Matrix* m, float tx) {
-    addSet(m->data + 0, mul(CV40, m->data + 3, tx));
+    addSet(m->data + 0, mul(m->data + 3, tx));
     return m;
 }
 
 Matrix* translateMatrixY(Matrix* m, float ty) {
-    addSet(m->data + 1, mul(CV40, m->data + 3, ty));
+    addSet(m->data + 1, mul(m->data + 3, ty));
     return m;
 }
 
 Matrix* translateMatrixZ(Matrix* m, float tz) {
-    addSet(m->data + 2, mul(CV40, m->data + 3, tz));
+    addSet(m->data + 2, mul(m->data + 3, tz));
     return m;
 }
 
 Matrix* translateMatrixTo(Matrix* m, const Vector3* v) {
-    m->data[0] = (Vector4){{1.0f, 0.0f, 0.0f, v->data[0]}};
-    m->data[1] = (Vector4){{0.0f, 1.0f, 0.0f, v->data[1]}};
-    m->data[2] = (Vector4){{0.0f, 0.0f, 1.0f, v->data[2]}};
-    m->data[3] = (Vector4){{0.0f, 0.0f, 0.0f, 1.0f}};
+    m->data[0] = V(1.0f, 0.0f, 0.0f, v->data[0]);
+    m->data[1] = V(0.0f, 1.0f, 0.0f, v->data[1]);
+    m->data[2] = V(0.0f, 0.0f, 1.0f, v->data[2]);
+    m->data[3] = V(0.0f, 0.0f, 0.0f, 1.0f);
     return m;
 }
 
@@ -92,8 +91,8 @@ static Matrix* rotate(Matrix* m, float degrees, int a, int b) {
     float sin = sinf(degrees);
     float cos = cosf(degrees);
     Vector4 v = m->data[a];
-    sub(m->data + a, mul(CV40, &v, cos), mul(CV40, m->data + b, sin));
-    add(m->data + b, mul(CV40, &v, sin), mul(CV40, m->data + b, cos));
+    sub(m->data + a, mul(&v, cos), mul(m->data + b, sin));
+    add(m->data + b, mul(&v, sin), mul(m->data + b, cos));
     return m;
 }
 
@@ -118,8 +117,8 @@ Matrix* rotateMatrix(Matrix* m, const Quaternion* q) {
     mul(&b, q, &V(M(m, 0, 1), M(m, 1, 1), M(m, 2, 1)));
     mul(&c, q, &V(M(m, 0, 2), M(m, 1, 2), M(m, 2, 2)));
     mul(&d, q, &V(M(m, 0, 3), M(m, 1, 3), M(m, 2, 3)));
-    m->data[0] = (Vector4){{a.data[0], b.data[0], c.data[0], d.data[0]}};
-    m->data[1] = (Vector4){{a.data[1], b.data[1], c.data[1], d.data[1]}};
-    m->data[2] = (Vector4){{a.data[2], b.data[2], c.data[2], d.data[2]}};
+    m->data[0] = V(a.data[0], b.data[0], c.data[0], d.data[0]);
+    m->data[1] = V(a.data[1], b.data[1], c.data[1], d.data[1]);
+    m->data[2] = V(a.data[2], b.data[2], c.data[2], d.data[2]);
     return m;
 }

+ 1 - 3
src/Plane.c

@@ -2,10 +2,8 @@
 
 #include "core/Generic.h"
 
-#define CV30 (&VECTOR3)
-
 void initPlane(Plane* p, const Vector3* a, const Vector3* b, const Vector3* c) {
-    cross(&p->abc, sub(CV30, b, a), sub(CV30, c, a));
+    cross(&p->abc, sub(b, a), sub(c, a));
     normalize(&p->abc);
     p->d = -dot(&p->abc, b);
 }

+ 8 - 13
src/Quaternion.c

@@ -4,11 +4,6 @@
 #include "core/ToString.h"
 #include "core/Utility.h"
 
-#define mulC(a, b) mul(&VECTOR3, (a), (b))
-#define crossC(a, b) cross(&VECTOR3, (a), (b))
-#define addC(a, b) add(&VECTOR3, (a), (b))
-#define subC(a, b) sub(&VECTOR3, (a), (b))
-
 Quaternion* axisAngleQ(Quaternion* q, const Vector3* axis, float angle) {
     q->xyz = *axis;
     normalize(&q->xyz);
@@ -20,18 +15,18 @@ Quaternion* axisAngleQ(Quaternion* q, const Vector3* axis, float angle) {
 
 Quaternion* lerpQ(Quaternion* q, const Quaternion* a, float f,
                   const Quaternion* b) {
-    add(&q->xyz, mulC(&a->xyz, 1.0f - f), mulC(&b->xyz, f));
+    add(&q->xyz, mul(&a->xyz, 1.0f - f), mul(&b->xyz, f));
     q->w = a->w * (1.0f - f) + b->w * f;
-    float iLength = 1.0f / sqrtf(squareLengthV3(&q->xyz) + q->w * q->w);
+    float iLength = 1.0f / sqrtf(squareLength(&q->xyz) + q->w * q->w);
     mulSet(&q->xyz, iLength);
     q->w *= iLength;
     return q;
 }
 
 Quaternion* mulSetQ(Quaternion* q, const Quaternion* o) {
-    float dot = dotV3(&q->xyz, &o->xyz);
-    add(&q->xyz, mulC(&o->xyz, q->w),
-        addC(mulC(&q->xyz, o->w), crossC(&q->xyz, &o->xyz)));
+    float dot = dot(&q->xyz, &o->xyz);
+    add(&q->xyz, mul(&o->xyz, q->w),
+        add(mul(&q->xyz, o->w), cross(&q->xyz, &o->xyz)));
     q->w = q->w * o->w - dot;
     return q;
 }
@@ -44,9 +39,9 @@ Quaternion* mulQ(Quaternion* q, const Quaternion* a, const Quaternion* b) {
 
 Vector3* mulQV3(Vector3* r, const Quaternion* q, const Vector3* v) {
     Vector3 qv;
-    add(&qv, mulC(v, q->w), crossC(&q->xyz, v));
-    add(r, mulC(&q->xyz, dotV3(&q->xyz, v)),
-        subC(mulC(&qv, q->w), crossC(&qv, &q->xyz)));
+    add(&qv, mul(v, q->w), cross(&q->xyz, v));
+    add(r, mul(&q->xyz, dot(&q->xyz, v)),
+        sub(mul(&qv, q->w), cross(&qv, &q->xyz)));
     return r;
 }
 

+ 17 - 17
test/modules/VectorTests.c

@@ -70,12 +70,12 @@ static void testSetAngles() {
 }
 
 static void testCross() {
-    TEST_V3(FV3(0, 0, 1), cross(CV30, FV3(1, 0, 0), FV3(0, 1, 0)));
-    TEST_V3(FV3(0, -1, 0), cross(CV30, FV3(1, 0, 0), FV3(0, 0, 1)));
-    TEST_V3(FV3(0, 0, -1), cross(CV30, FV3(0, 1, 0), FV3(1, 0, 0)));
-    TEST_V3(FV3(1, 0, 0), cross(CV30, FV3(0, 1, 0), FV3(0, 0, 1)));
-    TEST_V3(FV3(0, 1, 0), cross(CV30, FV3(0, 0, 1), FV3(1, 0, 0)));
-    TEST_V3(FV3(-1, 0, 0), cross(CV30, FV3(0, 0, 1), FV3(0, 1, 0)));
+    TEST_V3(FV3(0, 0, 1), cross(FV3(1, 0, 0), FV3(0, 1, 0)));
+    TEST_V3(FV3(0, -1, 0), cross(FV3(1, 0, 0), FV3(0, 0, 1)));
+    TEST_V3(FV3(0, 0, -1), cross(FV3(0, 1, 0), FV3(1, 0, 0)));
+    TEST_V3(FV3(1, 0, 0), cross(FV3(0, 1, 0), FV3(0, 0, 1)));
+    TEST_V3(FV3(0, 1, 0), cross(FV3(0, 0, 1), FV3(1, 0, 0)));
+    TEST_V3(FV3(-1, 0, 0), cross(FV3(0, 0, 1), FV3(0, 1, 0)));
 }
 
 static void testSetAdd() {
@@ -92,8 +92,8 @@ static void testSetAdd() {
 }
 
 static void testAdd() {
-    TEST_V3(FV3(1, 2, 3), add(CV30, CV30, FV3(1, 2, 3)));
-    TEST_V3(FV3(3, 5, 7), add(CV30, FV3(1, 2, 3), FV3(2, 3, 4)));
+    TEST_V3(FV3(1, 2, 3), add(CV30, FV3(1, 2, 3)));
+    TEST_V3(FV3(3, 5, 7), add(FV3(1, 2, 3), FV3(2, 3, 4)));
 }
 
 static void testSetSub() {
@@ -110,8 +110,8 @@ static void testSetSub() {
 }
 
 static void testSub() {
-    TEST_V3(FV3(1, 2, 3), sub(CV30, CV30, FV3(-1, -2, -3)));
-    TEST_V3(FV3(-1, -1, -1), sub(CV30, FV3(1, 2, 3), FV3(2, 3, 4)));
+    TEST_V3(FV3(1, 2, 3), sub(CV30, FV3(-1, -2, -3)));
+    TEST_V3(FV3(-1, -1, -1), sub(FV3(1, 2, 3), FV3(2, 3, 4)));
 }
 
 static void testSetMul() {
@@ -128,7 +128,7 @@ static void testSetMul() {
 }
 
 static void testMul() {
-    TEST_V3(FV3(3, 6, 9), mul(CV30, FV3(1, 2, 3), 3));
+    TEST_V3(FV3(3, 6, 9), mul(FV3(1, 2, 3), 3));
 }
 
 static void testSetMulVector() {
@@ -145,8 +145,8 @@ static void testSetMulVector() {
 }
 
 static void testMulVector() {
-    TEST_V3(FV3(-2, -2, -9), mul(CV30, FV3(2, 1, 3), FV3(-1, -2, -3)));
-    TEST_V3(FV3(2, 2, 9), mul(CV30, FV3(1, 2, 3), FV3(2, 1, 3)));
+    TEST_V3(FV3(-2, -2, -9), mul(FV3(2, 1, 3), FV3(-1, -2, -3)));
+    TEST_V3(FV3(2, 2, 9), mul(FV3(1, 2, 3), FV3(2, 1, 3)));
 }
 
 static void testSetDiv() {
@@ -163,7 +163,7 @@ static void testSetDiv() {
 }
 
 static void testDiv() {
-    TEST_V3(FV3(-1, -2, -3), div(CV30, FV3(-3, -6, -9), 3));
+    TEST_V3(FV3(-1, -2, -3), div(FV3(-3, -6, -9), 3));
 }
 
 static void testSetDivVector() {
@@ -180,8 +180,8 @@ static void testSetDivVector() {
 }
 
 static void testDivVector() {
-    TEST_V3(FV3(-2, -0.5f, -1), div(CV30, FV3(2, 1, 3), FV3(-1, -2, -3)));
-    TEST_V3(FV3(0.5f, 2, 1), div(CV30, FV3(1, 2, 3), FV3(2, 1, 3)));
+    TEST_V3(FV3(-2, -0.5f, -1), div(FV3(2, 1, 3), FV3(-1, -2, -3)));
+    TEST_V3(FV3(0.5f, 2, 1), div(FV3(1, 2, 3), FV3(2, 1, 3)));
 }
 
 static void testSetInvert() {
@@ -194,7 +194,7 @@ static void testSetInvert() {
 }
 
 static void testInvert() {
-    TEST_V3(FV3(-1, 2, 3), invert(CV30, FV3(1, -2, -3)));
+    TEST_V3(FV3(-1, 2, 3), invert(FV3(1, -2, -3)));
 }
 
 static void testDot() {