98 lines
3.9 KiB
C++
98 lines
3.9 KiB
C++
#include <jtest/jtest.hpp>
|
|
#include <J3ML/Geometry/Triangle.hpp>
|
|
|
|
using J3ML::Geometry::Interval;
|
|
using J3ML::Geometry::Triangle;
|
|
|
|
int TriangleTests() {
|
|
TEST("Triangle::FaceNormal", [] {
|
|
Triangle t(
|
|
{-1, -1, -1},
|
|
{0, 1, 0},
|
|
{1, -1, 1}
|
|
);
|
|
|
|
jtest::check(t.FaceNormal() == Vector3{4, 0, -4});
|
|
});
|
|
|
|
TEST("Triangle::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
|
|
jtest::check(Intersects(xyTriangle, xyTriangle));
|
|
// Translate 1 towards x -- should collide
|
|
jtest::check(Intersects(xyTriangle, xyTriangle.Translated(Vector3(1.0f, 0.0f, 0.0f))));
|
|
// Translate 2 towards x -- should collide exactly on V1
|
|
jtest::check(Intersects(xyTriangle, xyTriangle.Translated(Vector3(2.0f, 0.0f, 0.0f))));
|
|
// Translate 2 towards negative x -- should collide exactly on V0
|
|
jtest::check(Intersects(xyTriangle, xyTriangle.Translated(Vector3(-2.0f, 0.0f, 0.0f))));
|
|
// Translate 3 towards x -- should not collide
|
|
jtest::check(!Intersects(xyTriangle, xyTriangle.Translated(Vector3(3.0f, 0.0f, 0.0f))));
|
|
// Translate 3 towards negative x -- should not collide
|
|
jtest::check(!Intersects(xyTriangle, xyTriangle.Translated(Vector3(-3.0f, 0.0f, 0.0f))));
|
|
// Translate 1 towards z -- should not collide
|
|
jtest::check(!Intersects(xyTriangle, xyTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))));
|
|
// Triangle collides with contained smaller triangle
|
|
jtest::check(!Intersects(xyTriangle, xyTriangle.Scaled(Vector3(0.5f, 0.5f, 0.5f)).Translated(Vector3(0.25f, 0.25f, 0.0f))));
|
|
|
|
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
|
|
jtest::check(Intersects(xyTriangle, zxTriangle));
|
|
// Should collide across xyTriangle's edge and zxTriangle's face
|
|
jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -1.0))));
|
|
// Should collide exactly on V1
|
|
jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -2.0))));
|
|
// xyTriangle's face should be poked by zxTriangle's V0
|
|
jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 0.0f))));
|
|
// xyTriangle's face should be cut by zxTriangle
|
|
jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, -0.5f))));
|
|
// Should not collide
|
|
jtest::check(!Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 1.0f))));
|
|
// Should not collide
|
|
jtest::check(!Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -3.0f))));
|
|
|
|
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
|
|
jtest::check(Intersects(yxTriangle, yxTriangle));
|
|
// Should not collide
|
|
jtest::check(!Intersects(xyTriangle, yxTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))));
|
|
// Should not collide
|
|
jtest::check(!Intersects(yxTriangle, yxTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))));
|
|
|
|
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
|
|
jtest::check(Intersects(xyTriangle, zyInvertedTriangle));
|
|
// Should not collide
|
|
jtest::check(!Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))));
|
|
// Should not collide
|
|
jtest::check(!Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.25f, 0.75f, 0.0f))));
|
|
});
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|