From b66368f3fd9c17e969fe1fd9d3f341eca7750183 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 16 May 2022 16:50:21 +0200 Subject: 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. --- source/blender/modifiers/intern/MOD_meshdeform.c | 45 +++++++++++++++++------- 1 file changed, 33 insertions(+), 12 deletions(-) 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) -- cgit v1.2.3