diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-04-18 11:27:15 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-04-18 11:27:15 +0400 |
commit | 9a4aecbcc3312070f03b3e8a450944a1a29b008c (patch) | |
tree | db88046718fa4151cf50d67efcaf9f504cd9f645 | |
parent | 1f01d62d15dc8c588b58f8732d3742b0bac8da22 (diff) |
bmesh: fix own bug in BM_vert_collapse_faces() with option 'kill_degenerate_faces', was removing data as it iterated, would crash in some cases.
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mods.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index 78db5baffd0..71f120c5217 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -545,17 +545,27 @@ BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac, /* ne = BM_edge_exists(tv, tv2); */ /* same as return above */ if (kill_degenerate_faces) { + BLI_array_declare(bad_faces); + BMFace **bad_faces = NULL; + BMIter fiter; BMFace *f; BMVert *verts[2] = {ne->v1, ne->v2}; int i; + for (i = 0; i < 2; i++) { + /* cant kill data we loop on, build a list and remove those */ + BLI_array_empty(bad_faces); BM_ITER(f, &fiter, bm, BM_FACES_OF_VERT, verts[i]) { if (f->len < 3) { - BM_face_kill(bm, f); + BLI_array_append(bad_faces, f); } } + while ((f = BLI_array_pop(bad_faces))) { + BM_face_kill(bm, f); + } } + BLI_array_free(bad_faces); } } |