mirror of https://github.com/CGAL/cgal
use face normals map as input of compute_vertex_normal
in the named parameters
This commit is contained in:
parent
afc33545c8
commit
d3ce97f566
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue