[Bf-blender-cvs] [228f7f1c850] master: Refactor: Deduplicate and simplify BVH Utils code

Germano Cavalcante noreply at git.blender.org
Tue Apr 5 23:15:27 CEST 2022


Commit: 228f7f1c850897cac85b2c4b42cf9052976b7be1
Author: Germano Cavalcante
Date:   Mon Apr 4 17:41:36 2022 -0300
Branches: master
https://developer.blender.org/rB228f7f1c850897cac85b2c4b42cf9052976b7be1

Refactor: Deduplicate and simplify BVH Utils code

In summary the changes are:
- Merge all `bvhtree_from_mesh_*.*_setup_data` in a single utility
- Create `bvhtree_from_editmesh_setup_data`
- Setup data only once in `BKE_bvhtree_from_mesh_get` and `BKE_bvhtree_from_editmesh_get`

Also the behavior of `BKE_bvhtree_from_mesh_get` and
`BKE_bvhtree_from_editmesh_get` changed a bit:
- If a null tree is cached, don't set the `data` to zero. This tree is not an error and the others data can still be used.
- If a null tree is returned, don't set the `data` to zero. Matches the previous change.

Differential Revision: https://developer.blender.org/D14549

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

M	source/blender/blenkernel/intern/bvhutils.cc

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

