From f1a86930164b360765c5e04d633aae4d617acdd1 Mon Sep 17 00:00:00 2001 From: Emmett Lalish Date: Tue, 3 Dec 2024 15:19:41 -0800 Subject: [PATCH] Fix DedupePropVerts (#1092) * added test * fixed dedupePropVerts * size_t --- src/impl.cpp | 11 ++++++---- test/manifold_test.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/impl.cpp b/src/impl.cpp index 9582b2c12..59cc0293d 100644 --- a/src/impl.cpp +++ b/src/impl.cpp @@ -194,13 +194,14 @@ int GetLabels(std::vector& components, } void DedupePropVerts(manifold::Vec& triProp, - const Vec>& vert2vert) { + const Vec>& vert2vert, + size_t numPropVert) { ZoneScoped; std::vector vertLabels; - const int numLabels = GetLabels(vertLabels, vert2vert, vert2vert.size()); + const int numLabels = GetLabels(vertLabels, vert2vert, numPropVert); std::vector label2vert(numLabels); - for (size_t v = 0; v < vert2vert.size(); ++v) label2vert[vertLabels[v]] = v; + for (size_t v = 0; v < numPropVert; ++v) label2vert[vertLabels[v]] = v; for (auto& prop : triProp) for (int i : {0, 1, 2}) prop[i] = label2vert[vertLabels[prop[i]]]; } @@ -343,6 +344,8 @@ void Manifold::Impl::CreateFaces() { const int prop1 = meshRelation_ .triProperties[pairFace][jointNum == 2 ? 0 : jointNum + 1]; + if (prop0 == prop1) return; + bool propEqual = true; for (size_t p = 0; p < numProp; ++p) { if (meshRelation_.properties[numProp * prop0 + p] != @@ -355,7 +358,7 @@ void Manifold::Impl::CreateFaces() { vert2vert[edgeIdx] = std::make_pair(prop0, prop1); } }); - DedupePropVerts(meshRelation_.triProperties, vert2vert); + DedupePropVerts(meshRelation_.triProperties, vert2vert, NumPropVert()); } for_each_n(autoPolicy(halfedge_.size(), 1e4), countAt(0), halfedge_.size(), diff --git a/test/manifold_test.cpp b/test/manifold_test.cpp index 3d561a1c8..ddaefd2bb 100644 --- a/test/manifold_test.cpp +++ b/test/manifold_test.cpp @@ -555,6 +555,54 @@ TEST(Manifold, Merge) { CheckCube(cubeSTL); } +TEST(Manifold, MergeEmpty) { + MeshGL shape; + shape.numProp = 7; + shape.triVerts = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35}; + shape.vertProperties = {0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + 0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + 0.0, 0.5, -0.43450000882149, 0.0, 0.0, 0.0, 1.0, + 0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + 0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + 0.0, -0.5, 0.434500008821487, 0.0, 0.0, 1.0, 0.0, + 0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + -0.0, 0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + -0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 1.0, + -0.0, 0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + 0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.5, -0.43450000882149, 0.0, 0.0, 1.0, 0.0, + 0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + -0.0, -0.5, 0.434500008821487, 0.0, 0.0, 1.0, 1.0, + 0.0, -0.5, 0.434500008821487, 0.0, 0.0, 0.0, 1.0, + -0.0, -0.5, 0.434500008821487, 0.0, 0.0, 1.0, 1.0, + 0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + -0.0, 0.5, 0.434500008821487, 0.0, 0.0, 1.0, 0.0, + -0.0, 0.5, -0.43450000882149, 0.0, 0.0, 0.0, 0.0, + -0.0, -0.5, 0.434500008821487, 0.0, 0.0, 1.0, 1.0, + -0.0, 0.5, 0.434500008821487, 0.0, 0.0, 0.0, 1.0, + -0.0, -0.5, 0.434500008821487, 0.0, 0.0, 1.0, 1.0, + -0.0, 0.5, -0.43450000882149, 0.0, 0.0, 0.0, 0.0, + -0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 0.0, + -0.0, -0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + 0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + 0.0, -0.5, 0.434500008821487, 0.0, 0.0, 0.0, 1.0, + 0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + -0.0, -0.5, 0.434500008821487, 0.0, 0.0, 0.0, 0.0, + -0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 0.0, + 0.0, -0.5, -0.43450000882149, 0.0, 0.0, 0.0, 0.0, + -0.0, 0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + 0.0, 0.5, -0.43450000882149, 0.0, 0.0, 0.0, 1.0, + -0.0, 0.5, -0.43450000882149, 0.0, 0.0, 1.0, 1.0, + 0.0, -0.5, -0.43450000882149, 0.0, 0.0, 0.0, 0.0, + -0.0, -0.5, -0.43450000882149, 0.0, 0.0, 1.0, 0.0}; + EXPECT_TRUE(shape.Merge()); + Manifold man(shape); + EXPECT_EQ(man.Status(), Manifold::Error::NoError); + EXPECT_TRUE(man.IsEmpty()); +} + TEST(Manifold, PinchedVert) { MeshGL shape; shape.numProp = 3;