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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
