[Bf-blender-cvs] [d914cfcb7a0] master: Cleanup: simplify parameters

Germano Cavalcante noreply at git.blender.org
Sun Jan 16 15:26:14 CET 2022


Commit: d914cfcb7a0729260894766eecf523c8e6a4b311
Author: Germano Cavalcante
Date:   Sun Jan 16 11:17:06 2022 -0300
Branches: master
https://developer.blender.org/rBd914cfcb7a0729260894766eecf523c8e6a4b311

Cleanup: simplify parameters

Use a common `userdata` for the different snap callbacks.

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

M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 4e6a229cb70..e96c43e0d02 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -1197,54 +1197,96 @@ static bool snap_bound_box_check_dist(const float min[3],
   return true;
 }
 
-static void cb_mvert_co_get(const int index, const void *user_data, const float **r_co)
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Callbacks
+ * \{ */
+
+struct Nearest2dUserData;
+
+typedef void (*Nearest2DGetVertCoCallback)(const int index,
+                                           const struct Nearest2dUserData *data,
+                                           const float **r_co);
+typedef void (*Nearest2DGetEdgeVertsCallback)(const int index,
+                                              const struct Nearest2dUserData *data,
+                                              int r_v_index[2]);
+typedef void (*Nearest2DGetTriVertsCallback)(const int index,
+                                             const struct Nearest2dUserData *data,
+                                             int r_v_index[3]);
+/* Equal the previous one */
+typedef void (*Nearest2DGetTriEdgesCallback)(const int index,
+                                             const struct Nearest2dUserData *data,
+                                             int r_e_index[3]);
+typedef void (*Nearest2DCopyVertNoCallback)(const int index,
+                                            const struct Nearest2dUserData *data,
+                                            float r_no[3]);
+
+typedef struct Nearest2dUserData {
+  Nearest2DGetVertCoCallback get_vert_co;
+  Nearest2DGetEdgeVertsCallback get_edge_verts_index;
+  Nearest2DGetTriVertsCallback get_tri_verts_index;
+  Nearest2DGetTriEdgesCallback get_tri_edges_index;
+  Nearest2DCopyVertNoCallback copy_vert_no;
+
+  union {
+    struct {
+      struct BMesh *bm;
+    };
+    struct {
+      const struct MVert *vert;
+      const float (*vert_normals)[3];
+      const struct MEdge *edge; /* only used for #BVHTreeFromMeshEdges */
+      const struct MLoop *loop;
+      const struct MLoopTri *looptri;
+    };
+  };
+
+  bool is_persp;
+  bool use_backface_culling;
+} Nearest2dUserData;
+
+static void cb_mvert_co_get(const int index, const Nearest2dUserData *data, const float **r_co)
 {
-  const BVHTreeFromMesh *data = user_data;
   *r_co = data->vert[index].co;
 }
 
-static void cb_bvert_co_get(const int index, const void *user_data, const float **r_co)
+static void cb_bvert_co_get(const int index, const Nearest2dUserData *data, const float **r_co)
 {
-  const BMEditMesh *data = user_data;
   BMVert *eve = BM_vert_at_index(data->bm, index);
   *r_co = eve->co;
 }
 
-static void cb_mvert_no_copy(const int index, const void *user_data, float r_no[3])
+static void cb_mvert_no_copy(const int index, const Nearest2dUserData *data, float r_no[3])
 {
-  const BVHTreeFromMesh *data = user_data;
   copy_v3_v3(r_no, data->vert_normals[index]);
 }
 
-static void cb_bvert_no_copy(const int index, const void *user_data, float r_no[3])
+static void cb_bvert_no_copy(const int index, const Nearest2dUserData *data, float r_no[3])
 {
-  const BMEditMesh *data = user_data;
   BMVert *eve = BM_vert_at_index(data->bm, index);
 
   copy_v3_v3(r_no, eve->no);
 }
 
-static void cb_medge_verts_get(const int index, const void *user_data, int r_v_index[2])
+static void cb_medge_verts_get(const int index, const Nearest2dUserData *data, int r_v_index[2])
 {
-  const BVHTreeFromMesh *data = user_data;
   const MEdge *edge = &data->edge[index];
 
   r_v_index[0] = edge->v1;
   r_v_index[1] = edge->v2;
 }
 
-static void cb_bedge_verts_get(const int index, const void *user_data, int r_v_index[2])
+static void cb_bedge_verts_get(const int index, const Nearest2dUserData *data, int r_v_index[2])
 {
-  const BMEditMesh *data = user_data;
   BMEdge *eed = BM_edge_at_index(data->bm, index);
 
   r_v_index[0] = BM_elem_index_get(eed->v1);
   r_v_index[1] = BM_elem_index_get(eed->v2);
 }
 
-static void cb_mlooptri_edges_get(const int index, const void *user_data, int r_v_index[3])
+static void cb_mlooptri_edges_get(const int index, const Nearest2dUserData *data, int r_v_index[3])
 {
-  const BVHTreeFromMesh *data = user_data;
   const MEdge *medge = data->edge;
   const MLoop *mloop = data->loop;
   const MLoopTri *lt = &data->looptri[index];
@@ -1261,9 +1303,8 @@ static void cb_mlooptri_edges_get(const int index, const void *user_data, int r_
   }
 }
 
-static void cb_mlooptri_verts_get(const int index, const void *user_data, int r_v_index[3])
+static void cb_mlooptri_verts_get(const int index, const Nearest2dUserData *data, int r_v_index[3])
 {
-  const BVHTreeFromMesh *data = user_data;
   const MLoop *loop = data->loop;
   const MLoopTri *looptri = &data->looptri[index];
 
@@ -1332,66 +1373,6 @@ static bool test_projected_edge_dist(const struct DistProjectedAABBPrecalc *prec
       precalc, clip_plane, clip_plane_len, is_persp, near_co, dist_px_sq, r_co);
 }
 
-/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Walk DFS
- * \{ */
-
-typedef void (*Nearest2DGetVertCoCallback)(const int index,
-                                           const void *user_data,
-                                           const float **r_co);
-typedef void (*Nearest2DGetEdgeVertsCallback)(const int index,
-                                              const void *user_data,
-                                              int r_v_index[2]);
-typedef void (*Nearest2DGetTriVertsCallback)(const int index,
-                                             const void *user_data,
-                                             int r_v_index[3]);
-/* Equal the previous one */
-typedef void (*Nearest2DGetTriEdgesCallback)(const int index,
-                                             const void *user_data,
-                                             int r_e_index[3]);
-typedef void (*Nearest2DCopyVertNoCallback)(const int index, const void *user_data, float r_no[3]);
-
-typedef struct Nearest2dUserData {
-  void *userdata;
-  Nearest2DGetVertCoCallback get_vert_co;
-  Nearest2DGetEdgeVertsCallback get_edge_verts_index;
-  Nearest2DGetTriVertsCallback get_tri_verts_index;
-  Nearest2DGetTriEdgesCallback get_tri_edges_index;
-  Nearest2DCopyVertNoCallback copy_vert_no;
-
-  bool is_persp;
-  bool use_backface_culling;
-} Nearest2dUserData;
-
-static void nearest2d_data_init(SnapObjectData *sod,
-                                bool is_persp,
-                                bool use_backface_culling,
-                                Nearest2dUserData *r_nearest2d)
-{
-  if (sod->type == SNAP_MESH) {
-    r_nearest2d->userdata = &sod->treedata_mesh;
-    r_nearest2d->get_vert_co = cb_mvert_co_get;
-    r_nearest2d->get_edge_verts_index = cb_medge_verts_get;
-    r_nearest2d->copy_vert_no = cb_mvert_no_copy;
-    r_nearest2d->get_tri_verts_index = cb_mlooptri_verts_get;
-    r_nearest2d->get_tri_edges_index = cb_mlooptri_edges_get;
-  }
-  else {
-    BLI_assert(sod->type == SNAP_EDIT_MESH);
-    r_nearest2d->userdata = sod->treedata_editmesh.em;
-    r_nearest2d->get_vert_co = cb_bvert_co_get;
-    r_nearest2d->get_edge_verts_index = cb_bedge_verts_get;
-    r_nearest2d->copy_vert_no = cb_bvert_no_copy;
-    r_nearest2d->get_tri_verts_index = NULL;
-    r_nearest2d->get_tri_edges_index = NULL;
-  }
-
-  r_nearest2d->is_persp = is_persp;
-  r_nearest2d->use_backface_culling = use_backface_culling;
-}
-
 static void cb_snap_vert(void *userdata,
                          int index,
                          const struct DistProjectedAABBPrecalc *precalc,
@@ -1399,10 +1380,10 @@ static void cb_snap_vert(void *userdata,
                          const int clip_plane_len,
                          BVHTreeNearest *nearest)
 {
-  struct Nearest2dUserData *data = userdata;
+  Nearest2dUserData *data = userdata;
 
   const float *co;
-  data->get_vert_co(index, data->userdata, &co);
+  data->get_vert_co(index, data, &co);
 
   if (test_projected_vert_dist(precalc,
                                clip_plane,
@@ -1411,7 +1392,7 @@ static void cb_snap_vert(void *userdata,
                                co,
                                &nearest->dist_sq,
                                nearest->co)) {
-    data->copy_vert_no(index, data->userdata, nearest->no);
+    data->copy_vert_no(index, data, nearest->no);
     nearest->index = index;
   }
 }
@@ -1426,11 +1407,11 @@ static void cb_snap_edge(void *userdata,
   struct Nearest2dUserData *data = userdata;
 
   int vindex[2];
-  data->get_edge_verts_index(index, data->userdata, vindex);
+  data->get_edge_verts_index(index, data, vindex);
 
   const float *v_pair[2];
-  data->get_vert_co(vindex[0], data->userdata, &v_pair[0]);
-  data->get_vert_co(vindex[1], data->userdata, &v_pair[1]);
+  data->get_vert_co(vindex[0], data, &v_pair[0]);
+  data->get_vert_co(vindex[1], data, &v_pair[1]);
 
   if (test_projected_edge_dist(precalc,
                                clip_plane,
@@ -1455,7 +1436,7 @@ static void cb_snap_edge_verts(void *userdata,
   struct Nearest2dUserData *data = userdata;
 
   int vindex[2];
-  data->get_edge_verts_index(index, data->userdata, vindex);
+  data->get_edge_verts_index(index, data, vindex);
 
   for (int i = 2; i--;) {
     if (vindex[i] == nearest->index) {
@@ -1472,16 +1453,16 @@ static void cb_snap_tri_edges(void *userdata,
                               const int clip_plane_len,
                               BVHTreeNearest *nearest)
 {
-  struct Nearest2dUserData *data = userdata;
+  Nearest2dUserData *data = userdata;
 
   if (data->use_backface_culling) {
     int vindex[3];
-    data->get_tri_verts_index(index, data->userdata, vindex);
+    data->get_tri_verts_index(index, data, vindex);
 
     const float *t0, *t1, *t2;
-    data->get_vert_co(vindex[0], data->userdata, &t0);
-    data->get_vert_co(vindex[1], data->userdata, &t1);
-    data->get_vert_co(vindex[2], data->userdata, &t2);
+    data->get_vert_co(vindex[0], data, &t0);
+    data->g

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list