BMesh: let vert-connect make degenerate faces when only 2 verts selected
This commit is contained in:
parent
bec7c8c7aa
commit
5256a5d66c
Notes:
blender-bot
2023-02-14 11:25:11 +01:00
Referenced by issue #39454, Cuda error on Branched Path Tracing mode. Referenced by issue #39418, Vertex connect doesn't work in some cases
|
@ -875,6 +875,7 @@ static BMOpDefine bmo_connect_verts_def = {
|
|||
"connect_verts",
|
||||
/* slots_in */
|
||||
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
|
||||
{"check_degenerate", BMO_OP_SLOT_BOOL}, /* prevent splits with overlaps & intersections */
|
||||
{{'\0'}},
|
||||
},
|
||||
/* slots_out */
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#define EDGE_OUT 1
|
||||
#define FACE_TAG 2
|
||||
|
||||
static int bm_face_connect_verts(BMesh *bm, BMFace *f)
|
||||
static int bm_face_connect_verts(BMesh *bm, BMFace *f, const bool check_degenerate)
|
||||
{
|
||||
BMLoop *(*loops_split)[2] = BLI_array_alloca(loops_split, f->len);
|
||||
STACK_DECLARE(loops_split);
|
||||
|
@ -82,7 +82,9 @@ static int bm_face_connect_verts(BMesh *bm, BMFace *f)
|
|||
l_pair[1] = loops_split[0][0];
|
||||
}
|
||||
|
||||
BM_face_legal_splits(f, loops_split, STACK_SIZE(loops_split));
|
||||
if (check_degenerate) {
|
||||
BM_face_legal_splits(f, loops_split, STACK_SIZE(loops_split));
|
||||
}
|
||||
|
||||
for (i = 0; i < STACK_SIZE(loops_split); i++) {
|
||||
BMVert **v_pair;
|
||||
|
@ -128,6 +130,7 @@ void bmo_connect_verts_exec(BMesh *bm, BMOperator *op)
|
|||
BMIter iter;
|
||||
BMVert *v;
|
||||
BMFace *f;
|
||||
const bool check_degenerate = BMO_slot_bool_get(op->slots_in, "check_degenerate");
|
||||
BLI_LINKSTACK_DECLARE(faces, BMFace *);
|
||||
|
||||
BLI_LINKSTACK_INIT(faces);
|
||||
|
@ -147,7 +150,7 @@ void bmo_connect_verts_exec(BMesh *bm, BMOperator *op)
|
|||
|
||||
/* connect faces */
|
||||
while ((f = BLI_LINKSTACK_POP(faces))) {
|
||||
if (bm_face_connect_verts(bm, f) == -1) {
|
||||
if (bm_face_connect_verts(bm, f, check_degenerate) == -1) {
|
||||
BMO_error_raise(bm, op, BMERR_CONNECTVERT_FAILED, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -529,6 +529,8 @@ void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
|
|||
|
||||
#if 1
|
||||
if (found_all) {
|
||||
/* leave 'check_degenerate' off, if a user tries to cut with 2 verts,
|
||||
* always connect even when resulting faces are degenerate [#39418] */
|
||||
BMOperator op_sub;
|
||||
BMO_op_initf(bm, &op_sub, 0,
|
||||
"connect_verts verts=%fv", VERT_OUT);
|
||||
|
|
|
@ -887,7 +887,7 @@ static int edbm_vert_connect_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
}
|
||||
else {
|
||||
if (!EDBM_op_init(em, &bmop, op, "connect_verts verts=%hv", BM_ELEM_SELECT)) {
|
||||
if (!EDBM_op_init(em, &bmop, op, "connect_verts verts=%hv check_degenerate=%b", BM_ELEM_SELECT, true)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue