diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h index e9c0f6ce302..99dcbcf4cd3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h @@ -26,8 +26,32 @@ #include #include +#include + namespace CGAL { namespace Polygon_mesh_processing { +namespace internal { + +template +struct PM_to_PS_point_converter +{ + PS_Point operator()(const PM_Point& p) const + { + CGAL_static_assertion((std::is_convertible::value)); + return PS_Point(p); + } +}; + +template +struct PM_to_PS_point_converter > +{ + std::array operator()(const PM_Point& p) const + { + return { p[0], p[1], p[2] }; + } +}; + +} // namespace internal /// \ingroup PMP_repairing_grp /// @@ -84,20 +108,24 @@ void polygon_mesh_to_polygon_soup(const PolygonMesh& mesh, typedef typename GetVertexPointMap::const_type VPM; VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, mesh)); + typedef typename boost::property_traits::value_type PM_Point; typedef CGAL::dynamic_vertex_property_t Vertex_index; typedef typename boost::property_map::const_type VIM; VIM vim = get(Vertex_index(), mesh); + typedef typename boost::range_value::type PS_Point; typedef typename boost::range_value::type Polygon; + internal::PM_to_PS_point_converter converter; + std::size_t index = points.size(); // so that multiple meshes can be put into the same soup CGAL::internal::reserve(points, points.size() + vertices(mesh).size()); CGAL::internal::reserve(polygons, polygons.size() + faces(mesh).size()); for(const vertex_descriptor v : vertices(mesh)) { - points.emplace_back(get(vpm, v)); + points.push_back(converter(get(vpm, v))); put(vim, v, index++); }