[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56858] trunk/blender/source/blender/bmesh : fix for crash in grid-fill where it was possible for rail edges to overlap .

Campbell Barton ideasman42 at gmail.com
Thu May 16 17:28:57 CEST 2013


Revision: 56858
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56858
Author:   campbellbarton
Date:     2013-05-16 15:28:57 +0000 (Thu, 16 May 2013)
Log Message:
-----------
fix for crash in grid-fill where it was possible for rail edges to overlap.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c
    trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h
    trunk/blender/source/blender/bmesh/operators/bmo_grid_fill.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c	2013-05-16 15:06:18 UTC (rev 56857)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.c	2013-05-16 15:28:57 UTC (rev 56858)
@@ -601,3 +601,28 @@
 
 	BLI_assert(el_store->len == el_store_len);
 }
+
+bool BM_edgeloop_overlap_check(struct BMEdgeLoopStore *el_store_a, struct BMEdgeLoopStore *el_store_b)
+{
+	LinkData *node;
+
+	/* clear */
+	for (node = el_store_a->verts.first; node; node = node->next) {
+		BM_elem_flag_disable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
+	}
+	for (node = el_store_b->verts.first; node; node = node->next) {
+		BM_elem_flag_disable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
+	}
+
+	/* enable 'a' */
+	for (node = el_store_a->verts.first; node; node = node->next) {
+		BM_elem_flag_enable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
+	}
+	/* check 'b' */
+	for (node = el_store_b->verts.first; node; node = node->next) {
+		if (BM_elem_flag_test((BMVert *)node->data, BM_ELEM_INTERNAL_TAG)) {
+			return true;
+		}
+	}
+	return false;
+}

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h	2013-05-16 15:06:18 UTC (rev 56857)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_edgeloop.h	2013-05-16 15:28:57 UTC (rev 56858)
@@ -57,6 +57,8 @@
 void                BM_edgeloop_flip(BMesh *bm, struct BMEdgeLoopStore *el_store);
 void                BM_edgeloop_expand(BMesh *bm, struct BMEdgeLoopStore *el_store, int el_store_len);
 
+bool                BM_edgeloop_overlap_check(struct BMEdgeLoopStore *el_store_a, struct BMEdgeLoopStore *el_store_b);
+
 #define BM_EDGELOOP_NEXT(el_store, elink) \
 	(elink)->next ? elink->next : (BM_edgeloop_is_closed(el_store) ? BM_edgeloop_verts_get(el_store)->first : NULL)
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_grid_fill.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_grid_fill.c	2013-05-16 15:06:18 UTC (rev 56857)
+++ trunk/blender/source/blender/bmesh/operators/bmo_grid_fill.c	2013-05-16 15:28:57 UTC (rev 56858)
@@ -423,6 +423,12 @@
 		goto cleanup;
 	}
 
+	if (BM_edgeloop_overlap_check(estore_rail_a, estore_rail_b)) {
+		BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
+		                "Connecting edge loops overlap");
+		goto cleanup;
+	}
+
 	/* finally we have all edge loops needed */
 	bm_grid_fill(bm, estore_a, estore_b, estore_rail_a, estore_rail_b,
 	             mat_nr, use_smooth);




More information about the Bf-blender-cvs mailing list