[Bf-blender-cvs] [a3e32e2ab5] surface-deform-modifier: Review: Multithread deform code

Luca Rood noreply at git.blender.org
Wed Jan 25 07:08:19 CET 2017


Commit: a3e32e2ab5d5a4ed226cd3ba0cdd2a47233b81e5
Author: Luca Rood
Date:   Wed Jan 25 03:59:20 2017 -0200
Branches: surface-deform-modifier
https://developer.blender.org/rBa3e32e2ab5d5a4ed226cd3ba0cdd2a47233b81e5

Review: Multithread deform code

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

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

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

diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index bfbf093b7f..957b900e70 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -80,6 +80,12 @@ typedef struct SDefBindWeightData {
 	unsigned int numbinds;
 } SDefBindWeightData;
 
+typedef struct SDefDeformData {
+	const SDefVert * const bind_verts;
+	const MVert * const mvert;
+	float (* const vertexCos)[3];
+} SDefDeformData;
+
 /* Bind result values */
 enum {
 	MOD_SDEF_BIND_RESULT_SUCCESS = 1,
@@ -95,7 +101,7 @@ enum {
 	MOD_SDEF_INFINITE_WEIGHT_ANGULAR = 1 << 0,
 	MOD_SDEF_INFINITE_WEIGHT_DIST_PROJ = 1 << 1,
 	MOD_SDEF_INFINITE_WEIGHT_DIST = 1 << 2,
-}
+};
 
 static void initData(ModifierData *md)
 {
@@ -1023,15 +1029,66 @@ static bool surfacedeformBind(SurfaceDeformModifierData *smd, float (*vertexCos)
 	return data.success == 1;
 }
 
+static void deformVert(void *userdata, void *UNUSED(userdata_chunk), const int index, const int UNUSED(threadid))
+{
+	const SDefDeformData * const data = (SDefDeformData *)userdata;
+	const SDefBind *sdbind = data->bind_verts[index].binds;
+	const MVert * const mvert = data->mvert;
+	float * const vertexCos = data->vertexCos[index];
+	float norm[3], temp[3];
+
+	zero_v3(vertexCos);
+
+	for (int j = 0; j < data->bind_verts[index].numbinds; j++, sdbind++) {
+		/* Mode-generic operations (allocate poly coordinates) */
+		float (*coords)[3] = MEM_mallocN(sizeof(*coords) * sdbind->numverts, "SDefDoPolyCoords");
+
+		for (int k = 0; k < sdbind->numverts; k++) {
+			copy_v3_v3(coords[k], mvert[sdbind->vert_inds[k]].co);
+		}
+
+		normal_poly_v3(norm, coords, sdbind->numverts);
+		zero_v3(temp);
+
+		/* ---------- looptri mode ---------- */
+		if (sdbind->mode == MOD_SDEF_MODE_LOOPTRI) {
+			madd_v3_v3fl(temp, mvert[sdbind->vert_inds[0]].co, sdbind->vert_weights[0]);
+			madd_v3_v3fl(temp, mvert[sdbind->vert_inds[1]].co, sdbind->vert_weights[1]);
+			madd_v3_v3fl(temp, mvert[sdbind->vert_inds[2]].co, sdbind->vert_weights[2]);
+		}
+		else {
+			/* ---------- ngon mode ---------- */
+			if (sdbind->mode == MOD_SDEF_MODE_NGON) {
+				for (int k = 0; k < sdbind->numverts; k++) {
+					madd_v3_v3fl(temp, coords[k], sdbind->vert_weights[k]);
+				}
+			}
+
+			/* ---------- centroid mode ---------- */
+			else if (sdbind->mode == MOD_SDEF_MODE_CENTROID) {
+				float cent[3];
+				mid_v3_v3_array(cent, coords, sdbind->numverts);
+
+				madd_v3_v3fl(temp, mvert[sdbind->vert_inds[0]].co, sdbind->vert_weights[0]);
+				madd_v3_v3fl(temp, mvert[sdbind->vert_inds[1]].co, sdbind->vert_weights[1]);
+				madd_v3_v3fl(temp, cent, sdbind->vert_weights[2]);
+			}
+		}
+
+		MEM_freeN(coords);
+
+		/* Apply normal offset (generic for all modes) */
+		madd_v3_v3fl(temp, norm, sdbind->normal_dist);
+
+		madd_v3_v3fl(vertexCos, temp, sdbind->influence);
+	}
+}
+
 static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], unsigned int numverts)
 {
 	SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
 	DerivedMesh *tdm;
 	unsigned int tnumpoly;
-	SDefVert *sdvert;
-	SDefBind *sdbind;
-	const MVert *mvert;
-	float norm[3], temp[3];
 
 	/* Exit function if bind flag is not set (free bind data if any) */
 	if (!(smd->flags & MOD_SDEF_BIND)) {
@@ -1071,58 +1128,12 @@ static void surfacedeformModifier_do(ModifierData *md, float (*vertexCos)[3], un
 	}
 
 	/* Actual vertex location update starts here */
-	mvert = tdm->getVertArray(tdm);
-	sdvert = smd->verts;
-
-	for (int i = 0; i < numverts; i++, sdvert++) {
-		sdbind = sdvert->binds;
-
-		zero_v3(vertexCos[i]);
+	SDefDeformData data = {.bind_verts = smd->verts,
+		                   .mvert = tdm->getVertArray(tdm),
+		                   .vertexCos = vertexCos};
 
-		for (int j = 0; j < sdvert->numbinds; j++, sdbind++) {
-			/* Mode-generic operations (allocate poly coordinates) */
-			float (*coords)[3] = MEM_mallocN(sizeof(*coords) * sdbind->numverts, "SDefDoPolyCoords");
-
-			for (int k = 0; k < sdbind->numverts; k++) {
-				copy_v3_v3(coords[k], mvert[sdbind->vert_inds[k]].co);
-			}
-
-			normal_poly_v3(norm, coords, sdbind->numverts);
-			zero_v3(temp);
-
-			/* ---------- looptri mode ---------- */
-			if (sdbind->mode == MOD_SDEF_MODE_LOOPTRI) {
-				madd_v3_v3fl(temp, mvert[sdbind->vert_inds[0]].co, sdbind->vert_weights[0]);
-				madd_v3_v3fl(temp, mvert[sdbind->vert_inds[1]].co, sdbind->vert_weights[1]);
-				madd_v3_v3fl(temp, mvert[sdbind->vert_inds[2]].co, sdbind->vert_weights[2]);
-			}
-			else {
-				/* ---------- ngon mode ---------- */
-				if (sdbind->mode == MOD_SDEF_MODE_NGON) {
-					for (int k = 0; k < sdbind->numverts; k++) {
-						madd_v3_v3fl(temp, coords[k], sdbind->vert_weights[k]);
-					}
-				}
-
-				/* ---------- centroid mode ---------- */
-				else if (sdbind->mode == MOD_SDEF_MODE_CENTROID) {
-					float cent[3];
-					mid_v3_v3_array(cent, coords, sdbind->numverts);
-
-					madd_v3_v3fl(temp, mvert[sdbind->vert_inds[0]].co, sdbind->vert_weights[0]);
-					madd_v3_v3fl(temp, mvert[sdbind->vert_inds[1]].co, sdbind->vert_weights[1]);
-					madd_v3_v3fl(temp, cent, sdbind->vert_weights[2]);
-				}
-			}
-
-			MEM_freeN(coords);
-
-			/* Apply normal offset (generic for all modes) */
-			madd_v3_v3fl(temp, norm, sdbind->normal_dist);
-
-			madd_v3_v3fl(vertexCos[i], temp, sdbind->influence);
-		}
-	}
+	BLI_task_parallel_range_ex(0, numverts, &data, NULL, 0, deformVert,
+	                           numverts > 10000, false);
 
 	tdm->release(tdm);
 }




More information about the Bf-blender-cvs mailing list