Fix T40162: Vert connect creates extra face cutting across concave NGon.

We need to support cutting degenerate ngons, see: T39418
This commit disallows cuts across faces where the same vertices can create better cuts on different faces.
This commit is contained in:
Campbell Barton 2014-05-13 17:50:11 +10:00
parent 46bd759964
commit dd8a9eee3b
3 changed files with 19 additions and 0 deletions

@ -1104,6 +1104,21 @@ void BM_face_splits_check_legal(BMFace *f, BMLoop *(*loops)[2], int len)
} }
} }
/**
* This simply checks that the verts don't connect faces which would have more optimal splits.
* but _not_ check for correctness.
*/
void BM_face_splits_check_optimal(BMFace *f, BMLoop *(*loops)[2], int len)
{
int i;
for (i = 0; i < len; i++) {
BMLoop *l_a_dummy, *l_b_dummy;
if (f != BM_vert_pair_share_face_by_angle(loops[i][0]->v, loops[i][1]->v, &l_a_dummy, &l_b_dummy, false)) {
loops[i][0] = NULL;
}
}
}
/** /**
* Small utility functions for fast access * Small utility functions for fast access

@ -63,6 +63,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f,
const bool use_tag) ATTR_NONNULL(1, 2); const bool use_tag) ATTR_NONNULL(1, 2);
void BM_face_splits_check_legal(BMFace *f, BMLoop *(*loops)[2], int len) ATTR_NONNULL(); void BM_face_splits_check_legal(BMFace *f, BMLoop *(*loops)[2], int len) ATTR_NONNULL();
void BM_face_splits_check_optimal(BMFace *f, BMLoop *(*loops)[2], int len) ATTR_NONNULL();
void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3]) ATTR_NONNULL(); void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3]) ATTR_NONNULL();
void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4]) ATTR_NONNULL(); void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4]) ATTR_NONNULL();

@ -84,6 +84,9 @@ static int bm_face_connect_verts(BMesh *bm, BMFace *f, const bool check_degenera
if (check_degenerate) { if (check_degenerate) {
BM_face_splits_check_legal(f, loops_split, STACK_SIZE(loops_split)); BM_face_splits_check_legal(f, loops_split, STACK_SIZE(loops_split));
} }
else {
BM_face_splits_check_optimal(f, loops_split, STACK_SIZE(loops_split));
}
for (i = 0; i < STACK_SIZE(loops_split); i++) { for (i = 0; i < STACK_SIZE(loops_split); i++) {
BMVert **v_pair; BMVert **v_pair;