#ifdef WITH_TESTS #include "../Tests.h" #include "../../navMesh/NavMeshTriangle.h" using namespace NM; TEST(NavMeshTriangle, uv_2D_on_2D) { NavMeshTriangle t1(Point3(0,0,0), Point3(1,0,0), Point3(0,1,0), 1); // flat triangle ASSERT_NEAR(0.5, t1.getArea(), 0.0001); float u, v; std::vector testVals = {1.0,0.0, 0.0,1.0, 0.4,0.4, 0.8,0.1, 0.1,0.8, 0.3,0.6, 0.6,0.3}; // point -> uv -> point for (size_t i = 0; i < testVals.size(); i+=2) { Point2 pt1(testVals[i], testVals[i+1]); t1.getUV(pt1, u, v); Point3 pt2 = t1.getPoint(u,v); ASSERT_NEAR(pt1.x, pt2.x, 0.0001); ASSERT_NEAR(pt1.y, pt2.y, 0.0001); } } TEST(NavMeshTriangle, uv_2D_on_3D) { NavMeshTriangle t1(Point3(0,0,0), Point3(2,0,0), Point3(0,1,1), 1); // non-flat triangle float u, v; std::vector testVals = {1.0,0.0, 0.0,1.0, 0.4,0.4, 0.8,0.1, 0.1,0.8, 0.3,0.6, 0.6,0.3}; // point -> uv -> point for (size_t i = 0; i < testVals.size(); i+=2) { Point2 pt1(testVals[i], testVals[i+1]); t1.getUV(pt1, u, v); Point3 pt2 = t1.getPoint(u,v); ASSERT_NEAR(pt1.x, pt2.x, 0.0001); ASSERT_NEAR(pt1.y, pt2.y, 0.0001); } } TEST(NavMeshTriangle, uv_3D_on_3D) { NavMeshTriangle t1(Point3(0,0,0), Point3(1,0,0), Point3(0,1,1), 1); // non-flat triangle float u, v; std::vector testVals = {1.0,0.0,0.0, 0.0,1.0,1.0}; // point -> uv -> point for (size_t i = 0; i < testVals.size(); i+=3) { Point3 pt1(testVals[i], testVals[i+1], testVals[i+2]); t1.getUV(pt1, u, v); Point3 pt2 = t1.getPoint(u,v); ASSERT_NEAR(pt1.x, pt2.x, 0.0001); ASSERT_NEAR(pt1.y, pt2.y, 0.0001); ASSERT_NEAR(pt1.z, pt2.z, 0.0001); } } TEST(NavMeshTriangle, contains) { NavMeshTriangle t1(Point3(0,0,0), Point3(1,0,0), Point3(0,1,0), 1); ASSERT_TRUE(t1.contains(Point3(0,0,0))); ASSERT_TRUE(t1.contains(Point3(1,0,0))); ASSERT_TRUE(t1.contains(Point3(0,1,0))); ASSERT_TRUE(t1.contains(Point3(0.5,0.5,0))); ASSERT_FALSE(t1.contains(Point3(0.501,0.5,0))); ASSERT_FALSE(t1.contains(Point3(0.5,0.501,0))); ASSERT_FALSE(t1.contains(Point3(1,1,0))); } TEST(NavMeshTriangle, area) { NavMeshTriangle t1(Point3(0,0,0), Point3(1,0,0), Point3(0,1,0), 1); ASSERT_NEAR(0.5, t1.getArea(), 0.0001); NavMeshTriangle t2(Point3(0,0,9), Point3(1,0,9), Point3(0,1,9), 1); ASSERT_NEAR(0.5, t2.getArea(), 0.0001); } TEST(NavMeshTriangle, interpolate) { NavMeshTriangle t1(Point3(0,0,0), Point3(1,0,0), Point3(0,1,0), 1); ASSERT_NEAR(1.0f, t1.interpolate(Point3(0,0,0), 1.0, 2.0, 3.0), 0.001); ASSERT_NEAR(2.0f, t1.interpolate(Point3(1,0,0), 1.0, 2.0, 3.0), 0.001); ASSERT_NEAR(3.0f, t1.interpolate(Point3(0,1,0), 1.0, 2.0, 3.0), 0.001); ASSERT_NEAR(1.5f, t1.interpolate(Point3(0.5,0,0), 1.0, 2.0, 3.0), 0.01); // between 1/2 ASSERT_NEAR(1.9f, t1.interpolate(Point3(0.9,0,0), 1.0, 2.0, 3.0), 0.01); ASSERT_NEAR(2.0f, t1.interpolate(Point3(0,0.5,0), 1.0, 2.0, 3.0), 0.01); // between 1/3 ASSERT_NEAR(2.8f, t1.interpolate(Point3(0,0.9,0), 1.0, 2.0, 3.0), 0.01); } #endif