forked from bartvdbraak/blender
fix for crash in edgering subd when 3+ disconnected edge rings were found.
This commit is contained in:
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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user