Skip to content

Commit 01311b3

Browse files
Add tests for ConvexMesh
1 parent ba531e2 commit 01311b3

File tree

7 files changed

+193
-60
lines changed

7 files changed

+193
-60
lines changed

include/reactphysics3d/mathematics/Vector3.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ struct Vector3 {
154154
/// Return the zero vector
155155
static Vector3 zero();
156156

157+
/// Function to test if two vectors are (almost) equal
158+
static bool approxEqual(const Vector3& vec1, const Vector3& vec2, decimal epsilon = MACHINE_EPSILON);
159+
157160
// -------------------- Friends -------------------- //
158161

159162
friend Vector3 operator+(const Vector3& vector1, const Vector3& vector2);
@@ -390,9 +393,9 @@ RP3D_FORCE_INLINE Vector3 Vector3::zero() {
390393
}
391394

392395
// Function to test if two vectors are (almost) equal
393-
RP3D_FORCE_INLINE bool approxEqual(const Vector3& vec1, const Vector3& vec2, decimal epsilon = MACHINE_EPSILON) {
394-
return approxEqual(vec1.x, vec2.x, epsilon) && approxEqual(vec1.y, vec2.y, epsilon) &&
395-
approxEqual(vec1.z, vec2.z, epsilon);
396+
RP3D_FORCE_INLINE bool Vector3::approxEqual(const Vector3& vec1, const Vector3& vec2, decimal epsilon) {
397+
return reactphysics3d::approxEqual(vec1.x, vec2.x, epsilon) && reactphysics3d::approxEqual(vec1.y, vec2.y, epsilon) &&
398+
reactphysics3d::approxEqual(vec1.z, vec2.z, epsilon);
396399
}
397400

398401
}

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ set (RP3D_TESTS_HEADERS
1515
"tests/collision/TestPointInside.h"
1616
"tests/collision/TestRaycast.h"
1717
"tests/collision/TestTriangleVertexArray.h"
18+
"tests/collision/TestConvexMesh.h"
1819
"tests/containers/TestArray.h"
1920
"tests/containers/TestMap.h"
2021
"tests/containers/TestSet.h"

test/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "tests/collision/TestDynamicAABBTree.h"
4040
#include "tests/collision/TestHalfEdgeStructure.h"
4141
#include "tests/collision/TestTriangleVertexArray.h"
42+
#include "tests/collision/TestConvexMesh.h"
4243
#include "tests/containers/TestArray.h"
4344
#include "tests/containers/TestMap.h"
4445
#include "tests/containers/TestSet.h"
@@ -80,6 +81,7 @@ int main() {
8081
testSuite.addTest(new TestCollisionWorld("CollisionWorld"));
8182
testSuite.addTest(new TestDynamicAABBTree("DynamicAABBTree"));
8283
testSuite.addTest(new TestHalfEdgeStructure("HalfEdgeStructure"));
84+
testSuite.addTest(new TestConvexMesh("ConvexMesh"));
8385

8486
// ---------- Utils tests ---------- //
8587

test/tests/collision/TestCollisionWorld.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ struct CollisionPointData {
5959

6060
bool isContactPointSimilarTo(const Vector3& pointBody1, const Vector3& pointBody2, decimal penDepth, decimal epsilon = 0.001) const {
6161

62-
return approxEqual(pointBody1, localPointBody1, epsilon) &&
63-
approxEqual(pointBody2, localPointBody2, epsilon) &&
62+
return Vector3::approxEqual(pointBody1, localPointBody1, epsilon) &&
63+
Vector3::approxEqual(pointBody2, localPointBody2, epsilon) &&
6464
approxEqual(penetrationDepth, penDepth, epsilon);
6565
}
6666
};
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/********************************************************************************
2+
* ReactPhysics3D physics library, http://www.reactphysics3d.com *
3+
* Copyright (c) 2010-2016 Daniel Chappuis *
4+
*********************************************************************************
5+
* *
6+
* This software is provided 'as-is', without any express or implied warranty. *
7+
* In no event will the authors be held liable for any damages arising from the *
8+
* use of this software. *
9+
* *
10+
* Permission is granted to anyone to use this software for any purpose, *
11+
* including commercial applications, and to alter it and redistribute it *
12+
* freely, subject to the following restrictions: *
13+
* *
14+
* 1. The origin of this software must not be misrepresented; you must not claim *
15+
* that you wrote the original software. If you use this software in a *
16+
* product, an acknowledgment in the product documentation would be *
17+
* appreciated but is not required. *
18+
* *
19+
* 2. Altered source versions must be plainly marked as such, and must not be *
20+
* misrepresented as being the original software. *
21+
* *
22+
* 3. This notice may not be removed or altered from any source distribution. *
23+
* *
24+
********************************************************************************/
25+
26+
#ifndef TEST_CONVEX_MESH_H
27+
#define TEST_CONVEX_MESH_H
28+
29+
// Libraries
30+
#include "Test.h"
31+
#include <reactphysics3d/reactphysics3d.h>
32+
33+
/// Reactphysics3D namespace
34+
namespace reactphysics3d {
35+
36+
// Class TestConvexMesh
37+
/**
38+
* Unit test for the ConvexMesh class.
39+
*/
40+
class TestConvexMesh : public Test {
41+
42+
private :
43+
44+
// ---------- Atributes ---------- //
45+
46+
PhysicsCommon mPhysicsCommon;
47+
ConvexMesh* mConvexMesh;
48+
decimal mVertices[24];
49+
uint32 mIndices[24];
50+
51+
public :
52+
53+
// ---------- Methods ---------- //
54+
55+
/// Constructor
56+
TestConvexMesh(const std::string& name) : Test(name) {
57+
58+
// Cube
59+
mVertices[0] = -3; mVertices[1] = -3; mVertices[2] = 3;
60+
mVertices[3] = 3; mVertices[4] = -3; mVertices[5] = 3;
61+
mVertices[6] = 3; mVertices[7] = -3; mVertices[8] = -3;
62+
mVertices[9] = -3; mVertices[10] = -3; mVertices[11] = -3;
63+
mVertices[12] = -3; mVertices[13] = 3; mVertices[14] = 3;
64+
mVertices[15] = 3; mVertices[16] = 3; mVertices[17] = 3;
65+
mVertices[18] = 3; mVertices[19] = 3; mVertices[20] = -3;
66+
mVertices[21] = -3; mVertices[22] = 3; mVertices[23] = -3;
67+
68+
mIndices[0] = 0; mIndices[1] = 3; mIndices[2] = 2; mIndices[3] = 1;
69+
mIndices[4] = 4; mIndices[5] = 5; mIndices[6] = 6; mIndices[7] = 7;
70+
mIndices[8] = 0; mIndices[9] = 1; mIndices[10] = 5; mIndices[11] = 4;
71+
mIndices[12] = 1; mIndices[13] = 2; mIndices[14] = 6; mIndices[15] = 5;
72+
mIndices[16] = 2; mIndices[17] = 3; mIndices[18] = 7; mIndices[19] = 6;
73+
mIndices[20] = 0; mIndices[21] = 4; mIndices[22] = 7; mIndices[23] = 3;
74+
75+
PolygonVertexArray::PolygonFace faces[6];
76+
rp3d::PolygonVertexArray::PolygonFace* face = faces;
77+
for (int f = 0; f < 6; f++) {
78+
face->indexBase = f * 4;
79+
face->nbVertices = 4;
80+
face++;
81+
}
82+
PolygonVertexArray polygonVertexArray(8, &(mVertices[0]), 3 * sizeof(float),
83+
&(mIndices[0]), sizeof(int), 6, faces,
84+
rp3d::PolygonVertexArray::VertexDataType::VERTEX_FLOAT_TYPE,
85+
rp3d::PolygonVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
86+
std::vector<Error> errors;
87+
mConvexMesh = mPhysicsCommon.createConvexMesh(polygonVertexArray, errors);
88+
rp3d_test(mConvexMesh != nullptr);
89+
}
90+
91+
/// Destructor
92+
virtual ~TestConvexMesh() {
93+
94+
}
95+
96+
/// Run the tests
97+
void run() {
98+
test();
99+
}
100+
101+
void test() {
102+
103+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(0), Vector3(mVertices[0], mVertices[1], mVertices[2])));
104+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(1), Vector3(mVertices[3], mVertices[4], mVertices[5])));
105+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(2), Vector3(mVertices[6], mVertices[7], mVertices[8])));
106+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(3), Vector3(mVertices[9], mVertices[10], mVertices[11])));
107+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(4), Vector3(mVertices[12], mVertices[13], mVertices[14])));
108+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(5), Vector3(mVertices[15], mVertices[16], mVertices[17])));
109+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(6), Vector3(mVertices[18], mVertices[19], mVertices[20])));
110+
rp3d_test(Vector3::approxEqual(mConvexMesh->getVertex(7), Vector3(mVertices[21], mVertices[22], mVertices[23])));
111+
112+
rp3d_test(mConvexMesh->getNbVertices() == 8);
113+
rp3d_test(mConvexMesh->getHalfEdgeStructure().getNbVertices() == 8);
114+
rp3d_test(mConvexMesh->getNbFaces() == 6);
115+
rp3d_test(mConvexMesh->getHalfEdgeStructure().getNbFaces() == 6);
116+
rp3d_test(mConvexMesh->getHalfEdgeStructure().getNbHalfEdges() == 12 * 2);
117+
rp3d_test(mConvexMesh->getVolume() == 216);
118+
119+
rp3d_test(Vector3::approxEqual(mConvexMesh->getCentroid(), Vector3::zero()));
120+
rp3d_test(Vector3::approxEqual(mConvexMesh->getMinBounds(), Vector3(-3, -3 ,-3)));
121+
rp3d_test(Vector3::approxEqual(mConvexMesh->getMaxBounds(), Vector3(3, 3 ,3)));
122+
}
123+
};
124+
125+
}
126+
127+
#endif

