38#include <OpenVolumeMesh/Attribs/NormalAttrib.hh>
40#include <OpenVolumeMesh/Core/GeometryKernel.hh>
42namespace OpenVolumeMesh {
44template <
class GeomKernelT>
45NormalAttrib<GeomKernelT>::NormalAttrib(GeomKernelT& _kernel) :
47v_normals_(_kernel.template request_vertex_property<typename GeomKernelT::PointT>(
"vertex_normals", typename GeomKernelT::PointT(0.0))),
48f_normals_(_kernel.template request_face_property<typename GeomKernelT::PointT>(
"face_normals", typename GeomKernelT::PointT(0.0)))
53template <
class GeomKernelT>
54NormalAttrib<GeomKernelT>::~NormalAttrib() {
58template <
class GeomKernelT>
61 if(!kernel_->has_face_bottom_up_incidences()) {
62 std::cerr <<
"Error: update_vertex_normals() needs bottom-up incidences!" << std::endl;
69 for(
const auto &_vh: kernel_->vertices())
71 compute_vertex_normal(_vh);
75template <
class GeomKernelT>
78 if(!kernel_->has_face_bottom_up_incidences()) {
79 std::cerr <<
"Error: update_normals() needs bottom-up incidences!" << std::endl;
83 for (
const auto &_fh: kernel_->faces()) {
84 f_normals_[_fh] = kernel_->normal(_fh.halfface_handle(0));
88template <
class GeomKernelT>
91 std::set<HalfFaceHandle> halffaces;
93 voh_it.valid(); ++voh_it) {
96 hehf_it.valid(); ++hehf_it) {
97 if(kernel_->is_boundary(*hehf_it)) {
98 halffaces.insert(*hehf_it);
102 typename GeomKernelT::PointT normal =
typename GeomKernelT::PointT(0.0);
103 for(std::set<HalfFaceHandle>::const_iterator hf_it = halffaces.begin();
104 hf_it != halffaces.end(); ++hf_it) {
105 normal += (*this)[*hf_it];
109 v_normals_[_vh] = normal;
void update_face_normals()
Compute face normals.