[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