[Bf-blender-cvs] [7ec59cc7b70] master: Cleanup: split ED_mesh_mirror_*_table into multiple functions

Campbell Barton noreply at git.blender.org
Fri Apr 3 12:52:38 CEST 2020


Commit: 7ec59cc7b700952fdbddfbb44a55977e0bf3bcb6
Author: Campbell Barton
Date:   Fri Apr 3 21:47:56 2020 +1100
Branches: master
https://developer.blender.org/rB7ec59cc7b700952fdbddfbb44a55977e0bf3bcb6

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.

===================================================================

M	source/blender/editors/armature/armature_skinning.c
M	source/blender/editors/include/ED_mesh.h
M	source/blender/editors/mesh/editmesh_utils.c
M	source/blender/editors/mesh/mesh_mirror.c
M	source/blender/editors/mesh/meshtools.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_shapekey.c
M	source/blender/editors/sculpt_paint/paint_vertex.c
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/util/ed_util.c

===================================================================

diff --git a/source/blender/editors/armature/armature_skinning.c b/source/blender/editors/armature/armature_skinning.c
index 87f980db7b9..b637a57f7c0 100644
--- a/source/blender/editors/armature/armature_skinning.c
+++ b/source/blender/editors/armature/armature_skinning.c
@@ -459,7 +459,7 @@ static void add_verts_to_dgroups(ReportList *reports,
   }
 
   /* only generated in some cases but can call anyway */
-  ED_mesh_mirror_spatial_table(ob, NULL, NULL, NULL, 'e');
+  ED_mesh_mirror_spatial_table_end(ob);
 
   /* free the memory allocated */
   MEM_freeN(bonelist);
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 6d3396bb393..7f69bcb25cd 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -450,9 +450,19 @@ int join_mesh_exec(struct bContext *C, struct wmOperator *op);
 int join_mesh_shapes_exec(struct bContext *C, struct wmOperator *op);
 
 /* mirror lookup api */
-int ED_mesh_mirror_spatial_table(
-    struct Object *ob, struct BMEditMesh *em, struct Mesh *me_eval, const float co[3], char mode);
-int ED_mesh_mirror_topo_table(struct Object *ob, struct Mesh *me_eval, char mode);
+/* Spatial Mirror */
+void ED_mesh_mirror_spatial_table_begin(struct Object *ob,
+                                        struct BMEditMesh *em,
+                                        struct Mesh *me_eval);
+void ED_mesh_mirror_spatial_table_end(struct Object *ob);
+int ED_mesh_mirror_spatial_table_lookup(struct Object *ob,
+                                        struct BMEditMesh *em,
+                                        struct Mesh *me_eval,
+                                        const float co[3]);
+
+/* Topology Mirror */
+void ED_mesh_mirror_topo_table_begin(struct Object *ob, struct Mesh *me_eval);
+void ED_mesh_mirror_topo_table_end(struct Object *ob);
 
 /* retrieves mirrored cache vert, or NULL if there isn't one.
  * note: calling this without ensuring the mirror cache state
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index 0bdc9e4e6ea..08976cc46c4 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -406,10 +406,10 @@ void EDBM_mesh_load(Main *bmain, Object *ob)
 void EDBM_mesh_free(BMEditMesh *em)
 {
   /* These tables aren't used yet, so it's not strictly necessary
-   * to 'end' them (with 'e' param) but if someone tries to start
-   * using them, having these in place will save a lot of pain */
-  ED_mesh_mirror_spatial_table(NULL, NULL, NULL, NULL, 'e');
-  ED_mesh_mirror_topo_table(NULL, NULL, 'e');
+   * to 'end' them but if someone tries to start using them,
+   * having these in place will save a lot of pain. */
+  ED_mesh_mirror_spatial_table_end(NULL);
+  ED_mesh_mirror_topo_table_end(NULL);
 
   BKE_editmesh_free(em);
 }
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;
+  }
 }
 
 /** \} */
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 62237b46481..519822dd65c 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -786,53 +786,64 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
 }
 
 /* -------------------------------------------------------------------- */
