]> git.localhorst.tv Git - blobs.git/commitdiff
catch ray/sphere intersect corner case
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 18 Dec 2017 09:07:05 +0000 (10:07 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 18 Dec 2017 09:07:05 +0000 (10:07 +0100)
tst/math/IntersectTest.cpp

index cd5084574d8d3928fae03a50dd04f45314c47a04..f428aaa59a585ce0f3a84f941ff8df12fe23b3e2 100644 (file)
@@ -243,6 +243,35 @@ void IntersectTest::testRaySphereIntersection() {
                glm::dvec3(1.0, 0.0, 0.0), normal
        );
 
+       ray.Origin({ 0.5, 0.0, 0.0 }); // a tad to the right
+       CPPUNIT_ASSERT_MESSAGE(
+               "ray does not intersect sphere at origin",
+               Intersect(ray, sphere, normal, dist)
+       );
+       CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
+               "distance along ray to unit sphere at origin is not 0.5",
+               0.5, dist, epsilon
+       );
+       AssertEqual(
+               "bad intersection normal",
+               glm::dvec3(1.0, 0.0, 0.0), normal
+       );
+
+       // corner case: ray origin exactly on sphere (should "intersect")
+       ray.Origin({ 1.0, 0.0, 0.0 });
+       CPPUNIT_ASSERT_MESSAGE(
+               "ray touching sphere does not intersect it",
+               Intersect(ray, sphere, normal, dist)
+       );
+       CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
+               "distance along ray touching unit sphere is not 0.0",
+               0.0, dist, epsilon
+       );
+       AssertEqual(
+               "bad intersection normal",
+               glm::dvec3(1.0, 0.0, 0.0), normal
+       );
+
        ray.Origin({ 2.0, 0.0, 0.0 }); // move outside
        CPPUNIT_ASSERT_MESSAGE(
                "ray pointing away from sphere intersects it for some reason",