[Bf-blender-cvs] [a45f2fd1fbf] blender-v2.90-release: Cleanup: move mesh access for dupli vert/face into shared function

Campbell Barton noreply at git.blender.org
Thu Aug 13 07:45:40 CEST 2020


Commit: a45f2fd1fbf34c5fef62d22fd3d377e0916b06d3
Author: Campbell Barton
Date:   Thu Aug 13 13:30:25 2020 +1000
Branches: blender-v2.90-release
https://developer.blender.org/rBa45f2fd1fbf34c5fef62d22fd3d377e0916b06d3

Cleanup: move mesh access for dupli vert/face into shared function

De-duplicate mesh access & comments.

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

M	source/blender/blenkernel/intern/object_dupli.c

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

diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 520b1948c4f..b1c141756e5 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -299,6 +299,37 @@ static void make_child_duplis(const DupliContext *ctx,
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name Internal Data Access Utilities
+ * \{ */
+
+static Mesh *mesh_data_from_duplicator_object(Object *ob, BMEditMesh **r_em)
+{
+  /* Gather mesh info. */
+  BMEditMesh *em = BKE_editmesh_from_object(ob);
+  Mesh *me_eval;
+
+  *r_em = NULL;
+
+  /* We do not need any render-specific handling anymore, depsgraph takes care of that. */
+  /* NOTE: Do direct access to the evaluated mesh: this function is used
+   * during meta balls evaluation. But even without those all the objects
+   * which are needed for correct instancing are already evaluated. */
+  if (em != NULL) {
+    *r_em = em;
+
+    /* Note that this will only show deformation if #eModifierMode_OnCage is enabled.
+     * We could change this but it matches 2.7x behavior. */
+    me_eval = em->mesh_eval_cage;
+  }
+  else {
+    me_eval = BKE_object_get_evaluated_mesh(ob);
+  }
+  return me_eval;
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Dupli-Collection Implementation (#OB_DUPLICOLLECTION)
  * \{ */
@@ -444,26 +475,16 @@ static void make_duplis_verts(const DupliContext *ctx)
   vdd.use_rotation = parent->transflag & OB_DUPLIROT;
 
   /* Gather mesh info. */
-  {
-    vdd.edit_mesh = BKE_editmesh_from_object(parent);
-
-    /* We do not need any render-specific handling anymore, depsgraph takes care of that. */
-    /* NOTE: Do direct access to the evaluated mesh: this function is used
-     * during meta balls evaluation. But even without those all the objects
-     * which are needed for correct instancing are already evaluated. */
-    if (vdd.edit_mesh != NULL) {
-      vdd.me_eval = vdd.edit_mesh->mesh_eval_cage;
-    }
-    else {
-      vdd.me_eval = BKE_object_get_evaluated_mesh(parent);
-    }
-
-    if (vdd.me_eval == NULL) {
-      return;
-    }
+  BMEditMesh *em = NULL;
+  Mesh *me_eval = mesh_data_from_duplicator_object(parent, &em);
+  if (me_eval == NULL) {
+    return;
+  }
 
-    vdd.orco = CustomData_get_layer(&vdd.me_eval->vdata, CD_ORCO);
-    vdd.totvert = vdd.me_eval->totvert;
+  {
+    vdd.me_eval = me_eval;
+    vdd.orco = CustomData_get_layer(&me_eval->vdata, CD_ORCO);
+    vdd.totvert = me_eval->totvert;
   }
 
   make_child_duplis(ctx, &vdd, make_child_duplis_verts);
@@ -731,32 +752,22 @@ static void make_duplis_faces(const DupliContext *ctx)
   fdd.use_scale = ((parent->transflag & OB_DUPLIFACES_SCALE) != 0);
 
   /* Gather mesh info. */
-  {
-    BMEditMesh *em = BKE_editmesh_from_object(parent);
-
-    /* We do not need any render-specific handling anymore, depsgraph takes care of that. */
-    /* NOTE: Do direct access to the evaluated mesh: this function is used
-     * during meta balls evaluation. But even without those all the objects
-     * which are needed for correct instancing are already evaluated. */
-    if (em != NULL) {
-      fdd.me_eval = em->mesh_eval_cage;
-    }
-    else {
-      fdd.me_eval = BKE_object_get_evaluated_mesh(parent);
-    }
-
-    if (fdd.me_eval == NULL) {
-      return;
-    }
-
-    fdd.orco = CustomData_get_layer(&fdd.me_eval->vdata, CD_ORCO);
-    const int uv_idx = CustomData_get_render_layer(&fdd.me_eval->ldata, CD_MLOOPUV);
-    fdd.mloopuv = CustomData_get_layer_n(&fdd.me_eval->ldata, CD_MLOOPUV, uv_idx);
+  BMEditMesh *em = NULL;
+  Mesh *me_eval = mesh_data_from_duplicator_object(parent, &em);
+  if (me_eval == NULL) {
+    return;
+  }
 
-    fdd.totface = fdd.me_eval->totpoly;
-    fdd.mpoly = fdd.me_eval->mpoly;
-    fdd.mloop = fdd.me_eval->mloop;
-    fdd.mvert = fdd.me_eval->mvert;
+  {
+    fdd.me_eval = me_eval;
+    fdd.orco = CustomData_get_layer(&me_eval->vdata, CD_ORCO);
+    const int uv_idx = CustomData_get_render_layer(&me_eval->ldata, CD_MLOOPUV);
+    fdd.mloopuv = CustomData_get_layer_n(&me_eval->ldata, CD_MLOOPUV, uv_idx);
+
+    fdd.totface = me_eval->totpoly;
+    fdd.mpoly = me_eval->mpoly;
+    fdd.mloop = me_eval->mloop;
+    fdd.mvert = me_eval->mvert;
   }
 
   make_child_duplis(ctx, &fdd, make_child_duplis_faces);



More information about the Bf-blender-cvs mailing list