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 <bastien@blender.org>2020-04-21 19:29:25 +0300
committerBastien Montagne <bastien@blender.org>2020-04-21 19:29:25 +0300
commit8845b27dce8908de398cd7b0e0d08fb4be90e005 (patch)
treebe3140b084d3d02ac29a93b5b5edb407a066fffe
parent93e193399d9432f2334deb77a93c41b82b1ef4e7 (diff)
parentbc3aab3fa547e60d2361d5a50cdc79885bdc7355 (diff)
Merge branch 'blender-v2.83-release'
-rw-r--r--source/blender/blenkernel/BKE_lib_id.h1
-rw-r--r--source/blender/blenkernel/intern/blendfile.c21
-rw-r--r--source/blender/blenkernel/intern/lib_id.c12
3 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_lib_id.h b/source/blender/blenkernel/BKE_lib_id.h
index 9f36798fbd5..0c91ba6231b 100644
--- a/source/blender/blenkernel/BKE_lib_id.h
+++ b/source/blender/blenkernel/BKE_lib_id.h
@@ -74,6 +74,7 @@ void BKE_libblock_init_empty(struct ID *id) ATTR_NONNULL(1);
void BKE_lib_libblock_session_uuid_reset(void);
void BKE_lib_libblock_session_uuid_ensure(struct ID *id);
+void BKE_lib_libblock_session_uuid_renew(struct ID *id);
void *BKE_id_new(struct Main *bmain, const short type, const char *name);
void *BKE_id_new_nomain(const short type, const char *name);
diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c
index 0d5d35e3508..13dcc7b06f6 100644
--- a/source/blender/blenkernel/intern/blendfile.c
+++ b/source/blender/blenkernel/intern/blendfile.c
@@ -201,6 +201,27 @@ static void setup_app_data(bContext *C,
SWAP(ListBase, bmain->workspaces, bfd->main->workspaces);
SWAP(ListBase, bmain->screens, bfd->main->screens);
+ /* In case of actual new file reading without loading UI, we need to regenerate the session
+ * uuid of the UI-related datablocks we are keeping from previous session, otherwise their uuid
+ * will collide with some generated for newly read data. */
+ if (mode != LOAD_UNDO) {
+ ID *id;
+ FOREACH_MAIN_LISTBASE_ID_BEGIN (&bfd->main->wm, id) {
+ BKE_lib_libblock_session_uuid_renew(id);
+ }
+ FOREACH_MAIN_LISTBASE_ID_END;
+
+ FOREACH_MAIN_LISTBASE_ID_BEGIN (&bfd->main->workspaces, id) {
+ BKE_lib_libblock_session_uuid_renew(id);
+ }
+ FOREACH_MAIN_LISTBASE_ID_END;
+
+ FOREACH_MAIN_LISTBASE_ID_BEGIN (&bfd->main->screens, id) {
+ BKE_lib_libblock_session_uuid_renew(id);
+ }
+ FOREACH_MAIN_LISTBASE_ID_END;
+ }
+
/* we re-use current window and screen */
win = CTX_wm_window(C);
curscreen = CTX_wm_screen(C);
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index ad2cf078054..fe25016344e 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -1033,6 +1033,18 @@ void BKE_lib_libblock_session_uuid_ensure(ID *id)
}
/**
+ * Re-generate a new session-wise uuid for the given \a id.
+ *
+ * \warning This has a very specific use-case (to handle UI-related data-blocks that are kept
+ * across new file reading, when we do keep existing UI). No other usage is expected currently.
+ */
+void BKE_lib_libblock_session_uuid_renew(ID *id)
+{
+ id->session_uuid = MAIN_ID_SESSION_UUID_UNSET;
+ BKE_lib_libblock_session_uuid_ensure(id);
+}
+
+/**
* Generic helper to create a new empty data-block of given type in given \a bmain database.
*
* \param name: can be NULL, in which case we get default name for this ID type.