[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