From 1a69384e76e2b1ab11c87a582eb2cdf26386ac59 Mon Sep 17 00:00:00 2001 From: Asad-ullah Khan Date: Fri, 3 Apr 2020 02:35:25 +0200 Subject: Fix T74205: crash cancelling transfrom operation in sculpt mode Differential Revision: https://developer.blender.org/D7018 --- source/blender/editors/sculpt_paint/sculpt.c | 6 +++++- source/blender/editors/sculpt_paint/sculpt_intern.h | 1 + source/blender/editors/sculpt_paint/sculpt_undo.c | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 8d4870f5dd8..db138bb907d 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -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); } diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h index f0481582571..60b51ce17fd 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.h +++ b/source/blender/editors/sculpt_paint/sculpt_intern.h @@ -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]); diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c index f6ed4fa21e0..f21bfe245dd 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.c +++ b/source/blender/editors/sculpt_paint/sculpt_undo.c @@ -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(); -- cgit v1.2.3