[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53973] trunk/blender/source/blender/ modifiers/intern/MOD_laplaciansmooth.c: Improved performance for multiple iterations, keeping the same laplacian matrix.

Alexander Pinzon apinzonf at gmail.com
Mon Jan 21 20:33:59 CET 2013


Revision: 53973
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53973
Author:   apinzonf
Date:     2013-01-21 19:33:58 +0000 (Mon, 21 Jan 2013)
Log Message:
-----------
Improved performance for multiple iterations, keeping the same laplacian matrix.

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_laplaciansmooth.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_laplaciansmooth.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_laplaciansmooth.c	2013-01-21 18:45:31 UTC (rev 53972)
+++ trunk/blender/source/blender/modifiers/intern/MOD_laplaciansmooth.c	2013-01-21 19:33:58 UTC (rev 53973)
@@ -576,17 +576,17 @@
 	sys->vert_centroid[0] = 0.0f;
 	sys->vert_centroid[1] = 0.0f;
 	sys->vert_centroid[2] = 0.0f;
-	for (iter = 0; iter < smd->repeat; iter++) {
-		memset_laplacian_system(sys, 0);
-		nlNewContext();
-		sys->context = nlGetCurrent();
-		nlSolverParameteri(NL_NB_VARIABLES, numVerts);
-		nlSolverParameteri(NL_LEAST_SQUARES, NL_TRUE);
-		nlSolverParameteri(NL_NB_ROWS, numVerts);
-		nlSolverParameteri(NL_NB_RIGHT_HAND_SIDES, 3);
+	memset_laplacian_system(sys, 0);
+	nlNewContext();
+	sys->context = nlGetCurrent();
+	nlSolverParameteri(NL_NB_VARIABLES, numVerts);
+	nlSolverParameteri(NL_LEAST_SQUARES, NL_TRUE);
+	nlSolverParameteri(NL_NB_ROWS, numVerts);
+	nlSolverParameteri(NL_NB_RIGHT_HAND_SIDES, 3);
 
-		init_laplacian_matrix(sys);
+	init_laplacian_matrix(sys);
 
+    for (iter = 0; iter < smd->repeat; iter++) {
 		nlBegin(NL_SYSTEM);
 		for (i = 0; i < numVerts; i++) {
 			nlSetVariable(0, i, vertexCos[i][0]);
@@ -603,50 +603,54 @@
 		nlBegin(NL_MATRIX);
 		dv = dvert;
 		for (i = 0; i < numVerts; i++) {
-			nlRightHandSideAdd(0, i, vertexCos[i][0]);
-			nlRightHandSideAdd(1, i, vertexCos[i][1]);
-			nlRightHandSideAdd(2, i, vertexCos[i][2]);
-			if (dv) {
-				wpaint = defvert_find_weight(dv, defgrp_index);
-				dv++;
-			}
-			else {
-				wpaint = 1.0f;
-			}
-
-			if (sys->zerola[i] == 0) {
-				if (smd->flag & MOD_LAPLACIANSMOOTH_NORMALIZED) {
-					w = sys->vweights[i];
-					sys->vweights[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda) * wpaint / w;
-					w = sys->vlengths[i];
-					sys->vlengths[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda_border) * wpaint * 2.0f / w;
-					if (sys->numNeEd[i] == sys->numNeFa[i]) {
-						nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda) * wpaint);
-					}
-					else {
-						nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda_border) * wpaint * 2.0f);
-					}
+			nlRightHandSideSet(0, i, vertexCos[i][0]);
+			nlRightHandSideSet(1, i, vertexCos[i][1]);
+			nlRightHandSideSet(2, i, vertexCos[i][2]);
+			if (iter == 0) {
+				if (dv) {
+					wpaint = defvert_find_weight(dv, defgrp_index);
+					dv++;
 				}
 				else {
-					w = sys->vweights[i] * sys->ring_areas[i];
-					sys->vweights[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda) * wpaint / (4.0f * w);
-					w = sys->vlengths[i];
-					sys->vlengths[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda_border) * wpaint * 2.0f / w;
+					wpaint = 1.0f;
+				}
 
-					if (sys->numNeEd[i] == sys->numNeFa[i]) {
-						nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda) * wpaint / (4.0f * sys->ring_areas[i]));
+				if (sys->zerola[i] == 0) {
+					if (smd->flag & MOD_LAPLACIANSMOOTH_NORMALIZED) {
+						w = sys->vweights[i];
+						sys->vweights[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda) * wpaint / w;
+						w = sys->vlengths[i];
+						sys->vlengths[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda_border) * wpaint * 2.0f / w;
+						if (sys->numNeEd[i] == sys->numNeFa[i]) {
+							nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda) * wpaint);
+						}
+						else {
+							nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda_border) * wpaint * 2.0f);
+						}
 					}
 					else {
-						nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda_border) * wpaint * 2.0f);
+						w = sys->vweights[i] * sys->ring_areas[i];
+						sys->vweights[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda) * wpaint / (4.0f * w);
+						w = sys->vlengths[i];
+						sys->vlengths[i] = (w == 0.0f) ? 0.0f : -fabsf(smd->lambda_border) * wpaint * 2.0f / w;
+
+						if (sys->numNeEd[i] == sys->numNeFa[i]) {
+							nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda) * wpaint / (4.0f * sys->ring_areas[i]));
+						}
+						else {
+							nlMatrixAdd(i, i,  1.0f + fabsf(smd->lambda_border) * wpaint * 2.0f);
+						}
 					}
 				}
+				else {
+					nlMatrixAdd(i, i, 1.0f);
+				}
 			}
-			else {
-				nlMatrixAdd(i, i, 1.0f);
-			}
 		}
 
-		fill_laplacian_matrix(sys);
+		if (iter == 0){
+			fill_laplacian_matrix(sys);
+		}
 
 		nlEnd(NL_MATRIX);
 		nlEnd(NL_SYSTEM);
@@ -654,9 +658,9 @@
 		if (nlSolveAdvanced(NULL, NL_TRUE)) {
 			validate_solution(sys, smd->flag, smd->lambda, smd->lambda_border);
 		}
-		nlDeleteContext(sys->context);
-		sys->context = NULL;
 	}
+	nlDeleteContext(sys->context);
+	sys->context = NULL;
 	delete_laplacian_system(sys);
 
 }




More information about the Bf-blender-cvs mailing list