Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-05-13 11:50:11 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-13 11:56:26 +0400
commitdd8a9eee3b403e91543e358b2ecffd40d3adaa6b (patch)
tree8830034c7f5634e69f528baa4e0cf92ea68e00a7 /source
parent46bd759964cad419a65c38de69770d7a3cb7a836 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.c15
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.h1
-rw-r--r--source/blender/bmesh/operators/bmo_connect.c3
3 files changed, 19 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c
index 32b9d81a223..ed12c641014 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.c
+++ b/source/blender/bmesh/intern/bmesh_polygon.c
@@ -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
diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h
index 7200d47bc15..d903b77ecf8 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.h
+++ b/source/blender/bmesh/intern/bmesh_polygon.h
@@ -63,6 +63,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f,
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_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_quad(BMFace *f, BMVert *r_verts[4]) ATTR_NONNULL();
diff --git a/source/blender/bmesh/operators/bmo_connect.c b/source/blender/bmesh/operators/bmo_connect.c
index f7a14f430e8..0848ae8ef10 100644
--- a/source/blender/bmesh/operators/bmo_connect.c
+++ b/source/blender/bmesh/operators/bmo_connect.c
@@ -84,6 +84,9 @@ static int bm_face_connect_verts(BMesh *bm, BMFace *f, const bool check_degenera
if (check_degenerate) {
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++) {
BMVert **v_pair;