From: Daniel Karbach Date: Mon, 18 Dec 2017 09:07:05 +0000 (+0100) Subject: catch ray/sphere intersect corner case X-Git-Url: http://git.localhorst.tv/?p=blobs.git;a=commitdiff_plain;h=82c3e2c1e27f05b9617a4da8e4806ace7d38a5e1 catch ray/sphere intersect corner case --- diff --git a/tst/math/IntersectTest.cpp b/tst/math/IntersectTest.cpp index cd50845..f428aaa 100644 --- a/tst/math/IntersectTest.cpp +++ b/tst/math/IntersectTest.cpp @@ -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",