From 63074306c2093f0faec3f7cb731978bbfb194ff3 Mon Sep 17 00:00:00 2001 From: papush! Date: Sat, 2 Oct 2021 12:03:46 +0200 Subject: [PATCH] fix hole detection and dumb filling --- src/main_window.cpp | 7 +++-- src/mesh_processing.cpp | 58 +++++++++++++++++++++++++++++------------ src/mesh_processing.h | 9 ++++--- 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/main_window.cpp b/src/main_window.cpp index cbce79a..91cff0a 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -43,10 +43,13 @@ void MainWindow::open(const QString &path) { for (const VertexHandle &vh : mesh.vertices()) { mesh.set_color(vh, MyMesh::Color(0, 0, 0)); } - if (glm != nullptr) mesh_viewer.removeOpenGLMesh(glm); - for (HalfedgeStrip border : findBorders(mesh)) { + + for (HalfedgeHandle border : findBorders(mesh)) { setBorderColor(mesh, border, {1, 0, 0}); + fillHoleDumb(mesh, border); } + + if (glm != nullptr) mesh_viewer.removeOpenGLMesh(glm); glm = mesh_viewer.addOpenGLMeshFromOpenMesh(&mesh); for (QAction *a : toolbar_actions) { a->setEnabled(true); diff --git a/src/mesh_processing.cpp b/src/mesh_processing.cpp index 16261e5..0d7f5f5 100644 --- a/src/mesh_processing.cpp +++ b/src/mesh_processing.cpp @@ -1,30 +1,54 @@ #include "mesh_processing.h" -#include +#include +#include -std::vector findBorders(MyMesh &mesh) { - std::vector borders(1); - size_t current = 0; - for (auto it = mesh.halfedges_begin(); it != mesh.halfedges_end(); ++it) { - while (mesh.is_boundary(*it)) { - borders[current].push_back(*it); - ++it; +std::vector findBorders(MyMesh &mesh) { + std::vector borders; + std::set ignore; + for (HalfedgeHandle it : mesh.halfedges()) { + if (mesh.is_boundary(it) + && ignore.find(it) == ignore.end()) { + borders.push_back(it); + ignore.insert(it); + for (HalfedgeHandle it2 : HalfedgeLoopRange(mesh, it)) { + ignore.insert(it2); + } } - if (borders[current].size() > 0) { - borders.emplace_back(); - current++; - } - } - if (borders.back().size() == 0) { - borders.pop_back(); } return borders; } -void setBorderColor(MyMesh &mesh, const HalfedgeStrip &border, +void setBorderColor(MyMesh &mesh, const HalfedgeHandle &border, MyMesh::Color color) { - for (MyMesh::HalfedgeHandle it : border) { + for (HalfedgeHandle it : HalfedgeLoopRange(mesh, border)) { mesh.set_color(mesh.to_vertex_handle(it), color); } } + + +void fillHoleDumb(MyMesh &mesh, HalfedgeHandle &border) { + mesh.request_vertex_status(); + mesh.request_edge_status(); + mesh.request_face_status(); + + Point center(0, 0, 0); + size_t length = 0; + for (HalfedgeHandle it : HalfedgeLoopRange(mesh, border)) { + VertexHandle vert = mesh.to_vertex_handle(it); + center += mesh.point(vert); + length++; + } + center /= length; + VertexHandle center_handle = mesh.new_vertex_dirty(center); + + for (HalfedgeHandle it = border; + mesh.to_vertex_handle(it) != center_handle;) { + HalfedgeHandle next = mesh.next_halfedge_handle(it); + mesh.add_face(mesh.from_vertex_handle(it), + mesh.to_vertex_handle(it), + center_handle); + it = next; + } +} diff --git a/src/mesh_processing.h b/src/mesh_processing.h index aa7e786..76c6722 100644 --- a/src/mesh_processing.h +++ b/src/mesh_processing.h @@ -6,11 +6,12 @@ #include -typedef std::vector HalfedgeStrip; +std::vector findBorders(MyMesh &mesh); -std::vector findBorders(MyMesh &mesh); - -void setBorderColor(MyMesh &mesh, const HalfedgeStrip &border, +void setBorderColor(MyMesh &mesh, const HalfedgeHandle &border, MyMesh::Color color); +void fillHoleDumb(MyMesh &mesh, HalfedgeHandle &border); + + #endif \ No newline at end of file