From 368f8f740409e5c8af40e341597e89e9e861b584 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 28 Aug 2020 16:29:55 +0200 Subject: Blenloader: new api function to check if reading is for undo --- source/blender/blenloader/BLO_read_write.h | 4 ++++ source/blender/blenloader/intern/readfile.c | 31 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/BLO_read_write.h b/source/blender/blenloader/BLO_read_write.h index 024b6a6c5e4..ff3a82f708a 100644 --- a/source/blender/blenloader/BLO_read_write.h +++ b/source/blender/blenloader/BLO_read_write.h @@ -195,6 +195,7 @@ void BLO_read_pointer_array(BlendDataReader *reader, void **ptr_p); /* Misc. */ bool BLO_read_requires_endian_switch(BlendDataReader *reader); +bool BLO_read_data_is_undo(BlendDataReader *reader); /* Blend Read Lib API * =================== @@ -208,6 +209,9 @@ ID *BLO_read_get_new_id_address(BlendLibReader *reader, struct Library *lib, str #define BLO_read_id_address(reader, lib, id_ptr_p) \ *(id_ptr_p) = (void *)BLO_read_get_new_id_address((reader), (lib), (ID *)*(id_ptr_p)) +/* Misc. */ +bool BLO_read_lib_is_undo(BlendLibReader *reader); + /* Blend Expand API * =================== * diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index aec5a254750..e9dcd5dddae 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2430,7 +2430,7 @@ static int direct_link_id_restore_recalc(const FileData *fd, static void direct_link_id_common( BlendDataReader *reader, Library *current_library, ID *id, ID *id_old, const int tag) { - if (reader->fd->memfile == NULL) { + if (!BLO_read_data_is_undo(reader)) { /* When actually reading a file , we do want to reset/re-generate session uuids. * In undo case, we want to re-use existing ones. */ id->session_uuid = MAIN_ID_SESSION_UUID_UNSET; @@ -2471,7 +2471,7 @@ static void direct_link_id_common( * * But for regular file load we clear the flag, since the flags might have been changed since * the version the file has been saved with. */ - if (reader->fd->memfile == NULL) { + if (!BLO_read_data_is_undo(reader)) { id->recalc = 0; id->recalc_after_undo_push = 0; } @@ -2948,7 +2948,7 @@ static void lib_link_ntree(BlendLibReader *reader, Library *lib, bNodeTree *ntre /* For nodes with static socket layout, add/remove sockets as needed * to match the static layout. */ - if (reader->fd->memfile == NULL) { + if (!BLO_read_lib_is_undo(reader)) { LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { node_verify_socket_templates(ntree, node); } @@ -3228,7 +3228,7 @@ static void lib_link_pose(BlendLibReader *reader, Object *ob, bPose *pose) /* always rebuild to match proxy or lib changes, but on Undo */ bool rebuild = false; - if (reader->fd->memfile == NULL) { + if (!BLO_read_lib_is_undo(reader)) { if (ob->proxy || ob->id.lib != arm->id.lib) { rebuild = true; } @@ -3587,7 +3587,7 @@ static void direct_link_image(BlendDataReader *reader, Image *ima) BLO_read_list(reader, &ima->tiles); BLO_read_list(reader, &(ima->renderslots)); - if (reader->fd->memfile == NULL) { + if (!BLO_read_data_is_undo(reader)) { /* We reset this last render slot index only when actually reading a file, not for undo. */ ima->last_render_slot = ima->render_slot; } @@ -4803,9 +4803,10 @@ static void direct_link_object(BlendDataReader *reader, Object *ob) * Also when linking in a file don't allow edit and pose modes. * See [#34776, #42780] for more information. */ - if (reader->fd->memfile || (ob->id.tag & (LIB_TAG_EXTERN | LIB_TAG_INDIRECT))) { + const bool is_undo = BLO_read_data_is_undo(reader); + if (is_undo || (ob->id.tag & (LIB_TAG_EXTERN | LIB_TAG_INDIRECT))) { ob->mode &= ~(OB_MODE_EDIT | OB_MODE_PARTICLE_EDIT); - if (!reader->fd->memfile) { + if (!is_undo) { ob->mode &= ~OB_MODE_POSE; } } @@ -4982,7 +4983,7 @@ static void direct_link_object(BlendDataReader *reader, Object *ob) if (ob->sculpt) { ob->sculpt = NULL; /* Only create data on undo, otherwise rely on editor mode switching. */ - if (reader->fd->memfile && (ob->mode & OB_MODE_ALL_SCULPT)) { + if (BLO_read_data_is_undo(reader) && (ob->mode & OB_MODE_ALL_SCULPT)) { BKE_object_sculpt_data_create(ob); } } @@ -5859,7 +5860,7 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) direct_link_view_layer(reader, view_layer); } - if (reader->fd->memfile) { + if (BLO_read_data_is_undo(reader)) { /* If it's undo do nothing here, caches are handled by higher-level generic calling code. */ } else { @@ -7306,7 +7307,7 @@ static void direct_link_sound(BlendDataReader *reader, bSound *sound) sound->cache = NULL; } - if (reader->fd->memfile != NULL) { + if (BLO_read_data_is_undo(reader)) { sound->tags |= SOUND_TAGS_WAVEFORM_NO_RELOAD; } @@ -11243,6 +11244,16 @@ void BLO_read_pointer_array(BlendDataReader *reader, void **ptr_p) *ptr_p = final_array; } +bool BLO_read_data_is_undo(BlendDataReader *reader) +{ + return reader->fd->memfile != NULL; +} + +bool BLO_read_lib_is_undo(BlendLibReader *reader) +{ + return reader->fd->memfile != NULL; +} + void BLO_expand_id(BlendExpander *expander, ID *id) { expand_doit(expander->fd, expander->main, id); -- cgit v1.2.3