Fix T74205: crash cancelling transfrom operation in sculpt mode

Differential Revision: https://developer.blender.org/D7018
This commit is contained in:
Asad-ullah Khan 2020-04-03 02:35:25 +02:00 committed by Brecht Van Lommel
parent 80513d8574
commit 1a69384e76
Notes: blender-bot 2023-02-14 10:11:54 +01:00
Referenced by issue #74205, Crash in sculpt mode at trying to rotate after a cancelled rotate
3 changed files with 12 additions and 2 deletions

View File

@ -11076,7 +11076,11 @@ void ED_sculpt_end_transform(struct bContext *C)
if (ss->filter_cache) {
sculpt_filter_cache_free(ss);
}
SCULPT_undo_push_end();
/* Force undo push to happen even inside transform operator, since the sculpt
* undo system works separate from regular undo and this is require to properly
* finish an undo step also when cancelling. */
const bool use_nested_undo = true;
SCULPT_undo_push_end_ex(use_nested_undo);
sculpt_flush_update_done(C, ob, SCULPT_UPDATE_COORDS);
}

View File

@ -726,6 +726,7 @@ SculptUndoNode *SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType
SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node);
void SCULPT_undo_push_begin(const char *name);
void SCULPT_undo_push_end(void);
void SCULPT_undo_push_end_ex(const bool use_nested_undo);
void SCULPT_vertcos_to_key(Object *ob, KeyBlock *kb, const float (*vertCos)[3]);

View File

@ -1289,6 +1289,11 @@ void SCULPT_undo_push_begin(const char *name)
}
void SCULPT_undo_push_end(void)
{
SCULPT_undo_push_end_ex(false);
}
void SCULPT_undo_push_end_ex(const bool use_nested_undo)
{
UndoSculpt *usculpt = sculpt_undo_get_nodes();
SculptUndoNode *unode;
@ -1307,7 +1312,7 @@ void SCULPT_undo_push_end(void)
/* We could remove this and enforce all callers run in an operator using 'OPTYPE_UNDO'. */
wmWindowManager *wm = G_MAIN->wm.first;
if (wm->op_undo_depth == 0) {
if (wm->op_undo_depth == 0 || use_nested_undo) {
UndoStack *ustack = ED_undo_stack_get();
BKE_undosys_step_push(ustack, NULL, NULL);
WM_file_tag_modified();