From e07b95e7eec9d779d7fd552728ea9b7fa1cb1bbe Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Fri, 4 Sep 2015 14:43:25 +0200 Subject: [PATCH] Non manifold edges fix - The test to detect the non manifold edges was wrong. It had an unnecessary condition. - The function that fills the list of non manifold edges was not called anymore. It is now called in compute_normals_and_vertices(). - I added the necessary code to display the non manifold edges. --- .../Polyhedron/Scene_polygon_soup_item.cpp | 58 +++++++++++++++++-- .../demo/Polyhedron/Scene_polygon_soup_item.h | 10 +++- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp index 9240eca0aeb..c8bed3add1b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.cpp @@ -117,12 +117,27 @@ Scene_polygon_soup_item::initialize_buffers(Viewer_interface* viewer) const program->enableAttributeArray("vertex"); program->setAttributeBuffer("vertex",GL_FLOAT,0,4); buffers[3].release(); - program->release(); vaos[1]->release(); } + //vao containing the data for the non manifold edges + { + program = getShaderProgram(PROGRAM_WITHOUT_LIGHT, viewer); + program->bind(); + vaos[2]->bind(); + buffers[4].bind(); + buffers[4].allocate(positions_nm_lines.data(), + static_cast(positions_nm_lines.size()*sizeof(float))); + program->enableAttributeArray("vertex"); + program->setAttributeBuffer("vertex",GL_FLOAT,0,4); + buffers[4].release(); + vaos[2]->release(); + nb_nm_edges = positions_nm_lines.size(); + positions_nm_lines.resize(0); + std::vector (positions_nm_lines).swap(positions_nm_lines); + } are_buffers_filled = true; } @@ -258,7 +273,6 @@ Scene_polygon_soup_item::triangulate_polygon(Polygons_iterator pit) void Scene_polygon_soup_item::compute_normals_and_vertices(){ //get the vertices and normals - typedef Polygon_soup::Polygons::size_type size_type; positions_poly.resize(0); positions_lines.resize(0); @@ -319,16 +333,36 @@ Scene_polygon_soup_item::compute_normals_and_vertices(){ positions_lines.push_back(pb.z()); positions_lines.push_back(1.0); } + //Non manifold edges + positions_nm_lines.resize(0); + soup->fill_edges(); + BOOST_FOREACH(const Polygon_soup::Edge& edge, + soup->non_manifold_edges) + { + + const Point_3& a = soup->points[edge[0]]; + const Point_3& b = soup->points[edge[1]]; + positions_nm_lines.push_back(a.x()); + positions_nm_lines.push_back(a.y()); + positions_nm_lines.push_back(a.z()); + positions_nm_lines.push_back(1.0); + + positions_nm_lines.push_back(b.x()); + positions_nm_lines.push_back(b.y()); + positions_nm_lines.push_back(b.z()); + positions_nm_lines.push_back(1.0); + } } } Scene_polygon_soup_item::Scene_polygon_soup_item() - : Scene_item(4,2), + : Scene_item(5,3), soup(0), oriented(false) { + nb_nm_edges = 0; } Scene_polygon_soup_item::~Scene_polygon_soup_item() @@ -544,7 +578,6 @@ Scene_polygon_soup_item::draw(Viewer_interface* viewer) const { // Clean-up program->release(); vaos[0]->release(); - } void @@ -574,7 +607,6 @@ Scene_polygon_soup_item::draw_edges(Viewer_interface* viewer) const { initialize_buffers(viewer); } if(soup == 0) return; - vaos[1]->bind(); attrib_buffers(viewer,PROGRAM_WITHOUT_LIGHT); program = getShaderProgram(PROGRAM_WITHOUT_LIGHT); @@ -587,6 +619,22 @@ Scene_polygon_soup_item::draw_edges(Viewer_interface* viewer) const { // Clean-up program->release(); vaos[1]->release(); + if(displayNonManifoldEdges()) + { + vaos[2]->bind(); + attrib_buffers(viewer,PROGRAM_WITHOUT_LIGHT); + program = getShaderProgram(PROGRAM_WITHOUT_LIGHT); + program->bind(); + QColor c = QColor(255,0,0,255); + + program->setAttributeValue("colors", c); + //draw the edges + viewer->glDrawArrays(GL_LINES, 0,static_cast( nb_nm_edges/4)); + // Clean-up + program->release(); + vaos[2]->release(); + } + } bool diff --git a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h index ce5b20df643..a78e353c27c 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h @@ -15,7 +15,10 @@ struct Polygon_soup { typedef Kernel::Point_3 Point_3; typedef std::vector Points; + //vector containing 3 indices of points in Points typedef std::vector Polygon_3; + //vector containing a pair of indices of points in Points and a set of indices of Polygons + //containing the edge. typedef std::map, std::set > Edges_map; typedef boost::array Edge; typedef std::vector Polygons; @@ -71,9 +74,8 @@ struct Polygon_soup const std::size_t& i0 = polygons[i][j]; const std::size_t& i1 = polygons[i][ j+1 < size ? j+1: 0]; - if( (i0 < i1) && - (edges[std::make_pair(i0, i1)].size() + - edges[std::make_pair(i1, i0)].size() > 2) ) + if(edges[std::make_pair(i0, i1)].size() + + edges[std::make_pair(i1, i0)].size() > 2) { Edge edge; edge[0] = i0; @@ -168,6 +170,8 @@ private: bool oriented; std::vector positions_poly; std::vector positions_lines; + mutable std::vector positions_nm_lines; + mutable int nb_nm_edges; std::vector normals; using Scene_item::initialize_buffers;