diff --git a/source/blender/blenkernel/intern/bvhutils.cc b/source/blender/blenkernel/intern/bvhutils.cc
index 01e4eb702cc..1cab5281f0e 100644
--- a/source/blender/blenkernel/intern/bvhutils.cc
+++ b/source/blender/blenkernel/intern/bvhutils.cc
@@ -561,6 +561,103 @@ static void mesh_edges_spherecast(void *userdata,
  * BVH builders
  */
 
+/* -------------------------------------------------------------------- */
+/** \name Commom Utils
+ * \{ */
+
+static void bvhtree_from_mesh_setup_data(BVHTree *tree,
+                                         const BVHCacheType bvh_cache_type,
+                                         const MVert *vert,
+                                         const MEdge *edge,
+                                         const MFace *face,
+                                         const MLoop *loop,
+                                         const MLoopTri *looptri,
+                                         const float (*vert_normals)[3],
+                                         BVHTreeFromMesh *r_data)
+{
+  memset(r_data, 0, sizeof(*r_data));
+
+  r_data->tree = tree;
+
+  r_data->vert = vert;
+  r_data->edge = edge;
+  r_data->face = face;
+  r_data->loop = loop;
+  r_data->looptri = looptri;
+  r_data->vert_normals = vert_normals;
+
+  switch (bvh_cache_type) {
+    case BVHTREE_FROM_VERTS:
+    case BVHTREE_FROM_LOOSEVERTS:
+      /* a nullptr nearest callback works fine
+       * remember the min distance to point is the same as the min distance to BV of point */
+      r_data->nearest_callback = nullptr;
+      r_data->raycast_callback = mesh_verts_spherecast;
+      break;
+
+    case BVHTREE_FROM_EDGES:
+    case BVHTREE_FROM_LOOSEEDGES:
+      r_data->nearest_callback = mesh_edges_nearest_point;
+      r_data->raycast_callback = mesh_edges_spherecast;
+      break;
+    case BVHTREE_FROM_FACES:
+      r_data->nearest_callback = mesh_faces_nearest_point;
+      r_data->raycast_callback = mesh_faces_spherecast;
+      break;
+    case BVHTREE_FROM_LOOPTRI:
+    case BVHTREE_FROM_LOOPTRI_NO_HIDDEN:
+      r_data->nearest_callback = mesh_looptri_nearest_point;
+      r_data->raycast_callback = mesh_looptri_spherecast;
+      break;
+    case BVHTREE_FROM_EM_VERTS:
+    case BVHTREE_FROM_EM_EDGES:
+    case BVHTREE_FROM_EM_LOOPTRI:
+    case BVHTREE_MAX_ITEM:
+      BLI_assert(false);
+      break;
+  }
+}
+
+static void bvhtree_from_editmesh_setup_data(BVHTree *tree,
+                                             const BVHCacheType bvh_cache_type,
+                                             struct BMEditMesh *em,
+                                             BVHTreeFromEditMesh *r_data)
+{
+  memset(r_data, 0, sizeof(*r_data));
+
+  r_data->tree = tree;
+
+  r_data->em = em;
+
+  switch (bvh_cache_type) {
+    case BVHTREE_FROM_EM_VERTS:
+      r_data->nearest_callback = nullptr;
+      r_data->raycast_callback = editmesh_verts_spherecast;
+      break;
+    case BVHTREE_FROM_EM_EDGES:
+      r_data->nearest_callback = nullptr; /* TODO */
+      r_data->raycast_callback = nullptr; /* TODO */
+      break;
+    case BVHTREE_FROM_EM_LOOPTRI:
+      r_data->nearest_callback = editmesh_looptri_nearest_point;
+      r_data->raycast_callback = editmesh_looptri_spherecast;
+      break;
+
+    case BVHTREE_FROM_VERTS:
+    case BVHTREE_FROM_LOOSEVERTS:
+    case BVHTREE_FROM_EDGES:
+    case BVHTREE_FROM_LOOSEEDGES:
+    case BVHTREE_FROM_FACES:
+    case BVHTREE_FROM_LOOPTRI:
+    case BVHTREE_FROM_LOOPTRI_NO_HIDDEN:
+    case BVHTREE_MAX_ITEM:
+      BLI_assert(false);
+      break;
+  }
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Vertex Builder
  * \{ */
@@ -631,26 +728,6 @@ static BVHTree *bvhtree_from_mesh_verts_create_tree(float epsilon,
   return tree;
 }
 
-static void bvhtree_from_mesh_verts_setup_data(BVHTreeFromMesh *data,
-                                               BVHTree *tree,
-                                               const bool is_cached,
-                                               const MVert *vert,
-                                               const bool vert_allocated)
-{
-  memset(data, 0, sizeof(*data));
-
-  data->tree = tree;
-  data->cached = is_cached;
-
-  /* a nullptr nearest callback works fine
-   * remember the min distance to point is the same as the min distance to BV of point */
-  data->nearest_callback = nullptr;
-  data->raycast_callback = mesh_verts_spherecast;
-
-  data->vert = vert;
-  data->vert_allocated = vert_allocated;
-}
-
 BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data,
                                         BMEditMesh *em,
                                         const BLI_bitmap *verts_mask,
@@ -687,12 +764,8 @@ BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data,
     bvhtree_balance(tree, false);
   }
 
-  if (tree) {
-    memset(data, 0, sizeof(*data));
-    data->tree = tree;
-    data->em = em;
-    data->nearest_callback = nullptr;
-    data->raycast_callback = editmesh_verts_spherecast;
+  if (data) {
+    bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_VERTS, em, data);
     data->cached = bvh_cache_p != nullptr;
   }
 
@@ -744,8 +817,13 @@ BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data,
     bvhcache_unlock(*bvh_cache_p, lock_started);
   }
 
-  /* Setup BVHTreeFromMesh */
-  bvhtree_from_mesh_verts_setup_data(data, tree, in_cache, vert, vert_allocated);
+  if (data) {
+    /* Setup BVHTreeFromMesh */
+    bvhtree_from_mesh_setup_data(
+        tree, BVHTREE_FROM_VERTS, vert, nullptr, nullptr, nullptr, nullptr, nullptr, data);
+    data->vert_allocated = vert_allocated;
+    data->cached = in_cache;
+  }
 
   return tree;
 }
@@ -833,29 +911,6 @@ static BVHTree *bvhtree_from_mesh_edges_create_tree(const MVert *vert,
   return tree;
 }
 
