use face normals map as input of compute_vertex_normal

in the named parameters
This commit is contained in:
Jane Tournois 2016-02-12 14:19:23 +01:00
parent afc33545c8
commit d3ce97f566
3 changed files with 56 additions and 2 deletions

View File

@ -32,6 +32,8 @@
#include <CGAL/Polygon_mesh_processing/internal/named_function_params.h>
#include <CGAL/Polygon_mesh_processing/internal/named_params_helper.h>
#include <boost/type_traits.hpp>
namespace CGAL{
namespace Polygon_mesh_processing{
@ -187,6 +189,14 @@ compute_vertex_normal(typename boost::graph_traits<PolygonMesh>::vertex_descript
typedef typename GetGeomTraits<PolygonMesh, NamedParameters>::type Kernel;
typedef typename Kernel::FT FT;
typedef typename GetFaceNormalMap<PolygonMesh, NamedParameters>::type FaceNormalMap;
FaceNormalMap fnmap
= boost::choose_param(get_param(np, face_normal), FaceNormalMap());
bool fnmap_valid
= !boost::is_same<FaceNormalMap,
typename GetFaceNormalMap<PolygonMesh, NamedParameters>::NoMap
>::value;
typedef typename Kernel::Vector_3 Vector;
typedef typename boost::graph_traits<PolygonMesh>::halfedge_descriptor halfedge_descriptor;
@ -197,7 +207,8 @@ compute_vertex_normal(typename boost::graph_traits<PolygonMesh>::vertex_descript
{
if (!is_border(he, pmesh))
{
Vector n = compute_face_normal(face(he, pmesh), pmesh, np);
Vector n = fnmap_valid ? get(fnmap, face(he, pmesh))
: compute_face_normal(face(he, pmesh), pmesh, np);
normal = normal + n;
}
he = opposite(next(he, pmesh), pmesh);
@ -279,8 +290,8 @@ compute_normals(const PolygonMesh& pmesh
, const NamedParameters& np
)
{
compute_vertex_normals(pmesh, vnm, np);
compute_face_normals(pmesh, fnm, np);
compute_vertex_normals(pmesh, vnm, np.face_normal_map(fnm));
}
///\cond SKIP_IN_MANUAL

View File

@ -38,6 +38,7 @@ namespace CGAL{
//to be documented
enum smooth_along_features_t { smooth_along_features };
enum face_normal_t { face_normal };
//internal
enum weight_calculator_t { weight_calculator };
@ -100,6 +101,14 @@ namespace CGAL{
return Params(w, *this);
}
template <typename FaceNormalMap>
pmp_bgl_named_params<FaceNormalMap, face_normal_t, self>
face_normal_map(const FaceNormalMap& m) const
{
typedef pmp_bgl_named_params<FaceNormalMap, face_normal_t, self> Params;
return Params(m, *this);
}
//overload
template <typename PointMap>
pmp_bgl_named_params<PointMap, boost::vertex_point_t, self>
@ -230,6 +239,14 @@ namespace parameters{
return Params(w);
}
template <typename FaceNormalMap>
pmp_bgl_named_params<FaceNormalMap, face_normal_t>
face_normal_map(const FaceNormalMap& m)
{
typedef pmp_bgl_named_params<FaceNormalMap, face_normal_t> Params;
return Params(p);
}
//overload
template <typename PointMap>
pmp_bgl_named_params<PointMap, boost::vertex_point_t>

View File

@ -100,6 +100,32 @@ public:
> ::type type;
};
template<typename PolygonMesh, typename NamedParameters>
class GetFaceNormalMap
{
struct DummyNormalPmap
{
typedef typename boost::graph_traits<PolygonMesh>::face_descriptor key_type;
typedef typename GetGeomTraits<PolygonMesh, NamedParameters>::type::Vector_3 value_type;
typedef value_type& reference;
typedef boost::lvalue_property_map_tag category;
reference operator[](key_type&) const { return CGAL::NULL_VECTOR; }
typedef DummyNormalPmap Self;
friend const value_type& get(const Self&, const key_type&) { return CGAL::NULL_VECTOR; }
friend reference get(const Self&, key_type&) { return CGAL::NULL_VECTOR; }
friend void put(const Self&, key_type&, const value_type&) {}
};
public:
typedef DummyNormalPmap NoMap;
typedef typename boost::lookup_named_param_def <
CGAL::face_normal_t,
NamedParameters,
DummyNormalPmap//default
> ::type type;
};
template<typename NamedParameters, typename DefaultSolver>
class GetSolver
{