[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51578] trunk/blender: Merge GSoC project from branch: Laplacian Smooth (Operator & Modifier)

Daniel Genrich daniel.genrich at gmx.net
Wed Oct 24 12:39:12 CEST 2012


Revision: 51578
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51578
Author:   genscher
Date:     2012-10-24 10:39:11 +0000 (Wed, 24 Oct 2012)
Log Message:
-----------
Merge GSoC project from branch: Laplacian Smooth (Operator & Modifier)
by Alexander Pinzon Fernandez (apinzonf)

Supported by Google Summer of Code 2012

Project Documentation:
http://wiki.blender.org/index.php/User:Apinzonf

Manual Page:
http://wiki.blender.org/index.php/User:Apinzonf/Doc:2.6/Manual/Modifiers/Deform/Laplacian_Smooth

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/bmesh/CMakeLists.txt
    trunk/blender/source/blender/bmesh/SConscript
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_intern.h
    trunk/blender/source/blender/editors/mesh/mesh_ops.c
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/modifiers/CMakeLists.txt
    trunk/blender/source/blender/modifiers/MOD_modifiertypes.h
    trunk/blender/source/blender/modifiers/SConscript
    trunk/blender/source/blender/modifiers/intern/MOD_util.c

Added Paths:
-----------
    trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c
    trunk/blender/source/blender/modifiers/intern/MOD_laplaciansmooth.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-10-24 10:09:48 UTC (rev 51577)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-10-24 10:39:11 UTC (rev 51578)
@@ -331,6 +331,20 @@
             row.operator("object.hook_select", text="Select")
             row.operator("object.hook_assign", text="Assign")
 
+    def LAPLACIANSMOOTH(self, layout, ob, md):
+        layout.prop(md, "iterations")
+        layout.prop(md, "lamb")
+        layout.prop(md, "lambdaborder")
+        row = layout.row()
+        row.label(text="Axis: ")
+        row.prop(md, "use_x")
+        row.prop(md, "use_y")
+        row.prop(md, "use_z")
+        row = layout.row()
+        row.prop(md, "volume_preservation")
+        layout.label(text="Vertex Group:")
+        layout.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+		
     def LATTICE(self, layout, ob, md):
         split = layout.split()
 

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2012-10-24 10:09:48 UTC (rev 51577)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2012-10-24 10:39:11 UTC (rev 51578)
@@ -1711,6 +1711,7 @@
         layout.operator("mesh.select_all", text="Select Inverse").action = 'INVERT'
         layout.operator("mesh.flip_normals")
         layout.operator("mesh.vertices_smooth", text="Smooth")
+        layout.operator("mesh.vertices_smooth_laplacian", text="Laplacian Smooth")
         layout.operator("mesh.inset")
         layout.operator("mesh.bevel", text="Bevel")
         layout.operator("mesh.bridge_edge_loops")

Modified: trunk/blender/source/blender/bmesh/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/bmesh/CMakeLists.txt	2012-10-24 10:09:48 UTC (rev 51577)
+++ trunk/blender/source/blender/bmesh/CMakeLists.txt	2012-10-24 10:39:11 UTC (rev 51578)
@@ -29,8 +29,7 @@
 	../blenlib
 	../makesdna
 	../../../intern/guardedalloc
