[Bf-blender-cvs] [bd04e80c09f] master: Cleanup: Move mesh modifier apply function to editors module

Hans Goudey noreply at git.blender.org
Thu Dec 15 17:14:02 CET 2022


Commit: bd04e80c09f00eac05a7f5d8d0cf6732ae245763
Author: Hans Goudey
Date:   Wed Dec 14 19:12:17 2022 -0600
Branches: master
https://developer.blender.org/rBbd04e80c09f00eac05a7f5d8d0cf6732ae245763

Cleanup: Move mesh modifier apply function to editors module

The function was highly related to the apply modifier operator,
and only used once. This was too specific to be in the blenkernel,
especially in a mesh conversion file.

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh_convert.cc
M	source/blender/editors/object/object_modifier.cc

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 6a55fe00bf6..472c82c3a81 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -279,18 +279,6 @@ struct Mesh *BKE_mesh_new_from_object_to_bmain(struct Main *bmain,
                                                struct Object *object,
                                                bool preserve_all_data_layers);
 
-/**
- * \param use_virtual_modifiers: When enabled calculate virtual-modifiers before applying `md_eval`
- * support this since virtual-modifiers are not modifiers from a user perspective,
- * allowing shape keys to be included with the modifier being applied, see: T91923.
- */
-struct Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
-                                                  struct Scene *scene,
-                                                  struct Object *ob_eval,
-                                                  struct ModifierData *md_eval,
-                                                  bool use_virtual_modifiers,
-                                                  bool build_shapekey_layers);
-
 /**
  * Move data from a mesh outside of the main data-base into a mesh in the data-base.
  * Takes ownership of the source mesh.
diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc
index fd2bb67c648..7a4c3c0834b 100644
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@ -1102,142 +1102,6 @@ Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain,
   return mesh_in_bmain;
 }
 
-static void add_shapekey_layers(Mesh *mesh_dest, Mesh *mesh_src)
-{
-  KeyBlock *kb;
-  Key *key = mesh_src->key;
-  int i;
-
-  if (!mesh_src->key) {
-    return;
-  }
-
-  /* ensure we can use mesh vertex count for derived mesh custom data */
-  if (mesh_src->totvert != mesh_dest->totvert) {
-    CLOG_ERROR(&LOG,
-               "vertex size mismatch (mesh/dm) '%s' (%d != %d)",
-               mesh_src->id.name + 2,
-               mesh_src->totvert,
-               mesh_dest->totvert);
-    return;
-  }
-
-  for (i = 0, kb = (KeyBlock *)key->block.first; kb; kb = kb->next, i++) {
-    int ci;
-    float *array;
-
-    if (mesh_src->totvert != kb->totelem) {
-      CLOG_ERROR(&LOG,
-                 "vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)",
-                 mesh_src->id.name + 2,
-                 mesh_src->totvert,
-                 kb->name,
-                 kb->totelem);
-      array = (float *)MEM_calloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
-    }
-    else {
-      array = (float *)MEM_malloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
-      memcpy(array, kb->data, sizeof(float[3]) * size_t(mesh_src->totvert));
-    }
-
-    CustomData_add_layer_named(
-        &mesh_dest->vdata, CD_SHAPEKEY, CD_ASSIGN, array, mesh_dest->totvert, kb->name);
-    ci = CustomData_get_layer_index_n(&mesh_dest->vdata, CD_SHAPEKEY, i);
-
-    mesh_dest->vdata.layers[ci].uid = kb->uid;
-  }
-}
-
-Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
-                                           Scene *scene,
-                                           Object *ob_eval,
-                                           ModifierData *md_eval,
-                                           const bool use_virtual_modifiers,
-                                           const bool build_shapekey_layers)
-{
-  Mesh *me = ob_eval->runtime.data_orig ? (Mesh *)ob_eval->runtime.data_orig :
-                                          (Mesh *)ob_eval->data;
-  const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md_eval->type);
-  Mesh *result = nullptr;
-  KeyBlock *kb;
-  ModifierEvalContext mectx = {depsgraph, ob_eval, MOD_APPLY_TO_BASE_MESH};
-
-  if (!(md_eval->mode & eModifierMode_Realtime)) {
-    return result;
-  }
-
-  if (mti->isDisabled && mti->isDisabled(scene, md_eval, false)) {
-    return result;
-  }
-
-  if (build_shapekey_layers && me->key &&
-      (kb = (KeyBlock *)BLI_findlink(&me->key->block, ob_eval->shapenr - 1))) {
-    MutableSpan<MVert> verts = me->verts_for_write();
-    BKE_keyblock_convert_to_mesh(kb, verts.data(), me->totvert);
-  }
-
-  Mesh *mesh_temp = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE);
-  int numVerts = 0;
-  float(*deformedVerts)[3] = nullptr;
-
-  if (use_virtual_modifiers) {
-    VirtualModifierData virtualModifierData;
-    for (ModifierData *md_eval_virt =
-             BKE_modifiers_get_virtual_modifierlist(ob_eval, &virtualModifierData);
-         md_eval_virt && (md_eval_virt != ob_eval->modifiers.first);
-         md_eval_virt = md_eval_virt->next) {
-      if (!BKE_modifier_is_enabled(scene, md_eval_virt, eModifierMode_Realtime)) {
-        continue;
-      }
-      /* All virtual modifiers are deform modifiers. */
-      const ModifierTypeInfo *mti_virt = BKE_modifier_get_info((ModifierType)md_eval_virt->type);
-      BLI_assert(mti_virt->type == eModifierTypeType_OnlyDeform);
-      if (mti_virt->type != eModifierTypeType_OnlyDeform) {
-        continue;
-      }
-
-      if (deformedVerts == nullptr) {
-        deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
-      }
-      mti_virt->deformVerts(md_eval_virt, &mectx, mesh_temp, deformedVerts, numVerts);
-    }
-  }
-
-  if (mti->type == eModifierTypeType_OnlyDeform) {
-    if (deformedVerts == nullptr) {
-      deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
-    }
-    result = mesh_temp;
-    mti->deformVerts(md_eval, &mectx, result, deformedVerts, numVerts);
-    BKE_mesh_vert_coords_apply(result, deformedVerts);
-
-    if (build_shapekey_layers) {
-      add_shapekey_layers(result, me);
-    }
-  }
-  else {
-    if (deformedVerts != nullptr) {
-      BKE_mesh_vert_coords_apply(mesh_temp, deformedVerts);
-    }
-
-    if (build_shapekey_layers) {
-      add_shapekey_layers(mesh_temp, me);
-    }
-
-    result = mti->modifyMesh(md_eval, &mectx, mesh_temp);
-    ASSERT_IS_VALID_MESH(result);
-
-    if (mesh_temp != result) {
-      BKE_id_free(nullptr, mesh_temp);
-    }
-  }
-
-  if (deformedVerts != nullptr) {
-    MEM_freeN(deformedVerts);
-  }
-
-  return result;
-}
 
 static KeyBlock *keyblock_ensure_from_uid(Key &key, const int uid, const StringRefNull name)
 {
diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc
index 3a239506cb3..28010b7c608 100644
--- a/source/blender/editors/object/object_modifier.cc
+++ b/source/blender/editors/object/object_modifier.cc
@@ -9,6 +9,8 @@
 #include <cstdio>
 #include <cstdlib>
 
+#include "CLG_log.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "DNA_anim_types.h"
@@ -95,6 +97,8 @@
 
 using blender::Span;
 
+static CLG_LogRef LOG = {"ed.object"};
+
 static void modifier_skin_customdata_delete(struct Object *ob);
 
 /* ------------------------------------------------------------------- */
@@ -650,18 +654,134 @@ bool ED_object_modifier_convert_psys_to_mesh(ReportList * /*reports*/,
   return true;
 }
 
-/* Gets mesh for the modifier which corresponds to an evaluated state. */
-static Mesh *modifier_apply_create_mesh_for_modifier(Depsgraph *depsgraph,
-                                                     Object *object,
-                                                     ModifierData *md_eval,
-                                                     bool use_virtual_modifiers,
-                                                     bool build_shapekey_layers)
+static void add_shapekey_layers(Mesh *mesh_dest, Mesh *mesh_src)
 {
-  Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
-  Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
-  Mesh *mesh_applied = BKE_mesh_create_derived_for_modifier(
-      depsgraph, scene_eval, object_eval, md_eval, use_virtual_modifiers, build_shapekey_layers);
-  return mesh_applied;
+  KeyBlock *kb;
+  Key *key = mesh_src->key;
+  int i;
+
+  if (!mesh_src->key) {
+    return;
+  }
+
+  for (i = 0, kb = (KeyBlock *)key->block.first; kb; kb = kb->next, i++) {
+    int ci;
+    float *array;
+
+    if (mesh_src->totvert != kb->totelem) {
+      CLOG_ERROR(&LOG,
+                 "vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)",
+                 mesh_src->id.name + 2,
+                 mesh_src->totvert,
+                 kb->name,
+                 kb->totelem);
+      array = (float *)MEM_calloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
+    }
+    else {
+      array = (float *)MEM_malloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
+      memcpy(array, kb->data, sizeof(float[3]) * size_t(mesh_src->totvert));
+    }
+
+    CustomData_add_layer_named(
+        &mesh_dest->vdata, CD_SHAPEKEY, CD_ASSIGN, array, mesh_dest->totvert, kb->name);
+    ci = CustomData_get_layer_index_n(&mesh_dest->vdata, CD_SHAPEKEY, i);
+
+    mesh_dest->vdata.layers[ci].uid = kb->uid;
+  }
+}
+
+/**
+ * \param use_virtual_modifiers: When enabled, calculate virtual-modifiers before applying
+ * `md_eval`. This is supported because virtual-modifiers are not modifiers from a user
+ * perspective, allowing shape keys to be included with the modifier being applied, see: T91923.
+ */
+static Mesh *create_applied_mesh_for_modifier(Depsgraph *depsgraph,
+                                              Scene *scene,
+                                              Object *ob_eval,
+                                              ModifierData *md_eval,
+                                              const bool use_virtual_modifiers,
+                                              const bool build_shapekey_layers)
+{
+  Mesh *me = ob_eval->runtime.data_orig ? (Mesh *)ob_eval->runtime.data_orig :
+                                          (Mesh *)ob_eval->data;
+  const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md_eval->type);
+  Mesh *result = nullptr;
+  KeyBlock *kb;
+  ModifierEvalContext mectx = {depsgraph, ob_eval, MOD_APPLY_TO_BASE_MESH};
+
+  if (!(md_eval->mode & eModifierMode_Realtime))

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list