diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-10-21 18:20:17 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-10-21 18:20:17 +0300 |
commit | c989c5d37d53968aefd2912dd9994c35323d7059 (patch) | |
tree | 6aae6d5a9620a42780a384e7abe3f6ae4ac1af1a /source/blender/blenkernel/intern/library_remap.c | |
parent | 4e36ebf5936b68ba3b0bf59ba6a67a88cb201fad (diff) |
Fix non-sense overloaded code in remapping post-process of objects and collections.
In one case, code was calling the same func on bmain for all objects or
collections inside that bmain... seriously...
Diffstat (limited to 'source/blender/blenkernel/intern/library_remap.c')
-rw-r--r-- | source/blender/blenkernel/intern/library_remap.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c index 057ce058b4e..a88eb87dd40 100644 --- a/source/blender/blenkernel/intern/library_remap.c +++ b/source/blender/blenkernel/intern/library_remap.c @@ -291,33 +291,52 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data) } } +/* Can be called with both old_ob and new_ob being NULL, this means we have to check whole Main database then. */ static void libblock_remap_data_postprocess_object_update(Main *bmain, Object *old_ob, Object *new_ob) { if (new_ob == NULL) { - /* In case we unlinked old_ob (new_ob is NULL), the object has already - * been removed from the scenes and their collections. We still have - * to remove the NULL children from collections not used in any scene. */ + /* In case we unlinked old_ob (new_ob is NULL), the object has already + * been removed from the scenes and their collections. We still have + * to remove the NULL children from collections not used in any scene. */ BKE_collections_object_remove_nulls(bmain); } BKE_main_collection_sync_remap(bmain); - if (old_ob->type == OB_MBALL) { - for (Object *ob = bmain->object.first; ob; ob = ob->id.next) { + if (old_ob == NULL) { + for (Object *ob = bmain->object.first; ob != NULL; ob = ob->id.next) { + if (ob->type == OB_MBALL && BKE_mball_is_basis(ob)) { + DEG_id_tag_update(&ob->id, OB_RECALC_DATA); + } + } + } + else { + for (Object *ob = bmain->object.first; ob != NULL; ob = ob->id.next) { if (ob->type == OB_MBALL && BKE_mball_is_basis_for(ob, old_ob)) { DEG_id_tag_update(&ob->id, OB_RECALC_DATA); + break; /* There is only one basis... */ } } } } -static void libblock_remap_data_postprocess_collection_update(Main *bmain, Collection *old_collection, Collection *new_collection) +/* Can be called with both old_collection and new_collection being NULL, + * this means we have to check whole Main database then. */ +static void libblock_remap_data_postprocess_collection_update( + Main *bmain, Collection *old_collection, Collection *new_collection) { if (new_collection == NULL) { /* In case we unlinked old_collection (new_collection is NULL), we need * to remove any collection children that have been set to NULL in the * because of pointer replacement. */ - BKE_collections_child_remove_nulls(bmain, old_collection); + if (old_collection != NULL) { + BKE_collections_child_remove_nulls(bmain, old_collection); + } + else { + for (Collection *collection = bmain->collection.first; collection; collection = collection->id.next) { + BKE_collections_child_remove_nulls(bmain, collection); + } + } } BKE_main_collection_sync_remap(bmain); @@ -604,10 +623,8 @@ void BKE_libblock_relink_ex( if (old_id) { switch (GS(old_id->name)) { case ID_OB: - { libblock_remap_data_postprocess_object_update(bmain, (Object *)old_id, (Object *)new_id); break; - } case ID_GR: libblock_remap_data_postprocess_collection_update(bmain, (Collection *)old_id, (Collection *)new_id); break; @@ -617,12 +634,8 @@ void BKE_libblock_relink_ex( } else { /* No choice but to check whole objects/collections. */ - for (Object *ob = bmain->object.first; ob; ob = ob->id.next) { - libblock_remap_data_postprocess_object_update(bmain, ob, NULL); - } - for (Collection *collection = bmain->collection.first; collection; collection = collection->id.next) { - libblock_remap_data_postprocess_collection_update(bmain, collection, NULL); - } + libblock_remap_data_postprocess_object_update(bmain, NULL, NULL); + libblock_remap_data_postprocess_collection_update(bmain, NULL, NULL); } break; } |