-/* Mesh Mirror (Topology) */
-
 /** \name Mesh Topology Mirror API
  * \{ */
 
 static MirrTopoStore_t mesh_topo_store = {NULL, -1. - 1, -1};
 
+BLI_INLINE void mesh_mirror_topo_table_get_meshes(Object *ob,
+                                                  Mesh *me_eval,
+                                                  Mesh **r_me_mirror,
+                                                  BMEditMesh **r_em_mirror)
+{
+  Mesh *me_mirror = NULL;
+  BMEditMesh *em_mirror = NULL;
+
+  Mesh *me = ob->data;
+  if (me_eval != NULL) {
+    me_mirror = me_eval;
+  }
+  else if (me->edit_mesh != NULL) {
+    em_mirror = me->edit_mesh;
+  }
+  else {
+    me_mirror = me;
+  }
+
+  *r_me_mirror = me_mirror;
+  *r_em_mirror = em_mirror;
+}
+
 /**
  * Mode is 's' start, or 'e' end, or 'u' use
  * if end, ob can be NULL.
  * \note This is supposed return -1 on error,
  * which callers are currently checking for, but is not used so far.
  */
-int ED_mesh_mirror_topo_table(Object *ob, Mesh *me_eval, char mode)
+void ED_mesh_mirror_topo_table_begin(Object *ob, Mesh *me_eval)
 {
+  Mesh *me_mirror;
+  BMEditMesh *em_mirror;
+  mesh_mirror_topo_table_get_meshes(ob, me_eval, &me_mirror, &em_mirror);
 
-  Mesh *me_mirror = NULL;
-  BMEditMesh *em_mirror = NULL;
+  ED_mesh_mirrtopo_init(em_mirror, me_mirror, &mesh_topo_store, false);
+}
 
-  if (mode != 'e') {
-    Mesh *me = ob->data;
-    if (me_eval != NULL) {
-      me_mirror = me_eval;
-    }
-    else if (me->edit_mesh != NULL) {
-      em_mirror = me->edit_mesh;
-    }
-    else {
-      me_mirror = me;
-    }
-  }
+void ED_mesh_mirror_topo_table_end(Object *UNUSED(ob))
+{
+  /* TODO: store this in object/object-data (keep unused argument for now). */
+  ED_mesh_mirrtopo_free(&mesh_topo_store);
+}
 
-  if (mode == 'u') { /* use table */
-    if (ED_mesh_mirrtopo_recalc_check(em_mirror, me_mirror, &mesh_topo_store)) {
-      ED_mesh_mirror_topo_table(ob, me_eval, 's');
-    }
-  }
-  else if (mode == 's') { /* start table */
-    ED_mesh_mirrtopo_init(em_mirror, me_mirror, &mesh_topo_store, false);
-  }
-  else if (mode == 'e') { /* end table */
-    ED_mesh_mirrtopo_free(&mesh_topo_store);
-  }
-  else {
-    BLI_assert(0);
-  }
+static int ed_mesh_mirror_topo_table_update(Object *ob, Mesh *me_eval)
+{
+  Mesh *me_mirror;
+  BMEditMesh *em_mirror;
+  mesh_mirror_topo_table_get_meshes(ob, me_eval, &me_mirror, &em_mirror);
 
+  if (ED_mesh_mirrtopo_recalc_check(em_mirror, me_mirror, &mesh_topo_store)) {
+    ED_mesh_mirror_topo_table_begin(ob, me_eval);
+  }
   return 0;
 }
 
@@ -849,12 +860,12 @@ static int mesh_get_x_mirror_vert_spatial(Object *ob, Mesh *mesh, int index)
   vec[1] = mvert->co[1];
   vec[2] = mvert->co[2];
 
-  return ED_mesh_mirror_spatial_table(ob, NULL, mesh, vec, 'u');
+  return ED_mesh_mirror_spatial_table_lookup(ob, NULL, mesh, vec);
 }
 
 static int mesh_get_x_mirror_vert_topo(Object *ob, Mesh *mesh, int 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list