Allow polygon soups to use std::array points in PM_to_PS

This commit is contained in:
Mael Rouxel-Labbé 2021-10-25 10:42:33 +02:00
parent ed3503d238
commit 0e2225d5c5
1 changed files with 29 additions and 1 deletions

View File

@ -26,8 +26,32 @@
#include <boost/range/value_type.hpp>
#include <boost/range/reference.hpp>
#include <array>
namespace CGAL {
namespace Polygon_mesh_processing {
namespace internal {
template <typename PM_Point, typename PS_Point>
struct PM_to_PS_point_converter
{
PS_Point operator()(const PM_Point& p) const
{
CGAL_static_assertion((std::is_convertible<PM_Point, PS_Point>::value));
return PS_Point(p);
}
};
template <typename PM_Point, typename PS_FT>
struct PM_to_PS_point_converter<PM_Point, std::array<PS_FT, 3> >
{
std::array<PS_FT, 3> 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<PolygonMesh, NamedParameters>::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<VPM>::value_type PM_Point;
typedef CGAL::dynamic_vertex_property_t<std::size_t> Vertex_index;
typedef typename boost::property_map<PolygonMesh, Vertex_index>::const_type VIM;
VIM vim = get(Vertex_index(), mesh);
typedef typename boost::range_value<PointRange>::type PS_Point;
typedef typename boost::range_value<PolygonRange>::type Polygon;
internal::PM_to_PS_point_converter<PM_Point, PS_Point> 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++);
}