[Bf-blender-cvs] [8313283] temp-modifier-deltamush-experimental: pre-divide vertex-count, avoid zero checks in smooth loop

Campbell Barton noreply at git.blender.org
Sun Mar 29 12:38:21 CEST 2015


Commit: 8313283889ef1849a2232c58342233ffd28a05ee
Author: Campbell Barton
Date:   Sun Mar 29 21:30:43 2015 +1100
Branches: temp-modifier-deltamush-experimental
https://developer.blender.org/rB8313283889ef1849a2232c58342233ffd28a05ee

pre-divide vertex-count, avoid zero checks in smooth loop

===================================================================

M	source/blender/modifiers/intern/MOD_deltamush.c

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_deltamush.c b/source/blender/modifiers/intern/MOD_deltamush.c
index 061d5e0..c29e160 100644
--- a/source/blender/modifiers/intern/MOD_deltamush.c
+++ b/source/blender/modifiers/intern/MOD_deltamush.c
@@ -186,13 +186,12 @@ typedef struct SmoothingData {
 static void smooth_iter(
         DeltaMushModifierData *dmmd, DerivedMesh *dm,
         float(*vertexCos)[3], unsigned int numVerts,
-        const short *boundaries, const float *vertex_edge_count,
+        const short *boundaries, const float *vertex_edge_count_idiv,
         SmoothingData *smooth_data)
 {
 	const unsigned int numEdges = (unsigned int)dm->getNumEdges(dm);
 	const MEdge *edges = dm->getEdgeArray(dm);
 	const float lambda = dmmd->lambda;
-	const float eps = FLT_EPSILON * 10.0f;
 	unsigned int i;
 
 	for (i = 0; i < numEdges; i++) {
@@ -219,10 +218,7 @@ static void smooth_iter(
 		/* fast-path */
 		for (i = 0; i < numVerts; i++) {
 			SmoothingData *sd = &smooth_data[i];
-			float div = vertex_edge_count[i];
-			if (div > eps) {
-				mul_v3_v3fl(vertexCos[i], sd->delta, 1.0f / div);
-			}
+			mul_v3_v3fl(vertexCos[i], sd->delta, vertex_edge_count_idiv[i]);
 			/* zero for the next iteration (saves memset on entire array) */
 			memset(sd, 0, sizeof(*sd));
 		}
@@ -231,23 +227,20 @@ static void smooth_iter(
 
 		for (i = 0; i < numVerts; i++) {
 			SmoothingData *sd = &smooth_data[i];
-			float div = vertex_edge_count[i];
-
-			if (div > eps) {
-				float lambda_alt = 1.0;
 
-				if (dmmd->smooth_weights) {
-					lambda_alt *= dmmd->smooth_weights[i];
-				}
+			float lambda_alt = 1.0;
 
-				if (boundaries) {
-					lambda_alt *= (boundaries[i] != 0 ? 0.0f : 1.0f);
-				}
+			if (dmmd->smooth_weights) {
+				lambda_alt *= dmmd->smooth_weights[i];
+			}
 
-				mul_v3_fl(sd->delta, 1.0f / div);
-				interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda_alt);
+			if (boundaries) {
+				lambda_alt *= (boundaries[i] != 0 ? 0.0f : 1.0f);
 			}
 
+			mul_v3_fl(sd->delta, vertex_edge_count_idiv[i]);
+			interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda_alt);
+
 			memset(sd, 0, sizeof(*sd));
 		}
 	}
@@ -278,6 +271,10 @@ static void smooth_verts(
 		vertex_edge_count[edges[i].v2] += 1.0f;
 	}
 
+	for (i = 0; i < numVerts; i++) {
+		vertex_edge_count[i] = vertex_edge_count[i] ? (1.0f / vertex_edge_count[i]) : 1.0f;
+	}
+
 	smooth_data = MEM_callocN((size_t)numVerts * sizeof(SmoothingData), "delta mush smoothing data");
 	for (i = 0; i < (unsigned int)dmmd->repeat; i++) {
 		/* no need to memset each time, 'smooth_iter' cleans up after its self */




More information about the Bf-blender-cvs mailing list