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:
parent
46bdfcab10
commit
a4be38c065
Notes:
blender-bot
2023-10-18 15:23:11 +02:00
Referenced by issue #78392, [2.83.5, 2.90, 2.91] Crash on undo/ redo after changing modes Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
|
@ -9585,6 +9585,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1902,10 +1902,17 @@ static void write_shaderfxs(WriteData *wd, ListBase *fxbase)
|
|||
|
||||
static void write_object(WriteData *wd, Object *ob, const void *id_address)
|
||||
{
|
||||
if (ob->id.us > 0 || wd->use_memfile) {
|
||||
const bool is_undo = wd->use_memfile;
|
||||
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 */
|
||||
writestruct_at_address(wd, ID_OB, Object, 1, id_address, ob);
|
||||
write_iddata(wd, &ob->id);
|
||||
|
|
Loading…
Reference in New Issue