Merge branch 'blender-v2.83-release'

This commit is contained in:
Campbell Barton 2020-05-12 14:41:54 +10:00
commit 859eee7e15
Notes: blender-bot 2023-02-14 08:42:53 +01:00
Referenced by issue #76669, Dope Sheet Editor, crash right clicking on a Mask channel
1 changed files with 24 additions and 34 deletions

View File

@ -7081,37 +7081,17 @@ void MESH_OT_wireframe(wmOperatorType *ot)
static int edbm_offset_edgeloop_exec(bContext *C, wmOperator *op)
{
bool mode_change = false;
const bool use_cap_endpoint = RNA_boolean_get(op->ptr, "use_cap_endpoint");
int ret = OPERATOR_CANCELLED;
{
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BKE_editmesh_from_object(obedit);
if (em->selectmode == SCE_SELECT_FACE) {
EDBM_selectmode_to_scene(C);
mode_change = true;
}
}
bool changed_multi = false;
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(
view_layer, CTX_wm_view3d(C), &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *obedit = objects[ob_index];
uint bases_len = 0;
Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(
view_layer, CTX_wm_view3d(C), &bases_len);
for (uint base_index = 0; base_index < bases_len; base_index++) {
Object *obedit = bases[base_index]->object;
BMEditMesh *em = BKE_editmesh_from_object(obedit);
/** If in face-only select mode, switch to edge select mode so that
* an edge-only selection is not inconsistent state.
*
* We need to run this for all objects, even when nothing is selected.
* This way we keep them in sync. */
if (mode_change) {
em->selectmode = SCE_SELECT_EDGE;
EDBM_selectmode_set(em);
}
if (em->bm->totedgesel == 0) {
continue;
}
@ -7131,16 +7111,26 @@ static int edbm_offset_edgeloop_exec(bContext *C, wmOperator *op)
BMO_slot_buffer_hflag_enable(
em->bm, bmop.slots_out, "edges.out", BM_EDGE, BM_ELEM_SELECT, true);
if (!EDBM_op_finish(em, &bmop, op, true)) {
continue;
}
else {
if (EDBM_op_finish(em, &bmop, op, true)) {
EDBM_update_generic(obedit->data, true, true);
ret = OPERATOR_FINISHED;
changed_multi = true;
}
}
MEM_freeN(objects);
return ret;
if (changed_multi) {
/** If in face-only select mode, switch to edge select mode so that
* an edge-only selection is not inconsistent state.
*
* We need to run this for all objects, even when nothing is selected.
* This way we keep them in sync. */
if (scene->toolsettings->selectmode == SCE_SELECT_FACE) {
EDBM_selectmode_disable_multi_ex(scene, bases, bases_len, SCE_SELECT_FACE, SCE_SELECT_EDGE);
}
}
MEM_freeN(bases);
return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void MESH_OT_offset_edge_loops(wmOperatorType *ot)