Browse Source

Refactored Box

Kajetan Johannes Hammerle 9 months ago
parent
commit
b0248eb397
5 changed files with 104 additions and 100 deletions
  1. 17 7
      include/core/Box.h
  2. 7 2
      include/core/ToString.h
  3. 14 27
      src/Box.c
  4. 9 0
      src/ToString.c
  5. 57 64
      test/modules/BoxTests.c

+ 17 - 7
include/core/Box.h

@@ -3,17 +3,27 @@
 
 #include "core/Vector.h"
 
-typedef struct {
+struct CoreBoxT {
     CoreVector3 min;
     CoreVector3 max;
-} CoreBox;
+};
+typedef struct CoreBoxT CoreBox;
 
 #define CORE_BOX ((CoreBox){0})
-CoreBox* coreSetBox(CoreBox* box, const CoreVector3* size);
-CoreBox* coreOffsetBox(CoreBox* box, const CoreVector3* offset);
+void coreSetBox(CoreBox* box, const CoreVector3* size);
+void coreOffsetBox(CoreBox* box, const CoreVector3* offset);
 bool coreCollidesWithBox(const CoreBox* box, const CoreBox* other);
-CoreBox* coreExpandBox(CoreBox* box, const CoreVector3* offset);
-CoreBox* coreGrowBox(CoreBox* box, const CoreVector3* growth);
-size_t coreToStringBox(const CoreBox* box, char* buffer, size_t n);
+void coreExpandBox(CoreBox* box, const CoreVector3* offset);
+void coreGrowBox(CoreBox* box, const CoreVector3* growth);
+
+#ifdef IMPORT_CORE
+#define Box CoreBox
+#define BOX CORE_BOX
+#define setBox coreSetBox
+#define offsetBox coreOffsetBox
+#define collidesWithBox coreCollidesWithBox
+#define expandBox coreExpandBox
+#define growBox coreGrowBox
+#endif
 
 #endif

+ 7 - 2
include/core/ToString.h

@@ -16,12 +16,15 @@ void coreStringAdd(size_t* w, char** buffer, size_t* n, size_t shift);
                               size_t n);
 
 CORE_STRUCT_TO_STRING(BitArray)
+CORE_STRUCT_TO_STRING(Box)
 
 #ifdef IMPORT_CORE
 #define toStringSize coreToStringSize
 #define toStringInt coreToStringInt
 #define stringAdd coreStringAdd
 #define toStringBitArray coreToStringBitArray
+#define toStringBox coreToStringBox
+
 // clang-format off
 #define CORE_PAIR(a, b) a: b
 // clang-format on
