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>2014-10-02 22:14:57 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-10-02 22:14:57 +0400
commit86cf53ec9ccc7189f4dbcf5deefe973f22c4731e (patch)
tree7d8e47091c58643b32b8864f68ae0568bbc5f977
parentb28bdfdff0c5484544c5e338e42d4f2121ef7cd3 (diff)
Fix for crash for removing faces that are iterated on
-rw-r--r--source/blender/blenkernel/intern/pbvh_bmesh.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index f1420987c2c..19256c3b19b 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -1189,7 +1189,7 @@ static void pbvh_bmesh_collapse_close_verts(EdgeQueueContext *eq_ctx,
GSet *deleted_verts = BLI_gset_ptr_new_ex("deleted_verts", BLI_heap_size(eq_ctx->q->heap));
while (!BLI_heap_is_empty(eq_ctx->q->heap)) {
- BMFace *f;
+ BMLoop *l;
BMEdge *e;
BMIter bm_iter;
BMVert **pair = BLI_heap_popmin(eq_ctx->q->heap);
@@ -1210,8 +1210,12 @@ static void pbvh_bmesh_collapse_close_verts(EdgeQueueContext *eq_ctx,
* It is possible if an adjacent vertex pair is joined that
* the two vertices already share an edge. Joining the edge rings
* would then be impossible */
- if (BLI_gset_haskey(deleted_verts, v1) || BLI_gset_haskey(deleted_verts, v2) ||
- BM_edge_exists(v1, v2) || BM_vert_is_boundary(v1) || BM_vert_is_boundary(v2)) {
+ if (BLI_gset_haskey(deleted_verts, v1) ||
+ BLI_gset_haskey(deleted_verts, v2) ||
+ BM_edge_exists(v1, v2) ||
+ BM_vert_is_boundary(v1) ||
+ BM_vert_is_boundary(v2))
+ {
continue;
}
@@ -1242,13 +1246,12 @@ static void pbvh_bmesh_collapse_close_verts(EdgeQueueContext *eq_ctx,
#endif
- /* Remove the faces */
- BM_ITER_ELEM (f, &bm_iter, v1, BM_FACES_OF_VERT) {
- pbvh_bmesh_delete_vert_face(bvh, v1, f, deleted_verts, eq_ctx);
+ /* Remove the faces (would use 'BM_FACES_OF_VERT' except we can't look on data we remove) */
+ while ((l = BM_vert_find_first_loop(v1))) {
+ pbvh_bmesh_delete_vert_face(bvh, v1, l->f, deleted_verts, eq_ctx);
}
-
- BM_ITER_ELEM (f, &bm_iter, v2, BM_FACES_OF_VERT) {
- pbvh_bmesh_delete_vert_face(bvh, v2, f, deleted_verts, eq_ctx);
+ while ((l = BM_vert_find_first_loop(v2))) {
+ pbvh_bmesh_delete_vert_face(bvh, v2, l->f, deleted_verts, eq_ctx);
}
if (BM_ELEM_CD_GET_INT(v1, eq_ctx->cd_vert_node_offset) != DYNTOPO_NODE_NONE)