fix for crash in edgering subd when 3+ disconnected edge rings were found.

This commit is contained in:
Campbell Barton 2013-06-02 17:02:56 +00:00
parent 7068a5eba7
commit cfd0438d3c

@ -249,9 +249,8 @@ static GHash *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
el_store_other = BLI_ghash_lookup(vert_eloop_gh, v_other); el_store_other = BLI_ghash_lookup(vert_eloop_gh, v_other);
BLI_assert(el_store != NULL); /* in rare cases we cant find a match */
BLI_assert(el_store_other != NULL); if (el_store_other) {
pair_test.first = el_store; pair_test.first = el_store;
pair_test.second = el_store_other; pair_test.second = el_store_other;
@ -262,12 +261,19 @@ static GHash *bm_edgering_pair_calc(BMesh *bm, ListBase *eloops_rim)
GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second); GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second);
BLI_ghash_insert(eloop_pair_gh, pair, NULL); BLI_ghash_insert(eloop_pair_gh, pair, NULL);
} }
}
} }
} }
} }
BLI_ghash_free(vert_eloop_gh, NULL, NULL); BLI_ghash_free(vert_eloop_gh, NULL, NULL);
if (BLI_ghash_size(eloop_pair_gh) == 0) {
BLI_ghash_free(eloop_pair_gh, NULL, NULL);
eloop_pair_gh = NULL;
}
return eloop_pair_gh; return eloop_pair_gh;
} }
@ -1151,15 +1157,26 @@ void bmo_subdivide_edgering_exec(BMesh *bm, BMOperator *op)
interp_mode, cuts, smooth, falloff_cache); interp_mode, cuts, smooth, falloff_cache);
bm_edgering_pair_store_free(lpair, interp_mode); bm_edgering_pair_store_free(lpair, interp_mode);
} }
else {
BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
"Edge-ring pair isn't connected");
goto cleanup;
}
} }
else { else {
GHashIterator gh_iter; GHashIterator gh_iter;
int i; int i;
GHash *eloop_pairs_gh = bm_edgering_pair_calc(bm, &eloops_rim); GHash *eloop_pairs_gh = bm_edgering_pair_calc(bm, &eloops_rim);
LoopPairStore **lpair_arr;
const int eloop_pairs_len = BLI_ghash_size(eloop_pairs_gh); if (eloop_pairs_gh == NULL) {
LoopPairStore **lpair_arr = BLI_array_alloca(lpair_arr, eloop_pairs_len); BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
"Edge-rings are not connected");
goto cleanup;
}
lpair_arr = BLI_array_alloca(lpair_arr, BLI_ghash_size(eloop_pairs_gh));
/* first cache pairs */ /* first cache pairs */
GHASH_ITER_INDEX (gh_iter, eloop_pairs_gh, i) { GHASH_ITER_INDEX (gh_iter, eloop_pairs_gh, i) {