3232#include < dust3d/mesh/triangulate.h>
3333#include < dust3d/mesh/trim_vertices.h>
3434#include < dust3d/mesh/tube_mesh_builder.h>
35- #include < dust3d/mesh/weld_vertices.h>
3635#include < functional>
3736#include < memory>
3837
@@ -902,7 +901,7 @@ std::unique_ptr<MeshState> MeshGenerator::combineComponentMesh(const std::string
902901 }
903902 std::vector<std::tuple<std::unique_ptr<MeshState>, CombineMode, std::string>> groupMeshes;
904903 for (const auto & group : combineGroups) {
905- auto childMesh = combineComponentChildGroupMesh (group.second , componentCache);
904+ auto childMesh = combineComponentChildGroupMesh (group.second , componentCache, &componentCache. brokenTriangles );
906905 if (nullptr == childMesh || childMesh->isNull ())
907906 continue ;
908907 groupMeshes.emplace_back (std::make_tuple (std::move (childMesh), group.first , String::join (group.second , " |" )));
@@ -922,7 +921,7 @@ std::unique_ptr<MeshState> MeshGenerator::combineComponentMesh(const std::string
922921 groupMeshes.emplace_back (std::make_tuple (std::move (stitchingMesh), CombineMode::Normal, String::join (stitchingComponents, " :" )));
923922 }
924923 }
925- mesh = combineMultipleMeshes (std::move (groupMeshes));
924+ mesh = combineMultipleMeshes (std::move (groupMeshes), &componentCache. brokenTriangles );
926925 ComponentPreview preview;
927926 if (mesh) {
928927 mesh->fetch (preview.vertices , preview.triangles );
@@ -947,7 +946,8 @@ std::unique_ptr<MeshState> MeshGenerator::combineComponentMesh(const std::string
947946 return mesh;
948947}
949948
950- std::unique_ptr<MeshState> MeshGenerator::combineMultipleMeshes (std::vector<std::tuple<std::unique_ptr<MeshState>, CombineMode, std::string>>&& multipleMeshes)
949+ std::unique_ptr<MeshState> MeshGenerator::combineMultipleMeshes (std::vector<std::tuple<std::unique_ptr<MeshState>, CombineMode, std::string>>&& multipleMeshes,
950+ std::set<std::array<PositionKey, 3 >>* brokenTriangles)
951951{
952952 std::unique_ptr<MeshState> mesh;
953953 std::string meshIdStrings;
@@ -982,6 +982,10 @@ std::unique_ptr<MeshState> MeshGenerator::combineMultipleMeshes(std::vector<std:
982982 m_cacheContext->cachedCombination .insert ({ meshIdStrings, nullptr });
983983 }
984984 if (newMesh && !newMesh->isNull ()) {
985+ if (nullptr != brokenTriangles) {
986+ for (const auto & brokenTriangle : newMesh->brokenTriangles )
987+ brokenTriangles->insert (brokenTriangle);
988+ }
985989 mesh = std::move (newMesh);
986990 } else {
987991 m_isSuccessful = false ;
@@ -993,7 +997,9 @@ std::unique_ptr<MeshState> MeshGenerator::combineMultipleMeshes(std::vector<std:
993997 return mesh;
994998}
995999
996- std::unique_ptr<MeshState> MeshGenerator::combineComponentChildGroupMesh (const std::vector<std::string>& componentIdStrings, GeneratedComponent& componentCache)
1000+ std::unique_ptr<MeshState> MeshGenerator::combineComponentChildGroupMesh (const std::vector<std::string>& componentIdStrings,
1001+ GeneratedComponent& componentCache,
1002+ std::set<std::array<PositionKey, 3 >>* brokenTriangles)
9971003{
9981004 std::vector<std::tuple<std::unique_ptr<MeshState>, CombineMode, std::string>> multipleMeshes;
9991005 for (const auto & childIdString : componentIdStrings) {
@@ -1022,7 +1028,7 @@ std::unique_ptr<MeshState> MeshGenerator::combineComponentChildGroupMesh(const s
10221028
10231029 multipleMeshes.emplace_back (std::make_tuple (std::move (subMesh), childCombineMode, childIdString));
10241030 }
1025- return combineMultipleMeshes (std::move (multipleMeshes));
1031+ return combineMultipleMeshes (std::move (multipleMeshes), brokenTriangles );
10261032}
10271033
10281034void MeshGenerator::collectSharedQuadEdges (const std::vector<Vector3>& vertices, const std::vector<std::vector<size_t >>& faces,
@@ -1139,6 +1145,20 @@ void MeshGenerator::collectUncombinedComponent(const std::string& componentIdStr
11391145 }
11401146}
11411147
1148+ void MeshGenerator::collectBrokenTriangles (const std::string& componentIdString)
1149+ {
1150+ const auto & component = findComponent (componentIdString);
1151+ for (const auto & childIdString : String::split (String::valueOrEmpty (*component, " children" ), ' ,' )) {
1152+ if (childIdString.empty ())
1153+ continue ;
1154+ collectBrokenTriangles (childIdString);
1155+ }
1156+ const auto & componentCache = m_cacheContext->components [componentIdString];
1157+ for (const auto & triangle : componentCache.brokenTriangles ) {
1158+ m_object->brokenTrianglesToComponentIdMap .insert ({ triangle, Uuid (componentIdString) });
1159+ }
1160+ }
1161+
11421162void MeshGenerator::setDefaultPartColor (const Color& color)
11431163{
11441164 m_defaultPartColor = color;
@@ -1310,27 +1330,14 @@ void MeshGenerator::generate()
13101330 if (nullptr != combinedMesh) {
13111331 combinedMesh->fetch (combinedVertices, combinedFaces);
13121332 m_object->seamTriangleUvs = combinedMesh->seamTriangleUvs ;
1313- if (m_weldEnabled) {
1314- size_t totalAffectedNum = 0 ;
1315- size_t affectedNum = 0 ;
1316- do {
1317- std::vector<Vector3> weldedVertices;
1318- std::vector<std::vector<size_t >> weldedFaces;
1319- affectedNum = weldVertices (combinedVertices, combinedFaces,
1320- m_minimalRadius, componentCache.noneSeamVertices ,
1321- weldedVertices, weldedFaces);
1322- combinedVertices = weldedVertices;
1323- combinedFaces = weldedFaces;
1324- totalAffectedNum += affectedNum;
1325- } while (affectedNum > 0 );
1326- }
13271333 recoverQuads (combinedVertices, combinedFaces, componentCache.sharedQuadEdges , m_object->triangleAndQuads );
13281334 m_object->vertices = combinedVertices;
13291335 m_object->triangles = combinedFaces;
13301336 }
13311337
13321338 // Recursively check uncombined components
13331339 collectUncombinedComponent (to_string (Uuid ()));
1340+ collectBrokenTriangles (to_string (Uuid ()));
13341341
13351342 postprocessObject (m_object);
13361343
0 commit comments