conquer3d 0.1.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. conquer3d-0.1.9/LICENSE +21 -0
  2. conquer3d-0.1.9/PKG-INFO +93 -0
  3. conquer3d-0.1.9/README.md +69 -0
  4. conquer3d-0.1.9/conquer3d/_C.pyi +69 -0
  5. conquer3d-0.1.9/conquer3d/_C.so +0 -0
  6. conquer3d-0.1.9/conquer3d/__init__.py +5 -0
  7. conquer3d-0.1.9/conquer3d/csrc/binds/data_structure/bvh.cpp +135 -0
  8. conquer3d-0.1.9/conquer3d/csrc/binds/data_structure/gs_bvh.cpp +353 -0
  9. conquer3d-0.1.9/conquer3d/csrc/binds/data_structure/kdtree.cpp +87 -0
  10. conquer3d-0.1.9/conquer3d/csrc/binds/data_structure/pgs_bvh.cpp +254 -0
  11. conquer3d-0.1.9/conquer3d/csrc/binds/primitive/gs.cpp +156 -0
  12. conquer3d-0.1.9/conquer3d/csrc/binds/primitive/pgs.cpp +63 -0
  13. conquer3d-0.1.9/conquer3d/csrc/data_structure/bvh.cu +372 -0
  14. conquer3d-0.1.9/conquer3d/csrc/data_structure/kdtree.cu +194 -0
  15. conquer3d-0.1.9/conquer3d/csrc/primitive/gs.cu +155 -0
  16. conquer3d-0.1.9/conquer3d/csrc/primitive/gs_aabb.cu +860 -0
  17. conquer3d-0.1.9/conquer3d/csrc/primitive/pgs.cu +103 -0
  18. conquer3d-0.1.9/conquer3d/csrc/primitive/pgs_aabb.cu +464 -0
  19. conquer3d-0.1.9/conquer3d/csrc/pybind.cpp +24 -0
  20. conquer3d-0.1.9/conquer3d/data_structure/__init__.py +8 -0
  21. conquer3d-0.1.9/conquer3d/primitive/__init__.py +0 -0
  22. conquer3d-0.1.9/conquer3d/primitive/gs.py +134 -0
  23. conquer3d-0.1.9/conquer3d/primitive/pgs.py +36 -0
  24. conquer3d-0.1.9/conquer3d.egg-info/PKG-INFO +93 -0
  25. conquer3d-0.1.9/conquer3d.egg-info/SOURCES.txt +30 -0
  26. conquer3d-0.1.9/conquer3d.egg-info/dependency_links.txt +1 -0
  27. conquer3d-0.1.9/conquer3d.egg-info/not-zip-safe +1 -0
  28. conquer3d-0.1.9/conquer3d.egg-info/requires.txt +10 -0
  29. conquer3d-0.1.9/conquer3d.egg-info/top_level.txt +1 -0
  30. conquer3d-0.1.9/pyproject.toml +64 -0
  31. conquer3d-0.1.9/setup.cfg +4 -0
  32. conquer3d-0.1.9/setup.py +137 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Do Hoang Khoi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,93 @@
