Cleanup: Return Mesh BVH data by value

This commit is contained in:
Hans Goudey
2024-12-17 19:57:36 -05:00
committed by Hans Goudey
parent 625bd70dd7
commit 671fa08e72
6 changed files with 117 additions and 157 deletions

View File

@@ -73,13 +73,12 @@ enum BVHCacheType {
* \param verts_num_active: if >= 0, number of active verts to add to BVH-tree
* (else will be computed from `verts_mask`).
*/
BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data,
Span<float3> vert_positions,
BitSpan verts_mask,
int verts_num_active,
float epsilon,
int tree_type,
int axis);
BVHTreeFromMesh bvhtree_from_mesh_verts_ex(Span<float3> vert_positions,
BitSpan verts_mask,
int verts_num_active,
float epsilon,
int tree_type,
int axis);
/**
* Builds a BVH-tree where nodes are the given edges.
@@ -89,48 +88,40 @@ BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data,
* \param edges_num_active: if >= 0, number of active edges to add to BVH-tree
* (else will be computed from `edges_mask`).
*/
BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data,
Span<float3> vert_positions,
Span<int2> edges,
BitSpan edges_mask,
int edges_num_active,
float epsilon,
int tree_type,
int axis);
BVHTreeFromMesh bvhtree_from_mesh_edges_ex(Span<float3> vert_positions,
Span<int2> edges,
BitSpan edges_mask,
int edges_num_active,
float epsilon,
int tree_type,
int axis);
/**
* Builds a BVH-tree where nodes are the triangle faces (#Mesh::corner_tris()) of the given mesh.
*/
BVHTree *bvhtree_from_mesh_corner_tris_ex(BVHTreeFromMesh *data,
Span<float3> vert_positions,
Span<int> corner_verts,
Span<int3> corner_tris,
BitSpan corner_tris_mask,
int corner_tris_num_active,
float epsilon,
int tree_type,
int axis);
BVHTreeFromMesh bvhtree_from_mesh_corner_tris_ex(Span<float3> vert_positions,
Span<int> corner_verts,
Span<int3> corner_tris,
BitSpan corner_tris_mask,
int corner_tris_num_active,
float epsilon,
int tree_type,
int axis);
/**
* Build a bvh tree from the triangles in the mesh that correspond to the faces in the given mask.
*/
void bvhtree_from_mesh_tris_init(const Mesh &mesh,
const IndexMask &faces_mask,
BVHTreeFromMesh &r_data);
BVHTreeFromMesh bvhtree_from_mesh_tris_init(const Mesh &mesh, const IndexMask &faces_mask);
/**
* Build a bvh tree containing the given edges.
*/
void bvhtree_from_mesh_edges_init(const Mesh &mesh,
const IndexMask &edges_mask,
BVHTreeFromMesh &r_data);
BVHTreeFromMesh bvhtree_from_mesh_edges_init(const Mesh &mesh, const IndexMask &edges_mask);
/**
* Build a bvh tree containing the given vertices.
*/
void bvhtree_from_mesh_verts_init(const Mesh &mesh,
const IndexMask &verts_mask,
BVHTreeFromMesh &r_data);
BVHTreeFromMesh bvhtree_from_mesh_verts_init(const Mesh &mesh, const IndexMask &verts_mask);
/**
* Math functions used by callbacks
@@ -152,9 +143,8 @@ struct BVHTreeFromPointCloud {
const float (*coords)[3];
};
void bvhtree_from_pointcloud_get(const PointCloud &pointcloud,
const IndexMask &points_mask,
BVHTreeFromPointCloud &r_data);
BVHTreeFromPointCloud bvhtree_from_pointcloud_get(const PointCloud &pointcloud,
const IndexMask &points_mask);
void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data);

View File

@@ -452,28 +452,23 @@ static std::unique_ptr<BVHTree, BVHTreeDeleter> bvhtree_from_mesh_verts_create_t
return tree;
}
BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data,
const Span<float3> vert_positions,
const BitSpan verts_mask,
int verts_num_active,
float epsilon,
int tree_type,
int axis)
BVHTreeFromMesh bvhtree_from_mesh_verts_ex(const Span<float3> vert_positions,
const BitSpan verts_mask,
int verts_num_active,
float epsilon,
int tree_type,
int axis)
{
std::unique_ptr<BVHTree, BVHTreeDeleter> tree = bvhtree_from_mesh_verts_create_tree(
epsilon, tree_type, axis, vert_positions, verts_mask, verts_num_active);
bvhtree_balance(tree.get());
if (data) {
/* Setup BVHTreeFromMesh */
*data = bvhtree_from_mesh_setup_data(
tree.get(), BVHTREE_FROM_VERTS, vert_positions, {}, {}, {}, {});
}
data->owned_tree = std::move(tree);
data->tree = data->owned_tree.get();
return data->owned_tree.get();
BVHTreeFromMesh data = bvhtree_from_mesh_setup_data(
tree.get(), BVHTREE_FROM_VERTS, vert_positions, {}, {}, {}, {});
data.owned_tree = std::move(tree);
data.tree = data.owned_tree.get();
return data;
}
/** \} */
@@ -511,29 +506,24 @@ static std::unique_ptr<BVHTree, BVHTreeDeleter> bvhtree_from_mesh_edges_create_t
return tree;
}
BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data,
const Span<float3> vert_positions,
const Span<int2> edges,
const BitSpan edges_mask,
int edges_num_active,
float epsilon,
int tree_type,
int axis)
BVHTreeFromMesh bvhtree_from_mesh_edges_ex(const Span<float3> vert_positions,
const Span<int2> edges,
const BitSpan edges_mask,
int edges_num_active,
float epsilon,
int tree_type,
int axis)
{
std::unique_ptr<BVHTree, BVHTreeDeleter> tree = bvhtree_from_mesh_edges_create_tree(
vert_positions, edges, edges_mask, edges_num_active, epsilon, tree_type, axis);
bvhtree_balance(tree.get());
if (data) {
/* Setup BVHTreeFromMesh */
*data = bvhtree_from_mesh_setup_data(
tree.get(), BVHTREE_FROM_EDGES, vert_positions, edges, {}, {}, {});
}
data->owned_tree = std::move(tree);
data->tree = data->owned_tree.get();
return data->owned_tree.get();
BVHTreeFromMesh data = bvhtree_from_mesh_setup_data(
tree.get(), BVHTREE_FROM_EDGES, vert_positions, edges, {}, {}, {});
data.owned_tree = std::move(tree);
data.tree = data.owned_tree.get();
return data;
}
/** \} */
@@ -621,15 +611,14 @@ static std::unique_ptr<BVHTree, BVHTreeDeleter> bvhtree_from_mesh_corner_tris_cr
return tree;
}
BVHTree *bvhtree_from_mesh_corner_tris_ex(BVHTreeFromMesh *data,
const Span<float3> vert_positions,
const Span<int> corner_verts,
const Span<int3> corner_tris,
const BitSpan corner_tris_mask,
int corner_tris_num_active,
float epsilon,
int tree_type,
int axis)
BVHTreeFromMesh bvhtree_from_mesh_corner_tris_ex(const Span<float3> vert_positions,
const Span<int> corner_verts,
const Span<int3> corner_tris,
const BitSpan corner_tris_mask,
int corner_tris_num_active,
float epsilon,
int tree_type,
int axis)
{
std::unique_ptr<BVHTree, BVHTreeDeleter> tree = bvhtree_from_mesh_corner_tris_create_tree(
epsilon,
@@ -643,20 +632,16 @@ BVHTree *bvhtree_from_mesh_corner_tris_ex(BVHTreeFromMesh *data,
bvhtree_balance(tree.get());
if (data) {
/* Setup BVHTreeFromMesh */
*data = bvhtree_from_mesh_setup_data(tree.get(),
BVHTREE_FROM_CORNER_TRIS,
vert_positions,
{},
corner_verts,
corner_tris,
nullptr);
}
data->owned_tree = std::move(tree);
data->tree = data->owned_tree.get();
return data->owned_tree.get();
BVHTreeFromMesh data = bvhtree_from_mesh_setup_data(tree.get(),
BVHTREE_FROM_CORNER_TRIS,
vert_positions,
{},
corner_verts,
corner_tris,
nullptr);
data.owned_tree = std::move(tree);
data.tree = data.owned_tree.get();
return data;
}
static BitVector<> loose_verts_no_hidden_mask_get(const Mesh &mesh, int *r_elem_active_len)
@@ -963,14 +948,10 @@ blender::bke::BVHTreeFromMesh Mesh::bvh_corner_tris() const
namespace blender::bke {
void bvhtree_from_mesh_tris_init(const Mesh &mesh,
const IndexMask &faces_mask,
BVHTreeFromMesh &r_data)
BVHTreeFromMesh bvhtree_from_mesh_tris_init(const Mesh &mesh, const IndexMask &faces_mask)
{
if (faces_mask.size() == mesh.faces_num) {
/* Can use cache if all faces are in the bvh tree. */
r_data = mesh.bvh_corner_tris();
return;
return mesh.bvh_corner_tris();
}
const Span<float3> positions = mesh.vert_positions();
@@ -978,7 +959,7 @@ void bvhtree_from_mesh_tris_init(const Mesh &mesh,
const Span<int> corner_verts = mesh.corner_verts();
const OffsetIndices faces = mesh.faces();
const Span<int3> corner_tris = mesh.corner_tris();
r_data = bvhtree_from_mesh_setup_data(
BVHTreeFromMesh data = bvhtree_from_mesh_setup_data(
nullptr, BVHTREE_FROM_CORNER_TRIS, positions, edges, corner_verts, corner_tris, nullptr);
int tris_num = 0;
@@ -989,7 +970,7 @@ void bvhtree_from_mesh_tris_init(const Mesh &mesh,
std::unique_ptr<BVHTree, BVHTreeDeleter> tree = bvhtree_new_common(
0.0f, 2, 6, tris_num, active_num);
if (tree == nullptr) {
return;
return {};
}
faces_mask.foreach_index([&](const int face_i) {
@@ -1005,30 +986,27 @@ void bvhtree_from_mesh_tris_init(const Mesh &mesh,
});
BLI_bvhtree_balance(tree.get());
r_data.owned_tree = std::move(tree);
r_data.tree = r_data.owned_tree.get();
data.owned_tree = std::move(tree);
data.tree = data.owned_tree.get();
return data;
}
void bvhtree_from_mesh_edges_init(const Mesh &mesh,
const IndexMask &edges_mask,
BVHTreeFromMesh &r_data)
BVHTreeFromMesh bvhtree_from_mesh_edges_init(const Mesh &mesh, const IndexMask &edges_mask)
{
if (edges_mask.size() == mesh.edges_num) {
/* Can use cache if all edges are in the bvh tree. */
r_data = mesh.bvh_edges();
return;
return mesh.bvh_edges();
}
const Span<float3> positions = mesh.vert_positions();
const Span<int2> edges = mesh.edges();
r_data = bvhtree_from_mesh_setup_data(
BVHTreeFromMesh data = bvhtree_from_mesh_setup_data(
nullptr, BVHTREE_FROM_EDGES, positions, edges, {}, {}, nullptr);
int active_num = -1;
std::unique_ptr<BVHTree, BVHTreeDeleter> tree = bvhtree_new_common(
0.0f, 2, 6, edges_mask.size(), active_num);
if (tree == nullptr) {
return;
return {};
}
edges_mask.foreach_index([&](const int edge_i) {
@@ -1040,29 +1018,26 @@ void bvhtree_from_mesh_edges_init(const Mesh &mesh,
});
BLI_bvhtree_balance(tree.get());
r_data.owned_tree = std::move(tree);
r_data.tree = r_data.owned_tree.get();
data.owned_tree = std::move(tree);
data.tree = data.owned_tree.get();
return data;
}
void bvhtree_from_mesh_verts_init(const Mesh &mesh,
const IndexMask &verts_mask,
BVHTreeFromMesh &r_data)
BVHTreeFromMesh bvhtree_from_mesh_verts_init(const Mesh &mesh, const IndexMask &verts_mask)
{
if (verts_mask.size() == mesh.verts_num) {
/* Can use cache if all vertices are in the bvh tree. */
r_data = mesh.bvh_verts();
return;
return mesh.bvh_verts();
}
const Span<float3> positions = mesh.vert_positions();
r_data = bvhtree_from_mesh_setup_data(
BVHTreeFromMesh data = bvhtree_from_mesh_setup_data(
nullptr, BVHTREE_FROM_VERTS, positions, {}, {}, {}, nullptr);
int active_num = -1;
std::unique_ptr<BVHTree, BVHTreeDeleter> tree = bvhtree_new_common(
0.0f, 2, 6, verts_mask.size(), active_num);
if (tree == nullptr) {
return;
return {};
}
verts_mask.foreach_index([&](const int vert_i) {
@@ -1071,8 +1046,9 @@ void bvhtree_from_mesh_verts_init(const Mesh &mesh,
});
BLI_bvhtree_balance(tree.get());
r_data.owned_tree = std::move(tree);
r_data.tree = r_data.owned_tree.get();
data.owned_tree = std::move(tree);
data.tree = data.owned_tree.get();
return data;
}
/** \} */
@@ -1081,15 +1057,13 @@ void bvhtree_from_mesh_verts_init(const Mesh &mesh,
/** \name Point Cloud BVH Building
* \{ */
void bvhtree_from_pointcloud_get(const PointCloud &pointcloud,
const blender::IndexMask &points_mask,
BVHTreeFromPointCloud &r_data)
BVHTreeFromPointCloud bvhtree_from_pointcloud_get(const PointCloud &pointcloud,
const IndexMask &points_mask)
{
int active_num = -1;
BVHTree *tree = bvhtree_new_common(0.0f, 2, 6, points_mask.size(), active_num).release();
r_data.tree = tree;
if (!tree) {
return;
return {};
}
const Span<float3> positions = pointcloud.positions();
@@ -1097,9 +1071,11 @@ void bvhtree_from_pointcloud_get(const PointCloud &pointcloud,
BLI_bvhtree_balance(tree);
r_data.coords = (const float(*)[3])positions.data();
r_data.tree = tree;
r_data.nearest_callback = nullptr;
BVHTreeFromPointCloud data{};
data.tree = tree;
data.nearest_callback = nullptr;
data.coords = (const float(*)[3])positions.data();
return data;
}
void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data)

View File

@@ -1424,8 +1424,8 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode,
}
}
}
blender::bke::bvhtree_from_mesh_verts_ex(
&treedata[tindex], positions_src, verts_active, num_verts_active, 0.0, 2, 6);
treedata[tindex] = blender::bke::bvhtree_from_mesh_verts_ex(
positions_src, verts_active, num_verts_active, 0.0, 2, 6);
}
}
else {
@@ -1449,15 +1449,14 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode,
corner_tris_num_active++;
}
}
blender::bke::bvhtree_from_mesh_corner_tris_ex(&treedata[tindex],
positions_src,
corner_verts_src,
corner_tris_src,
corner_tris_active,
corner_tris_num_active,
0.0,
2,
6);
treedata[tindex] = blender::bke::bvhtree_from_mesh_corner_tris_ex(positions_src,
corner_verts_src,
corner_tris_src,
corner_tris_active,
corner_tris_num_active,
0.0,
2,
6);
}
}
else {

View File

@@ -129,8 +129,8 @@ class ProximityFunction : public mf::MultiFunction {
if (group_mask.is_empty()) {
continue;
}
bke::BVHTreeFromPointCloud &bvh = bvh_trees_[group_i].pointcloud_bvh;
bke::bvhtree_from_pointcloud_get(pointcloud, group_mask, bvh);
bvh_trees_[group_i].pointcloud_bvh = bke::bvhtree_from_pointcloud_get(pointcloud,
group_mask);
}
},
threading::individual_task_sizes(
@@ -163,20 +163,16 @@ class ProximityFunction : public mf::MultiFunction {
if (group_mask.is_empty()) {
continue;
}
bke::BVHTreeFromMesh &bvh = bvh_trees_[group_i].mesh_bvh;
switch (type_) {
case GEO_NODE_PROX_TARGET_POINTS: {
bke::bvhtree_from_mesh_verts_init(mesh, group_mask, bvh);
case GEO_NODE_PROX_TARGET_POINTS:
bvh_trees_[group_i].mesh_bvh = bke::bvhtree_from_mesh_verts_init(mesh, group_mask);
break;
}
case GEO_NODE_PROX_TARGET_EDGES: {
bke::bvhtree_from_mesh_edges_init(mesh, group_mask, bvh);
case GEO_NODE_PROX_TARGET_EDGES:
bvh_trees_[group_i].mesh_bvh = bke::bvhtree_from_mesh_edges_init(mesh, group_mask);
break;
}
case GEO_NODE_PROX_TARGET_FACES: {
bke::bvhtree_from_mesh_tris_init(mesh, group_mask, bvh);
case GEO_NODE_PROX_TARGET_FACES:
bvh_trees_[group_i].mesh_bvh = bke::bvhtree_from_mesh_tris_init(mesh, group_mask);
break;
}
}
}
},

View File

@@ -80,8 +80,8 @@ static void get_closest_pointcloud_points(const PointCloud &pointcloud,
BLI_assert(positions.size() >= r_indices.size());
BLI_assert(pointcloud.totpoint > 0);
bke::BVHTreeFromPointCloud tree_data;
bke::bvhtree_from_pointcloud_get(pointcloud, IndexMask(pointcloud.totpoint), tree_data);
bke::BVHTreeFromPointCloud tree_data = bke::bvhtree_from_pointcloud_get(
pointcloud, IndexMask(pointcloud.totpoint));
if (tree_data.tree == nullptr) {
r_indices.fill(0);
r_distances_sq.fill(0.0f);

View File

@@ -122,8 +122,7 @@ class SampleNearestSurfaceFunction : public mf::MultiFunction {
[&](const IndexRange range) {
for (const int group_i : range) {
const IndexMask &group_mask = group_masks[group_i];
bke::BVHTreeFromMesh &bvh = bvh_trees_[group_i];
bke::bvhtree_from_mesh_tris_init(mesh, group_mask, bvh);
bvh_trees_[group_i] = bke::bvhtree_from_mesh_tris_init(mesh, group_mask);
}
},
threading::individual_task_sizes(