forked from bartvdbraak/blender
Fix T48085: Select linked w/ seam delimit gives random results
This changes behavior so seams aren't used for the bmesh walker.
This commit is contained in:
parent
975a224f12
commit
935998312c
@ -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};
|
struct DelimitData delimit_data = {0};
|
||||||
|
|
||||||
BMIter iter;
|
|
||||||
BMEdge *e;
|
|
||||||
|
|
||||||
if (delimit & BMO_DELIM_UV) {
|
if (delimit & BMO_DELIM_UV) {
|
||||||
delimit_data.cd_loop_type = CD_MLOOPUV;
|
delimit_data.cd_loop_type = CD_MLOOPUV;
|
||||||
delimit_data.cd_loop_offset = CustomData_get_offset(&bm->ldata, delimit_data.cd_loop_type);
|
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 */
|
/* grr, shouldn't need to alloc BMO flags here */
|
||||||
BM_mesh_elem_toolflags_ensure(bm);
|
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);
|
{
|
||||||
}
|
BMIter iter;
|
||||||
}
|
BMEdge *e;
|
||||||
else {
|
|
||||||
/* don't delimit selected edges in vert/edge mode */
|
|
||||||
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
|
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
|
||||||
const bool is_walk_ok = (
|
const bool is_walk_ok = (
|
||||||
BM_elem_flag_test(e, BM_ELEM_SELECT) ||
|
|
||||||
(select_linked_delimit_test(e, delimit, &delimit_data) == false));
|
(select_linked_delimit_test(e, delimit, &delimit_data) == false));
|
||||||
|
|
||||||
BMO_elem_flag_set(bm, e, BMO_ELE_TAG, is_walk_ok);
|
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);
|
select_linked_delimit_validate(bm, &delimit);
|
||||||
|
|
||||||
if (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) {
|
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));
|
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_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_MASK_NOP, delimit ? BMO_ELE_TAG : BMW_MASK_NOP, BMW_MASK_NOP,
|
||||||
BMW_FLAG_TEST_HIDDEN,
|
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) {
|
else if (em->selectmode & SCE_SELECT_EDGE) {
|
||||||
BMEdge *e;
|
BMEdge *e;
|
||||||
|
|
||||||
BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
|
if (delimit) {
|
||||||
BM_elem_flag_set(e, BM_ELEM_TAG, BM_elem_flag_test(e, BM_ELEM_SELECT));
|
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,
|
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);
|
select_linked_delimit_validate(bm, &delimit);
|
||||||
|
|
||||||
if (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 */
|
/* Note: logic closely matches 'edbm_select_linked_exec', keep in sync */
|
||||||
|
Loading…
Reference in New Issue
Block a user