]> git.localhorst.tv Git - gong.git/blobdiff - tst/geometry/IntersectionTest.cpp
sphere/sphere intersection test
[gong.git] / tst / geometry / IntersectionTest.cpp
index 36cacdfa8bd309293c8224a0da636f9dd544e34d..550c0f257c65fc2bf33325d59b4aa7c939215031 100644 (file)
@@ -325,6 +325,59 @@ void IntersectionTest::testBoxBox() {
        );
 }
 
+void IntersectionTest::testSphereSphere() {
+       const float delta = std::numeric_limits<float>::epsilon();
+
+       Sphere a{{ 0.0f, 0.0f, 0.0f }, 1.0f};
+       Sphere b{{ 0.0f, 0.0f, 0.0f }, 1.0f};
+       float depth;
+       glm::vec3 normal;
+
+       CPPUNIT_ASSERT_MESSAGE(
+               "coincidental spheres should intersect",
+               Intersection(a, b, depth, normal)
+       );
+       CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
+               "bad intersection distance",
+               2.0f, depth, delta
+       );
+       // normal can be just about anything
+
+       b.Move({ 1, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "spheres should intersect",
+               Intersection(a, b, depth, normal)
+       );
+       CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
+               "bad intersection distance",
+               1.0f, depth, delta
+       );
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "bad intersection normal",
+               glm::vec3(1, 0, 0), normal
+       );
+
+       b.Position({ -1.5, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "spheres should intersect",
+               Intersection(a, b, depth, normal)
+       );
+       CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
+               "bad intersection distance",
+               0.5f, depth, delta
+       );
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "bad intersection normal",
+               glm::vec3(-1, 0, 0), normal
+       );
+
+       b.Move({ -1, 0, 0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "spheres should not intersect",
+               !Intersection(a, b, depth, normal)
+       );
+}
+
 void IntersectionTest::testSpherePlane() {
        const float delta = std::numeric_limits<float>::epsilon();