#include #include using J3ML::Geometry::Interval; using J3ML::Geometry::Triangle; TEST(TriangleTests, FaceNormal) { Triangle t{ Vector3{-1, -1, -1}, Vector3{0, 1, 0}, Vector3{1, -1, 1} }; EXPECT_EQ(t.FaceNormal(), (Vector3{4, 0, -4})); } TEST(TriangleTests, IntersectTriangle) { Triangle xyTriangle{ {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {2.0f, 0.0f, 0.0f} }; // Triangle collides with itself EXPECT_EQ(Intersects(xyTriangle, xyTriangle), true); // Translate 1 towards x -- should collide EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(1.0f, 0.0f, 0.0f))), true); // Translate 2 towards x -- should collide exactly on V1 EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(2.0f, 0.0f, 0.0f))), true); // Translate 2 towards negative x -- should collide exactly on V0 EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(-2.0f, 0.0f, 0.0f))), true); // Translate 3 towards x -- should not collide EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(3.0f, 0.0f, 0.0f))), false); // Translate 3 towards negative x -- should not collide EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(-3.0f, 0.0f, 0.0f))), false); // Translate 1 towards z -- should not collide EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))), false); // Triangle collides with contained smaller triangle EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Scaled(Vector3(0.5f, 0.5f, 0.5f)).Translated(Vector3(0.25f, 0.25f, 0.0f))), true); Triangle zxTriangle { {0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 2.0f} }; // Should collide exactly on V0 EXPECT_EQ(Intersects(xyTriangle, zxTriangle), true); // Should collide across xyTriangle's edge and zxTriangle's face EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -1.0))), true); // Should collide exactly on V1 EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -2.0))), true); // xyTriangle's face should be poked by zxTriangle's V0 EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 0.0f))), true); // xyTriangle's face should be cut by zxTriangle EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, -0.5f))), true); // Should not collide EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 1.0f))), false); // Should not collide EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -3.0f))), false); Triangle yxTriangle{ {0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {0.0f, 2.0f, 0.0f} }; // Should collide on V0-V1 edge EXPECT_EQ(Intersects(yxTriangle, yxTriangle), true); // Should not collide EXPECT_EQ(Intersects(xyTriangle, yxTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))), false); // Should not collide EXPECT_EQ(Intersects(yxTriangle, yxTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))), false); Triangle zyInvertedTriangle{ {0.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 1.0f} }; // Should collide exactly on V1 EXPECT_EQ(Intersects(xyTriangle, zyInvertedTriangle), true); // Should not collide EXPECT_EQ(Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))), false); // Should not collide EXPECT_EQ(Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.25f, 0.75f, 0.0f))), false); }