[Bf-blender-cvs] [ec6d32b238d] master: Fix T78392: [2.83.5, 2.90, 2.91] Crash on undo/ redo after changing modes.

Bastien Montagne noreply at git.blender.org
Mon Sep 14 14:59:40 CEST 2020


Commit: ec6d32b238da507c258a4b571e332c5cb67a6b18
Author: Bastien Montagne
Date:   Mon Sep 14 14:55:48 2020 +0200
Branches: master
https://developer.blender.org/rBec6d32b238da507c258a4b571e332c5cb67a6b18

Fix T78392: [2.83.5, 2.90, 2.91] Crash on undo/ redo after changing modes.

During undo/redo read code is expected to clear the `OB_MODE_EDIT`
bitflag of `Object.mode`, for some reasons.

This was not done anymore for re-used Objects, we need to add a special
handling case for that too.

Should be backported to 2.90 and 2.83 (will probably not be straight
forward for the latter).

===================================================================

M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c

===================================================================

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index b0f0a08651c..38dc63af1fe 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6553,6 +6553,9 @@ static void read_libblock_undo_restore_identical(
     if (ob->proxy != NULL) {
       ob->proxy->proxy_from = ob;
     }
+    /* For undo we stay in object mode during undo presses, so keep editmode disabled for re-used
+     * data-blocks too. */
+    ob->mode &= ~OB_MODE_EDIT;
   }
 }
 
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index b3e937a29b2..183ed3668b7 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1303,10 +1303,17 @@ static void write_shaderfxs(BlendWriter *writer, ListBase *fxbase)
 
 static void write_object(BlendWriter *writer, Object *ob, const void *id_address)
 {
-  if (ob->id.us > 0 || BLO_write_is_undo(writer)) {
+  const bool is_undo = BLO_write_is_undo(writer);
+  if (ob->id.us > 0 || is_undo) {
     /* Clean up, important in undo case to reduce false detection of changed datablocks. */
     BKE_object_runtime_reset(ob);
 
+    if (is_undo) {
+      /* For undo we stay in object mode during undo presses, so keep editmode disabled on save as
+       * well, can help reducing false detection of changed datablocks. */
+      ob->mode &= ~OB_MODE_EDIT;
+    }
+
     /* write LibData */
     BLO_write_id_struct(writer, Object, id_address, &ob->id);
     BKE_id_blend_write(writer, &ob->id);



More information about the Bf-blender-cvs mailing list