diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-05-06 22:04:37 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-05-06 22:04:37 +0400 |
commit | 3d9d26d6bf6058e0f6af4bdf7305a01b3da702c2 (patch) | |
tree | 771549cc5d95c15929f8ba07c8e28c2646c3d360 /source | |
parent | ffed654ff2a1349b735026aafde6f8937a4a3f15 (diff) |
fix [#31197] Limited dissolve leaves faces/edges/verts behind
bad bug where vertices could be in a face more then once (which isn't allowed), now check for this when creating a face.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.c | 13 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_private.h | 1 |
2 files changed, 14 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 0169caa8f61..684237b79c5 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -214,6 +214,9 @@ BMFace *BM_face_create_ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, i BLI_array_append(verts, v); BLI_array_append(edges2, e); + /* we only flag the verts to check if they are in the face more then once */ + BM_ELEM_API_FLAG_ENABLE(v, _FLAG_MV); + do { e2 = bmesh_disk_edge_next(e2, v); if (e2 != e && BM_ELEM_API_FLAG_TEST(e2, _FLAG_MF)) { @@ -269,6 +272,12 @@ BMFace *BM_face_create_ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, i if (!edges2[i]) { goto err; } + + /* check if vert is in face more then once. if the flag is disabled. we've already visited */ + if (!BM_ELEM_API_FLAG_TEST(verts[i], _FLAG_MV)) { + goto err; + } + BM_ELEM_API_FLAG_DISABLE(verts[i], _FLAG_MV); } f = BM_face_create(bm, verts, edges2, len, nodouble); @@ -286,6 +295,10 @@ BMFace *BM_face_create_ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, i err: for (i = 0; i < len; i++) { BM_ELEM_API_FLAG_DISABLE(edges[i], _FLAG_MF); + /* vert count may != len */ + if (i < BLI_array_count(verts)) { + BM_ELEM_API_FLAG_DISABLE(verts[i], _FLAG_MV); + } } BLI_array_free(verts); diff --git a/source/blender/bmesh/intern/bmesh_private.h b/source/blender/bmesh/intern/bmesh_private.h index 23d0a1e3906..0827901f5c2 100644 --- a/source/blender/bmesh/intern/bmesh_private.h +++ b/source/blender/bmesh/intern/bmesh_private.h @@ -60,6 +60,7 @@ int bmesh_disk_count(BMVert *v); * on using these internal flags!*/ #define _FLAG_JF 1 /* join faces */ #define _FLAG_MF 2 /* make face */ +#define _FLAG_MV 2 /* make face, vertex */ #define BM_ELEM_API_FLAG_ENABLE(element, f) ((element)->oflags[0].pflag |= (f)) #define BM_ELEM_API_FLAG_DISABLE(element, f) ((element)->oflags[0].pflag &= ~(f)) |