diff --git a/src/OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh b/src/OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh index 78b8f806..f476ad1f 100644 --- a/src/OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh +++ b/src/OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh @@ -179,6 +179,17 @@ protected: ///TODO:Implement fixed positions + // Compute the maximal vertex valence in the mesh + unsigned int maxValence = 0; + for ( auto vertex : _m.vertices() ) { + maxValence = std::max(maxValence,_m.valence(vertex)); + } + + // We pre initialized with 30. If it's larger, we update the weights + if (maxValence >= 30) { + init_weights( maxValence + 1 ); + } + // Do _n subdivisions for (size_t i=0; i < _n; ++i) { diff --git a/src/Unittests/TestFiles/cylinder.om b/src/Unittests/TestFiles/cylinder.om new file mode 100644 index 00000000..7036e0a3 Binary files /dev/null and b/src/Unittests/TestFiles/cylinder.om differ diff --git a/src/Unittests/unittests_subdivider_uniform.cc b/src/Unittests/unittests_subdivider_uniform.cc index 835c89cf..53900233 100644 --- a/src/Unittests/unittests_subdivider_uniform.cc +++ b/src/Unittests/unittests_subdivider_uniform.cc @@ -1027,6 +1027,28 @@ TEST_F(OpenMeshSubdividerUniform_Triangle, Modified_Butterfly) { +TEST_F(OpenMeshSubdividerUniform_Triangle, Modified_Butterfly_cylinder) { + mesh_.clear(); + + OpenMesh::IO::read_mesh(mesh_, "cylinder.om"); + + // Initialize subdivider + OpenMesh::Subdivider::Uniform::ModifiedButterflyT butter; + + // Check setup + EXPECT_EQ(66u, mesh_.n_vertices() ) << "Wrong number of vertices"; + EXPECT_EQ(128u, mesh_.n_faces() ) << "Wrong number of faces"; + + // Execute 3 subdivision steps + butter( mesh_,3,true ); + + // Check setup + EXPECT_EQ(4098u, mesh_.n_vertices() ) << "Wrong number of vertices after subdivision with loop"; + EXPECT_EQ(8192u, mesh_.n_faces() ) << "Wrong number of faces after subdivision with loop"; +} + + + TEST_F(OpenMeshSubdividerUniform_Triangle, Modified_Butterfly_delete_vertex) { for (bool collect_garbage : { false, true })