-	../../../extern/bullet2/src
-)
+	../../../extern/bullet2/src	../../../intern/opennl/extern)
 
 set(INC_SYS
 
@@ -52,6 +51,7 @@
 	operators/bmo_mirror.c
 	operators/bmo_primitive.c
 	operators/bmo_removedoubles.c
+	operators/bmo_smooth_laplacian.c
 	operators/bmo_symmetrize.c
 	operators/bmo_subdivide.c
 	operators/bmo_subdivide.h

Modified: trunk/blender/source/blender/bmesh/SConscript
===================================================================
--- trunk/blender/source/blender/bmesh/SConscript	2012-10-24 10:09:48 UTC (rev 51577)
+++ trunk/blender/source/blender/bmesh/SConscript	2012-10-24 10:39:11 UTC (rev 51578)
@@ -13,8 +13,7 @@
 	'../makesdna',
 	'../blenkernel',
 	'#/intern/guardedalloc',
-        '#/extern/bullet2/src'
-	]
+	'#/extern/bullet2/src'	'#/intern/opennl/extern',	]
 
 defs = []
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-10-24 10:09:48 UTC (rev 51577)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-10-24 10:39:11 UTC (rev 51578)
@@ -114,6 +114,26 @@
 };
 
 /*
+ * Vertext Smooth Laplacian 
+ * Smooths vertices by using Laplacian smoothing propose by.
+ * Desbrun, et al. Implicit Fairing of Irregular Meshes using Diffusion and Curvature Flow
+*/
+static BMOpDefine bmo_smooth_laplacian_vert_def = {
+	"smooth_laplacian_vert",
+	{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, //input vertices
+	 {BMO_OP_SLOT_FLT, "lambda"}, //lambda param
+	 {BMO_OP_SLOT_FLT, "lambda_border"}, //lambda param in border
+	 {BMO_OP_SLOT_BOOL, "use_x"}, //Smooth object along X axis
+	 {BMO_OP_SLOT_BOOL, "use_y"}, //Smooth object along Y axis
+	 {BMO_OP_SLOT_BOOL, "use_z"}, //Smooth object along Z axis
+	 {BMO_OP_SLOT_BOOL, "volume_preservation"}, //Apply volume preservation after smooth
+	{0} /* null-terminating sentinel */,
+	},
+	bmo_smooth_laplacian_vert_exec,
+	0
+};
+
+/*
  * Right-Hand Faces
  *
  * Computes an "outside" normal for the specified input faces.
@@ -1278,6 +1298,7 @@
 	&bmo_similar_verts_def,
 	&bmo_slide_vert_def,
 	&bmo_smooth_vert_def,
+	&bmo_smooth_laplacian_vert_def,
 	&bmo_solidify_def,
 	&bmo_spin_def,
 	&bmo_split_def,

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2012-10-24 10:09:48 UTC (rev 51577)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2012-10-24 10:39:11 UTC (rev 51578)
@@ -91,6 +91,7 @@
 void bmo_similar_verts_exec(BMesh *bm, BMOperator *op);
 void bmo_slide_vert_exec(BMesh *bm, BMOperator *op);
 void bmo_smooth_vert_exec(BMesh *bm, BMOperator *op);
+void bmo_smooth_laplacian_vert_exec(BMesh *bm, BMOperator *op);
 void bmo_solidify_face_region_exec(BMesh *bm, BMOperator *op);
 void bmo_spin_exec(BMesh *bm, BMOperator *op);
 void bmo_split_edges_exec(BMesh *bm, BMOperator *op);

Added: trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c	                        (rev 0)
+++ trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c	2012-10-24 10:39:11 UTC (rev 51578)
@@ -0,0 +1,613 @@
+/*
+ * ***** 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Alexander Pinzon
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/bmesh/operators/bmo_smooth_laplacian.c
+ *  \ingroup bmesh
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_meshdata_types.h"
+
+#include "BLI_array.h"
+#include "BLI_heap.h"
+#include "BLI_math.h"
+#include "BLI_math_geom.h"
+#include "BLI_smallhash.h"
+
+#include "BKE_customdata.h"
+#include "BKE_mesh.h"
+
+#include "bmesh.h"
+
+#include "ONL_opennl.h"
+
+#include "intern/bmesh_operators_private.h" /* own include */
+
+#define SMOOTH_LAPLACIAN_AREA_FACTOR 4.0f
+#define SMOOTH_LAPLACIAN_EDGE_FACTOR 2.0f
+#define SMOOTH_LAPLACIAN_MAX_EDGE_PERCENTAGE 1.8
+#define SMOOTH_LAPLACIAN_MIN_EDGE_PERCENTAGE 0.15
+
+struct BLaplacianSystem {
+	float *eweights;		/* Length weights per Edge */
+	float (*fweights)[3];   /* Cotangent weights per face */
+	float *ring_areas;		/* Total area per ring*/
+	float *vlengths;		/* Total sum of lengths(edges) per vertice*/
+	float *vweights;		/* Total sum of weights per vertice*/
+	int numEdges;			/* Number of edges*/
+	int numFaces;			/* Number of faces*/
+	int numVerts;			/* Number of verts*/
+	short *zerola;			/* Is zero area or length*/
+
+	/* Pointers to data*/
+	BMesh *bm;
+	BMOperator *op;
+	NLContext *context;
+
+	/*Data*/
+	float min_area;
+};
+typedef struct BLaplacianSystem LaplacianSystem;
+
+static float compute_volume(BMesh *bm, BMOperator *op);
+static float cotan_weight(float *v1, float *v2, float *v3);
+static int vert_is_boundary(BMVert *v);
+static LaplacianSystem * init_laplacian_system( int a_numEdges, int a_numFaces, int a_numVerts);
+static void init_laplacian_matrix(LaplacianSystem * sys);
+static void delete_laplacian_system(LaplacianSystem * sys);
+static void delete_void_pointer(void * data);
+static void fill_laplacian_matrix(LaplacianSystem * sys);
+static void memset_laplacian_system(LaplacianSystem *sys, int val);
+static void validate_solution(LaplacianSystem * sys, int usex, int usey, int usez, float lambda, float lambda_border, int volumepreservation);
+static void volume_preservation(BMesh *bm, BMOperator *op, float vini, float vend, int usex, int usey, int usez);
+
+static void delete_void_pointer(void * data)
+{
+	if (data) {
+		MEM_freeN(data);
+		data = NULL;
+	}
+}
+
+static void delete_laplacian_system(LaplacianSystem * sys) 
+{
+	delete_void_pointer(sys->eweights);
+	delete_void_pointer(sys->fweights);
+	delete_void_pointer(sys->ring_areas);
+	delete_void_pointer(sys->vlengths);
+	delete_void_pointer(sys->vweights);
+	delete_void_pointer(sys->zerola);
+	if (sys->context) {
+		nlDeleteContext(sys->context);
+	}
+	sys->bm = NULL;
+	sys->op = NULL;
+	MEM_freeN(sys);
+}
+
+static void memset_laplacian_system(LaplacianSystem *sys, int val)
+{
+	memset(sys->eweights	, val, sizeof(float) * sys->numEdges);
+	memset(sys->fweights	, val, sizeof(float) * sys->numFaces * 3);
+	memset(sys->ring_areas	, val, sizeof(float) * sys->numVerts);
+	memset(sys->vlengths	, val, sizeof(float) * sys->numVerts);
+	memset(sys->vweights	, val, sizeof(float) * sys->numVerts);
+	memset(sys->zerola		, val, sizeof(short) * sys->numVerts);
+}
+
+static LaplacianSystem * init_laplacian_system( int a_numEdges, int a_numFaces, int a_numVerts) 
+{
+	LaplacianSystem * sys; 
+	sys = MEM_callocN(sizeof(LaplacianSystem), "ModLaplSmoothSystem");
+	sys->numEdges = a_numEdges;
+	sys->numFaces = a_numFaces;
+	sys->numVerts = a_numVerts;
+
+	sys->eweights =  MEM_callocN(sizeof(float) * sys->numEdges, "ModLaplSmoothEWeight");
+	if (!sys->eweights) {
+		delete_laplacian_system(sys);
+		return NULL;
+	}
+	
+	sys->fweights =  MEM_callocN(sizeof(float) * 3 * sys->numFaces, "ModLaplSmoothFWeight");
+	if (!sys->fweights) {
+		delete_laplacian_system(sys);
+		return NULL;
+	}
+	
+	sys->ring_areas =  MEM_callocN(sizeof(float) * sys->numVerts, "ModLaplSmoothRingAreas");
+	if (!sys->ring_areas) {
+		delete_laplacian_system(sys);
+		return NULL;
+	}
+	
+	sys->vlengths =  MEM_callocN(sizeof(float) * sys->numVerts, "ModLaplSmoothVlengths");

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list