90 lines
3.6 KiB
C++
90 lines
3.6 KiB
C++
#include <gtest/gtest.h>
|
|
#include <J3ML/Geometry/Triangle.h>
|
|
|
|
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);
|
|
}
|
|
|