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).
This commit is contained in:
2020-09-14 14:55:48 +02:00
parent 4b14f763da
commit ec6d32b238
2 changed files with 11 additions and 1 deletions

View File

@@ -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;
}
}

View File

@@ -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);