diff options
Diffstat (limited to 'source/blender/freestyle/intern/geometry/normal_cycle.h')
-rw-r--r-- | source/blender/freestyle/intern/geometry/normal_cycle.h | 210 |
1 files changed, 122 insertions, 88 deletions
diff --git a/source/blender/freestyle/intern/geometry/normal_cycle.h b/source/blender/freestyle/intern/geometry/normal_cycle.h index cdf00a0b4c5..3fbf4fb58ae 100644 --- a/source/blender/freestyle/intern/geometry/normal_cycle.h +++ b/source/blender/freestyle/intern/geometry/normal_cycle.h @@ -1,110 +1,144 @@ /* - * OGF/Graphite: Geometry and Graphics Programming Library + Utilities - * Copyright (C) 2000 Bruno Levy + * ***** BEGIN GPL LICENSE BLOCK ***** * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * If you modify this software, you should include a notice giving the - * name of the person performing the modification, the date of modification, - * and the reason for such modification. + * This Code is Copyright (C) 2010 Blender Foundation. + * All rights reserved. * - * Contact: Bruno Levy + * The Original Code is: + * OGF/Graphite: Geometry and Graphics Programming Library + Utilities + * Copyright (C) 2000 Bruno Levy + * Contact: Bruno Levy + * levy@loria.fr + * ISA Project + * LORIA, INRIA Lorraine, + * Campus Scientifique, BP 239 + * 54506 VANDOEUVRE LES NANCY CEDEX + * FRANCE * - * levy@loria.fr + * Contributor(s): none yet. * - * ISA Project - * LORIA, INRIA Lorraine, - * Campus Scientifique, BP 239 - * 54506 VANDOEUVRE LES NANCY CEDEX - * FRANCE - * - * Note that the GNU General Public License does not permit incorporating - * the Software into proprietary programs. + * ***** END GPL LICENSE BLOCK ***** */ #ifndef __MESH_TOOLS_MATH_NORMAL_CYCLE__ #define __MESH_TOOLS_MATH_NORMAL_CYCLE__ -# include "../system/FreestyleConfig.h" -# include "Geom.h" +/** \file blender/freestyle/intern/geometry/normal_cycle.h + * \ingroup freestyle + * \author Bruno Levy + */ + +#include "Geom.h" + +#include "../system/FreestyleConfig.h" + using namespace Geometry; - + namespace OGF { -template <class T> inline void ogf_swap(T& x, T& y) { - T z = x ; - x = y ; - y = z ; - } +template <class T> inline void ogf_swap(T& x, T& y) +{ + T z = x ; + x = y ; + y = z ; +} //_________________________________________________________ - /** - * NormalCycle evaluates the curvature tensor in function - * of a set of dihedral angles and associated vectors. - * Reference: - * Restricted Delaunay Triangulation and Normal Cycle, - * D. Cohen-Steiner and J.M. Morvan, - * SOCG 2003 - */ - class LIB_GEOMETRY_EXPORT NormalCycle { - public: - NormalCycle() ; - void begin() ; - void end() ; - /** - * Note: the specified edge vector needs to be pre-clipped - * by the neighborhood. - */ - void accumulate_dihedral_angle( - const Vec3r& edge, real angle, real neigh_area = 1.0 - ) ; - const Vec3r& eigen_vector(int i) const { return axis_[i_[i]] ; } - real eigen_value(int i) const { return eigen_value_[i_[i]] ; } - - const Vec3r& N() const { return eigen_vector(2) ; } - const Vec3r& Kmax() const { return eigen_vector(1) ; } - const Vec3r& Kmin() const { return eigen_vector(0) ; } - - real n() const { return eigen_value(2) ; } - real kmax() const { return eigen_value(1) ; } - real kmin() const { return eigen_value(0) ; } - - private: - real center_[3] ; - Vec3r axis_[3] ; - real eigen_value_[3] ; - real M_[6] ; - int i_[3] ; - } ; - - inline void NormalCycle::accumulate_dihedral_angle( - const Vec3r& edge, const double beta, double neigh_area - ) { - double s = beta * neigh_area / edge.norm(); - - M_[0] += s * edge.x() * edge.x() ; - M_[1] += s * edge.x() * edge.y() ; - M_[2] += s * edge.y() * edge.y() ; - M_[3] += s * edge.x() * edge.z() ; - M_[4] += s * edge.y() * edge.z() ; - M_[5] += s * edge.z() * edge.z() ; - } - -//_________________________________________________________ +/** +* NormalCycle evaluates the curvature tensor in function +* of a set of dihedral angles and associated vectors. +* Reference: +* Restricted Delaunay Triangulation and Normal Cycle, +* D. Cohen-Steiner and J.M. Morvan, +* SOCG 2003 +*/ +class LIB_GEOMETRY_EXPORT NormalCycle { +public: + NormalCycle(); + void begin(); + void end(); + /** + * Note: the specified edge vector needs to be pre-clipped by the neighborhood. + */ + void accumulate_dihedral_angle(const Vec3r& edge, real angle, real neigh_area = 1.0); + + const Vec3r& eigen_vector(int i) const + { + return axis_[i_[i]]; + } + + real eigen_value(int i) const + { + return eigen_value_[i_[i]]; + } + + const Vec3r& N() const + { + return eigen_vector(2); + } + const Vec3r& Kmax() const + { + return eigen_vector(1); + } + + const Vec3r& Kmin() const + { + return eigen_vector(0); + } + + real n() const + { + return eigen_value(2); + } + + real kmax() const + { + return eigen_value(1); + } + + real kmin() const + { + return eigen_value(0); + } + +private: + real center_[3]; + Vec3r axis_[3]; + real eigen_value_[3]; + real M_[6]; + int i_[3]; +}; + +inline void NormalCycle::accumulate_dihedral_angle(const Vec3r& edge, const double beta, double neigh_area) +{ + double s = beta * neigh_area / edge.norm(); + + M_[0] += s * edge.x() * edge.x(); + M_[1] += s * edge.x() * edge.y(); + M_[2] += s * edge.y() * edge.y(); + M_[3] += s * edge.x() * edge.z(); + M_[4] += s * edge.y() * edge.z(); + M_[5] += s * edge.z() * edge.z(); } -#endif +//_________________________________________________________ + +} // OGF namespace + +#endif // __MESH_TOOLS_MATH_NORMAL_CYCLE__ |