浏览代码

Make first argument optional for 3 arg operations

Kajetan Johannes Hammerle 11 月之前
父节点
当前提交
f2b3e663c1
共有 2 个文件被更改,包括 32 次插入14 次删除
  1. 24 4
      include/core/Generic.h
  2. 8 10
      src/Frustum.c

+ 24 - 4
include/core/Generic.h

@@ -23,14 +23,30 @@
         GENERIC_PAIR(IntVector3*, name##IV3),                                  \
         GENERIC_PAIR(IntVector4*, name##IV4))
 
+#define ZERO_VECTOR(a)                                                         \
+    _Generic((a),                                                              \
+        GENERIC_PAIR(Vector2*, &(Vector2){0}),                                 \
+        GENERIC_PAIR(Vector3*, &(Vector3){0}),                                 \
+        GENERIC_PAIR(Vector4*, &(Vector4){0}),                                 \
+        GENERIC_PAIR(IntVector2*, &(IntVector2){0}),                           \
+        GENERIC_PAIR(IntVector3*, &(IntVector3){0}),                           \
+        GENERIC_PAIR(IntVector4*, &(IntVector4){0}))
+
 #define GENERIC_FACTOR(b, type, base, factor)                                  \
     type:                                                                      \
     _Generic((b), GENERIC_PAIR(type, base), default: factor)
 
+#define SELECT_OP(_1, _2, _3, name, ...) name
+
 #define addSet(a, b) GENERIC_VECTOR(a, addSet)(a, b)
-#define add(a, b, c) GENERIC_VECTOR(a, add)(a, b, c)
+#define add3(a, b, c) GENERIC_VECTOR(a, add)(a, b, c)
+#define add2(a, b) add3(ZERO_VECTOR(a), a, b)
+#define add(...) SELECT_OP(__VA_ARGS__, add3, add2, 0)(__VA_ARGS__)
+
 #define subSet(a, b) GENERIC_VECTOR(a, subSet)(a, b)
-#define sub(a, b, c) GENERIC_VECTOR(a, sub)(a, b, c)
+#define sub3(a, b, c) GENERIC_VECTOR(a, sub)(a, b, c)
+#define sub2(a, b) sub3(ZERO_VECTOR(a), a, b)
+#define sub(...) SELECT_OP(__VA_ARGS__, sub3, sub2, 0)(__VA_ARGS__)
 
 #define mulSet(a, b)                                                           \
     _Generic((a),                                                              \
@@ -43,7 +59,7 @@
         GENERIC_FACTOR(b, IntVector3*, mulSetIV3, mulSetIV3F),                 \
         GENERIC_FACTOR(b, IntVector4*, mulSetIV4, mulSetIV4F))(a, b)
 
-#define mul(a, b, c)                                                           \
+#define mul3(a, b, c)                                                          \
     _Generic((a),                                                              \
         Matrix *: mulMatrix,                                                   \
         Quaternion *: mulQ,                                                    \
@@ -58,6 +74,8 @@
         GENERIC_FACTOR(c, IntVector2*, mulIV2, mulIV2F),                       \
         GENERIC_FACTOR(c, IntVector3*, mulIV3, mulIV3F),                       \
         GENERIC_FACTOR(c, IntVector4*, mulIV4, mulIV4F))(a, b, c)
+#define mul2(a, b) mul3(ZERO_VECTOR(a), a, b)
+#define mul(...) SELECT_OP(__VA_ARGS__, mul3, mul2, 0)(__VA_ARGS__)
 
 #define divSet(a, b)                                                           \
     _Generic((a),                                                              \
@@ -68,7 +86,7 @@
         GENERIC_FACTOR(b, IntVector3*, divSetIV3, divSetIV3F),                 \
         GENERIC_FACTOR(b, IntVector4*, divSetIV4, divSetIV4F))(a, b)
 
-#define div(a, b, c)                                                           \
+#define div3(a, b, c)                                                          \
     _Generic((a),                                                              \
         GENERIC_FACTOR(c, Vector2*, divV2, divV2F),                            \
         GENERIC_FACTOR(c, Vector3*, divV3, divV3F),                            \
@@ -76,6 +94,8 @@
         GENERIC_FACTOR(c, IntVector2*, divIV2, divIV2F),                       \
         GENERIC_FACTOR(c, IntVector3*, divIV3, divIV3F),                       \
         GENERIC_FACTOR(c, IntVector4*, divIV4, divIV4F))(a, b, c)
+#define div2(a, b) div3(ZERO_VECTOR(a), a, b)
+#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)

+ 8 - 10
src/Frustum.c

@@ -5,8 +5,6 @@
 #include "core/Generic.h"
 #include "core/Utility.h"
 
-#define CV30 (&CORE_VECTOR3)
-
 void initFrustum(Frustum* f, float fieldOfView, float nearClip, float farClip) {
     f->tan = tanf(degreeToRadian(fieldOfView) * 0.5f);
     f->nearClip = nearClip;
@@ -38,32 +36,32 @@ void updateFrustumPlanes(Frustum* f, const Vector3* pos, const Vector3* right,
     float hFarWidth = hFarHeight * aspect;
 
     Vector3 fCenter;
-    add(&fCenter, pos, mul(CV30, front, f->farClip));
+    add(&fCenter, pos, mul(front, f->farClip));
     Vector3 upFar;
     mul(&upFar, up, hFarHeight);
     Vector3 rightFar;
     mul(&rightFar, right, hFarWidth);
 
     Vector3 fTopLeft;
-    add(&fTopLeft, &fCenter, sub(CV30, &upFar, &rightFar));
+    add(&fTopLeft, &fCenter, sub(&upFar, &rightFar));
     Vector3 fTopRight;
-    add(&fTopRight, &fCenter, add(CV30, &upFar, &rightFar));
+    add(&fTopRight, &fCenter, add(&upFar, &rightFar));
     Vector3 fBottomRight;
-    sub(&fBottomRight, &fCenter, sub(CV30, &upFar, &rightFar));
+    sub(&fBottomRight, &fCenter, sub(&upFar, &rightFar));
 
     Vector3 nCenter;
-    add(&nCenter, pos, mul(CV30, front, f->nearClip));
+    add(&nCenter, pos, mul(front, f->nearClip));
     Vector3 upNear;
     mul(&upNear, up, hNearHeight);
     Vector3 rightNear;
     mul(&rightNear, right, hNearWidth);
 
     Vector3 nTopLeft;
-    add(&nTopLeft, &nCenter, sub(CV30, &upNear, &rightNear));
+    add(&nTopLeft, &nCenter, sub(&upNear, &rightNear));
     Vector3 nBottomLeft;
-    sub(&nBottomLeft, &nCenter, add(CV30, &upNear, &rightNear));
+    sub(&nBottomLeft, &nCenter, add(&upNear, &rightNear));
     Vector3 nBottomRight;
-    sub(&nBottomRight, &nCenter, sub(CV30, &upNear, &rightNear));
+    sub(&nBottomRight, &nCenter, sub(&upNear, &rightNear));
 
     // near plane
     initPlane(f->planes + 0, &nBottomRight, &nTopLeft, &nBottomLeft);