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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to