[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