diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-02-13 22:58:40 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-02-16 12:34:00 +0300 |
commit | 8165234b46f872cfc8905a36741a3af844ff61ad (patch) | |
tree | 3084edb3e9878d2fc220b342463dbc23589d4e97 /source/blender/blenloader/intern/readfile.c | |
parent | e03f335b1d81c3820e206849cb72860f7d2d2c39 (diff) |
Fix part I of T53977: Severe problem with multiple instances of a library (save and reload).
The issue was that when a same lib was found several times in loaded
.blend, we'd only keep the first occurence. But since Blender expects
next data-blocks to belong to last found library, we could actually
be adding data-blocks assigned to copies of the duplicated lib to
another, totally unrelated lib.
Those data-blocks were then obviously not found when actually loading
libs content, and lost.
Note that this only fix one part of the issue, current code can
generate several copies of same linked data-block now, will fix in
another commit.
Diffstat (limited to 'source/blender/blenloader/intern/readfile.c')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 9aa67e8651f..f45ff677ae3 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -7423,12 +7423,20 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main) BLI_remlink(&main->library, lib); MEM_freeN(lib); - - + + /* Now, since Blender always expect **latest** Main pointer from fd->mainlist to be the active library + * Main pointer, where to add all non-library data-blocks found in file next, we have to switch that + * 'dupli' found Main to latest position in the list! + * Otherwise, you get weird disappearing linked data on a rather unconsistant basis. + * See also T53977 for reproducible case. */ + BLI_remlink(fd->mainlist, newmain); + BLI_addtail(fd->mainlist, newmain); + return; } } } + /* make sure we have full path in lib->filepath */ BLI_strncpy(lib->filepath, lib->name, sizeof(lib->name)); BLI_cleanup_path(fd->relabase, lib->filepath); |