[Bf-blender-cvs] [9f5833798ca] master: Modifier: skip edit-mesh conversion for armature, curve & lattice

Campbell Barton noreply at git.blender.org
Sat Jun 13 05:23:12 CEST 2020


Commit: 9f5833798caf9581c2d781f4e2f8b95acb1560e0
Author: Campbell Barton
Date:   Sat Jun 13 13:14:07 2020 +1000
Branches: master
https://developer.blender.org/rB9f5833798caf9581c2d781f4e2f8b95acb1560e0

Modifier: skip edit-mesh conversion for armature, curve & lattice

This is an improvement over 2.7x which converted edit-mesh to mesh
(CDDM) for all 3 modifiers.

Overall this increases performance in edit-mode by around 15-20%.

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

M	source/blender/blenkernel/BKE_armature.h
M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/BKE_lattice.h
M	source/blender/blenkernel/intern/armature_deform.c
M	source/blender/blenkernel/intern/curve_deform.c
M	source/blender/blenkernel/intern/lattice_deform.c
M	source/blender/modifiers/intern/MOD_armature.c
M	source/blender/modifiers/intern/MOD_curve.c
M	source/blender/modifiers/intern/MOD_lattice.c

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

diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 30a1644af39..7572c3cb452 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -28,6 +28,7 @@
 extern "C" {
 #endif
 
+struct BMEditMesh;
 struct Bone;
 struct Depsgraph;
 struct ListBase;
@@ -371,6 +372,16 @@ void BKE_armature_deform_coords_with_mesh(struct Object *ob_arm,
                                           const char *defgrp_name,
                                           const struct Mesh *me_target);
 
+void BKE_armature_deform_coords_with_editmesh(struct Object *ob_arm,
+                                              struct Object *ob_target,
+                                              float (*vert_coords)[3],
+                                              float (*vert_deform_mats)[3][3],
+                                              int vert_coords_len,
+                                              int deformflag,
+                                              float (*vert_coords_prev)[3],
+                                              const char *defgrp_name,
+                                              struct BMEditMesh *em_target);
+
 /** \} */
 
 #ifdef __cplusplus
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 417dbd49855..81e595aa94d 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -29,6 +29,7 @@
 extern "C" {
 #endif
 
+struct BMEditMesh;
 struct BezTriple;
 struct Curve;
 struct Depsgraph;
@@ -316,6 +317,16 @@ void BKE_curve_deform_coords(struct Object *ob_curve,
                              const int defgrp_index,
                              const short flag,
                              const short defaxis);
+
+void BKE_curve_deform_coords_with_editmesh(Object *ob_curve,
+                                           Object *ob_target,
+                                           float (*vert_coords)[3],
+                                           const int vert_coords_len,
+                                           const int defgrp_index,
+                                           const short flag,
+                                           const short defaxis,
+                                           struct BMEditMesh *em_target);
+
 void BKE_curve_deform_co(struct Object *ob_curve,
                          struct Object *ob_target,
                          const float orco[3],
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 922f7278034..045bea613f3 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -30,6 +30,7 @@
 extern "C" {
 #endif
 
+struct BMEditMesh;
 struct BPoint;
 struct Depsgraph;
 struct Lattice;
@@ -123,6 +124,15 @@ void BKE_lattice_deform_coords_with_mesh(struct Object *ob_lattice,
                                          const char *defgrp_name,
                                          const float influence,
                                          const struct Mesh *me_target);
+
+void BKE_lattice_deform_coords_with_editmesh(struct Object *ob_lattice,
+                                             struct Object *ob_target,
+                                             float (*vert_coords)[3],
+                                             const int vert_coords_len,
+                                             const short flag,
+                                             const char *defgrp_name,
+                                             const float influence,
+                                             struct BMEditMesh *em_target);
 /** \} */
 
 #ifdef __cplusplus
diff --git a/source/blender/blenkernel/intern/armature_deform.c b/source/blender/blenkernel/intern/armature_deform.c
index cee487e2244..e180070f518 100644
--- a/source/blender/blenkernel/intern/armature_deform.c
+++ b/source/blender/blenkernel/intern/armature_deform.c
@@ -48,6 +48,7 @@
 #include "BKE_action.h"
 #include "BKE_armature.h"
 #include "BKE_deform.h"
+#include "BKE_editmesh.h"
 #include "BKE_lattice.h"
 
 #include "DEG_depsgraph_build.h"
@@ -261,13 +262,17 @@ typedef struct ArmatureUserdata {
 
   float premat[4][4];
   float postmat[4][4];
+
+  /** Specific data types. */
+  struct {
+    int cd_dvert_offset;
+  } bmesh;
 } ArmatureUserdata;
 
-static void armature_vert_task(void *__restrict userdata,
-                               const int i,
-                               const TaskParallelTLS *__restrict UNUSED(tls))
+static void armature_vert_task_with_dvert(const ArmatureUserdata *data,
+                                          const int i,
+                                          const MDeformVert *dvert)
 {
-  const ArmatureUserdata *data = userdata;
   float(*const vert_coords)[3] = data->vert_coords;
   float(*const vert_deform_mats)[3][3] = data->vert_deform_mats;
   float(*const vert_coords_prev)[3] = data->vert_coords_prev;
@@ -276,7 +281,6 @@ static void armature_vert_task(void *__restrict userdata,
   const bool use_dverts = data->use_dverts;
   const int armature_def_nr = data->armature_def_nr;
 
-  const MDeformVert *dvert;
   DualQuat sumdq, *dq = NULL;
   bPoseChannel *pchan;
   float *co, dco[3];
@@ -300,27 +304,6 @@ static void armature_vert_task(void *__restrict userdata,
     }
   }
 
-  if (use_dverts || armature_def_nr != -1) {
-    if (data->me_target) {
-      BLI_assert(i < data->me_target->totvert);
-      if (data->me_target->dvert != NULL) {
-        dvert = data->me_target->dvert + i;
-      }
-      else {
-        dvert = NULL;
-      }
-    }
-    else if (data->dverts && i < data->dverts_len) {
-      dvert = data->dverts + i;
-    }
-    else {
-      dvert = NULL;
-    }
-  }
-  else {
-    dvert = NULL;
-  }
-
   if (armature_def_nr != -1 && dvert) {
     armature_weight = BKE_defvert_find_weight(dvert, armature_def_nr);
 
@@ -434,6 +417,51 @@ static void armature_vert_task(void *__restrict userdata,
   }
 }
 
+static void armature_vert_task(void *__restrict userdata,
+                               const int i,
+                               const TaskParallelTLS *__restrict UNUSED(tls))
+{
+  const ArmatureUserdata *data = userdata;
+  const MDeformVert *dvert;
+  if (data->use_dverts || data->armature_def_nr != -1) {
+    if (data->me_target) {
+      BLI_assert(i < data->me_target->totvert);
+      if (data->me_target->dvert != NULL) {
+        dvert = data->me_target->dvert + i;
+      }
+      else {
+        dvert = NULL;
+      }
+    }
+    else if (data->dverts && i < data->dverts_len) {
+      dvert = data->dverts + i;
+    }
+    else {
+      dvert = NULL;
+    }
+  }
+  else {
+    dvert = NULL;
+  }
+
+  armature_vert_task_with_dvert(data, i, dvert);
+}
+
+static void armature_vert_task_editmesh(void *__restrict userdata, MempoolIterData *iter)
+{
+  const ArmatureUserdata *data = userdata;
+  BMVert *v = (BMVert *)iter;
+  MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(v, data->bmesh.cd_dvert_offset);
+  armature_vert_task_with_dvert(data, BM_elem_index_get(v), dvert);
+}
+
+static void armature_vert_task_editmesh_no_dvert(void *__restrict userdata, MempoolIterData *iter)
+{
+  const ArmatureUserdata *data = userdata;
+  BMVert *v = (BMVert *)iter;
+  armature_vert_task_with_dvert(data, BM_elem_index_get(v), NULL);
+}
+
 static void armature_deform_coords_impl(Object *ob_arm,
                                         Object *ob_target,
                                         float (*vert_coords)[3],
@@ -443,6 +471,7 @@ static void armature_deform_coords_impl(Object *ob_arm,
                                         float (*vert_coords_prev)[3],
                                         const char *defgrp_name,
                                         const Mesh *me_target,
+                                        BMEditMesh *em_target,
                                         bGPDstroke *gps_target)
 {
   bArmature *arm = ob_arm->data;
@@ -456,6 +485,7 @@ static void armature_deform_coords_impl(Object *ob_arm,
   int i, dverts_len = 0; /* safety for vertexgroup overflow */
   bool use_dverts = false;
   int armature_def_nr;
+  int cd_dvert_offset = -1;
 
   /* in editmode, or not an armature */
   if (arm->edbo || (ob_arm->pose == NULL)) {
@@ -476,10 +506,12 @@ static void armature_deform_coords_impl(Object *ob_arm,
     defbase_len = BLI_listbase_count(&ob_target->defbase);
 
     if (ob_target->type == OB_MESH) {
-      Mesh *me = ob_target->data;
-      dverts = me->dvert;
-      if (dverts) {
-        dverts_len = me->totvert;
+      if (em_target == NULL) {
+        Mesh *me = ob_target->data;
+        dverts = me->dvert;
+        if (dverts) {
+          dverts_len = me->totvert;
+        }
       }
     }
     else if (ob_target->type == OB_LATTICE) {
@@ -501,7 +533,11 @@ static void armature_deform_coords_impl(Object *ob_arm,
   if (deformflag & ARM_DEF_VGROUP) {
     if (ELEM(ob_target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) {
       /* if we have a Mesh, only use dverts if it has them */
-      if (me_target) {
+      if (em_target) {
+        cd_dvert_offset = CustomData_get_offset(&em_target->bm->vdata, CD_MDEFORMVERT);
+        use_dverts = (cd_dvert_offset != -1);
+      }
+      else if (me_target) {
         use_dverts = (me_target->dvert != NULL);
       }
       else if (dverts) {
@@ -543,6 +579,10 @@ static void armature_deform_coords_impl(Object *ob_arm,
       .dverts_len = dverts_len,
       .pchan_from_defbase = pchan_from_defbase,
       .defbase_len = defbase_len,
+      .bmesh =
+          {
+              .cd_dvert_offset = cd_dvert_offset,
+          },
   };
 
   float obinv[4][4];
@@ -551,10 +591,25 @@ static void armature_deform_coords_impl(Object *ob_arm,
   mul_m4_m4m4(data.postmat, obinv, ob_arm->obmat);
   invert_m4_m4(data.premat, data.postmat);
 
-  TaskParallelSettings settings;
-  BLI_parallel_range_settings_defaults(&settings);
-  settings.min_iter_per_thread = 32;
-  BLI_task_parallel_range(0, vert_coords_len, &data, armature_vert_task, &settings);
+  if (em_target != NULL) {
+    /* While this could cause an extra loop over mesh data, in most cases this will
+  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list