]> git.localhorst.tv Git - gong.git/commitdiff
simple AABB intersection test
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 2 Dec 2016 11:40:14 +0000 (12:40 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 2 Dec 2016 11:40:14 +0000 (12:40 +0100)
src/geometry/geometry.cpp
src/geometry/primitive.hpp
tst/geometry/IntersectionTest.cpp
tst/geometry/IntersectionTest.hpp

index 1c1bfd61655bf8e2225d681c35984798f400da56..002c68f0d1ba69760b65d41049e069a2ef2d490a 100644 (file)
@@ -46,6 +46,16 @@ std::ostream &operator <<(std::ostream &out, const AABB &box) {
        return out << "AABB(" << box.min << ", " << box.max << ')';
 }
 
+bool Intersection(const AABB &a, const AABB &b) noexcept {
+       if (a.max.x < b.min.x) return false;
+       if (b.max.x < a.min.x) return false;
+       if (a.max.y < b.min.y) return false;
+       if (b.max.y < a.min.y) return false;
+       if (a.max.z < b.min.z) return false;
+       if (b.max.z < a.min.z) return false;
+       return true;
+}
+
 std::ostream &operator <<(std::ostream &out, const Ray &ray) {
        return out << "Ray(" << ray.orig << ", " << ray.dir << ')';
 }
index 819ef04e77bd03e948b4c18fd051d817e610b69d..c922506c40fa0e2281de5983bba01b11d36f8d90 100644 (file)
@@ -30,10 +30,17 @@ struct AABB {
                glm::vec3 high(glm::max(glm::abs(min), glm::abs(max)));
                return glm::length(high);
        }
+
+       void Move(const glm::vec3 &delta) noexcept {
+               min += delta;
+               max += delta;
+       }
 };
 
 std::ostream &operator <<(std::ostream &, const AABB &);
 
+bool Intersection(const AABB &, const AABB &) noexcept;
+
 // TODO: this should really use setters/getters for dir and inv_dir so
 //       manipulating code doesn't "forget" to call Update()
 struct Ray {
index d2332fe7f74b7ddb55ee2a449b0fdb9459788411..36cacdfa8bd309293c8224a0da636f9dd544e34d 100644 (file)
@@ -21,6 +21,64 @@ void IntersectionTest::tearDown() {
 }
 
 
+void IntersectionTest::testAABB() {
+       AABB a{ { -1, -1, -1 }, { 1, 1, 1 } };
+       AABB b(a);
+
+       CPPUNIT_ASSERT_MESSAGE(
+               "coincidental AABBs should intersect",
+               Intersection(a, b)
+       );
+
+       b.Move({ 1, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should intersect",
+               Intersection(a, b)
+       );
+
+       b.Move({ 2, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should not intersect",
+               !Intersection(a, b)
+       );
+
+       b.Move({ -4, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should intersect",
+               Intersection(a, b)
+       );
+
+       b.Move({ -2, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should not intersect",
+               !Intersection(a, b)
+       );
+
+       b.Move({ 3, 1, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should intersect",
+               Intersection(a, b)
+       );
+
+       b.Move({ 0, 2, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should not intersect",
+               !Intersection(a, b)
+       );
+
+       b.Move({ 2, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should not intersect",
+               !Intersection(a, b)
+       );
+
+       b.Move({ 0, 0, 2 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "AABBs should not intersect",
+               !Intersection(a, b)
+       );
+}
+
 void IntersectionTest::testSimpleRayBox() {
        Ray ray{ { 0, 0, 0 }, { 1, 0, 0 }, { } }; // at origin, pointing right
        ray.Update();
index d0c7d80444676bbab3573540885d4680ed05c8d1..4865c889047dbb91995c71c0ab17bc99d0ffcba8 100644 (file)
@@ -13,6 +13,7 @@ class IntersectionTest
 
 CPPUNIT_TEST_SUITE(IntersectionTest);
 
+CPPUNIT_TEST(testAABB);
 CPPUNIT_TEST(testSimpleRayBox);
 CPPUNIT_TEST(testRayBox);
 CPPUNIT_TEST(testBoxBox);
@@ -25,6 +26,7 @@ public:
        void setUp();
        void tearDown();
 
+       void testAABB();
        void testSimpleRayBox();
        void testRayBox();
        void testBoxBox();