[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47249] branches/soc-2012-sushi/source/ blender: Add area to normalized laplacian weight.

Alexander Pinzon apinzonf at gmail.com
Thu May 31 02:54:55 CEST 2012


Revision: 47249
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47249
Author:   apinzonf
Date:     2012-05-31 00:54:54 +0000 (Thu, 31 May 2012)
Log Message:
-----------
Add area to normalized laplacian weight.

Modified Paths:
--------------
    branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
    branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c

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-05-30 23:00:03 UTC (rev 47248)
+++ branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c	2012-05-31 00:54:54 UTC (rev 47249)
@@ -47,6 +47,7 @@
 void compute_weight(BMFace *f, int vid, float lambda);
 float compute_weight_return( BMFace *f, int vid, float lambda);
 static float cotan_weight(float *v1, float *v2, float *v3);
+float area_ring(BMVert *v);
 
 void bmo_vertexsmoothlaplacian_exec(BMesh *bm, BMOperator *op)
 {
@@ -83,17 +84,22 @@
 			
 			nlMatrixAdd(m_vertex_id, m_vertex_id, 1.0f);
 			
+			we = 0.0f;
 			BM_ITER_ELEM (f, &iter, v, BM_FACES_OF_VERT) {
-				we = compute_weight_return(f,m_vertex_id,  lambda);
+				we = we + compute_weight_return(f,m_vertex_id,  lambda);
 			}
-
+			we = lambda/(we*4.0f*area_ring(v));
 			BM_ITER_ELEM (f, &iter, v, BM_FACES_OF_VERT) {
-				compute_weight(f,m_vertex_id,  lambda/we);
+				compute_weight(f,m_vertex_id,  we);
 			}
+			nlMatrixAdd(m_vertex_id, m_vertex_id, lambda/(4.0f*area_ring(v)));
 		}
 		
 		nlEnd(NL_MATRIX);
 		nlEnd(NL_SYSTEM);
+		if(bm->totvert <32){
+			nlPrintMatrix();
+		}
 		nlSolveAdvanced(NULL, NL_TRUE);
 		BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
 			m_vertex_id = BM_elem_index_get(v);
@@ -142,10 +148,10 @@
 			int vc_id = BM_elem_index_get(vf[vc]);
 			wa = lambda*cotan_weight(vf[vb]->co, vf[vc]->co, vf[va]->co);
 			nlMatrixAdd(vid, vc_id, -wa);
-			nlMatrixAdd(vid, vid, wa);
+			//nlMatrixAdd(vid, vid, wa);
 			wa = lambda*cotan_weight(vf[vc]->co, vf[va]->co, vf[vb]->co);
 			nlMatrixAdd(vid, vb_id, -wa);
-			nlMatrixAdd(vid, vid, wa);
+			//nlMatrixAdd(vid, vid, wa);
 		}
 	}
 }
@@ -194,3 +200,25 @@
 	
 	return dot_v3v3(a, b) / clen;
 }
+
+float area_ring(BMVert *v){
+	BMIter fiter;
+	BMIter viter;
+	BMVert *vn;
+	BMFace *f;
+	BMVert *vf[3];
+	int i;
+	float area = 0.0f;
+	BM_ITER_ELEM (f, &fiter, v, BM_FACES_OF_VERT) {
+		i = 0;
+		BM_ITER_ELEM (vn, &viter, f, BM_VERTS_OF_FACE) {
+			vf[i] = vn;
+			i = i + 1;
+		}
+		if(i == 3){
+			area = area + area_tri_v3(vf[0]->co, vf[1]->co, vf[2]->co);
+		}
+	}
+	return area;
+
+}
\ No newline at end of file

Modified: branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c	2012-05-30 23:00:03 UTC (rev 47248)
+++ branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c	2012-05-31 00:54:54 UTC (rev 47249)
@@ -1670,7 +1670,7 @@
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
 	RNA_def_int(ot->srna, "repeat", 1, 1, 50, "Number of iterations to smooth the mesh", "", 1, 50);
-	RNA_def_float(ot->srna, "lambda", 0.1f, 0.001f, 100.0f, "Lambda factor", "", 0.001, 100.0f);
+	RNA_def_float(ot->srna, "lambda", 0.00005f, 0.0000001f, 100.0f, "Lambda factor", "", 0.0000001f, 100.0f);
 
 }
 




More information about the Bf-blender-cvs mailing list