[Bf-blender-cvs] [b66368f3fd9] master: LibOverride: Do not write MeshDeform modifier binding data.

Bastien Montagne noreply at git.blender.org
Mon May 16 16:57:26 CEST 2022


Commit: b66368f3fd9c17e969fe1fd9d3f341eca7750183
Author: Bastien Montagne
Date:   Mon May 16 16:50:21 2022 +0200
Branches: master
https://developer.blender.org/rBb66368f3fd9c17e969fe1fd9d3f341eca7750183

LibOverride: Do not write MeshDeform modifier binding data.

Skip writing binding data and similar for override modifiers already
present in reference linked data, as this can use a lot of space, and
is fully useless data typically since we already skip writing Mesh
geometry data itself.

Ref. T97967.

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

M	source/blender/modifiers/intern/MOD_meshdeform.c

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

diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 84df93b00bf..c5db0a5f21a 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -581,28 +581,49 @@ static void panelRegister(ARegionType *region_type)
   modifier_panel_register(region_type, eModifierType_MeshDeform, panel_draw);
 }
 
-static void blendWrite(BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
+static void blendWrite(BlendWriter *writer, const ID *id_owner, const ModifierData *md)
 {
-  MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
-  int size = mmd->dyngridsize;
+  MeshDeformModifierData mmd = *(const MeshDeformModifierData *)md;
+
+  if (ID_IS_OVERRIDE_LIBRARY(id_owner)) {
+    BLI_assert(!ID_IS_LINKED(id_owner));
+    const bool is_local = (md->flag & eModifierFlag_OverrideLibrary_Local) != 0;
+    if (!is_local) {
+      /* Modifier comming from linked data cannot be bound from an override, so we can remove all
+       * binding data, can save a sgnificant amout of memory. */
+      mmd.influences_num = 0;
+      mmd.bindinfluences = NULL;
+      mmd.verts_num = 0;
+      mmd.bindoffsets = NULL;
+      mmd.cage_verts_num = 0;
+      mmd.bindcagecos = NULL;
+      mmd.dyngridsize = 0;
+      mmd.dyngrid = NULL;
+      mmd.influences_num = 0;
+      mmd.dyninfluences = NULL;
+      mmd.dynverts = NULL;
+    }
+  }
 
-  BLO_write_struct(writer, MeshDeformModifierData, mmd);
+  const int size = mmd.dyngridsize;
 
-  BLO_write_struct_array(writer, MDefInfluence, mmd->influences_num, mmd->bindinfluences);
+  BLO_write_struct_at_address(writer, MeshDeformModifierData, md, &mmd);
+
+  BLO_write_struct_array(writer, MDefInfluence, mmd.influences_num, mmd.bindinfluences);
 
   /* NOTE: `bindoffset` is abusing `verts_num + 1` as its size, this becomes an incorrect value in
    * case `verts_num == 0`, since `bindoffset` is then NULL, not a size 1 allocated array. */
-  if (mmd->verts_num > 0) {
-    BLO_write_int32_array(writer, mmd->verts_num + 1, mmd->bindoffsets);
+  if (mmd.verts_num > 0) {
+    BLO_write_int32_array(writer, mmd.verts_num + 1, mmd.bindoffsets);
   }
   else {
-    BLI_assert(mmd->bindoffsets == NULL);
+    BLI_assert(mmd.bindoffsets == NULL);
   }
 
-  BLO_write_float3_array(writer, mmd->cage_verts_num, mmd->bindcagecos);
-  BLO_write_struct_array(writer, MDefCell, size * size * size, mmd->dyngrid);
-  BLO_write_struct_array(writer, MDefInfluence, mmd->influences_num, mmd->dyninfluences);
-  BLO_write_int32_array(writer, mmd->verts_num, mmd->dynverts);
+  BLO_write_float3_array(writer, mmd.cage_verts_num, mmd.bindcagecos);
+  BLO_write_struct_array(writer, MDefCell, size * size * size, mmd.dyngrid);
+  BLO_write_struct_array(writer, MDefInfluence, mmd.influences_num, mmd.dyninfluences);
+  BLO_write_int32_array(writer, mmd.verts_num, mmd.dynverts);
 }
 
 static void blendRead(BlendDataReader *reader, ModifierData *md)



More information about the Bf-blender-cvs mailing list