diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-04-25 11:17:13 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-04-25 11:44:11 +0300 |
commit | 935998312c44300385588c466ef31fa9e85d385f (patch) | |
tree | fcf00694640942f11bebc2eff8c21a3f97c590c5 | |
parent | 975a224f12ff43afb34281458a4e1136568d6920 (diff) |
Fix T48085: Select linked w/ seam delimit gives random results
This changes behavior so seams aren't used for the bmesh walker.
-rw-r--r-- | source/blender/editors/mesh/editmesh_select.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index 17250fbfb09..84ae35fae6e 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -2430,13 +2430,10 @@ static void select_linked_delimit_validate(BMesh *bm, int *delimit) } } -static void select_linked_delimit_begin(BMesh *bm, short selectmode, int delimit) +static void select_linked_delimit_begin(BMesh *bm, int delimit) { struct DelimitData delimit_data = {0}; - BMIter iter; - BMEdge *e; - if (delimit & BMO_DELIM_UV) { delimit_data.cd_loop_type = CD_MLOOPUV; delimit_data.cd_loop_offset = CustomData_get_offset(&bm->ldata, delimit_data.cd_loop_type); @@ -2447,19 +2444,13 @@ static void select_linked_delimit_begin(BMesh *bm, short selectmode, int delimit /* grr, shouldn't need to alloc BMO flags here */ BM_mesh_elem_toolflags_ensure(bm); - if (selectmode == SCE_SELECT_FACE) { - BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { - const bool is_walk_ok = ( - (select_linked_delimit_test(e, delimit, &delimit_data) == false)); - BMO_elem_flag_set(bm, e, BMO_ELE_TAG, is_walk_ok); - } - } - else { - /* don't delimit selected edges in vert/edge mode */ + { + BMIter iter; + BMEdge *e; + BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { const bool is_walk_ok = ( - BM_elem_flag_test(e, BM_ELEM_SELECT) || (select_linked_delimit_test(e, delimit, &delimit_data) == false)); BMO_elem_flag_set(bm, e, BMO_ELE_TAG, is_walk_ok); @@ -2491,7 +2482,7 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op) select_linked_delimit_validate(bm, &delimit); if (delimit) { - select_linked_delimit_begin(em->bm, em->selectmode, delimit); + select_linked_delimit_begin(em->bm, delimit); } if (em->selectmode & SCE_SELECT_VERTEX) { @@ -2501,6 +2492,17 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op) BM_elem_flag_set(v, BM_ELEM_TAG, BM_elem_flag_test(v, BM_ELEM_SELECT)); } + /* exclude all delimited verts */ + if (delimit) { + BMEdge *e; + BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) { + if (!BMO_elem_flag_test(bm, e, BMO_ELE_TAG)) { + BM_elem_flag_disable(e->v1, BM_ELEM_TAG); + BM_elem_flag_disable(e->v2, BM_ELEM_TAG); + } + } + } + BMW_init(&walker, em->bm, delimit ? BMW_LOOP_SHELL_WIRE : BMW_VERT_SHELL, BMW_MASK_NOP, delimit ? BMO_ELE_TAG : BMW_MASK_NOP, BMW_MASK_NOP, BMW_FLAG_TEST_HIDDEN, @@ -2546,8 +2548,17 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op) else if (em->selectmode & SCE_SELECT_EDGE) { BMEdge *e; - BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) { - BM_elem_flag_set(e, BM_ELEM_TAG, BM_elem_flag_test(e, BM_ELEM_SELECT)); + if (delimit) { + BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) { + BM_elem_flag_set( + e, BM_ELEM_TAG, + (BM_elem_flag_test(e, BM_ELEM_SELECT) && BMO_elem_flag_test(bm, e, BMO_ELE_TAG))); + } + } + else { + BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) { + BM_elem_flag_set(e, BM_ELEM_TAG, BM_elem_flag_test(e, BM_ELEM_SELECT)); + } } BMW_init(&walker, em->bm, delimit ? BMW_LOOP_SHELL_WIRE : BMW_VERT_SHELL, @@ -2661,7 +2672,7 @@ static void edbm_select_linked_pick_ex(BMEditMesh *em, BMElem *ele, bool sel, in select_linked_delimit_validate(bm, &delimit); if (delimit) { - select_linked_delimit_begin(bm, em->selectmode, delimit); + select_linked_delimit_begin(bm, delimit); } /* Note: logic closely matches 'edbm_select_linked_exec', keep in sync */ |