Merge branch 'blender-v2.83-release'
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1032,6 +1032,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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user