Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2020-04-03 13:47:56 +0300
committerCampbell Barton <ideasman42@gmail.com>2020-04-03 13:52:13 +0300
commit7ec59cc7b700952fdbddfbb44a55977e0bf3bcb6 (patch)
treee96541ccf39d82f79cf9d76792c7fdbbc0e8ae56 /source/blender/editors/mesh/mesh_mirror.c
parentb5253159b6113e1f54297ebe06322191b483996e (diff)
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.
Diffstat (limited to 'source/blender/editors/mesh/mesh_mirror.c')
-rw-r--r--source/blender/editors/mesh/mesh_mirror.c102
1 files changed, 50 insertions, 52 deletions
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;
+ }
}
/** \} */