forked from bartvdbraak/blender
fix for crash in grid-fill where it was possible for rail edges to overlap.
This commit is contained in:
parent
a8964d865f
commit
fbf890200c
@ -601,3 +601,24 @@ void BM_edgeloop_expand(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store, int el_sto
|
||||
|
||||
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;
|
||||
|
||||
/* init */
|
||||
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_enable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
|
||||
}
|
||||
|
||||
/* check 'a' */
|
||||
for (node = el_store_a->verts.first; node; node = node->next) {
|
||||
if (BM_elem_flag_test((BMVert *)node->data, BM_ELEM_INTERNAL_TAG)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -57,6 +57,8 @@ void BM_edgeloop_calc_normal(BMesh *bm, struct BMEdgeLoopStore *e
|
||||
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)
|
||||
|
||||
|
@ -423,6 +423,12 @@ void bmo_grid_fill_exec(BMesh *bm, BMOperator *op)
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user