[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48814] branches/soc-2012-sushi: Add internal constraint for reduce spikes, based in length of edge.

Alexander Pinzon apinzonf at gmail.com
Tue Jul 10 20:12:29 CEST 2012


Revision: 48814
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48814
Author:   apinzonf
Date:     2012-07-10 18:12:29 +0000 (Tue, 10 Jul 2012)
Log Message:
-----------
Add internal constraint for reduce spikes, based in length of edge.

Modified Paths:
--------------
    branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py
    branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
    branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
    branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h
    branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c
    branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c

Modified: branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-07-10 18:12:29 UTC (rev 48814)
@@ -316,7 +316,6 @@
         layout.prop(md, "iterations")
         layout.prop(md, "lamb")
         layout.prop(md, "lambdaborder")
-        layout.prop(md, "minarea")
         row = layout.row()
         row.label(text="Axis: ")
         row.prop(md, "use_x")

Modified: branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c	2012-07-10 18:12:29 UTC (rev 48814)
@@ -120,11 +120,9 @@
 	{{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_FLT, "min_area"}, //Minimun area permited
 	 {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_MAPPING, "vertex_group"}, // Vertex group with weights for every vertice.
 	 {BMO_OP_SLOT_BOOL, "volume_preservation"}, //Apply volume preservation after smooth
 	{0} /* null-terminating sentinel */,
 	},

Modified: branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
===================================================================
--- branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c	2012-07-10 18:12:29 UTC (rev 48814)
@@ -46,6 +46,8 @@
 
 #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 */
@@ -77,6 +79,7 @@
 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)
@@ -472,13 +475,67 @@
 	}
 }
 
+static void validate_solution(LaplacianSystem * sys, int usex, int usey, int usez, float lambda, float lambda_border, int volumepreservation)
+{
+	int m_vertex_id;
+	float leni, lene;
+	float vini, vend;
+	float *vi1, *vi2, ve1[3], ve2[3];
+	unsigned int idv1, idv2;
+	BMOIter siter;
+	BMVert *v;
+	BMEdge *e;
+	BMIter eiter;
+
+	BM_ITER_MESH  (e, &eiter, sys->bm, BM_EDGES_OF_MESH) {
+		idv1 = BM_elem_index_get(e->v1);
+		idv2 = BM_elem_index_get(e->v2);
+		vi1 = e->v1->co;
+		vi2 =  e->v2->co;
+		ve1[0] = nlGetVariable(0, idv1);
+		ve1[1] = nlGetVariable(1, idv1);
+		ve1[2] = nlGetVariable(2, idv1);
+		ve2[0] = nlGetVariable(0, idv2);
+		ve2[1] = nlGetVariable(1, idv2);
+		ve2[2] = nlGetVariable(2, idv2);
+		leni = len_v3v3(vi1, vi2);
+		lene = len_v3v3(ve1, ve2);
+		if ( lene > leni* SMOOTH_LAPLACIAN_MAX_EDGE_PERCENTAGE || lene < leni*SMOOTH_LAPLACIAN_MIN_EDGE_PERCENTAGE) {
+			sys->zerola[idv1] = 1;
+			sys->zerola[idv2] = 1;
+		}
+	}
+
+	if (volumepreservation) {
+		vini = compute_volume(sys->bm, sys->op);
+	}
+	BMO_ITER (v, &siter, sys->bm, sys->op, "verts", BM_VERT) {
+		m_vertex_id = BM_elem_index_get(v);
+		if (sys->zerola[m_vertex_id] == 0) {
+			if (usex) {
+				v->co[0] =  nlGetVariable(0, m_vertex_id);
+			}
+			if (usey) {
+				v->co[1] =  nlGetVariable(1, m_vertex_id);
+			}
+			if (usez) {
+				v->co[2] =  nlGetVariable(2, m_vertex_id);
+			}
+		}
+	}
+	if (volumepreservation) {
+		vend = compute_volume(sys->bm, sys->op);
+		volume_preservation(sys->bm, sys->op, vini, vend, usex, usey, usez);
+	}
+
+}
+
 void bmo_smooth_laplacian_vert_exec(BMesh *bm, BMOperator *op)
 {
 	int i;
 	int m_vertex_id;
 	int usex, usey, usez, volumepreservation;
 	float lambda, lambda_border;
-	float vini, vend;
 	float w;
 	BMOIter siter;
 	BMVert *v;
@@ -494,7 +551,7 @@
 	BM_mesh_elem_index_ensure(bm, BM_VERT);
 	lambda = BMO_slot_float_get(op, "lambda");
 	lambda_border = BMO_slot_float_get(op, "lambda_border");
-	sys->min_area = BMO_slot_float_get(op, "min_area");
+	sys->min_area = 0.00001f;
 	usex = BMO_slot_bool_get(op, "use_x");
 	usey = BMO_slot_bool_get(op, "use_y");
 	usez = BMO_slot_bool_get(op, "use_z");
@@ -550,25 +607,7 @@
 	nlEnd(NL_SYSTEM);
 
 	if (nlSolveAdvanced(NULL, NL_TRUE) ) {
-		if(volumepreservation){
-			vini = compute_volume(bm, op);
-		}
-		BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
-			m_vertex_id = BM_elem_index_get(v);
-			if (usex) {
-				v->co[0] =  nlGetVariable(0, m_vertex_id);
-			}
-			if (usey) {
-				v->co[1] =  nlGetVariable(1, m_vertex_id);
-			}
-			if (usez) {
-				v->co[2] =  nlGetVariable(2, m_vertex_id);
-			}
-		}
-		if(volumepreservation){
-			vend = compute_volume(bm, op);
-			volume_preservation(bm, op, vini, vend, usex, usey, usez);
-		}
+		validate_solution(sys, usex, usey, usez, lambda, lambda_border, volumepreservation);
 	}
 		
 	delete_laplacian_system(sys);

