X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=tst%2Fmodel%2FGeometryTest.cpp;h=82f88eeefcf5de296a3aaf9e013d65cd97509dde;hb=b127256b13f5a07ec6170b333c6dd0c46531cf21;hp=71830c6176930f31421e31af7afb052dff937292;hpb=0580ff3941fe5f5ea25c96e737edba1541d9271f;p=blank.git diff --git a/tst/model/GeometryTest.cpp b/tst/model/GeometryTest.cpp index 71830c6..82f88ee 100644 --- a/tst/model/GeometryTest.cpp +++ b/tst/model/GeometryTest.cpp @@ -64,6 +64,10 @@ void GeometryTest::testRayBoxIntersection() { } void GeometryTest::testBoxBoxIntersection() { + const float delta = std::numeric_limits::epsilon(); + float depth = 0; + glm::vec3 normal(0); + AABB box{ { -1, -1, -1 }, { 1, 1, 1 } }; // 2x2x2 cube centered around origin glm::mat4 Ma(1); // identity glm::mat4 Mb(1); // identity @@ -71,28 +75,43 @@ void GeometryTest::testBoxBoxIntersection() { CPPUNIT_ASSERT_MESSAGE( "identical OBBs don't intersect", - Intersection(box, Ma, box, Mb) + Intersection(box, Ma, box, Mb, depth, normal) + ); + // depth is two, but normal can be any + // (will probably be the first axis of box a, but any is valid) + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( + "penetration depth of coincidental 2x2x2 boxes is not 2", + 2.0f, depth, delta ); Ma = glm::translate(glm::vec3(-2, 0, 0)); // 2 to the left Mb = glm::translate(glm::vec3(2, 0, 0)); // 2 to the right CPPUNIT_ASSERT_MESSAGE( "distant OBBs intersect (2 apart, no rotation)", - !Intersection(box, Ma, box, Mb) + !Intersection(box, Ma, box, Mb, depth, normal) ); + // depth and normal undefined for non-intersecting objects Ma = glm::rotate(PI_0p25, glm::vec3(0, 0, 1)); // rotated 45° around Z Mb = glm::translate(glm::vec3(2.4, 0, 0)); // 2.4 to the right - // they should barely touch. intersect by about 0.01 if my head works + // they should barely touch. intersect by about sqrt(2) - 1.4 if my head works CPPUNIT_ASSERT_MESSAGE( "OBBs don't intersect (one rotated by 45°)", - Intersection(box, Ma, box, Mb) + Intersection(box, Ma, box, Mb, depth, normal) + ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( + "bad penetration depth (with rotation)", + 0.01421356237309504880f, depth, delta + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "bad intersection normal (with rotation)", + glm::vec3(1, 0, 0), abs(normal) // normal can be in + or - x, therefore abs() ); Mb = glm::translate(glm::vec3(3, 0, 0)); // 3 to the right CPPUNIT_ASSERT_MESSAGE( "OBBs intersect (one rotated by 45°)", - !Intersection(box, Ma, box, Mb) + !Intersection(box, Ma, box, Mb, depth, normal) ); }