[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57196] trunk/blender/source/blender/bmesh /operators/bmo_subdivide_edgering.c: fix for crash in edgering subd when 3+ disconnected edge rings were found.
Campbell Barton
ideasman42 at gmail.com
Sun Jun 2 19:02:57 CEST 2013
Revision: 57196
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57196
Author: campbellbarton
Date: 2013-06-02 17:02:56 +0000 (Sun, 02 Jun 2013)
Log Message:
-----------
fix for crash in edgering subd when 3+ disconnected edge rings were found.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c
Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c 2013-06-02 15:58:43 UTC (rev 57195)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c 2013-06-02 17:02:56 UTC (rev 57196)
@@ -249,18 +249,19 @@
el_store_other = BLI_ghash_lookup(vert_eloop_gh, v_other);
- BLI_assert(el_store != NULL);
- BLI_assert(el_store_other != NULL);
+ /* in rare cases we cant find a match */
+ if (el_store_other) {
+ pair_test.first = el_store;
+ pair_test.second = el_store_other;
- pair_test.first = el_store;
- pair_test.second = el_store_other;
+ if (pair_test.first > pair_test.second)
+ SWAP(const void *, pair_test.first, pair_test.second);
- if (pair_test.first > pair_test.second)
- SWAP(const void *, pair_test.first, pair_test.second);
+ if (!BLI_ghash_haskey(eloop_pair_gh, &pair_test)) {
+ GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second);
+ BLI_ghash_insert(eloop_pair_gh, pair, NULL);
+ }
- if (!BLI_ghash_haskey(eloop_pair_gh, &pair_test)) {
- GHashPair *pair = BLI_ghashutil_pairalloc(pair_test.first, pair_test.second);
- BLI_ghash_insert(eloop_pair_gh, pair, NULL);
}
}
}
@@ -268,6 +269,11 @@
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;
}
@@ -1151,16 +1157,27 @@
interp_mode, cuts, smooth, falloff_cache);
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 {
GHashIterator gh_iter;
int i;
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);
- LoopPairStore **lpair_arr = BLI_array_alloca(lpair_arr, eloop_pairs_len);
+ if (eloop_pairs_gh == NULL) {
+ 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 */
GHASH_ITER_INDEX (gh_iter, eloop_pairs_gh, i) {
GHashPair *eloop_pair = BLI_ghashIterator_getKey(&gh_iter);
More information about the Bf-blender-cvs
mailing list