-static void bvhtree_from_mesh_edges_setup_data(BVHTreeFromMesh *data,
-                                               BVHTree *tree,
-                                               const bool is_cached,
-                                               const MVert *vert,
-                                               const bool vert_allocated,
-                                               const MEdge *edge,
-                                               const bool edge_allocated)
-{
-  memset(data, 0, sizeof(*data));
-
-  data->tree = tree;
-
-  data->cached = is_cached;
-
-  data->nearest_callback = mesh_edges_nearest_point;
-  data->raycast_callback = mesh_edges_spherecast;
-
-  data->vert = vert;
-  data->vert_allocated = vert_allocated;
-  data->edge = edge;
-  data->edge_allocated = edge_allocated;
-}
-
 BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data,
                                         BMEditMesh *em,
                                         const BLI_bitmap *edges_mask,
@@ -891,12 +946,8 @@ BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data,
     bvhtree_balance(tree, false);
   }
 
-  if (tree) {
-    memset(data, 0, sizeof(*data));
-    data->tree = tree;
-    data->em = em;
-    data->nearest_callback = nullptr; /* TODO */
-    data->raycast_callback = nullptr; /* TODO */
+  if (data) {
+    bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_EDGES, em, data);
     data->cached = bvh_cache_p != nullptr;
   }
 
@@ -954,9 +1005,14 @@ BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data,
     bvhcache_unlock(*bvh_cache_p, lock_started);
   }
 
-  /* Setup BVHTreeFromMesh */
-  bvhtree_from_mesh_edges_setup_data(
-      data, tree, in_cache, vert, vert_allocated, edge, edge_allocated);
+  if (data) {
+    /* Setup BVHTreeFromMesh */
+    bvhtree_from_mesh_setup_data(
+        tree, BVHTREE_FROM_EDGES, vert, edge, nullptr, nullptr, nullptr, nullptr, data);
+    data->vert_allocated = vert_allocated;
+    data->vert_allocated = edge_allocated;
+    data->cached = in_cache;
+  }
 
   return tree;
 }
@@ -1014,28 +1070,6 @@ static BVHTree *bvhtree_from_mesh_faces_create_tree(float epsilon,
   return tree;
 }
 
-static void bvhtree_from_mesh_faces_setup_data(BVHTreeFromMesh *data,
-                                               BVHTree *tree,
-                                               const bool is_cached,
-                                               const MVert *vert,
-                                               const bool vert_allocated,
-                                               const MFace *face,
-                                               const bool face_allocated)
-{
-  memset(data, 0, sizeof(*data));
-
-  data->tree = tree;
-  data->cached = is_cached;
-
-  data->nearest_callback = mesh_faces_nearest_point;
-  data->raycast_callback = mesh_faces_spherecast;
-
-  data->vert = vert;
-  data->vert_allocated = vert_allocated;
-  data->face = face;
-  data->face_allocated = face_allocated;
-}
-
 BVHTree *bvhtree_from_mesh_faces_ex(BVHTreeFromMesh *data,
                                     const MVert *vert,
                                     const bool vert_allocated,
@@ -1076,9 +1110,14 @@ BVHTree *bvhtree_from_mesh_faces_ex(BVHTreeFromMesh *data,
     bvhcache_unlock(*bvh_cache_p, lock_started);
   }
 
-  /* Setup BVHTreeFromMesh */
-  bvhtree_from_mesh_faces_setup_data(
-      data, tree, in_cache, vert, vert_allocated, face, face_allocated);
+  if (data) {
+    /* Setup BVHTreeFromMesh */
+    bvhtree_from_mesh_setup_data(
+        tree, BVHTREE_FROM_FACES, vert, nullptr, face, nullptr, nullptr, nullptr, data);
+    data->vert_allocated = vert_allocated;
+    data->face_allocated = face_allocated;
+    data->cached = in_cache;
+  }
 
   return tree;
 }
@@ -1183,32 +1222,6 @@ static BVHTree *bvhtree_from_mesh_looptri_create_tree(float epsilon,
   return tree;
 }
 
-static void bvhtree_from_mesh_looptri_setup_data(BVHTreeFromMesh *data,
-                                                 BVHTree *tree,
-                                                 const bool is_cached,
-                                                 const MVert *vert,
-                                                 const bool vert_allocated,
-                                                 const MLoop *mloop,
-                                                 co

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list