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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-05-06 22:04:37 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-05-06 22:04:37 +0400
commit3d9d26d6bf6058e0f6af4bdf7305a01b3da702c2 (patch)
tree771549cc5d95c15929f8ba07c8e28c2646c3d360 /source/blender/bmesh
parentffed654ff2a1349b735026aafde6f8937a4a3f15 (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/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_construct.c13
-rw-r--r--source/blender/bmesh/intern/bmesh_private.h1
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))