test/tests/collision/TestTriangleVertexArray.h

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,16 @@ class TestTriangleVertexArray : public Test {
170170
Vector3 triangle0Vertices[3];
171171
mTriangleVertexArray1->getTriangleVertices(0, triangle0Vertices);
172172

173-
rp3d_test(approxEqual(triangle0Vertices[0], mVertex0, decimal(0.0000001)));
174-
rp3d_test(approxEqual(triangle0Vertices[1], mVertex1, decimal(0.0000001)));
175-
rp3d_test(approxEqual(triangle0Vertices[2], mVertex2, decimal(0.0000001)));
173+
rp3d_test(Vector3::approxEqual(triangle0Vertices[0], mVertex0, decimal(0.0000001)));
174+
rp3d_test(Vector3::approxEqual(triangle0Vertices[1], mVertex1, decimal(0.0000001)));
175+
rp3d_test(Vector3::approxEqual(triangle0Vertices[2], mVertex2, decimal(0.0000001)));
176176

177177
Vector3 triangle1Vertices[3];
178178
mTriangleVertexArray1->getTriangleVertices(1, triangle1Vertices);
179179

180-
rp3d_test(approxEqual(triangle1Vertices[0], mVertex0, decimal(0.0000001)));
181-
rp3d_test(approxEqual(triangle1Vertices[1], mVertex3, decimal(0.0000001)));
182-
rp3d_test(approxEqual(triangle1Vertices[2], mVertex1, decimal(0.0000001)));
180+
rp3d_test(Vector3::approxEqual(triangle1Vertices[0], mVertex0, decimal(0.0000001)));
181+
rp3d_test(Vector3::approxEqual(triangle1Vertices[1], mVertex3, decimal(0.0000001)));
182+
rp3d_test(Vector3::approxEqual(triangle1Vertices[2], mVertex1, decimal(0.0000001)));
183183

184184
// Get triangle normals
185185

@@ -193,9 +193,9 @@ class TestTriangleVertexArray : public Test {
193193
const Vector3 normal2Test(0, 1, 0);
194194
const Vector3 normal3Test(1, 0, 0);
195195

196-
rp3d_test(approxEqual(triangle0Normals[0], normal0Test, decimal(0.0001)));
197-
rp3d_test(approxEqual(triangle0Normals[2], normal2Test, decimal(0.0001)));
198-
rp3d_test(approxEqual(triangle1Normals[1], normal3Test, decimal(0.0001)));
196+
rp3d_test(Vector3::approxEqual(triangle0Normals[0], normal0Test, decimal(0.0001)));
197+
rp3d_test(Vector3::approxEqual(triangle0Normals[2], normal2Test, decimal(0.0001)));
198+
rp3d_test(Vector3::approxEqual(triangle1Normals[1], normal3Test, decimal(0.0001)));
199199

200200
// ----- Second triangle vertex array ----- //
201201

@@ -229,28 +229,28 @@ class TestTriangleVertexArray : public Test {
229229

230230
mTriangleVertexArray2->getTriangleVertices(0, triangle0Vertices);
231231

232-
rp3d_test(approxEqual(triangle0Vertices[0], mVertex4, decimal(0.0000001)));
233-
rp3d_test(approxEqual(triangle0Vertices[1], mVertex5, decimal(0.0000001)));
234-
rp3d_test(approxEqual(triangle0Vertices[2], mVertex6, decimal(0.0000001)));
232+
rp3d_test(Vector3::approxEqual(triangle0Vertices[0], mVertex4, decimal(0.0000001)));
233+
rp3d_test(Vector3::approxEqual(triangle0Vertices[1], mVertex5, decimal(0.0000001)));
234+
rp3d_test(Vector3::approxEqual(triangle0Vertices[2], mVertex6, decimal(0.0000001)));
235235

236236
mTriangleVertexArray2->getTriangleVertices(1, triangle1Vertices);
237237

238-
rp3d_test(approxEqual(triangle1Vertices[0], mVertex4, decimal(0.0000001)));
239-
rp3d_test(approxEqual(triangle1Vertices[1], mVertex7, decimal(0.0000001)));
240-
rp3d_test(approxEqual(triangle1Vertices[2], mVertex5, decimal(0.0000001)));
238+
rp3d_test(Vector3::approxEqual(triangle1Vertices[0], mVertex4, decimal(0.0000001)));
239+
rp3d_test(Vector3::approxEqual(triangle1Vertices[1], mVertex7, decimal(0.0000001)));
240+
rp3d_test(Vector3::approxEqual(triangle1Vertices[2], mVertex5, decimal(0.0000001)));
241241

242242
// Get triangle normals
243243

244244
mTriangleVertexArray2->getTriangleVerticesNormals(0, triangle0Normals);
245245
mTriangleVertexArray2->getTriangleVerticesNormals(1, triangle1Normals);
246246

247-
rp3d_test(approxEqual(triangle0Normals[0], mNormal0, decimal(0.000001)));
248-
rp3d_test(approxEqual(triangle0Normals[1], mNormal1, decimal(0.000001)));
249-
rp3d_test(approxEqual(triangle0Normals[2], mNormal2, decimal(0.000001)));
247+
rp3d_test(Vector3::approxEqual(triangle0Normals[0], mNormal0, decimal(0.000001)));
248+
rp3d_test(Vector3::approxEqual(triangle0Normals[1], mNormal1, decimal(0.000001)));
249+
rp3d_test(Vector3::approxEqual(triangle0Normals[2], mNormal2, decimal(0.000001)));
250250

251-
rp3d_test(approxEqual(triangle1Normals[0], mNormal0, decimal(0.000001)));
252-
rp3d_test(approxEqual(triangle1Normals[1], mNormal3, decimal(0.000001)));
253-
rp3d_test(approxEqual(triangle1Normals[2], mNormal1, decimal(0.000001)));
251+
rp3d_test(Vector3::approxEqual(triangle1Normals[0], mNormal0, decimal(0.000001)));
252+
rp3d_test(Vector3::approxEqual(triangle1Normals[1], mNormal3, decimal(0.000001)));
253+
rp3d_test(Vector3::approxEqual(triangle1Normals[2], mNormal1, decimal(0.000001)));
254254
}
255255

256256
};

0 commit comments

Comments
 (0)