diff options
-rw-r--r-- | source/blender/blenkernel/BKE_modifier.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 9 | ||||
-rw-r--r-- | source/blender/editors/object/object_add.c | 8 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_displace.c | 10 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_meshsequencecache.c | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_wave.c | 10 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvgedit.c | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvgmix.c | 10 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvgproximity.c | 10 |
12 files changed, 39 insertions, 55 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index e1ce58ba69b..7eb3ad33950 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -332,6 +332,7 @@ const ModifierTypeInfo *modifierType_getInfo(ModifierType type); * default values if pointer is optional. */ struct ModifierData *modifier_new(int type); +void modifier_free_ex(struct ModifierData *md, const int flag); void modifier_free(struct ModifierData *md); bool modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 11e259e0318..1af31d5e024 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -77,7 +77,7 @@ bool BKE_object_support_modifier_type_check(struct Object *ob, int modifier_type void BKE_object_link_modifiers( struct Object *ob_dst, const struct Object *ob_src, eObjectMode object_mode); -void BKE_object_free_modifiers(struct Object *ob); +void BKE_object_free_modifiers(struct Object *ob, const int flag); void BKE_object_make_proxy(struct Object *ob, struct Object *target, struct Object *gob); void BKE_object_copy_proxy_drivers(struct Object *ob, struct Object *target); diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index abbf073f646..8c88430aa10 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2469,7 +2469,7 @@ Mesh *BKE_mesh_new_from_object( /* if getting the original caged mesh, delete object modifiers */ if (cage) - BKE_object_free_modifiers(tmpobj); + BKE_object_free_modifiers(tmpobj, 0); /* copies the data */ copycu = tmpobj->data = BKE_curve_copy(bmain, (Curve *) ob->data); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 1604a017054..1f570dcb531 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -138,16 +138,38 @@ ModifierData *modifier_new(int type) return md; } -void modifier_free(ModifierData *md) +static void modifier_free_data_id_us_cb(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin, int cb_flag) +{ + ID *id = *idpoin; + if (id != NULL && (cb_flag & IDWALK_CB_USER) != 0) { + id_us_min(id); + } +} + +void modifier_free_ex(ModifierData *md, const int flag) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) { + if (mti->foreachIDLink) { + mti->foreachIDLink(md, NULL, modifier_free_data_id_us_cb, NULL); + } + else if (mti->foreachObjectLink) { + mti->foreachObjectLink(md, NULL, (ObjectWalkFunc)modifier_free_data_id_us_cb, NULL); + } + } + if (mti->freeData) mti->freeData(md); if (md->error) MEM_freeN(md->error); MEM_freeN(md); } +void modifier_free(ModifierData *md) +{ + modifier_free_ex(md, 0); +} + bool modifier_unique_name(ListBase *modifiers, ModifierData *md) { if (modifiers && md) { diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 73f47dec9cb..59d2bcc89fd 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -198,12 +198,12 @@ void BKE_object_free_curve_cache(Object *ob) } } -void BKE_object_free_modifiers(Object *ob) +void BKE_object_free_modifiers(Object *ob, const int flag) { ModifierData *md; while ((md = BLI_pophead(&ob->modifiers))) { - modifier_free(md); + modifier_free_ex(md, flag); } /* particle modifiers were freed, so free the particlesystems as well */ @@ -267,7 +267,7 @@ void BKE_object_link_modifiers( eObjectMode object_mode) { ModifierData *md; - BKE_object_free_modifiers(ob_dst); + BKE_object_free_modifiers(ob_dst, 0); if (!ELEM(ob_dst->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE)) { /* only objects listed above can have modifiers and linking them to objects @@ -421,7 +421,8 @@ void BKE_object_free(Object *ob) { BKE_animdata_free((ID *)ob, false); - BKE_object_free_modifiers(ob); + /* BKE_<id>_free shall never touch to ID->us. Never ever. */ + BKE_object_free_modifiers(ob, LIB_ID_CREATE_NO_USER_REFCOUNT); MEM_SAFE_FREE(ob->mat); MEM_SAFE_FREE(ob->matbits); diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 3590b38310f..96a5a95a5cd 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1659,7 +1659,7 @@ static void curvetomesh(EvaluationContext *eval_ctx, Main *bmain, Scene *scene, BKE_mesh_from_nurbs(ob); /* also does users */ if (ob->type == OB_MESH) { - BKE_object_free_modifiers(ob); + BKE_object_free_modifiers(ob, 0); /* Game engine defaults for mesh objects */ ob->body_type = OB_BODY_TYPE_STATIC; @@ -1788,7 +1788,7 @@ static int convert_exec(bContext *C, wmOperator *op) /* When 2 objects with linked data are selected, converting both * would keep modifiers on all but the converted object [#26003] */ if (ob->type == OB_MESH) { - BKE_object_free_modifiers(ob); /* after derivedmesh calls! */ + BKE_object_free_modifiers(ob, 0); /* after derivedmesh calls! */ } } } @@ -1813,7 +1813,7 @@ static int convert_exec(bContext *C, wmOperator *op) BKE_mesh_to_curve(&eval_ctx, scene, newob); if (newob->type == OB_CURVE) { - BKE_object_free_modifiers(newob); /* after derivedmesh calls! */ + BKE_object_free_modifiers(newob, 0); /* after derivedmesh calls! */ ED_rigidbody_object_remove(bmain, scene, newob); } } @@ -1846,7 +1846,7 @@ static int convert_exec(bContext *C, wmOperator *op) /* re-tessellation is called by DM_to_mesh */ - BKE_object_free_modifiers(newob); /* after derivedmesh calls! */ + BKE_object_free_modifiers(newob, 0); /* after derivedmesh calls! */ } else if (ob->type == OB_FONT) { ob->flag |= OB_DONE; diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c index f90e6cc1d36..7ec89b23f25 100644 --- a/source/blender/modifiers/intern/MOD_displace.c +++ b/source/blender/modifiers/intern/MOD_displace.c @@ -80,14 +80,6 @@ static void copyData(ModifierData *md, ModifierData *target) modifier_copyData_generic(md, target); } -static void freeData(ModifierData *md) -{ - DisplaceModifierData *dmd = (DisplaceModifierData *) md; - if (dmd->texture) { - id_us_min(&dmd->texture->id); - } -} - static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) { DisplaceModifierData *dmd = (DisplaceModifierData *)md; @@ -422,7 +414,7 @@ ModifierTypeInfo modifierType_Displace = { /* applyModifierEM */ NULL, /* initData */ initData, /* requiredDataMask */ requiredDataMask, - /* freeData */ freeData, + /* freeData */ NULL, /* isDisabled */ isDisabled, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c index a6d91fc3d90..10e1cdea4ca 100644 --- a/source/blender/modifiers/intern/MOD_meshsequencecache.c +++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c @@ -74,10 +74,6 @@ static void freeData(ModifierData *md) { MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md; - if (mcmd->cache_file) { - id_us_min(&mcmd->cache_file->id); - } - if (mcmd->reader) { #ifdef WITH_ALEMBIC CacheReader_free(mcmd->reader); diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c index 33b2d904c23..7921ea662a7 100644 --- a/source/blender/modifiers/intern/MOD_wave.c +++ b/source/blender/modifiers/intern/MOD_wave.c @@ -78,14 +78,6 @@ static void initData(ModifierData *md) wmd->defgrp_name[0] = 0; } -static void freeData(ModifierData *md) -{ - WaveModifierData *wmd = (WaveModifierData *) md; - if (wmd->texture) { - id_us_min(&wmd->texture->id); - } -} - static void copyData(ModifierData *md, ModifierData *target) { #if 0 @@ -366,7 +358,7 @@ ModifierTypeInfo modifierType_Wave = { /* applyModifierEM */ NULL, /* initData */ initData, /* requiredDataMask */ requiredDataMask, - /* freeData */ freeData, + /* freeData */ NULL, /* isDisabled */ NULL, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 23f36d3bc4c..6fdfe215c37 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -78,10 +78,6 @@ static void freeData(ModifierData *md) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData *) md; curvemapping_free(wmd->cmap_curve); - - if (wmd->mask_texture) { - id_us_min(&wmd->mask_texture->id); - } } static void copyData(ModifierData *md, ModifierData *target) diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 1947e7e1f0f..45c41498792 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -125,14 +125,6 @@ static void initData(ModifierData *md) wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL; } -static void freeData(ModifierData *md) -{ - WeightVGMixModifierData *wmd = (WeightVGMixModifierData *) md; - if (wmd->mask_texture) { - id_us_min(&wmd->mask_texture->id); - } -} - static void copyData(ModifierData *md, ModifierData *target) { #if 0 @@ -409,7 +401,7 @@ ModifierTypeInfo modifierType_WeightVGMix = { /* applyModifierEM */ NULL, /* initData */ initData, /* requiredDataMask */ requiredDataMask, - /* freeData */ freeData, + /* freeData */ NULL, /* isDisabled */ isDisabled, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 87c6a03a536..84c5207830e 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -285,14 +285,6 @@ static void initData(ModifierData *md) wmd->max_dist = 1.0f; /* vert arbitrary distance, but don't use 0 */ } -static void freeData(ModifierData *md) -{ - WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData *) md; - if (wmd->mask_texture) { - id_us_min(&wmd->mask_texture->id); - } -} - static void copyData(ModifierData *md, ModifierData *target) { #if 0 @@ -592,7 +584,7 @@ ModifierTypeInfo modifierType_WeightVGProximity = { /* applyModifierEM */ NULL, /* initData */ initData, /* requiredDataMask */ requiredDataMask, - /* freeData */ freeData, + /* freeData */ NULL, /* isDisabled */ isDisabled, /* updateDepsgraph */ updateDepsgraph, /* dependsOnTime */ dependsOnTime, |