116 lines
2.9 KiB
C++
116 lines
2.9 KiB
C++
#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<float> 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<float> 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<float> 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
|