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); } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs