[Bf-blender-cvs] [3db2bc82aa5] master: Surface Deform: optimize handling of the vertex group weight.

Alexander Gavrilov noreply at git.blender.org
Thu Jan 7 19:09:29 CET 2021


Commit: 3db2bc82aa59725a9cc0c1184465ef4accd85aac
Author: Alexander Gavrilov
Date:   Wed Jan 6 12:47:01 2021 +0300
Branches: master
https://developer.blender.org/rB3db2bc82aa59725a9cc0c1184465ef4accd85aac

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

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

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 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,



More information about the Bf-blender-cvs mailing list