Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/freestyle/intern/geometry/normal_cycle.h')
-rwxr-xr-xsource/blender/freestyle/intern/geometry/normal_cycle.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/source/blender/freestyle/intern/geometry/normal_cycle.h b/source/blender/freestyle/intern/geometry/normal_cycle.h
new file mode 100755
index 00000000000..cdf00a0b4c5
--- /dev/null
+++ b/source/blender/freestyle/intern/geometry/normal_cycle.h
@@ -0,0 +1,110 @@
+/*
+ * OGF/Graphite: Geometry and Graphics Programming Library + Utilities
+ * Copyright (C) 2000 Bruno Levy
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * Contact: Bruno Levy
+ *
+ * levy@loria.fr
+ *
+ * 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.
+ */
+
+#ifndef __MESH_TOOLS_MATH_NORMAL_CYCLE__
+#define __MESH_TOOLS_MATH_NORMAL_CYCLE__
+
+# include "../system/FreestyleConfig.h"
+# include "Geom.h"
+using namespace Geometry;
+
+namespace OGF {
+
+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() ;
+ }
+
+//_________________________________________________________
+
+}
+
+#endif