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...).
This commit is contained in:
Bastien Montagne 2018-11-29 10:31:56 +01:00
parent f24147d459
commit 8a92976254
Notes: blender-bot 2023-02-14 05:04:52 +01:00
Referenced by issue #58075, Crash on switching to vertex paint mode after going to the modeling workspace
Referenced by issue #57653, Crash when i switch from edit mode to sculpt mode
3 changed files with 15 additions and 5 deletions

View File

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

View File

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

View File

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