Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2021-01-06 12:47:01 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2021-01-07 21:08:44 +0300
commit3db2bc82aa59725a9cc0c1184465ef4accd85aac (patch)
tree8d04bddc767c3a30b86db6d740b9d4b9071de602 /source/blender/modifiers/intern/MOD_surfacedeform.c
parent64277e8f3a7e0bdcece91d9b09f219a79531bdd1 (diff)
Surface Deform: optimize handling of the vertex group weight.
There is no need to first copy weights to a separate array, or create the data layer if it doesn't exist. The threaded code can retrieve the weight directly from the layer. Differential Revision: https://developer.blender.org/D10015
Diffstat (limited to 'source/blender/modifiers/intern/MOD_surfacedeform.c')
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c43
1 files changed, 18 insertions, 25 deletions
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 4dde1645ab7..64fad1b370b 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -160,7 +160,9 @@ typedef struct SDefDeformData {
const SDefVert *const bind_verts;
float (*const targetCos)[3];
float (*const vertexCos)[3];
- float *const weights;
+ const MDeformVert *const dvert;
+ int const defgrp_index;
+ bool const invert_vgroup;
float const strength;
} SDefDeformData;
@@ -1191,7 +1193,17 @@ static void deformVert(void *__restrict userdata,
const int num_binds = data->bind_verts[index].numbinds;
float *const vertexCos = data->vertexCos[index];
float norm[3], temp[3], offset[3];
- const float weight = (data->weights != NULL) ? data->weights[index] : 1.0f;
+
+ /* Retrieve the value of the weight vertex group if specified. */
+ float weight = 1.0f;
+
+ if (data->dvert && data->defgrp_index != -1) {
+ weight = BKE_defvert_find_weight(&data->dvert[index], data->defgrp_index);
+
+ if (data->invert_vgroup) {
+ weight = 1.0f - weight;
+ }
+ }
/* Check if this vertex will be deformed. If it is not deformed we return and avoid
* unnecessary calculations. */
@@ -1332,33 +1344,16 @@ static void surfacedeformModifier_do(ModifierData *md,
int defgrp_index;
MDeformVert *dvert;
MOD_get_vgroup(ob, mesh, smd->defgrp_name, &dvert, &defgrp_index);
- float *weights = NULL;
- const bool invert_group = (smd->flags & MOD_SDEF_INVERT_VGROUP) != 0;
-
- if (defgrp_index != -1) {
- dvert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MDEFORMVERT, mesh->totvert);
- /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */
- if (dvert == NULL) {
- /* Add a valid data layer! */
- dvert = CustomData_add_layer(&mesh->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, mesh->totvert);
- }
-
- if (dvert) {
- weights = MEM_calloc_arrayN((size_t)numverts, sizeof(*weights), __func__);
- MDeformVert *dv = dvert;
- for (uint i = 0; i < numverts; i++, dv++) {
- weights[i] = invert_group ? (1.0f - BKE_defvert_find_weight(dv, defgrp_index)) :
- BKE_defvert_find_weight(dv, defgrp_index);
- }
- }
- }
+ const bool invert_vgroup = (smd->flags & MOD_SDEF_INVERT_VGROUP) != 0;
/* Actual vertex location update starts here */
SDefDeformData data = {
.bind_verts = smd->verts,
.targetCos = MEM_malloc_arrayN(tnumverts, sizeof(float[3]), "SDefTargetVertArray"),
.vertexCos = vertexCos,
- .weights = weights,
+ .dvert = dvert,
+ .defgrp_index = defgrp_index,
+ .invert_vgroup = invert_vgroup,
.strength = smd->strength,
};
@@ -1372,8 +1367,6 @@ static void surfacedeformModifier_do(ModifierData *md,
MEM_freeN(data.targetCos);
}
-
- MEM_SAFE_FREE(weights);
}
static void deformVerts(ModifierData *md,