Fix [#37388] Grid fill crashes blender in specific situation.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 11 Nov 2013 14:29:01 +0000 (14:29 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 11 Nov 2013 14:29:01 +0000 (14:29 +0000)
With some geometries, we can have a valid first path, without being able to find a valid second one, added needed check.

source/blender/bmesh/operators/bmo_fill_grid.c

index 4e302a8ff63cd9dbc5402b5766310fc3b609df9d..50d25202f7e6a3b0f9ac236311102010657b7fe3 100644 (file)
@@ -633,7 +633,12 @@ void bmo_grid_fill_exec(BMesh *bm, BMOperator *op)
                goto cleanup;
        }
 
-       BM_mesh_edgeloops_find_path(bm, &eloops_rail, bm_edge_test_rail_cb, (void *)bm, v_a_first, v_b_last);
+       /* We may find a first path, but not a second one! See geometry attached to bug [#37388]. */
+       if (BM_mesh_edgeloops_find_path(bm, &eloops_rail, bm_edge_test_rail_cb, bm, v_a_first, v_b_last) == false) {
+               BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
+                               "Loops are not connected by wire/boundary edges");
+               goto cleanup;
+       }
 
        /* Check flipping by comparing path length */
        estore_rail_a = eloops_rail.first;
@@ -656,7 +661,7 @@ void bmo_grid_fill_exec(BMesh *bm, BMOperator *op)
                BM_edgeloop_free(estore_rail_a);
                estore_rail_a = estore_rail_b;
 
-               /* reverse so these so both are sorted the same way */
+               /* reverse so both are sorted the same way */
                BM_edgeloop_flip(bm, estore_b);
                SWAP(BMVert *, v_b_first, v_b_last);