Fix T85436: Separate by loose parts doesn't show new objects

Only the "changed" state from the last edit-object was used,
this meant the operator would not perform the necessary update
with multi-object edit-mode.

Use "changed" & "changed_multi" naming convention.
This commit is contained in:
Campbell Barton 2021-08-03 18:08:10 +10:00 committed by Jeroen Bakker
parent 607e3d3b88
commit a70b625a10
Notes: blender-bot 2023-02-14 10:54:29 +01:00
Referenced by issue #85436, Separate by loose parts weird result.
Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
1 changed files with 13 additions and 11 deletions

View File

@ -4303,7 +4303,7 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
const int type = RNA_enum_get(op->ptr, "type");
int retval = 0;
bool changed_multi = false;
if (ED_operator_editmesh(C)) {
uint bases_len = 0;
@ -4313,6 +4313,7 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
for (uint bs_index = 0; bs_index < bases_len; bs_index++) {
Base *base = bases[bs_index];
BMEditMesh *em = BKE_editmesh_from_object(base->object);
bool changed = false;
if (type == 0) {
if ((em->bm->totvertsel == 0) && (em->bm->totedgesel == 0) && (em->bm->totfacesel == 0)) {
@ -4327,22 +4328,23 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
/* editmode separate */
switch (type) {
case MESH_SEPARATE_SELECTED:
retval = mesh_separate_selected(bmain, scene, view_layer, base, em->bm);
changed = mesh_separate_selected(bmain, scene, view_layer, base, em->bm);
break;
case MESH_SEPARATE_MATERIAL:
retval = mesh_separate_material(bmain, scene, view_layer, base, em->bm);
changed = mesh_separate_material(bmain, scene, view_layer, base, em->bm);
break;
case MESH_SEPARATE_LOOSE:
retval = mesh_separate_loose(bmain, scene, view_layer, base, em->bm);
changed = mesh_separate_loose(bmain, scene, view_layer, base, em->bm);
break;
default:
BLI_assert(0);
break;
}
if (retval) {
if (changed) {
EDBM_update_generic(base->object->data, true, true);
}
changed_multi |= changed;
}
MEM_freeN(bases);
}
@ -4359,7 +4361,7 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
Mesh *me = ob->data;
if (!ID_IS_LINKED(me)) {
BMesh *bm_old = NULL;
int retval_iter = 0;
bool changed = false;
bm_old = BM_mesh_create(&bm_mesh_allocsize_default,
&((struct BMeshCreateParams){
@ -4370,17 +4372,17 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
switch (type) {
case MESH_SEPARATE_MATERIAL:
retval_iter = mesh_separate_material(bmain, scene, view_layer, base_iter, bm_old);
changed = mesh_separate_material(bmain, scene, view_layer, base_iter, bm_old);
break;
case MESH_SEPARATE_LOOSE:
retval_iter = mesh_separate_loose(bmain, scene, view_layer, base_iter, bm_old);
changed = mesh_separate_loose(bmain, scene, view_layer, base_iter, bm_old);
break;
default:
BLI_assert(0);
break;
}
if (retval_iter) {
if (changed) {
BM_mesh_bm_to_me(bmain,
bm_old,
me,
@ -4394,14 +4396,14 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
BM_mesh_free(bm_old);
retval |= retval_iter;
changed_multi |= changed;
}
}
}
CTX_DATA_END;
}
if (retval) {
if (changed_multi) {
/* delay depsgraph recalc until all objects are duplicated */
DEG_relations_tag_update(bmain);
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, NULL);