mirror of https://github.com/CGAL/cgal
Fix default visitor mechanism
This commit is contained in:
parent
05761799e8
commit
67b2fd1454
|
|
@ -45,7 +45,7 @@ struct Polygon_soup_orientation_visitor{
|
||||||
inline virtual void reverse_polygon(const std::size_t&) {}
|
inline virtual void reverse_polygon(const std::size_t&) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class PointRange, class PolygonRange, class Visitor>
|
template<class PointRange, class PolygonRange, class Visitor = Polygon_soup_orientation_visitor>
|
||||||
struct Polygon_soup_orienter
|
struct Polygon_soup_orienter
|
||||||
{
|
{
|
||||||
typedef typename PointRange::value_type Point_3;
|
typedef typename PointRange::value_type Point_3;
|
||||||
|
|
@ -71,7 +71,7 @@ struct Polygon_soup_orienter
|
||||||
Edge_map edges; //< the set of edges of the input polygons
|
Edge_map edges; //< the set of edges of the input polygons
|
||||||
Marked_edges marked_edges; //< the set of singular edges or edges incident
|
Marked_edges marked_edges; //< the set of singular edges or edges incident
|
||||||
//< to non-compatible orientation polygons
|
//< to non-compatible orientation polygons
|
||||||
Visitor& visitor;
|
Visitor* visitor;
|
||||||
|
|
||||||
/// for each polygon referenced by its position in `polygons`, indicates
|
/// for each polygon referenced by its position in `polygons`, indicates
|
||||||
/// the connected component it belongs too after orientation.
|
/// the connected component it belongs too after orientation.
|
||||||
|
|
@ -131,7 +131,10 @@ struct Polygon_soup_orienter
|
||||||
}
|
}
|
||||||
|
|
||||||
void inverse_orientation(const std::size_t index) {
|
void inverse_orientation(const std::size_t index) {
|
||||||
visitor.reverse_polygon(index);
|
if(visitor)
|
||||||
|
{
|
||||||
|
visitor->reverse_polygon(index);
|
||||||
|
}
|
||||||
std::reverse(polygons[index].begin(), polygons[index].end());
|
std::reverse(polygons[index].begin(), polygons[index].end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -140,7 +143,10 @@ struct Polygon_soup_orienter
|
||||||
V_ID old_index,
|
V_ID old_index,
|
||||||
V_ID new_index)
|
V_ID new_index)
|
||||||
{
|
{
|
||||||
visitor.update_polygon_id(polygon_id, old_index, new_index);
|
if(visitor)
|
||||||
|
{
|
||||||
|
visitor->update_polygon_id(polygon_id, old_index, new_index);
|
||||||
|
}
|
||||||
for(V_ID& i : polygons[polygon_id])
|
for(V_ID& i : polygons[polygon_id])
|
||||||
if( i==old_index )
|
if( i==old_index )
|
||||||
i=new_index;
|
i=new_index;
|
||||||
|
|
@ -159,12 +165,18 @@ struct Polygon_soup_orienter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Polygon_soup_orienter(Points& points, Polygons& polygons, Visitor& visitor)
|
Polygon_soup_orienter(Points& points, Polygons& polygons, Visitor* visitor)
|
||||||
: points(points), polygons(polygons), edges(points.size()), visitor(visitor)
|
: points(points), polygons(polygons), edges(points.size()), visitor(visitor)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
Polygon_soup_orienter(Points& points, Polygons& polygons)
|
||||||
|
: points(points), polygons(polygons), edges(points.size()), visitor(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//filling containers
|
//filling containers
|
||||||
static void fill_edge_map(Edge_map& edges, Marked_edges& marked_edges, const Polygons& polygons, Visitor& visitor) {
|
static void fill_edge_map(Edge_map& edges, Marked_edges& marked_edges, const Polygons& polygons, Visitor* visitor) {
|
||||||
// Fill edges
|
// Fill edges
|
||||||
for (P_ID i = 0; i < polygons.size(); ++i)
|
for (P_ID i = 0; i < polygons.size(); ++i)
|
||||||
{
|
{
|
||||||
|
|
@ -193,7 +205,10 @@ struct Polygon_soup_orienter
|
||||||
|
|
||||||
if (nb_edges > 2)
|
if (nb_edges > 2)
|
||||||
{
|
{
|
||||||
visitor.non_manifold_edge(i0, i1);
|
if(visitor)
|
||||||
|
{
|
||||||
|
visitor->non_manifold_edge(i0, i1);
|
||||||
|
}
|
||||||
set_edge_marked(i0, i1, marked_edges);
|
set_edge_marked(i0, i1, marked_edges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -389,7 +404,10 @@ struct Polygon_soup_orienter
|
||||||
for(const V_ID_and_Polygon_ids& vid_and_pids : vertices_to_duplicate)
|
for(const V_ID_and_Polygon_ids& vid_and_pids : vertices_to_duplicate)
|
||||||
{
|
{
|
||||||
V_ID new_index = static_cast<V_ID>(points.size());
|
V_ID new_index = static_cast<V_ID>(points.size());
|
||||||
visitor.duplicate_vertex(vid_and_pids.first, new_index);
|
if(visitor)
|
||||||
|
{
|
||||||
|
visitor->duplicate_vertex(vid_and_pids.first, new_index);
|
||||||
|
}
|
||||||
points.push_back( points[vid_and_pids.first] );
|
points.push_back( points[vid_and_pids.first] );
|
||||||
for(P_ID polygon_id : vid_and_pids.second)
|
for(P_ID polygon_id : vid_and_pids.second)
|
||||||
replace_vertex_index_in_polygon(polygon_id, vid_and_pids.first, new_index);
|
replace_vertex_index_in_polygon(polygon_id, vid_and_pids.first, new_index);
|
||||||
|
|
@ -457,7 +475,7 @@ struct Polygon_soup_orienter
|
||||||
template <class PointRange, class PolygonRange, class Visitor>
|
template <class PointRange, class PolygonRange, class Visitor>
|
||||||
bool orient_polygon_soup(PointRange& points,
|
bool orient_polygon_soup(PointRange& points,
|
||||||
PolygonRange& polygons,
|
PolygonRange& polygons,
|
||||||
Visitor& visitor)
|
Visitor* visitor)
|
||||||
{
|
{
|
||||||
std::size_t inital_nb_pts = points.size();
|
std::size_t inital_nb_pts = points.size();
|
||||||
internal::Polygon_soup_orienter<PointRange, PolygonRange, Visitor>
|
internal::Polygon_soup_orienter<PointRange, PolygonRange, Visitor>
|
||||||
|
|
@ -507,9 +525,7 @@ bool orient_polygon_soup(PointRange& points,
|
||||||
PolygonRange& polygons)
|
PolygonRange& polygons)
|
||||||
{
|
{
|
||||||
std::size_t inital_nb_pts = points.size();
|
std::size_t inital_nb_pts = points.size();
|
||||||
internal::Polygon_soup_orientation_visitor dummy_visitor;
|
internal::Polygon_soup_orienter<PointRange, PolygonRange> orienter(points, polygons);
|
||||||
internal::Polygon_soup_orienter<PointRange, PolygonRange,
|
|
||||||
internal::Polygon_soup_orientation_visitor> orienter(points, polygons, dummy_visitor);
|
|
||||||
orienter.fill_edge_map();
|
orienter.fill_edge_map();
|
||||||
orienter.orient();
|
orienter.orient();
|
||||||
orienter.duplicate_singular_vertices();
|
orienter.duplicate_singular_vertices();
|
||||||
|
|
|
||||||
|
|
@ -213,7 +213,7 @@ bool is_polygon_soup_a_polygon_mesh(const PolygonRange& polygons)
|
||||||
typename Orienter::Marked_edges marked_edges;
|
typename Orienter::Marked_edges marked_edges;
|
||||||
internal::Polygon_soup_orientation_visitor dummy_visitor;
|
internal::Polygon_soup_orientation_visitor dummy_visitor;
|
||||||
|
|
||||||
Orienter::fill_edge_map(edges, marked_edges, polygons, dummy_visitor);
|
Orienter::fill_edge_map(edges, marked_edges, polygons, &dummy_visitor);
|
||||||
|
|
||||||
//returns false if duplication is necessary
|
//returns false if duplication is necessary
|
||||||
if(!marked_edges.empty())
|
if(!marked_edges.empty())
|
||||||
|
|
|
||||||
|
|
@ -463,7 +463,7 @@ Scene_polygon_soup_item::orient(std::vector<std::pair<std::size_t, std::size_t>
|
||||||
Visitor visitor(non_manifold_vertices);
|
Visitor visitor(non_manifold_vertices);
|
||||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||||
res = CGAL::Polygon_mesh_processing::
|
res = CGAL::Polygon_mesh_processing::
|
||||||
orient_polygon_soup(d->soup->points, d->soup->polygons, visitor);
|
orient_polygon_soup(d->soup->points, d->soup->polygons, &visitor);
|
||||||
QApplication::restoreOverrideCursor();
|
QApplication::restoreOverrideCursor();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue