From 42b68c2b1d56a6121dcf6b0aedadc9beae700616 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 2 Feb 2014 17:41:02 +1100 Subject: BMesh: optimize loop_find_regions, reserve array size --- source/blender/editors/mesh/editmesh_select.c | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'source/blender/editors/mesh') diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index 1944ce84be7..0078dd5ccaf 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -3070,38 +3070,38 @@ static int loop_find_region(BMLoop *l, int flag, static int verg_radial(const void *va, const void *vb) { - BMEdge *e1 = *((void **)va); - BMEdge *e2 = *((void **)vb); + BMEdge *e_a = *((BMEdge **)va); + BMEdge *e_b = *((BMEdge **)vb); + int a, b; + a = BM_edge_face_count(e_a); + b = BM_edge_face_count(e_b); - a = BM_edge_face_count(e1); - b = BM_edge_face_count(e2); - - if (a > b) return -1; - if (a == b) return 0; - if (a < b) return 1; - - return -1; + if (a > b) return -1; + if (a < b) return 1; + return 0; } -static int loop_find_regions(BMEditMesh *em, int selbigger) +static int loop_find_regions(BMEditMesh *em, const bool selbigger) { SmallHash visithash; BMIter iter; - BMEdge *e, **edges = NULL; - BLI_array_declare(edges); + const int edges_len = em->bm->totedgesel; + BMEdge *e, **edges; BMFace *f; int count = 0, i; - BLI_smallhash_init(&visithash); + BLI_smallhash_init_ex(&visithash, edges_len); + edges = MEM_mallocN(sizeof(*edges) * edges_len, __func__); BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) { BM_elem_flag_disable(f, BM_ELEM_TAG); } + i = 0; BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { - BLI_array_append(edges, e); + edges[i++] = e; BM_elem_flag_enable(e, BM_ELEM_TAG); } else { @@ -3110,9 +3110,9 @@ static int loop_find_regions(BMEditMesh *em, int selbigger) } /* sort edges by radial cycle length */ - qsort(edges, BLI_array_count(edges), sizeof(void *), verg_radial); + qsort(edges, edges_len, sizeof(*edges), verg_radial); - for (i = 0; i < BLI_array_count(edges); i++) { + for (i = 0; i < edges_len; i++) { BMIter liter; BMLoop *l; BMFace **region = NULL, **region_out; @@ -3161,7 +3161,7 @@ static int loop_find_regions(BMEditMesh *em, int selbigger) } } - BLI_array_free(edges); + MEM_freeN(edges); BLI_smallhash_release(&visithash); return count; -- cgit v1.2.3