fix/feature [#35085] Loop cut slide

Loop cut slide now works with multicut.

issue is that since edge slide now supports more configurations, cases where loop-cut-slide silently failed before,
now slide (albeit in an awkward way at times).

Fix this my adjusting the selection of after loopcut so edge slide can properly operate on it.
This commit is contained in:
Campbell Barton
2013-04-26 15:05:19 +00:00
parent 722175e4b9
commit dfc406fc2c
2 changed files with 12 additions and 26 deletions

View File

@@ -1086,10 +1086,12 @@ void bmo_subdivide_edges_exec(BMesh *bm, BMOperator *op)
for (j = 0; j < BLI_array_count(loops_split); j++) {
if (loops_split[j][0]) {
BMFace *f_new;
BLI_assert(BM_edge_exists(loops_split[j][0]->v, loops_split[j][1]->v) == NULL);
/* BMFace *f_new = */ /* UNUSED */
BM_face_split(bm, face, loops_split[j][0]->v, loops_split[j][1]->v, &l_new, NULL, false);
f_new = BM_face_split(bm, face, loops_split[j][0]->v, loops_split[j][1]->v, &l_new, NULL, false);
if (f_new) {
BMO_elem_flag_enable(bm, l_new->e, ELE_INNER);
}
}
}
@@ -1183,28 +1185,8 @@ void BM_mesh_esubdivide(BMesh *bm, const char edge_hflag,
/* deselect input */
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false);
for (ele = BMO_iter_new(&iter, op.slots_out, "geom_inner.out", BM_EDGE | BM_VERT); ele; ele = BMO_iter_step(&iter)) {
BM_elem_select_set(bm, ele, true);
if (ele->head.htype == BM_VERT) {
BMEdge *e;
BMIter eiter;
BM_ITER_ELEM (e, &eiter, ele, BM_EDGES_OF_VERT) {
if (!BM_elem_flag_test(e, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT))
{
BM_edge_select_set(bm, e, true);
}
else if (BM_elem_flag_test(e, BM_ELEM_SELECT) &&
(!BM_elem_flag_test(e->v1, BM_ELEM_SELECT) ||
!BM_elem_flag_test(e->v2, BM_ELEM_SELECT)))
{
BM_edge_select_set(bm, e, false);
}
}
}
for (ele = BMO_iter_new(&iter, op.slots_out, "geom_inner.out", BM_EDGE); ele; ele = BMO_iter_step(&iter)) {
BM_edge_select_set(bm, (BMEdge *)ele, true);
}
}

View File

@@ -299,8 +299,12 @@ static void ringsel_finish(bContext *C, wmOperator *op)
/* tessface is already re-recalculated */
EDBM_update_generic(em, false, true);
/* we cant slide multiple edges in vertex select mode */
if ((cuts > 1) && (em->selectmode & SCE_SELECT_VERTEX)) {
/* dont flush vertex selection when we have multiple cuts, otherwise we can't slide */
}
/* force edge slide to edge select mode in in face select mode */
if (EDBM_selectmode_disable(lcd->vc.scene, em, SCE_SELECT_FACE, SCE_SELECT_EDGE)) {
else if (EDBM_selectmode_disable(lcd->vc.scene, em, SCE_SELECT_FACE, SCE_SELECT_EDGE)) {
/* pass, the change will flush selection */
}
else {