diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-11-29 12:31:56 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-11-29 12:42:56 +0300 |
commit | 8a92976254f38d1f260e7e23e48e0b6f92c6481c (patch) | |
tree | f2c1273f4e67cc9a9766ebe861b0220f7fb0773c /source/blender | |
parent | f24147d4598862a667ebd414e65a6872f78aed69 (diff) |
Fix T57653: Fix T58075: Crash when switching between Edit and Sculpt/Paint modes.
Sculpt (and paint) modes rely on valid evaluated data at their initialization.
Added code to ensure that in `ED_object_mode_toggle()`, when relevant
toggle operator requires it (looks like sculpt/paint should be the only
ones affected, although particle edit may be too...).
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/object/object_modes.c | 14 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_vertex.c | 4 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 2 |
3 files changed, 15 insertions, 5 deletions
diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c index ee075a94d29..10c7fcfeba1 100644 --- a/source/blender/editors/object/object_modes.c +++ b/source/blender/editors/object/object_modes.c @@ -35,10 +35,11 @@ #include "BLI_utildefines.h" #include "BKE_context.h" +#include "BKE_layer.h" #include "BKE_object.h" #include "BKE_paint.h" #include "BKE_report.h" -#include "BKE_layer.h" +#include "BKE_scene.h" #include "WM_api.h" #include "WM_types.h" @@ -161,7 +162,16 @@ void ED_object_mode_toggle(bContext *C, eObjectMode mode) const char *opstring = object_mode_op_string(mode); if (opstring) { - WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL); + wmOperatorType *ot = WM_operatortype_find(opstring, false); + if (ot->flag & OPTYPE_USE_EVAL_DATA) { + /* We need to force refresh of depsgraph after undo step, + * redoing the operator *may* rely on some valid evaluated data. */ + struct Main *bmain = CTX_data_main(C); + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_scene_view_layer_graph_evaluated_ensure(bmain, scene, view_layer); + } + WM_operator_name_call_ptr(C, ot, WM_OP_EXEC_REGION_WIN, NULL); } } } diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index a604bd5feb6..9d078d4fea2 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1320,7 +1320,7 @@ void PAINT_OT_weight_paint_toggle(wmOperatorType *ot) ot->poll = paint_poll_test; /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA; } /* ************ weight paint operator ********** */ @@ -2450,7 +2450,7 @@ void PAINT_OT_vertex_paint_toggle(wmOperatorType *ot) ot->poll = paint_poll_test; /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA; } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index a497d555296..ef4f9a9c7bf 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -5859,7 +5859,7 @@ static void SCULPT_OT_sculptmode_toggle(wmOperatorType *ot) ot->exec = sculpt_mode_toggle_exec; ot->poll = ED_operator_object_active_editable_mesh; - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA; } static bool sculpt_and_constant_or_manual_detail_poll(bContext *C) |