Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2020-06-15 17:30:46 +0300
committerBastien Montagne <bastien@blender.org>2020-06-15 18:25:51 +0300
commit89bde99674b50ad313f6b7d459f8293c4993ba06 (patch)
treeabf72519bfed95f064cfe6505ced2f2e97855f04 /source
parent624994caa2544823a1c89a868e9bf6760f525269 (diff)
Fix (unreported) critical mistake in Collection liblink code in readfile.c.
Prelimenary step to fix T77460. Not sure how or when that thing was done, but since that call walks around collections relationships, it's an utterly critical violation of liblinking principles (code here should never, ever 'get outside' of its own ID scope). This was wroking so far only because code called through this function (`BKE_collection_parent_relations_rebuild`) was only following parents pointers (in `BKE_collection_find_cycle()`), which would be either valid or non-existent. But next commit is going to change that to also check collection's objects instancing of other collections.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenloader/intern/readfile.c17
1 files changed, 3 insertions, 14 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cc53af2b4ff..12d1e93e183 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6366,8 +6366,6 @@ static void lib_link_collection_data(FileData *fd, Library *lib, Collection *col
for (CollectionChild *child = collection->children.first; child != NULL; child = child->next) {
child->collection = newlibadr(fd, lib, child->collection);
}
-
- BKE_collection_parent_relations_rebuild(collection);
}
static void lib_link_collection(FileData *fd, Main *UNUSED(bmain), Collection *collection)
@@ -10111,18 +10109,9 @@ static void lib_link_all(FileData *fd, Main *bmain)
* so simpler to just use it directly in this single call. */
BLO_main_validate_shapekeys(bmain, NULL);
- if (fd->memfile != NULL) {
- /* When doing redo, we perform a tremendous amount of esoteric magic tricks to avoid having to
- * re-read all library data-blocks.
- * Unfortunately, that means that we do not clear Collections' parents lists, which then get
- * improperly extended in some cases by lib_link_scene() and lib_link_collection() calls above
- * (when one local collection is parent of linked ones).
- * I do not really see a way to address that issue, besides brute force call below which
- * invalidates and re-creates all parenting relationships between collections. Yet another
- * example of why it is such a bad idea to keep that kind of double-linked relationships info
- * 'permanently' in our data structures... */
- BKE_main_collections_parent_relations_rebuild(bmain);
- }
+ /* We have to rebuild that runtime information *after* all data-blocks have been properly linked.
+ */
+ BKE_main_collections_parent_relations_rebuild(bmain);
#ifndef NDEBUG
/* Double check we do not have any 'need link' tag remaining, this should never be the case once