Skip to content

Commit 11c7c2d

Browse files
authored
Add unit tests for improved mesh parser and fix normals loading bug (#509)
1 parent 19769dd commit 11c7c2d

File tree

9 files changed

+692
-6
lines changed

9 files changed

+692
-6
lines changed

tesseract/tesseract_geometry/include/tesseract_geometry/mesh_parser.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ std::vector<std::shared_ptr<T>> extractMeshData(const aiScene* scene,
9090
{
9191
auto vertices = std::make_shared<tesseract_common::VectorVector3d>();
9292
auto triangles = std::make_shared<Eigen::VectorXi>();
93-
std::shared_ptr<tesseract_common::VectorVector3d> normals = nullptr;
93+
std::shared_ptr<tesseract_common::VectorVector3d> vertex_normals = nullptr;
9494
std::shared_ptr<tesseract_common::VectorVector4d> vertex_colors = nullptr;
9595
MeshMaterial::Ptr material = nullptr;
9696
std::shared_ptr<std::vector<MeshTexture::Ptr>> textures = nullptr;
@@ -128,13 +128,13 @@ std::vector<std::shared_ptr<T>> extractMeshData(const aiScene* scene,
128128

129129
if (normals && a->HasNormals())
130130
{
131-
normals = std::make_shared<tesseract_common::VectorVector3d>();
131+
vertex_normals = std::make_shared<tesseract_common::VectorVector3d>();
132132
for (unsigned int i = 0; i < a->mNumVertices; ++i)
133133
{
134134
aiVector3D v = transform * a->mNormals[i];
135-
normals->push_back(Eigen::Vector3d(static_cast<double>(v.x) * scale(0),
136-
static_cast<double>(v.y) * scale(1),
137-
static_cast<double>(v.z) * scale(2)));
135+
vertex_normals->push_back(Eigen::Vector3d(static_cast<double>(v.x) * scale(0),
136+
static_cast<double>(v.y) * scale(1),
137+
static_cast<double>(v.z) * scale(2)));
138138
}
139139
}
140140

@@ -270,7 +270,7 @@ std::vector<std::shared_ptr<T>> extractMeshData(const aiScene* scene,
270270
static_cast<int>(triangle_count),
271271
resource,
272272
scale,
273-
normals,
273+
vertex_normals,
274274
vertex_colors,
275275
material,
276276
textures));

tesseract/tesseract_geometry/test/tesseract_geometry_unit.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,81 @@ TEST(TesseractGeometryUnit, LoadMeshUnit) // NOLINT
296296
EXPECT_TRUE(convex_meshes[0]->getVerticeCount() == 8);
297297
}
298298

299+
#ifdef TESSERACT_ASSIMP_USE_PBRMATERIAL
300+
301+
TEST(TesseractGeometryUnit, LoadMeshWithMaterialGltf2Unit) // NOLINT
302+
{
303+
using namespace tesseract_geometry;
304+
305+
std::string mesh_file = std::string(TESSERACT_SUPPORT_DIR) + "/meshes/tesseract_material_mesh.glb";
306+
std::vector<Mesh::Ptr> meshes =
307+
createMeshFromPath<Mesh>(mesh_file, Eigen::Vector3d(1, 1, 1), true, true, true, true, true);
308+
ASSERT_TRUE(meshes.size() == 4);
309+
310+
auto& mesh0 = meshes[0];
311+
auto& mesh1 = meshes[1];
312+
auto& mesh2 = meshes[2];
313+
auto& mesh3 = meshes[3];
314+
315+
EXPECT_EQ(mesh0->getTriangleCount(), 34);
316+
EXPECT_EQ(mesh0->getVerticeCount(), 68);
317+
EXPECT_EQ(mesh1->getTriangleCount(), 15);
318+
EXPECT_EQ(mesh1->getVerticeCount(), 17);
319+
EXPECT_EQ(mesh2->getTriangleCount(), 15);
320+
EXPECT_EQ(mesh2->getVerticeCount(), 17);
321+
EXPECT_EQ(mesh3->getTriangleCount(), 2);
322+
EXPECT_EQ(mesh3->getVerticeCount(), 4);
323+
324+
auto mesh0_normals = mesh0->getNormals();
325+
ASSERT_TRUE(mesh0_normals != nullptr);
326+
EXPECT_EQ(mesh0_normals->size(), 68);
327+
auto mesh1_normals = mesh1->getNormals();
328+
ASSERT_TRUE(mesh1_normals != nullptr);
329+
EXPECT_EQ(mesh1_normals->size(), 17);
330+
auto mesh2_normals = mesh2->getNormals();
331+
ASSERT_TRUE(mesh2_normals != nullptr);
332+
EXPECT_EQ(mesh2_normals->size(), 17);
333+
auto mesh3_normals = mesh3->getNormals();
334+
ASSERT_TRUE(mesh3_normals != nullptr);
335+
EXPECT_EQ(mesh3_normals->size(), 4);
336+
337+
auto mesh0_material = mesh0->getMaterial();
338+
EXPECT_TRUE(mesh0_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.7, 0.7, 0.7, 1), 0.01));
339+
EXPECT_NEAR(mesh0_material->getMetallicFactor(), 0.0, 0.01);
340+
EXPECT_NEAR(mesh0_material->getRoughnessFactor(), 0.5, 0.01);
341+
EXPECT_TRUE(mesh0_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
342+
343+
auto mesh1_material = mesh1->getMaterial();
344+
EXPECT_TRUE(mesh1_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.8, 0, 0, 1), 0.01));
345+
EXPECT_NEAR(mesh1_material->getMetallicFactor(), 0.8, 0.01);
346+
EXPECT_NEAR(mesh1_material->getRoughnessFactor(), 0.1, 0.01);
347+
EXPECT_TRUE(mesh1_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
348+
349+
auto mesh2_material = mesh2->getMaterial();
350+
EXPECT_TRUE(mesh2_material->getBaseColorFactor().isApprox(Eigen::Vector4d(0.05, 0.8, 0.05, 1), 0.01));
351+
EXPECT_NEAR(mesh2_material->getMetallicFactor(), 0.9, 0.01);
352+
EXPECT_NEAR(mesh2_material->getRoughnessFactor(), 0.7, 0.01);
353+
EXPECT_TRUE(mesh2_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0.1, 0.1, 0.5, 1), 0.01));
354+
355+
auto mesh3_material = mesh3->getMaterial();
356+
EXPECT_TRUE(mesh3_material->getBaseColorFactor().isApprox(Eigen::Vector4d(1, 1, 1, 1), 0.01));
357+
EXPECT_NEAR(mesh3_material->getMetallicFactor(), 0, 0.01);
358+
EXPECT_NEAR(mesh3_material->getRoughnessFactor(), 0.5, 0.01);
359+
EXPECT_TRUE(mesh3_material->getEmissiveFactor().isApprox(Eigen::Vector4d(0, 0, 0, 1), 0.01));
360+
361+
EXPECT_TRUE(mesh0->getTextures() == nullptr);
362+
EXPECT_TRUE(mesh1->getTextures() == nullptr);
363+
EXPECT_TRUE(mesh2->getTextures() == nullptr);
364+
365+
ASSERT_TRUE(mesh3->getTextures() != nullptr);
366+
ASSERT_EQ(mesh3->getTextures()->size(), 1);
367+
368+
auto texture = mesh3->getTextures()->at(0);
369+
EXPECT_EQ(texture->getTextureImage()->getResourceContents().size(), 38212);
370+
EXPECT_EQ(texture->getUVs()->size(), 4);
371+
}
372+
#endif
373+
299374
int main(int argc, char** argv)
300375
{
301376
testing::InitGoogleTest(&argc, argv);
Loading

0 commit comments

Comments
 (0)