diff --git a/source/blender/modifiers/MOD_nodes.hh b/source/blender/modifiers/MOD_nodes.hh index 827c4476d1d..5bf64a80507 100644 --- a/source/blender/modifiers/MOD_nodes.hh +++ b/source/blender/modifiers/MOD_nodes.hh @@ -10,6 +10,7 @@ struct NodesModifierData; struct NodesModifierDataBlock; struct Object; struct NodesModifierPackedBake; +struct NodesModifierBake; namespace blender::bke::bake { struct ModifierCache; @@ -45,5 +46,6 @@ struct NodesModifierRuntime { void nodes_modifier_data_block_destruct(NodesModifierDataBlock *data_block, bool do_id_user); void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake); +void nodes_modifier_bake_destruct(NodesModifierBake *bake, bool do_id_user); } // namespace blender diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 0998e07eba8..2ddb93e87c9 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -378,8 +378,11 @@ static void update_bakes_from_node_group(NodesModifierData &nmd) NodesModifierBake &new_bake = new_bake_data[i]; if (old_bake) { new_bake = *old_bake; - /* The ownership of the string was moved to `new_bake`. */ + /* The ownership of this data was moved to `new_bake`. */ old_bake->directory = nullptr; + old_bake->data_blocks = nullptr; + old_bake->data_blocks_num = 0; + old_bake->packed = nullptr; } else { new_bake.id = id; @@ -390,7 +393,7 @@ static void update_bakes_from_node_group(NodesModifierData &nmd) } for (NodesModifierBake &old_bake : MutableSpan(nmd.bakes, nmd.bakes_num)) { - MEM_SAFE_FREE(old_bake.directory); + nodes_modifier_bake_destruct(&old_bake, true); } MEM_SAFE_FREE(nmd.bakes); @@ -2751,6 +2754,21 @@ void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake) MEM_SAFE_FREE(packed_bake); } +void nodes_modifier_bake_destruct(NodesModifierBake *bake, const bool do_id_user) +{ + MEM_SAFE_FREE(bake->directory); + + for (NodesModifierDataBlock &data_block : MutableSpan(bake->data_blocks, bake->data_blocks_num)) + { + nodes_modifier_data_block_destruct(&data_block, do_id_user); + } + MEM_SAFE_FREE(bake->data_blocks); + + if (bake->packed) { + nodes_modifier_packed_bake_free(bake->packed); + } +} + static void free_data(ModifierData *md) { NodesModifierData *nmd = reinterpret_cast(md); @@ -2760,18 +2778,7 @@ static void free_data(ModifierData *md) } for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) { - MEM_SAFE_FREE(bake.directory); - - for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num)) - { - MEM_SAFE_FREE(data_block.id_name); - MEM_SAFE_FREE(data_block.lib_name); - } - MEM_SAFE_FREE(bake.data_blocks); - - if (bake.packed) { - nodes_modifier_packed_bake_free(bake.packed); - } + nodes_modifier_bake_destruct(&bake, false); } MEM_SAFE_FREE(nmd->bakes);