Modified: branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c	2012-07-10 18:12:29 UTC (rev 48814)
@@ -1604,7 +1604,6 @@
 	int i, repeat;
 	float lambda = 0.1f;
 	float lambda_border = 0.1f;
-	float min_area = 0.00001f;
 	BMIter fiter;
 	BMFace *f;
 
@@ -1626,7 +1625,6 @@
 	repeat = RNA_int_get(op->ptr, "repeat");
 	lambda = RNA_float_get(op->ptr, "lambda");
 	lambda_border = RNA_float_get(op->ptr, "lambda_border");
-	min_area = RNA_float_get(op->ptr, "min_area");
 	usex = RNA_boolean_get(op->ptr, "use_x");
 	usey = RNA_boolean_get(op->ptr, "use_y");
 	usez = RNA_boolean_get(op->ptr, "use_z");
@@ -1636,8 +1634,8 @@
 	
 	for (i = 0; i < repeat; i++) {
 		if (!EDBM_op_callf(em, op,
-		                   "smooth_laplacian_vert verts=%hv lambda=%f lambda_border=%f min_area=%f use_x=%b use_y=%b use_z=%b volume_preservation=%b",
-		                   BM_ELEM_SELECT, lambda, lambda_border, min_area, usex, usey, usez, volume_preservation))
+		                   "smooth_laplacian_vert verts=%hv lambda=%f lambda_border=%f use_x=%b use_y=%b use_z=%b volume_preservation=%b",
+		                   BM_ELEM_SELECT, lambda, lambda_border, usex, usey, usez, volume_preservation))
 		{
 			return OPERATOR_CANCELLED;
 		}
@@ -1674,8 +1672,6 @@
 					"Lambda factor", "", 0.0000001f, 1000.0f);
 	RNA_def_float(ot->srna, "lambda_border", 0.00005f, 0.0000001f, 1000.0f, 
 					"Lambda factor in border", "", 0.0000001f, 1000.0f);
-	RNA_def_float(ot->srna, "min_area", 0.00001f, 0.0000000000000001f, 1000.0f, 
-					"Minimum area permitted", "", 0.0000000000000001f, 1000.0f);
 	RNA_def_boolean(ot->srna, "use_x", 1, "Smooth X Axis", "Smooth object along	X axis");
 	RNA_def_boolean(ot->srna, "use_y", 1, "Smooth Y Axis", "Smooth object along	Y axis");
 	RNA_def_boolean(ot->srna, "use_z", 1, "Smooth Z Axis", "Smooth object along	Z axis");

Modified: branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h	2012-07-10 18:12:29 UTC (rev 48814)
@@ -1102,7 +1102,7 @@
 
 typedef struct LaplacianSmoothModifierData {
 	ModifierData modifier;
-	float lambda, lambda_border, min_area;
+	float lambda, lambda_border;
 	char defgrp_name[64];	/* MAX_VGROUP_NAME */
 	short flag, repeat;
 

Modified: branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c	2012-07-10 18:12:29 UTC (rev 48814)
@@ -1795,13 +1795,6 @@
 	RNA_def_property_ui_text(prop, "Lambda border", "Lambda factor in border");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-	prop = RNA_def_property(srna, "minarea", PROP_FLOAT, PROP_NONE);
-	RNA_def_property_float_sdna(prop, NULL, "min_area");
-	RNA_def_property_range(prop, 0.0000000000000001, FLT_MAX);
-	RNA_def_property_ui_range(prop, 0.0000000000000001, 1000.0, 0.0000001, 18);
-	RNA_def_property_ui_text(prop, "Minimum area", "Minimum area permitted");
-	RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
 	prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "repeat");
 	RNA_def_property_ui_range(prop, 0, 200, 1, 0);

Modified: branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c
===================================================================
--- branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c	2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c	2012-07-10 18:12:29 UTC (rev 48814)
@@ -57,6 +57,9 @@
 
 #include "ONL_opennl.h"
 
+#define MOD_LAPLACIANSMOOTH_MAX_EDGE_PERCENTAGE 1.8
+#define MOD_LAPLACIANSMOOTH_MIN_EDGE_PERCENTAGE 0.15
+
 struct BLaplacianSystem {
 	float *eweights;		/* Length weights per Edge */
 	float (*fweights)[3];   /* Cotangent weights per face */
@@ -94,6 +97,7 @@
 static void init_laplacian_matrix(LaplacianSystem * sys);
 static void memset_laplacian_system(LaplacianSystem *sys, int val);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list