From 7ec59cc7b700952fdbddfbb44a55977e0bf3bcb6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 3 Apr 2020 21:47:56 +1100 Subject: Cleanup: split ED_mesh_mirror_*_table into multiple functions Spatial & topology mirror table each used a single function taking a char as an identifier. Split these into begin/end/lookup functions. --- source/blender/editors/mesh/mesh_mirror.c | 102 +++++++++++++++--------------- 1 file changed, 50 insertions(+), 52 deletions(-) (limited to 'source/blender/editors/mesh/mesh_mirror.c') diff --git a/source/blender/editors/mesh/mesh_mirror.c b/source/blender/editors/mesh/mesh_mirror.c index a4243c13940..0bbc8b0df76 100644 --- a/source/blender/editors/mesh/mesh_mirror.c +++ b/source/blender/editors/mesh/mesh_mirror.c @@ -44,73 +44,71 @@ static struct { void *tree; } MirrKdStore = {NULL}; -/* mode is 's' start, or 'e' end, or 'u' use */ -/* if end, ob can be NULL */ -int ED_mesh_mirror_spatial_table( - Object *ob, BMEditMesh *em, Mesh *me_eval, const float co[3], char mode) +void ED_mesh_mirror_spatial_table_begin(Object *ob, BMEditMesh *em, Mesh *me_eval) { - if (mode == 'u') { /* use table */ - if (MirrKdStore.tree == NULL) { - ED_mesh_mirror_spatial_table(ob, em, me_eval, NULL, 's'); - } - - if (MirrKdStore.tree) { - KDTreeNearest_3d nearest; - const int i = BLI_kdtree_3d_find_nearest(MirrKdStore.tree, co, &nearest); + Mesh *me = ob->data; + const bool use_em = (!me_eval && em && me->edit_mesh == em); + const int totvert = use_em ? em->bm->totvert : me_eval ? me_eval->totvert : me->totvert; - if (i != -1) { - if (nearest.dist < KD_THRESH) { - return i; - } - } - } - return -1; + if (MirrKdStore.tree) { /* happens when entering this call without ending it */ + ED_mesh_mirror_spatial_table_end(ob); } - else if (mode == 's') { /* start table */ - Mesh *me = ob->data; - const bool use_em = (!me_eval && em && me->edit_mesh == em); - const int totvert = use_em ? em->bm->totvert : me_eval ? me_eval->totvert : me->totvert; - - if (MirrKdStore.tree) { /* happens when entering this call without ending it */ - ED_mesh_mirror_spatial_table(ob, em, me_eval, co, 'e'); - } - MirrKdStore.tree = BLI_kdtree_3d_new(totvert); + MirrKdStore.tree = BLI_kdtree_3d_new(totvert); - if (use_em) { - BMVert *eve; - BMIter iter; - int i; + if (use_em) { + BMVert *eve; + BMIter iter; + int i; - /* this needs to be valid for index lookups later (callers need) */ - BM_mesh_elem_table_ensure(em->bm, BM_VERT); + /* this needs to be valid for index lookups later (callers need) */ + BM_mesh_elem_table_ensure(em->bm, BM_VERT); - BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) { - BLI_kdtree_3d_insert(MirrKdStore.tree, i, eve->co); - } + BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) { + BLI_kdtree_3d_insert(MirrKdStore.tree, i, eve->co); } - else { - MVert *mvert = me_eval ? me_eval->mvert : me->mvert; - int i; + } + else { + MVert *mvert = me_eval ? me_eval->mvert : me->mvert; + int i; - for (i = 0; i < totvert; i++, mvert++) { - BLI_kdtree_3d_insert(MirrKdStore.tree, i, mvert->co); - } + for (i = 0; i < totvert; i++, mvert++) { + BLI_kdtree_3d_insert(MirrKdStore.tree, i, mvert->co); } + } + + BLI_kdtree_3d_balance(MirrKdStore.tree); +} - BLI_kdtree_3d_balance(MirrKdStore.tree); +int ED_mesh_mirror_spatial_table_lookup(Object *ob, + BMEditMesh *em, + Mesh *me_eval, + const float co[3]) +{ + if (MirrKdStore.tree == NULL) { + ED_mesh_mirror_spatial_table_begin(ob, em, me_eval); } - else if (mode == 'e') { /* end table */ - if (MirrKdStore.tree) { - BLI_kdtree_3d_free(MirrKdStore.tree); - MirrKdStore.tree = NULL; + + if (MirrKdStore.tree) { + KDTreeNearest_3d nearest; + const int i = BLI_kdtree_3d_find_nearest(MirrKdStore.tree, co, &nearest); + + if (i != -1) { + if (nearest.dist < KD_THRESH) { + return i; + } } } - else { - BLI_assert(0); - } + return -1; +} - return 0; +void ED_mesh_mirror_spatial_table_end(Object *UNUSED(ob)) +{ + /* TODO: store this in object/object-data (keep unused argument for now). */ + if (MirrKdStore.tree) { + BLI_kdtree_3d_free(MirrKdStore.tree); + MirrKdStore.tree = NULL; + } } /** \} */ -- cgit v1.2.3