[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