53bc23c6eb356246da3ca1fbd6b3e0df7c13f8e4
[blender.git] / source / blender / freestyle / intern / geometry / normal_cycle.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is:
19  *   OGF/Graphite: Geometry and Graphics Programming Library + Utilities
20  *   Copyright (C) 2000 Bruno Levy
21  *   Contact: Bruno Levy
22  *      levy@loria.fr
23  *      ISA Project
24  *      LORIA, INRIA Lorraine, 
25  *      Campus Scientifique, BP 239
26  *      54506 VANDOEUVRE LES NANCY CEDEX 
27  *      FRANCE
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL LICENSE BLOCK *****
32  */
33
34 #ifndef __MESH_TOOLS_MATH_NORMAL_CYCLE__
35 #define __MESH_TOOLS_MATH_NORMAL_CYCLE__
36
37 /** \file blender/freestyle/intern/geometry/normal_cycle.h
38  *  \ingroup freestyle
39  *  \author Bruno Levy
40  */
41
42 #include "Geom.h"
43
44 #include "../system/FreestyleConfig.h"
45
46 #ifdef WITH_CXX_GUARDEDALLOC
47 #include "MEM_guardedalloc.h"
48 #endif
49
50 namespace Freestyle {
51
52 using namespace Geometry;
53
54 namespace OGF {
55
56 template <class T> inline void ogf_swap(T& x, T& y)
57 {
58         T z = x ;
59         x = y ;
60         y = z ;
61 }
62
63 //_________________________________________________________
64
65 /**
66 * NormalCycle evaluates the curvature tensor in function
67 * of a set of dihedral angles and associated vectors.
68 * Reference:
69 *    Restricted Delaunay Triangulation and Normal Cycle,
70 *    D. Cohen-Steiner and J.M. Morvan,
71 *    SOCG 2003
72 */
73 class NormalCycle {
74 public:
75         NormalCycle();
76         void begin();
77         void end();
78         /**
79          * Note: the specified edge vector needs to be pre-clipped by the neighborhood.
80          */
81         void accumulate_dihedral_angle(const Vec3r& edge, real angle, real neigh_area = 1.0);
82
83         const Vec3r& eigen_vector(int i) const
84         {
85                 return axis_[i_[i]];
86         }
87
88         real eigen_value(int i) const
89         {
90                 return eigen_value_[i_[i]];
91         }
92
93         const Vec3r& N() const
94         {
95                 return eigen_vector(2);
96         }
97
98         const Vec3r& Kmax() const
99         {
100                 return eigen_vector(1);
101         }
102
103         const Vec3r& Kmin() const
104         {
105                 return eigen_vector(0);
106         }
107
108         real n() const
109         {
110                 return eigen_value(2);
111         }
112
113         real kmax() const
114         {
115                 return eigen_value(1);
116         }
117
118         real kmin() const
119         {
120                 return eigen_value(0);
121         }
122
123 private:
124         /* UNUSED */
125         // real center_[3];
126         Vec3r axis_[3];
127         real eigen_value_[3];
128         real M_[6];
129         int i_[3];
130
131 #ifdef WITH_CXX_GUARDEDALLOC
132         MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:OGF:NormalCycle")
133 #endif
134 };
135
136 inline void NormalCycle::accumulate_dihedral_angle(const Vec3r& edge, const double beta, double neigh_area)
137 {
138         double s = beta * neigh_area / edge.norm();
139
140         M_[0] += s * edge.x() * edge.x();
141         M_[1] += s * edge.x() * edge.y();
142         M_[2] += s * edge.y() * edge.y();
143         M_[3] += s * edge.x() * edge.z();
144         M_[4] += s * edge.y() * edge.z();
145         M_[5] += s * edge.z() * edge.z();
146 }
147
148 //_________________________________________________________
149
150 }  // OGF namespace
151
152 } /* namespace Freestyle */
153
154 #endif  // __MESH_TOOLS_MATH_NORMAL_CYCLE__