[Bf-blender-cvs] [cb3c9cba492] blender2.8: Fix T55171: crash with undo and linked collections.
Brecht Van Lommel
noreply at git.blender.org
Thu May 24 12:08:36 CEST 2018
Commit: cb3c9cba49290bf12116033a7ea151cad352cf76
Author: Brecht Van Lommel
Date: Thu May 24 12:01:40 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBcb3c9cba49290bf12116033a7ea151cad352cf76
Fix T55171: crash with undo and linked collections.
Collections created in library file versioning need to be set as coming
from the library, otherwise they get freed on undo.
===================================================================
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/versioning_280.c
===================================================================
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 70c898a374e..f0c6d314c26 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5717,7 +5717,6 @@ static void lib_link_collection_data(FileData *fd, Library *lib, Collection *col
cob->ob = newlibadr_us(fd, lib, cob->ob);
if (cob->ob == NULL) {
- BLI_assert(!"Collection linked object got lost"); // TODO: remove, only for testing now
BLI_freelinkN(&collection->gobject, cob);
}
}
@@ -5729,7 +5728,6 @@ static void lib_link_collection_data(FileData *fd, Library *lib, Collection *col
if (child->collection == NULL ||
BKE_collection_find_cycle(collection, child->collection))
{
- BLI_assert(!"Collection child got lost"); // TODO: remove, only for testing now
BLI_freelinkN(&collection->children, child);
}
else {
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 7bb20c38308..a25c744afc4 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -262,6 +262,7 @@ static void do_version_layer_collection_post(
static void do_version_scene_collection_convert(
Main *bmain,
+ ID *id,
SceneCollection *sc,
Collection *collection,
GHash *collection_map)
@@ -273,7 +274,8 @@ static void do_version_scene_collection_convert(
for (SceneCollection *nsc = sc->scene_collections.first; nsc;) {
SceneCollection *nsc_next = nsc->next;
Collection *ncollection = BKE_collection_add(bmain, collection, nsc->name);
- do_version_scene_collection_convert(bmain, nsc, ncollection, collection_map);
+ ncollection->id.lib = id->lib;
+ do_version_scene_collection_convert(bmain, id, nsc, ncollection, collection_map);
nsc = nsc_next;
}
@@ -293,7 +295,7 @@ static void do_version_group_collection_to_collection(Main *bmain, Collection *g
{
/* Convert old 2.8 group collections to new unified collections. */
if (group->collection) {
- do_version_scene_collection_convert(bmain, group->collection, group, NULL);
+ do_version_scene_collection_convert(bmain, &group->id, group->collection, group, NULL);
}
group->collection = NULL;
@@ -317,7 +319,7 @@ static void do_version_scene_collection_to_collection(Main *bmain, Scene *scene)
/* Convert scene collections. */
GHash *collection_map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
if (scene->collection) {
- do_version_scene_collection_convert(bmain, scene->collection, scene->master_collection, collection_map);
+ do_version_scene_collection_convert(bmain, &scene->id, scene->collection, scene->master_collection, collection_map);
scene->collection = NULL;
}
@@ -434,6 +436,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
collections[DO_VERSION_COLLECTION_VISIBLE].suffix);
Collection *collection = BKE_collection_add(bmain, collection_master, name);
+ collection->id.lib = scene->id.lib;
collection->flag |= collections[DO_VERSION_COLLECTION_VISIBLE].flag;
collections[DO_VERSION_COLLECTION_VISIBLE].collections[layer] = collection;
collections[DO_VERSION_COLLECTION_VISIBLE].created |= (1 << layer);
@@ -453,6 +456,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
collections[collection_index].suffix);
Collection *collection = BKE_collection_add(bmain, collection_parent, name);
+ collection->id.lib = scene->id.lib;
collection->flag |= collections[collection_index].flag;
collections[collection_index].collections[layer] = collection;
collections[collection_index].created |= (1 << layer);
@@ -676,12 +680,14 @@ void do_versions_after_linking_280(Main *main)
/* Convert group layer visibility flags to hidden nested collection. */
for (Collection *collection = main->collection.first; collection; collection = collection->id.next) {
- Collection *collection_hidden = NULL;
+ /* Add fake user for all existing groups. */
+ id_fake_user_set(&collection->id);
if (collection->flag & (COLLECTION_RESTRICT_VIEW | COLLECTION_RESTRICT_RENDER)) {
continue;
}
+ Collection *collection_hidden = NULL;
for (CollectionObject *cob = collection->gobject.first, *cob_next = NULL; cob; cob = cob_next) {
cob_next = cob->next;
Object *ob = cob->ob;
@@ -689,6 +695,7 @@ void do_versions_after_linking_280(Main *main)
if (!(ob->lay & collection->layer)) {
if (collection_hidden == NULL) {
collection_hidden = BKE_collection_add(main, collection, "Hidden");
+ collection_hidden->id.lib = collection->id.lib;
collection_hidden->flag |= COLLECTION_RESTRICT_VIEW | COLLECTION_RESTRICT_RENDER;
}
@@ -696,9 +703,6 @@ void do_versions_after_linking_280(Main *main)
BKE_collection_object_remove(main, collection, ob, true);
}
}
-
- /* Add fake user for all existing groups. */
- id_fake_user_set(&collection->id);
}
/* Convert layers to collections. */
More information about the Bf-blender-cvs
mailing list