diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2018-02-22 23:16:39 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2018-02-22 23:16:39 +0300 |
commit | d7ba1ada8208f6f846b3705f5c6d9933261a625f (patch) | |
tree | 88ff991dbdb5dc9f5fb3f407e1ddd14c0b8b1f35 /source | |
parent | e7c4a9d1ef76f6edff95ca9f418a65fc42a453dc (diff) |
Fix T54136: Crash when deleting an object that is in an instanced group
We were not cleaning up groups after deleting objects, leaving groups with
Bases that had no object.
It includes a unittest.
Reviewers: mont29
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/library_remap.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c index 6d4c4082810..e689461636d 100644 --- a/source/blender/blenkernel/intern/library_remap.c +++ b/source/blender/blenkernel/intern/library_remap.c @@ -279,6 +279,26 @@ static void libblock_remap_data_preprocess_scene_object_unlink( } } +static void libblock_remap_data_preprocess_group_unlink( + IDRemap *r_id_remap_data, Object *ob, const bool skip_indirect, const bool is_indirect) +{ + Main *bmain = r_id_remap_data->bmain; + for (Group *group = bmain->group.first; group; group = group->id.next) { + if (BKE_group_object_exists(group, ob)) { + if (skip_indirect && is_indirect) { + r_id_remap_data->skipped_indirect++; + r_id_remap_data->skipped_refcounted++; + } + else { + BKE_collections_object_remove(bmain, &group->id, ob, false); + if (!is_indirect) { + r_id_remap_data->status |= ID_REMAP_IS_LINKED_DIRECT; + } + } + } + } +} + static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data) { switch (GS(r_id_remap_data->id->name)) { @@ -297,6 +317,8 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data) { libblock_remap_data_preprocess_scene_object_unlink( r_id_remap_data, sce, ob_iter, skip_indirect, is_indirect); + libblock_remap_data_preprocess_group_unlink( + r_id_remap_data, ob_iter, skip_indirect, is_indirect); } FOREACH_SCENE_OBJECT_END } @@ -305,7 +327,10 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data) Object *old_ob = (Object *)r_id_remap_data->old_id; libblock_remap_data_preprocess_scene_object_unlink( r_id_remap_data, sce, old_ob, skip_indirect, is_indirect); + libblock_remap_data_preprocess_group_unlink( + r_id_remap_data, old_ob, skip_indirect, is_indirect); } + } break; } |