@@ -30,8 +33,10 @@ CORE_STRUCT_TO_STRING(BitArray)
         CORE_PAIR(struct Core##name##T*, toString##name)
 
 #define toString(t, ...)                                                       \
-    _Generic((t), char*: coreToString, CORE_STRUCT_PAIR(BitArray))(            \
-        t, __VA_ARGS__)
+    _Generic((t),                                                              \
+        char*: coreToString,                                                   \
+        CORE_STRUCT_PAIR(BitArray),                                            \
+        CORE_STRUCT_PAIR(Box))(t, __VA_ARGS__)
 #endif
 
 #endif

+ 14 - 27
src/Box.c

@@ -1,9 +1,8 @@
 #include "core/Box.h"
 
-#include "core/ToString.h"
-#include "core/Utility.h"
+#include "core/Generic.h"
 
-CoreBox* coreSetBox(CoreBox* box, const CoreVector3* size) {
+void setBox(Box* box, const Vector3* size) {
     for(size_t i = 0; i < 3; i++) {
         if(size->data[i] < 0.0f) {
             box->min.data[i] = size->data[i];
@@ -13,16 +12,14 @@ CoreBox* coreSetBox(CoreBox* box, const CoreVector3* size) {
             box->max.data[i] = size->data[i];
         }
     }
-    return box;
 }
 
-CoreBox* coreOffsetBox(CoreBox* box, const CoreVector3* offset) {
-    coreAddSetV3(&box->min, offset);
-    coreAddSetV3(&box->max, offset);
-    return box;
+void offsetBox(Box* box, const Vector3* offset) {
+    addSet(&box->min, offset);
+    addSet(&box->max, offset);
 }
 
-bool coreCollidesWithBox(const CoreBox* box, const CoreBox* other) {
+bool collidesWithBox(const Box* box, const Box* other) {
     return box->max.data[0] > other->min.data[0] &&
            box->min.data[0] < other->max.data[0] &&
            box->max.data[1] > other->min.data[1] &&
@@ -31,7 +28,7 @@ bool coreCollidesWithBox(const CoreBox* box, const CoreBox* other) {
            box->min.data[2] < other->max.data[2];
 }
 
-CoreBox* coreExpandBox(CoreBox* box, const CoreVector3* offset) {
+void expandBox(Box* box, const Vector3* offset) {
     for(size_t i = 0; i < 3; i++) {
         if(offset->data[i] > 0.0f) {
             box->max.data[i] += offset->data[i];
@@ -39,16 +36,15 @@ CoreBox* coreExpandBox(CoreBox* box, const CoreVector3* offset) {
             box->min.data[i] += offset->data[i];
         }
     }
-    return box;
 }
 
-CoreBox* coreGrowBox(CoreBox* box, const CoreVector3* growth) {
-    CoreVector3 half = CORE_VECTOR3;
-    coreMulV3F(&half, growth, 0.5f);
-    CoreVector3 nMin = CORE_VECTOR3;
-    coreSubV3(&nMin, &box->min, &half);
-    CoreVector3 nMax = CORE_VECTOR3;
-    coreAddV3(&nMax, &box->max, &half);
+void growBox(Box* box, const Vector3* growth) {
+    Vector3 half;
+    mul(&half, growth, 0.5f);
+    Vector3 nMin;
+    sub(&nMin, &box->min, &half);
+    Vector3 nMax;
+    add(&nMax, &box->max, &half);
     for(size_t i = 0; i < 3; i++) {
         if(nMin.data[i] > nMax.data[i]) {
             nMin.data[i] = (box->min.data[i] + box->max.data[i]) * 0.5f;
@@ -57,13 +53,4 @@ CoreBox* coreGrowBox(CoreBox* box, const CoreVector3* growth) {
     }
     box->min = nMin;
     box->max = nMax;
-    return box;
-}
-
-size_t coreToStringBox(const CoreBox* box, char* buffer, size_t n) {
-    return coreToString(buffer, n,
-                        "Box([%.3f, %.3f, %.3f], [%.3f, %.3f, %.3f])",
-                        (double)box->min.data[0], (double)box->min.data[1],
-                        (double)box->min.data[2], (double)box->min.data[3],
-                        (double)box->min.data[4], (double)box->min.data[5]);
 }

+ 9 - 0
src/ToString.c

@@ -4,6 +4,7 @@
 #include <stdio.h>
 
 #include "core/BitArray.h"
+#include "core/Box.h"
 #include "core/Utility.h"
 
 size_t coreToString(char* buffer, size_t n, const char* format, ...) {
@@ -48,3 +49,11 @@ size_t toStringBitArray(const BitArray* a, char* buffer, size_t n) {
     coreStringAdd(&w, &buffer, &n, coreToString(buffer, n, "]"));
     return w;
 }
+
+size_t coreToStringBox(const CoreBox* box, char* buffer, size_t n) {
+    return coreToString(buffer, n,
+                        "Box([%.3f, %.3f, %.3f], [%.3f, %.3f, %.3f])",
+                        (double)box->min.data[0], (double)box->min.data[1],
+                        (double)box->min.data[2], (double)box->min.data[3],
+                        (double)box->min.data[4], (double)box->min.data[5]);
+}

+ 57 - 64
test/modules/BoxTests.c

@@ -1,94 +1,87 @@
 #include "../Tests.h"
 #include "core/Box.h"
+#include "core/ToString.h"
 
-#define CV3(a, b, c) (&(CoreVector3){{a, b, c}})
+#define CV3(a, b, c) (&(Vector3){{a, b, c}})
 
 static void testInit() {
-    CoreBox box = CORE_BOX;
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    CoreBox box = BOX;
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
     char buffer[128];
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([0.000, 0.000, 0.000], [1.000, 2.000, 3.000])",
-                     buffer);
-    coreToStringV3(&box.min, buffer, sizeof(buffer));
-    CORE_TEST_STRING("[0.000, 0.000, 0.000]", buffer);
-    coreToStringV3(&box.max, buffer, sizeof(buffer));
-    CORE_TEST_STRING("[1.000, 2.000, 3.000]", buffer);
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([0.000, 0.000, 0.000], [1.000, 2.000, 3.000])", buffer);
+    toStringV3(&box.min, buffer, sizeof(buffer));
+    TEST_STRING("[0.000, 0.000, 0.000]", buffer);
+    toStringV3(&box.max, buffer, sizeof(buffer));
+    TEST_STRING("[1.000, 2.000, 3.000]", buffer);
 
-    coreSetBox(&box, CV3(-1.0f, -2.0f, -3.0f));
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([-1.000, -2.000, -3.000], [0.000, 0.000, 0.000])",
-                     buffer);
-    coreToStringV3(&box.min, buffer, sizeof(buffer));
-    CORE_TEST_STRING("[-1.000, -2.000, -3.000]", buffer);
-    coreToStringV3(&box.max, buffer, sizeof(buffer));
-    CORE_TEST_STRING("[0.000, 0.000, 0.000]", buffer);
+    setBox(&box, CV3(-1.0f, -2.0f, -3.0f));
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([-1.000, -2.000, -3.000], [0.000, 0.000, 0.000])", buffer);
+    toStringV3(&box.min, buffer, sizeof(buffer));
+    TEST_STRING("[-1.000, -2.000, -3.000]", buffer);
+    toStringV3(&box.max, buffer, sizeof(buffer));
+    TEST_STRING("[0.000, 0.000, 0.000]", buffer);
 }
 
 static void testOffset() {
-    CoreBox box = CORE_BOX;
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
-    coreOffsetBox(&box, CV3(7.0f, -4.0f, 6.0f));
+    CoreBox box = BOX;
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    offsetBox(&box, CV3(7.0f, -4.0f, 6.0f));
     char buffer[128];
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([7.000, -4.000, 6.000], [8.000, -2.000, 9.000])",
-                     buffer);
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([7.000, -4.000, 6.000], [8.000, -2.000, 9.000])", buffer);
 }
 
 static void testCollidesWith() {
-    CoreBox boxA = CORE_BOX;
-    coreSetBox(&boxA, CV3(1.0f, 2.0f, 3.0f));
-    CoreBox boxB = CORE_BOX;
-    coreSetBox(&boxB, CV3(-1.0f, -2.0f, -3.0f));
-    CoreBox boxC = CORE_BOX;
-    coreSetBox(&boxC, CV3(2.0f, 2.0f, 2.0f));
-    coreOffsetBox(&boxC, CV3(-1.0f, -1.0f, -1.0f));
+    CoreBox boxA = BOX;
+    setBox(&boxA, CV3(1.0f, 2.0f, 3.0f));
+    CoreBox boxB = BOX;
+    setBox(&boxB, CV3(-1.0f, -2.0f, -3.0f));
+    CoreBox boxC = BOX;
+    setBox(&boxC, CV3(2.0f, 2.0f, 2.0f));
+    offsetBox(&boxC, CV3(-1.0f, -1.0f, -1.0f));
 
-    CORE_TEST_TRUE(coreCollidesWithBox(&boxC, &boxA));
-    CORE_TEST_TRUE(coreCollidesWithBox(&boxC, &boxB));
-    CORE_TEST_TRUE(coreCollidesWithBox(&boxA, &boxC));
-    CORE_TEST_TRUE(coreCollidesWithBox(&boxB, &boxC));
-    CORE_TEST_FALSE(coreCollidesWithBox(&boxA, &boxB));
-    CORE_TEST_FALSE(coreCollidesWithBox(&boxB, &boxA));
+    TEST_TRUE(collidesWithBox(&boxC, &boxA));
+    TEST_TRUE(collidesWithBox(&boxC, &boxB));
+    TEST_TRUE(collidesWithBox(&boxA, &boxC));
+    TEST_TRUE(collidesWithBox(&boxB, &boxC));
+    TEST_FALSE(collidesWithBox(&boxA, &boxB));
+    TEST_FALSE(collidesWithBox(&boxB, &boxA));
 }
 
 static void testExpand() {
-    CoreBox box = CORE_BOX;
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
-    coreExpandBox(&box, CV3(7.0f, -4.0f, 6.0f));
+    CoreBox box = BOX;
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    expandBox(&box, CV3(7.0f, -4.0f, 6.0f));
 
     char buffer[128];
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([0.000, -4.000, 0.000], [8.000, 2.000, 9.000])",
-                     buffer);
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([0.000, -4.000, 0.000], [8.000, 2.000, 9.000])", buffer);
 
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
-    coreExpandBox(&box, CV3(-7.0f, 4.0f, -6.0f));
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([-7.000, 0.000, -6.000], [1.000, 6.000, 3.000])",
-                     buffer);
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    expandBox(&box, CV3(-7.0f, 4.0f, -6.0f));
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([-7.000, 0.000, -6.000], [1.000, 6.000, 3.000])", buffer);
 }
 
 static void testGrow() {
-    CoreBox box = CORE_BOX;
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
-    coreGrowBox(&box, CV3(4.0f, 2.0f, 6.0f));
+    CoreBox box = BOX;
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    growBox(&box, CV3(4.0f, 2.0f, 6.0f));
     char buffer[128];
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([-2.000, -1.000, -3.000], [3.000, 3.000, 6.000])",
-                     buffer);
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([-2.000, -1.000, -3.000], [3.000, 3.000, 6.000])", buffer);
 
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
-    coreGrowBox(&box, CV3(-4.0f, -2.0f, -6.0f));
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([0.500, 1.000, 1.500], [0.500, 1.000, 1.500])",
-                     buffer);
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    growBox(&box, CV3(-4.0f, -2.0f, -6.0f));
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([0.500, 1.000, 1.500], [0.500, 1.000, 1.500])", buffer);
 
-    coreSetBox(&box, CV3(1.0f, 2.0f, 3.0f));
-    coreGrowBox(&box, CV3(-0.1f, -4.0f, -1.0f));
-    coreToStringBox(&box, buffer, sizeof(buffer));
-    CORE_TEST_STRING("Box([0.050, 1.000, 0.500], [0.950, 1.000, 2.500])",
-                     buffer);
+    setBox(&box, CV3(1.0f, 2.0f, 3.0f));
+    growBox(&box, CV3(-0.1f, -4.0f, -1.0f));
+    toString(&box, buffer, sizeof(buffer));
+    TEST_STRING("Box([0.050, 1.000, 0.500], [0.950, 1.000, 2.500])", buffer);
 }
 
 void testBox() {