[Bf-blender-cvs] [c729ddd7414] master: LibOverride: Do not write Surface Deform modifier binding data.

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


Commit: c729ddd7414ad0b25b9e4651e12ec4e4e4043775
Author: Bastien Montagne
Date:   Mon May 16 16:55:44 2022 +0200
Branches: master
https://developer.blender.org/rBc729ddd7414ad0b25b9e4651e12ec4e4e4043775

LibOverride: Do not write Surface Deform 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_surfacedeform.c

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

diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index e738e86dc24..fe49244c4a2 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -1669,29 +1669,41 @@ static void panelRegister(ARegionType *region_type)
   modifier_panel_register(region_type, eModifierType_SurfaceDeform, 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)
 {
-  const SurfaceDeformModifierData *smd = (const SurfaceDeformModifierData *)md;
+  SurfaceDeformModifierData smd = *(const SurfaceDeformModifierData *)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. */
+      smd.bind_verts_num = 0;
+      smd.verts = NULL;
+    }
+  }
 
-  BLO_write_struct(writer, SurfaceDeformModifierData, smd);
+  BLO_write_struct_at_address(writer, SurfaceDeformModifierData, md, &smd);
 
-  BLO_write_struct_array(writer, SDefVert, smd->bind_verts_num, smd->verts);
+  if (smd.verts != NULL) {
+    SDefVert *bind_verts = smd.verts;
+    BLO_write_struct_array(writer, SDefVert, smd.bind_verts_num, bind_verts);
 
-  if (smd->verts) {
-    for (int i = 0; i < smd->bind_verts_num; i++) {
-      BLO_write_struct_array(writer, SDefBind, smd->verts[i].binds_num, smd->verts[i].binds);
+    for (int i = 0; i < smd.bind_verts_num; i++) {
+      BLO_write_struct_array(writer, SDefBind, bind_verts[i].binds_num, bind_verts[i].binds);
 
-      if (smd->verts[i].binds) {
-        for (int j = 0; j < smd->verts[i].binds_num; j++) {
+      if (bind_verts[i].binds) {
+        for (int j = 0; j < bind_verts[i].binds_num; j++) {
           BLO_write_uint32_array(
-              writer, smd->verts[i].binds[j].verts_num, smd->verts[i].binds[j].vert_inds);
+              writer, bind_verts[i].binds[j].verts_num, bind_verts[i].binds[j].vert_inds);
 
-          if (ELEM(smd->verts[i].binds[j].mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRI)) {
-            BLO_write_float3_array(writer, 1, smd->verts[i].binds[j].vert_weights);
+          if (ELEM(bind_verts[i].binds[j].mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRI)) {
+            BLO_write_float3_array(writer, 1, bind_verts[i].binds[j].vert_weights);
           }
           else {
             BLO_write_float_array(
-                writer, smd->verts[i].binds[j].verts_num, smd->verts[i].binds[j].vert_weights);
+                writer, bind_verts[i].binds[j].verts_num, bind_verts[i].binds[j].vert_weights);
           }
         }
       }



More information about the Bf-blender-cvs mailing list