@@ -304,7 +304,7 @@ TEST_F(MeshManager, ConvexDecomposition)
304304 std::size_t maxConvexHulls = 4 ;
305305 std::size_t resolution = 1000 ;
306306 auto submesh = boxMesh->SubMeshByIndex (0u ).lock ();
307- auto decomposed = std::move (mgr-> ConvexDecomposition (
307+ auto decomposed = std::move (common::MeshManager:: ConvexDecomposition (
308308 *(submesh.get ()), maxConvexHulls, resolution));
309309
310310 // Decomposing a box should just produce a box
@@ -321,7 +321,7 @@ TEST_F(MeshManager, ConvexDecomposition)
321321 ASSERT_NE (nullptr , drillMesh);
322322 EXPECT_EQ (1u , drillMesh->SubMeshCount ());
323323 submesh = drillMesh->SubMeshByIndex (0u ).lock ();
324- decomposed = std::move (mgr-> ConvexDecomposition (
324+ decomposed = std::move (common::MeshManager:: ConvexDecomposition (
325325 *(submesh.get ()), maxConvexHulls, resolution));
326326
327327 // A drill should be decomposed into multiple submeshes
@@ -337,4 +337,93 @@ TEST_F(MeshManager, ConvexDecomposition)
337337 }
338338}
339339
340+ // ///////////////////////////////////////////////
341+ TEST_F (MeshManager, MergeSubMeshes)
342+ {
343+ auto mgr = common::MeshManager::Instance ();
344+ const common::Mesh *mesh = mgr->Load (
345+ common::testing::TestFile (" data" ,
346+ " multiple_texture_coordinates_triangle.dae" ));
347+ ASSERT_NE (nullptr , mesh);
348+ EXPECT_EQ (2u , mesh->SubMeshCount ());
349+ auto submesh = mesh->SubMeshByIndex (0u ).lock ();
350+ ASSERT_NE (nullptr , submesh);
351+ EXPECT_EQ (3u , submesh->VertexCount ());
352+ EXPECT_EQ (3u , submesh->NormalCount ());
353+ EXPECT_EQ (3u , submesh->IndexCount ());
354+ EXPECT_EQ (2u , submesh->TexCoordSetCount ());
355+ EXPECT_EQ (3u , submesh->TexCoordCountBySet (0 ));
356+ EXPECT_EQ (3u , submesh->TexCoordCountBySet (1 ));
357+ auto submeshB = mesh->SubMeshByIndex (1u ).lock ();
358+ ASSERT_NE (nullptr , submeshB);
359+ EXPECT_EQ (3u , submeshB->VertexCount ());
360+ EXPECT_EQ (3u , submeshB->NormalCount ());
361+ EXPECT_EQ (3u , submeshB->IndexCount ());
362+ EXPECT_EQ (3u , submeshB->TexCoordSetCount ());
363+ EXPECT_EQ (3u , submeshB->TexCoordCountBySet (0 ));
364+ EXPECT_EQ (3u , submeshB->TexCoordCountBySet (1 ));
365+ EXPECT_EQ (3u , submeshB->TexCoordCountBySet (2 ));
366+
367+ // merge all submeshes into one
368+ auto merged = common::MeshManager::MergeSubMeshes (*mesh);
369+ ASSERT_NE (nullptr , merged);
370+ EXPECT_FALSE (merged->Name ().empty ());
371+ EXPECT_EQ (1u , merged->SubMeshCount ());
372+ auto mergedSubmesh = merged->SubMeshByIndex (0u ).lock ();
373+ ASSERT_NE (nullptr , mergedSubmesh);
374+ EXPECT_FALSE (mergedSubmesh->Name ().empty ());
375+
376+ // Verify vertice, normals, indice, and texcoord values in the
377+ // final merged submesh
378+ EXPECT_EQ (6u , mergedSubmesh->VertexCount ());
379+ EXPECT_EQ (6u , mergedSubmesh->NormalCount ());
380+ EXPECT_EQ (6u , mergedSubmesh->IndexCount ());
381+ EXPECT_EQ (3u , mergedSubmesh->TexCoordSetCount ());
382+ EXPECT_EQ (6u , mergedSubmesh->TexCoordCountBySet (0 ));
383+ EXPECT_EQ (6u , mergedSubmesh->TexCoordCountBySet (1 ));
384+ EXPECT_EQ (6u , mergedSubmesh->TexCoordCountBySet (2 ));
385+
386+ EXPECT_EQ (math::Vector3d (0 , 0 , 0 ), mergedSubmesh->Vertex (0u ));
387+ EXPECT_EQ (math::Vector3d (10 , 0 , 0 ), mergedSubmesh->Vertex (1u ));
388+ EXPECT_EQ (math::Vector3d (10 , 10 , 0 ), mergedSubmesh->Vertex (2u ));
389+ EXPECT_EQ (math::Vector3d (10 , 0 , 0 ), mergedSubmesh->Vertex (3u ));
390+ EXPECT_EQ (math::Vector3d (20 , 0 , 0 ), mergedSubmesh->Vertex (4u ));
391+ EXPECT_EQ (math::Vector3d (20 , 10 , 0 ), mergedSubmesh->Vertex (5u ));
392+
393+ EXPECT_EQ (math::Vector3d (0 , 0 , 1 ), mergedSubmesh->Normal (0u ));
394+ EXPECT_EQ (math::Vector3d (0 , 0 , 1 ), mergedSubmesh->Normal (1u ));
395+ EXPECT_EQ (math::Vector3d (0 , 0 , 1 ), mergedSubmesh->Normal (2u ));
396+ EXPECT_EQ (math::Vector3d (0 , 0 , 1 ), mergedSubmesh->Normal (3u ));
397+ EXPECT_EQ (math::Vector3d (0 , 0 , 1 ), mergedSubmesh->Normal (4u ));
398+ EXPECT_EQ (math::Vector3d (0 , 0 , 1 ), mergedSubmesh->Normal (5u ));
399+
400+ EXPECT_EQ (0u , mergedSubmesh->Index (0u ));
401+ EXPECT_EQ (1u , mergedSubmesh->Index (1u ));
402+ EXPECT_EQ (2u , mergedSubmesh->Index (2u ));
403+ EXPECT_EQ (3u , mergedSubmesh->Index (3u ));
404+ EXPECT_EQ (4u , mergedSubmesh->Index (4u ));
405+ EXPECT_EQ (5u , mergedSubmesh->Index (5u ));
406+
407+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (0u , 0u ));
408+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (1u , 0u ));
409+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (2u , 0u ));
410+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (3u , 0u ));
411+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (4u , 0u ));
412+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (5u , 0u ));
413+
414+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (0u , 1u ));
415+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (1u , 1u ));
416+ EXPECT_EQ (math::Vector2d (0 , 1 ), mergedSubmesh->TexCoordBySet (2u , 1u ));
417+ EXPECT_EQ (math::Vector2d (0 , 0.5 ), mergedSubmesh->TexCoordBySet (3u , 1u ));
418+ EXPECT_EQ (math::Vector2d (0 , 0.4 ), mergedSubmesh->TexCoordBySet (4u , 1u ));
419+ EXPECT_EQ (math::Vector2d (0 , 0.3 ), mergedSubmesh->TexCoordBySet (5u , 1u ));
420+
421+ EXPECT_EQ (math::Vector2d (0 , 0 ), mergedSubmesh->TexCoordBySet (0u , 2u ));
422+ EXPECT_EQ (math::Vector2d (0 , 0 ), mergedSubmesh->TexCoordBySet (1u , 2u ));
423+ EXPECT_EQ (math::Vector2d (0 , 0 ), mergedSubmesh->TexCoordBySet (2u , 2u ));
424+ EXPECT_EQ (math::Vector2d (0 , 0.8 ), mergedSubmesh->TexCoordBySet (3u , 2u ));
425+ EXPECT_EQ (math::Vector2d (0 , 0.7 ), mergedSubmesh->TexCoordBySet (4u , 2u ));
426+ EXPECT_EQ (math::Vector2d (0 , 0.6 ), mergedSubmesh->TexCoordBySet (5u , 2u ));
427+ }
428+
340429#endif
0 commit comments