1
+ Metadata-Version: 2.4
2
+ Name: conquer3d
3
+ Version: 0.1.9
4
+ Summary: Geometric Cuda Tool Box
5
+ Author-email: Do Hoang Khoi <khoido8899@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/KhoiDOO/conquer3d
8
+ Project-URL: Repository, https://github.com/KhoiDOO/conquer3d.git
9
+ Project-URL: Documentation, https://github.com/KhoiDOO/conquer3d#readme
10
+ Project-URL: Issues, https://github.com/KhoiDOO/conquer3d/issues
11
+ Keywords: geometry
12
+ Requires-Python: >=3.10
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: torch>=2.0.0
16
+ Provides-Extra: cuda
17
+ Requires-Dist: cuda-toolkit==12.8.2; extra == "cuda"
18
+ Provides-Extra: dev
19
+ Requires-Dist: pytest>=7.0; extra == "dev"
20
+ Requires-Dist: black>=23.0; extra == "dev"
21
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
22
+ Requires-Dist: mypy>=1.0; extra == "dev"
23
+ Dynamic: license-file
24
+
25
+ # Conquer3D
26
+
27
+ # Setup
28
+
29
+ ## Build from source
30
+ ```bash
31
+ git clone https://github.com/KhoiDOO/geocutool.git
32
+ pip install pybind11-stubgen
33
+
34
+ # then
35
+ cd geocutool
36
+ pip install -e . --no-build-isolation
37
+
38
+ # or
39
+ pip install pybind11-stubgen
40
+ pip install git+https://github.com/KhoiDOO/geocutool.git --no-build-isolation
41
+ ```
42
+
43
+ ## To run notebooks in examples
44
+ ```bash
45
+ conda create -c conda-forge -n geocutool python=3.10 gxx_linux-64=13 gcc_linux-64=13 -y
46
+ conda activate geocutool
47
+
48
+ conda install nvidia::cuda-toolkit==12.8.2 -y
49
+
50
+ pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128
51
+
52
+ pip install pybind11-stubgen
53
+ pip install git+https://github.com/KhoiDOO/geocutool.git --no-build-isolation
54
+
55
+ pip install plotly open3d jupyter trimesh
56
+ ```
57
+
58
+ # Development
59
+ ```bash
60
+ pip install build twine
61
+ python -m build --sdist
62
+ twine upload dist/*
63
+ ```
64
+
65
+ # Reference
66
+
67
+ ## Research Paper
68
+ ```bibtex
69
+ @inproceedings{2383795.2383801,
70
+ author = {Karras, Tero},
71
+ title = {Maximizing parallelism in the construction of BVHs, octrees, and k-d trees},
72
+ year = {2012},
73
+ isbn = {9783905674415},
74
+ publisher = {Eurographics Association},
75
+ address = {Goslar, DEU},
76
+ booktitle = {Proceedings of the Fourth ACM SIGGRAPH / Eurographics Conference on High-Performance Graphics},
77
+ pages = {33–37},
78
+ numpages = {5},
79
+ location = {Paris, France},
80
+ series = {EGGH-HPG'12}
81
+ }
82
+ ```
83
+
84
+ ## Blog Post
85
+ - [Thinking Parallel, Part I: Collision Detection on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-i-collision-detection-gpu/)
86
+ - [Thinking Parallel, Part II: Tree Traversal on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-ii-tree-traversal-gpu/)
87
+ - [Thinking Parallel, Part III: Tree Construction on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-iii-tree-construction-gpu/)
88
+
89
+ ## Repository
90
+ - [cuBQL](https://github.com/NVIDIA/cuBQL)
91
+ - [cudaKDTree](https://github.com/ingowald/cudaKDTree)
92
+ - [Kaolin] (https://github.com/NVIDIAGameWorks/kaolin)
93
+ - [Pytorch3D] (https://github.com/facebookresearch/pytorch3d)
@@ -0,0 +1,69 @@
1
+ # Conquer3D
2
+
3
+ # Setup
4
+
5
+ ## Build from source
6
+ ```bash
7
+ git clone https://github.com/KhoiDOO/geocutool.git
8
+ pip install pybind11-stubgen
9
+
10
+ # then
11
+ cd geocutool
12
+ pip install -e . --no-build-isolation
13
+
14
+ # or
15
+ pip install pybind11-stubgen
16
+ pip install git+https://github.com/KhoiDOO/geocutool.git --no-build-isolation
17
+ ```
18
+
19
+ ## To run notebooks in examples
20
+ ```bash
21
+ conda create -c conda-forge -n geocutool python=3.10 gxx_linux-64=13 gcc_linux-64=13 -y
22
+ conda activate geocutool
23
+
24
+ conda install nvidia::cuda-toolkit==12.8.2 -y
25
+
26
+ pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128
27
+
28
+ pip install pybind11-stubgen
29
+ pip install git+https://github.com/KhoiDOO/geocutool.git --no-build-isolation
30
+
31
+ pip install plotly open3d jupyter trimesh
32
+ ```
33
+
34
+ # Development
35
+ ```bash
36
+ pip install build twine
37
+ python -m build --sdist
38
+ twine upload dist/*
39
+ ```
40
+
41
+ # Reference
42
+
43
+ ## Research Paper
44
+ ```bibtex
45
+ @inproceedings{2383795.2383801,
46
+ author = {Karras, Tero},
47
+ title = {Maximizing parallelism in the construction of BVHs, octrees, and k-d trees},
48
+ year = {2012},
49
+ isbn = {9783905674415},
50
+ publisher = {Eurographics Association},
51
+ address = {Goslar, DEU},
52
+ booktitle = {Proceedings of the Fourth ACM SIGGRAPH / Eurographics Conference on High-Performance Graphics},
53
+ pages = {33–37},
54
+ numpages = {5},
55
+ location = {Paris, France},
56
+ series = {EGGH-HPG'12}
57
+ }
58
+ ```
59
+
60
+ ## Blog Post
61
+ - [Thinking Parallel, Part I: Collision Detection on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-i-collision-detection-gpu/)
62
+ - [Thinking Parallel, Part II: Tree Traversal on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-ii-tree-traversal-gpu/)
63
+ - [Thinking Parallel, Part III: Tree Construction on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-iii-tree-construction-gpu/)
64
+
65
+ ## Repository
66
+ - [cuBQL](https://github.com/NVIDIA/cuBQL)
67
+ - [cudaKDTree](https://github.com/ingowald/cudaKDTree)
68
+ - [Kaolin] (https://github.com/NVIDIAGameWorks/kaolin)
69
+ - [Pytorch3D] (https://github.com/facebookresearch/pytorch3d)
@@ -0,0 +1,69 @@
1
+ """
2
+ Geocutool Python bindings
3
+ """
4
+ from __future__ import annotations
5
+ import torch
6
+ import typing
7
+ __all__: list[str] = ['BVH', 'GSBVH', 'KDTree', 'PGSBVH', 'compute_gs_aabb_func', 'compute_gs_covi_func', 'solve_gs_neighbor_mahalanobis_radius_func', 'solve_pgs_cluster_tangency_radius_func']
8
+ class BVH:
9
+ def __init__(self, in_aabb_mins: torch.Tensor, in_aabb_maxs: torch.Tensor) -> None:
10
+ """
11
+ Construct and build the Karras LBVH from Gaussian AABBs.
12
+ """
13
+ def query(self, query_aabb_mins: torch.Tensor, query_aabb_maxs: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]:
14
+ """
15
+ Query the BVH with bounding boxes or segments. Returns (query_ids, object_ids).
16
+ """
17
+ class GSBVH(BVH):
18
+ def __init__(self, in_aabb_mins: torch.Tensor, in_aabb_maxs: torch.Tensor) -> None:
19
+ """
20
+ Construct and build the Karras LBVH for Gaussians.
21
+ """
22
+ def query_edge(self, edge_starts: torch.Tensor, edge_ends: torch.Tensor, means: torch.Tensor, opacities: torch.Tensor, covis: torch.Tensor, isos: float | torch.Tensor = 11.345) -> tuple[torch.Tensor, torch.Tensor]:
23
+ """
24
+ Find the single highest-density Gaussian intersected by each line segment.
25
+ """
26
+ def query_edge_pair(self, edge_starts: torch.Tensor, edge_ends: torch.Tensor, means: torch.Tensor, covis: torch.Tensor, isos: float | torch.Tensor = 11.345, max_capacity: int = 10000000) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
27
+ """
28
+ Find all Gaussians intersected by each line segment.
29
+ """
30
+ def query_voxel_pair(self, vx_aabb_mins: torch.Tensor, vx_aabb_maxs: torch.Tensor, means: torch.Tensor, covis: torch.Tensor, opacities: torch.Tensor, gs_aabb_mins: torch.Tensor, gs_aabb_maxs: torch.Tensor, contact_points: torch.Tensor, isos: float | torch.Tensor = 11.345, ar_threshold: float = 0.0, p_threshold: float = 0.0, return_centroids: bool = False, max_capacity: int = 10000000) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor | None, torch.Tensor | None]:
31
+ """
32
+ Perform exact Broad-to-Narrow phase intersection between Voxels and Gaussians.
33
+ """
34
+ class KDTree:
35
+ def __init__(self, points: torch.Tensor) -> None:
36
+ """
37
+ Initializes and builds the KDTree on the GPU.
38
+ """
39
+ def query(self, query_points: torch.Tensor, k: int = 1, exclude_self: bool = False) -> tuple[torch.Tensor, torch.Tensor]:
40
+ """
41
+ Queries the KDTree for the K nearest neighbors.
42
+ """
43
+ class PGSBVH(BVH):
44
+ def __init__(self, in_aabb_mins: torch.Tensor, in_aabb_maxs: torch.Tensor) -> None:
45
+ """
46
+ Construct and build the Karras LBVH for Planar Gaussians.
47
+ """
48
+ def query_edge(self, edge_starts: torch.Tensor, edge_ends: torch.Tensor, means: torch.Tensor, normals: torch.Tensor, opacities: torch.Tensor, covis: torch.Tensor, isos: float | torch.Tensor = 11.345) -> tuple[torch.Tensor, torch.Tensor]:
49
+ """
50
+ Find the single highest-density PGS intersected by each line segment.
51
+ """
52
+ def query_voxel_pair(self, vx_aabb_mins: torch.Tensor, vx_aabb_maxs: torch.Tensor, means: torch.Tensor, normals: torch.Tensor, covis: torch.Tensor, gs_aabb_mins: torch.Tensor, gs_aabb_maxs: torch.Tensor, isos: float | torch.Tensor = 11.345, return_centroids: bool = False, return_centroid_densities: bool = False, max_capacity: int = 10000000) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor | None, torch.Tensor | None]:
53
+ """
54
+ Perform exact Broad-to-Narrow phase intersection between Voxels and PGS.
55
+ """
56
+ def compute_gs_aabb_func(means: torch.Tensor, scales: torch.Tensor, covis: torch.Tensor, isos: torch.Tensor | None, iso: float, tol: float, level: int) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
57
+ """
58
+ Compute AABB for 3D Gaussians
59
+ """
60
+ def compute_gs_covi_func(means: torch.Tensor, rotations: torch.Tensor, scales: torch.Tensor, rotnorm: bool, tol: float, level: int) -> torch.Tensor:
61
+ """
62
+ Compute covariance matrices for 3D Gaussians
63
+ """
64
+ def solve_gs_neighbor_mahalanobis_radius_func(means: torch.Tensor, covis: torch.Tensor, k: int) -> torch.Tensor:
65
+ """
66
+ Solve Gaussian Neighbor Mahalanobis Radius
67
+ """
68
+ def solve_pgs_cluster_tangency_radius_func(means: torch.Tensor, normals: torch.Tensor, covis: torch.Tensor, k: int = 16) -> tuple[torch.Tensor, torch.Tensor]:
69
+ ...
Binary file
@@ -0,0 +1,5 @@
1
+ import torch
2
+
3
+ from . import _C
4
+
5
+ __all__ = ['_C']
@@ -0,0 +1,135 @@
1
+ #include <torch/extension.h>
2
+ #include "../../data_structure/bvh.h"
3
+ #include "../../check.h"
4
+
5
+ #include <pybind11/pybind11.h>
6
+ #include <optional>
7
+ #include <vector>
8
+
9
+ namespace py = pybind11;
10
+
11
+ BVH::BVH(
12
+ const torch::Tensor &in_aabb_mins,
13
+ const torch::Tensor &in_aabb_maxs)
14
+ {
15
+ CHECK_INPUT(in_aabb_mins);
16
+ CHECK_INPUT(in_aabb_maxs);
17
+ TORCH_CHECK(in_aabb_mins.scalar_type() == torch::kFloat32, "aabb_mins must be float32");
18
+ TORCH_CHECK(in_aabb_maxs.scalar_type() == torch::kFloat32, "aabb_maxs must be float32");
19
+ TORCH_CHECK(in_aabb_mins.size(1) == 3, "aabb_mins must have shape (N, 3)");
20
+ TORCH_CHECK(in_aabb_maxs.size(1) == 3, "aabb_maxs must have shape (N, 3)");
21
+
22
+ this->num_objects = static_cast<uint32_t>(in_aabb_mins.size(0));
23
+
24
+ if (this->num_objects == 0)
25
+ {
26
+ throw std::runtime_error("Cannot build BVH with 0 objects.");
27
+ }
28
+
29
+ if (this->num_objects == 1)
30
+ {
31
+ this->num_nodes = 1;
32
+
33
+ auto options_int32 = in_aabb_mins.options().dtype(torch::kInt32);
34
+
35
+ // The Root is the only Leaf.
36
+ this->aabb_mins = in_aabb_mins.clone();
37
+ this->aabb_maxs = in_aabb_maxs.clone();
38
+
39
+ // No children (-1 means null pointer)
40
+ this->bvh_children = torch::full({1, 2}, -1, options_int32);
41
+
42
+ // The object ID is just index 0
43
+ this->object_ids = torch::zeros({1}, options_int32);
44
+
45
+ // Bypass the entire Karras CUDA build!
46
+ return;
47
+ }
48
+
49
+ // A Binary Tree with N leaves always has 2N - 1 total nodes!
50
+ this->num_nodes = 2 * this->num_objects - 1;
51
+ auto options = in_aabb_mins.options();
52
+
53
+ // Allocate the full flat arrays
54
+ this->aabb_mins = torch::empty({this->num_nodes, 3}, options);
55
+ this->aabb_maxs = torch::empty({this->num_nodes, 3}, options);
56
+ this->bvh_children = torch::empty({this->num_nodes, 2}, options.dtype(torch::kInt32));
57
+ this->bvh_parents = torch::empty({this->num_nodes}, options.dtype(torch::kInt32));
58
+ this->object_ids = torch::empty({this->num_objects}, options.dtype(torch::kInt32));
59
+
60
+ bvh::build(
61
+ this->num_objects,
62
+ this->num_nodes,
63
+ reinterpret_cast<const float3 *>(in_aabb_mins.data_ptr<float>()),
64
+ reinterpret_cast<const float3 *>(in_aabb_maxs.data_ptr<float>()),
65
+ reinterpret_cast<float3 *>(this->aabb_mins.data_ptr<float>()),
66
+ reinterpret_cast<float3 *>(this->aabb_maxs.data_ptr<float>()),
67
+ reinterpret_cast<int2 *>(this->bvh_children.data_ptr<int>()),
68
+ reinterpret_cast<int *>(this->bvh_parents.data_ptr<int>()),
69
+ reinterpret_cast<int *>(this->object_ids.data_ptr<int>())
70
+ );
71
+ }
72
+
73
+ std::tuple<torch::Tensor, torch::Tensor> BVH::query(
74
+ const torch::Tensor &query_aabb_mins,
75
+ const torch::Tensor &query_aabb_maxs)
76
+ {
77
+ CHECK_INPUT(query_aabb_mins);
78
+ CHECK_INPUT(query_aabb_maxs);
79
+ TORCH_CHECK(query_aabb_mins.scalar_type() == torch::kFloat32, "query_aabb_mins must be float32");
80
+ TORCH_CHECK(query_aabb_maxs.scalar_type() == torch::kFloat32, "query_aabb_maxs must be float32");
81
+ TORCH_CHECK(query_aabb_mins.size(1) == 3, "query_aabb_mins must have shape (M, 3)");
82
+ TORCH_CHECK(query_aabb_maxs.size(1) == 3, "query_aabb_maxs must have shape (M, 3)");
83
+
84
+ const uint32_t num_queries = static_cast<uint32_t>(query_aabb_mins.size(0));
85
+
86
+ auto options_int64 = query_aabb_mins.options().dtype(torch::kInt64);
87
+
88
+ if (num_queries == 0)
89
+ {
90
+ throw std::runtime_error("Cannot query BVH with 0 queries.");
91
+ }
92
+
93
+ torch::Tensor out_query_ids = torch::empty({BVH_MAX_CAPACITY}, options_int64);
94
+ torch::Tensor out_object_ids = torch::empty({BVH_MAX_CAPACITY}, options_int64);
95
+
96
+ torch::Tensor hit_counter = torch::zeros({1}, options_int64);
97
+
98
+ bvh::query(
99
+ num_queries,
100
+ this->num_objects,
101
+ reinterpret_cast<const float3 *>(query_aabb_mins.data_ptr<float>()),
102
+ reinterpret_cast<const float3 *>(query_aabb_maxs.data_ptr<float>()),
103
+ reinterpret_cast<const float3 *>(this->aabb_mins.data_ptr<float>()),
104
+ reinterpret_cast<const float3 *>(this->aabb_maxs.data_ptr<float>()),
105
+ reinterpret_cast<const int2 *>(this->bvh_children.data_ptr<int>()),
106
+ reinterpret_cast<const int *>(this->object_ids.data_ptr<int>()),
107
+ reinterpret_cast<int64_t *>(out_query_ids.data_ptr<int64_t>()),
108
+ reinterpret_cast<int64_t *>(out_object_ids.data_ptr<int64_t>()),
109
+ reinterpret_cast<int64_t *>(hit_counter.data_ptr<int64_t>()),
110
+ static_cast<int64_t>(BVH_MAX_CAPACITY)
111
+ );
112
+
113
+ int64_t num_hits = hit_counter.item<int64_t>();
114
+
115
+ num_hits = std::min(num_hits, static_cast<int64_t>(BVH_MAX_CAPACITY));
116
+
117
+ return std::make_tuple(
118
+ out_query_ids.slice(0, 0, num_hits),
119
+ out_object_ids.slice(0, 0, num_hits)
120
+ );
121
+ }
122
+
123
+ void bind_ds_bvh(py::module &m)
124
+ {
125
+ py::class_<BVH>(m, "BVH")
126
+ .def(py::init<const torch::Tensor &, const torch::Tensor &>(),
127
+ py::arg("in_aabb_mins"),
128
+ py::arg("in_aabb_maxs"),
129
+ "Construct and build the Karras LBVH from Gaussian AABBs.")
130
+
131
+ .def("query", &BVH::query,
132
+ py::arg("query_aabb_mins"),
133
+ py::arg("query_aabb_maxs"),
134
+ "Query the BVH with bounding boxes or segments. Returns (query_ids, object_ids).");
135
+ }