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
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2018-02-13 22:58:40 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-02-16 12:34:00 +0300
commit8165234b46f872cfc8905a36741a3af844ff61ad (patch)
tree3084edb3e9878d2fc220b342463dbc23589d4e97
parente03f335b1d81c3820e206849cb72860f7d2d2c39 (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.
-rw-r--r--source/blender/blenloader/intern/readfile.c12
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);