conquer3d 0.8.2__tar.gz → 0.8.4__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.
- {conquer3d-0.8.2/conquer3d.egg-info → conquer3d-0.8.4}/PKG-INFO +2 -2
- {conquer3d-0.8.2 → conquer3d-0.8.4}/README.md +1 -1
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/_C.pyi +120 -20
- conquer3d-0.8.4/conquer3d/_C.so +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/tmesh.py +10 -1
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/mesh_bvh.cpp +12 -6
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/triangle_mesh.cpp +265 -8
- conquer3d-0.8.4/conquer3d/csrc/binds/ops/flood_fill_band.cpp +96 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/bvh_traverse.cuh +9 -1
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/mesh_bvh.cu +50 -35
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/mesh_bvh.h +5 -3
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/triangle_mesh.h +95 -0
- conquer3d-0.8.4/conquer3d/csrc/ops/flood_fill_band.cu +1004 -0
- conquer3d-0.8.4/conquer3d/csrc/ops/flood_fill_band.h +84 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill_cf.cu +0 -45
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill_common.cuh +50 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/pybind.cpp +6 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4/conquer3d.egg-info}/PKG-INFO +2 -2
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/SOURCES.txt +3 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/pyproject.toml +1 -1
- conquer3d-0.8.2/conquer3d/_C.so +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/LICENSE +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/MANIFEST.in +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/grid.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/mesh.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/creation/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/creation/triangle_creation.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/creation/triangle_creation.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/bvh.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/grid.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/gs_bvh.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/kdtree.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/pgs_bvh.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/zcurve.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/chamfer.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/dc.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/dmc.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/flood_fill.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/flood_fill_cf.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mc.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mca.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mt.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mtg.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/volint.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/gs.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/pgs.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/ray.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/superquadric.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/triangle.cpp +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/check.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/constants.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/creation/triangle_creation.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/bvh.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/bvh.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/grid.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/grid.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/gs_bvh.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/kdtree.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/kdtree.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/pgs_bvh.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/triangle_mesh.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/zcurve.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/zcurve.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f2x2.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f3x1.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f3x3.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f3x4.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f4x1.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f4x4.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/maths.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/ops.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/qef.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/chamfer.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/chamfer.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dc.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dc.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dc_data.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dmc.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dmc.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dmc_data.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill_cf.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mc.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mc.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mc_data.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mca.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mca.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mca_data.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mt.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mt.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mt_data.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mtg.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mtg.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mtg_data.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/volint.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/volint.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/voxel_classify.cuh +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/aabb.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/edge.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs_aabb.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs_math.cuh +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs_aabb.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs_math.cuh +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/ray.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/superquadric.cu +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/superquadric.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/triangle.h +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/assets/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/assets/common.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/assets/iphigenia.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/collate/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/collate/mesh.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/collate/sparse_tensor.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/base_mesh.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/digit3d.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/digit3dmv.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/mesh.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/redwood.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/base.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/ops.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/vertex.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/bmesh.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/grid.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/sort.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/obj.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/off.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/ply.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/delaunay_triangulation.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/diff_marching_cubes.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/diff_marching_tetrahedra_grid.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/distance.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/dpsr.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/dual_contouring.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/dual_marching_cubes.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/hermite.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_cubes.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_cubes_asymptotic.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_tetrahedra.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_tetrahedra_grid.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/volint.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/__init__.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/gs.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/pgs.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/sq.py +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/dependency_links.txt +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/not-zip-safe +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/requires.txt +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/top_level.txt +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/setup.cfg +0 -0
- {conquer3d-0.8.2 → conquer3d-0.8.4}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: conquer3d
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.4
|
|
4
4
|
Summary: Geometric Cuda Tool Box
|
|
5
5
|
Author-email: Do Hoang Khoi <khoido8899@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -124,7 +124,7 @@ Every stage of one extraction, from input mesh to extracted surface.
|
|
|
124
124
|
|
|
125
125
|
<img src="docs/assets/img/fig-sign-modes.webp" alt="Sign modes" width="100%">
|
|
126
126
|
|
|
127
|
-
One slice through
|
|
127
|
+
One slice through each of two meshes, signed by all seven ways of deciding inside.
|
|
128
128
|
|
|
129
129
|
### Ray queries
|
|
130
130
|
|
|
@@ -91,7 +91,7 @@ Every stage of one extraction, from input mesh to extracted surface.
|
|
|
91
91
|
|
|
92
92
|
<img src="docs/assets/img/fig-sign-modes.webp" alt="Sign modes" width="100%">
|
|
93
93
|
|
|
94
|
-
One slice through
|
|
94
|
+
One slice through each of two meshes, signed by all seven ways of deciding inside.
|
|
95
95
|
|
|
96
96
|
### Ray queries
|
|
97
97
|
|
|
@@ -4,7 +4,7 @@ Conquer3D Python bindings
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
import torch
|
|
6
6
|
import typing
|
|
7
|
-
__all__: list[str] = ['BVH', 'GSBVH', 'KDTree', 'MeshBVH', 'PGSBVH', 'Ray', 'Triangle', 'TriangleMesh', 'build_sparse_grid_from_active_voxels', 'compute_active_voxels', 'compute_flood_fill', 'compute_flood_fill_cf', 'compute_grid_normal', 'compute_gs_aabb_func', 'compute_gs_covi_func', 'compute_superquadric_mesh_func', 'compute_zcurve', 'create_sphere', 'create_tetrahedra', 'create_voxel_cloud_from_tmesh', 'create_voxel_grid', 'create_voxel_grid_from_tmesh', 'dual_contouring', 'dual_contouring_backward', 'dual_marching_cubes', 'dual_marching_cubes_backward', 'get_active_voxel_ids_from_depth', 'marching_cubes', 'marching_cubes_asymptotic', 'marching_cubes_asymptotic_backward', 'marching_cubes_backward', 'marching_tetrahedra', 'marching_tetrahedra_backward', 'marching_tetrahedra_grid', 'marching_tetrahedra_grid_backward', 'one_sided_chamfer_distance', 'one_sided_chamfer_distance_backward', 'single_view_volume_integral', 'solve_gs_neighbor_mahalanobis_radius_func', 'solve_pgs_cluster_tangency_radius_func']
|
|
7
|
+
__all__: list[str] = ['BVH', 'GSBVH', 'KDTree', 'MeshBVH', 'PGSBVH', 'Ray', 'Triangle', 'TriangleMesh', 'build_sparse_grid_from_active_voxels', 'compute_active_voxels', 'compute_flood_fill', 'compute_flood_fill_band', 'compute_flood_fill_cf', 'compute_grid_normal', 'compute_gs_aabb_func', 'compute_gs_covi_func', 'compute_superquadric_mesh_func', 'compute_zcurve', 'create_sphere', 'create_tetrahedra', 'create_voxel_cloud_from_tmesh', 'create_voxel_grid', 'create_voxel_grid_from_tmesh', 'dual_contouring', 'dual_contouring_backward', 'dual_marching_cubes', 'dual_marching_cubes_backward', 'get_active_voxel_ids_from_depth', 'marching_cubes', 'marching_cubes_asymptotic', 'marching_cubes_asymptotic_backward', 'marching_cubes_backward', 'marching_tetrahedra', 'marching_tetrahedra_backward', 'marching_tetrahedra_grid', 'marching_tetrahedra_grid_backward', 'one_sided_chamfer_distance', 'one_sided_chamfer_distance_backward', 'single_view_volume_integral', 'solve_gs_neighbor_mahalanobis_radius_func', 'solve_pgs_cluster_tangency_radius_func']
|
|
8
8
|
class BVH:
|
|
9
9
|
"""
|
|
10
10
|
|
|
@@ -315,7 +315,7 @@ class MeshBVH(BVH):
|
|
|
315
315
|
triangles (torch.Tensor): (M, 3) int32 mesh triangles on CUDA.
|
|
316
316
|
return_sdf (bool, optional): Return signed distance instead of unsigned. Defaults to False.
|
|
317
317
|
return_prj_pts (bool, optional): Return closest surface projections. Defaults to True.
|
|
318
|
-
sign_mode (int, optional): Sign evaluation method (0: ray parity, 1: Fast Winding Number, 2: angle-weighted pseudonormals, 3: flood-fill mask, 4: hybrid, 5: coarse-to-fine flood fill). Defaults to 0.
|
|
318
|
+
sign_mode (int, optional): Sign evaluation method (0: ray parity, 1: Fast Winding Number, 2: angle-weighted pseudonormals, 3: flood-fill mask, 4: hybrid, 5: coarse-to-fine flood fill, 6: band flood fill that seals small holes). Defaults to 0.
|
|
319
319
|
return_occ (bool, optional): If True, additionally returns binary occupancy defined as
|
|
320
320
|
`distances < 0`. Only active when `return_sdf=True`; with an unsigned distance the
|
|
321
321
|
occupancy slot is returned as None, since unsigned distances carry no inside/outside
|
|
@@ -744,6 +744,37 @@ class TriangleMesh:
|
|
|
744
744
|
"""
|
|
745
745
|
Builds and returns the MeshBVH for the mesh.
|
|
746
746
|
"""
|
|
747
|
+
def build_flood_fill_band_data(self, grid_min: list[float] | None = None, grid_max: list[float] | None = None, res: list[int] | None = None, dilation_radius: int = 2, cavity_max_voxels: int = -1) -> None:
|
|
748
|
+
"""
|
|
749
|
+
Pre-computes the leak-resistant band flood fill used by sign_mode=6.
|
|
750
|
+
|
|
751
|
+
Water floods from the grid boundary and stops at the surface band dilated by
|
|
752
|
+
`dilation_radius` lattice spacings, so holes up to about `2 * dilation_radius + 3` spacings
|
|
753
|
+
across are sealed; small cavities the dilation encloses are released and the band is resolved
|
|
754
|
+
by neighbour agreement. Memory scales with surface area, like sign_mode=5.
|
|
755
|
+
|
|
756
|
+
The wall trades thin detail for leak resistance: solid parts thinner than about
|
|
757
|
+
`2 * dilation_radius + 3` spacings vanish, slots narrower than 3 spacings fill in, and a sealed-off
|
|
758
|
+
pocket holding more than `cavity_max_voxels` free vertices stays interior.
|
|
759
|
+
|
|
760
|
+
Args:
|
|
761
|
+
grid_min (List[float], optional): Lower grid corner [x, y, z]. When either bound is omitted,
|
|
762
|
+
both default to the mesh bounds padded by (r + 3) * E / (res - 1 - 2 * (r + 3)), with E
|
|
763
|
+
the largest extent.
|
|
764
|
+
grid_max (List[float], optional): Upper grid corner [x, y, z].
|
|
765
|
+
res (List[int], optional): Vertices per axis [rx, ry, rz]. Defaults to [128, 128, 128].
|
|
766
|
+
dilation_radius (int, optional): Chebyshev dilation radius in spacings. Defaults to 2.
|
|
767
|
+
cavity_max_voxels (int, optional): Largest interior component, in vertices, released for
|
|
768
|
+
resolution; -1 selects (2 * dilation_radius + 1)^3 and 0 disables the release.
|
|
769
|
+
Defaults to -1.
|
|
770
|
+
|
|
771
|
+
Raises:
|
|
772
|
+
RuntimeError: If explicit bounds leave less than `dilation_radius + 2` spacings between the
|
|
773
|
+
mesh and the grid boundary; the message names the padding required.
|
|
774
|
+
|
|
775
|
+
Example:
|
|
776
|
+
>>> mesh.build_flood_fill_band_data(res=[512, 512, 512])
|
|
777
|
+
"""
|
|
747
778
|
def build_flood_fill_cf_data(self, grid_min: list[float] | None = None, grid_max: list[float] | None = None, res: list[int] | None = None, block_size: list[int] | None = None, connectivity: int = 6) -> None:
|
|
748
779
|
"""
|
|
749
780
|
Pre-computes a 2-level Coarse-to-Fine (CF) volumetric flood-fill structure (< 10 MB VRAM at 1024^3).
|
|
@@ -1085,6 +1116,7 @@ class TriangleMesh:
|
|
|
1085
1116
|
- 3: Volumetric 3D flood-fill mask (dense).
|
|
1086
1117
|
- 4: Hybrid WN + pseudonormals.
|
|
1087
1118
|
- 5: Coarse-to-Fine (CF) Hierarchical Volumetric Flood Fill (< 10 MB VRAM).
|
|
1119
|
+
- 6: Band flood fill that seals small holes (memory like 5).
|
|
1088
1120
|
Defaults to 0.
|
|
1089
1121
|
distance_mode (int, optional): Distance algorithm (0: Ericson closest point, 1: projected normal). Defaults to 0.
|
|
1090
1122
|
return_occ (bool, optional): If True, additionally returns binary occupancy defined as
|
|
@@ -1151,6 +1183,41 @@ class TriangleMesh:
|
|
|
1151
1183
|
>>> pts, tri_ids, normals, _ = mesh.sample_points(5000, return_normals=True)
|
|
1152
1184
|
"""
|
|
1153
1185
|
@property
|
|
1186
|
+
def band_block_lookup(self) -> torch.Tensor:
|
|
1187
|
+
"""
|
|
1188
|
+
Band flood fill int32 coarse-index to band-slot lookup, -1 outside the band.
|
|
1189
|
+
"""
|
|
1190
|
+
@property
|
|
1191
|
+
def band_coarse_mask(self) -> torch.Tensor:
|
|
1192
|
+
"""
|
|
1193
|
+
Band flood fill coarse int8 labels (2 exterior, -1 interior, 1 band block).
|
|
1194
|
+
"""
|
|
1195
|
+
@property
|
|
1196
|
+
def band_fine_masks(self) -> torch.Tensor:
|
|
1197
|
+
"""
|
|
1198
|
+
Band flood fill (N, 8, 8, 8) int8 fine labels (2 exterior, -1 interior).
|
|
1199
|
+
"""
|
|
1200
|
+
@property
|
|
1201
|
+
def band_grid_max(self) -> list[float]:
|
|
1202
|
+
"""
|
|
1203
|
+
Band flood fill grid upper corner.
|
|
1204
|
+
"""
|
|
1205
|
+
@property
|
|
1206
|
+
def band_grid_min(self) -> list[float]:
|
|
1207
|
+
"""
|
|
1208
|
+
Band flood fill grid lower corner.
|
|
1209
|
+
"""
|
|
1210
|
+
@property
|
|
1211
|
+
def band_grid_res(self) -> list[int]:
|
|
1212
|
+
"""
|
|
1213
|
+
Band flood fill grid vertex resolution.
|
|
1214
|
+
"""
|
|
1215
|
+
@property
|
|
1216
|
+
def band_stats(self) -> dict[str, int]:
|
|
1217
|
+
"""
|
|
1218
|
+
Band flood fill build diagnostics: num_band_blocks, flood_rounds, num_released_cavity_voxels, resolution_rounds, num_unresolved_defaulted, bvh_stack_overflows.
|
|
1219
|
+
"""
|
|
1220
|
+
@property
|
|
1154
1221
|
def bvh(self) -> MeshBVH:
|
|
1155
1222
|
"""
|
|
1156
1223
|
The Bounding Volume Hierarchy (MeshBVH) built for this mesh.
|
|
@@ -1369,6 +1436,50 @@ def compute_flood_fill(vertices: torch.Tensor, triangles: torch.Tensor, aabb_min
|
|
|
1369
1436
|
>>> from conquer3d._C import compute_flood_fill
|
|
1370
1437
|
>>> mask = compute_flood_fill(verts, tris, a_mins, a_maxs, children, obj_ids, [-1,-1,-1], [1,1,1], [64,64,64], 6)
|
|
1371
1438
|
"""
|
|
1439
|
+
def compute_flood_fill_band(vertices: torch.Tensor, triangles: torch.Tensor, aabb_mins: torch.Tensor, aabb_maxs: torch.Tensor, bvh_children: torch.Tensor, object_ids: torch.Tensor, grid_min: list[float], grid_max: list[float], grid_res: list[int], dilation_radius: int = 2, cavity_max_voxels: int = -1) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, list[int], list[int], dict[str, int]]:
|
|
1440
|
+
"""
|
|
1441
|
+
Computes the leak-resistant band flood fill used by sign_mode=6.
|
|
1442
|
+
|
|
1443
|
+
Water floods from the grid boundary and stops at a wall of lattice vertices: the corners of
|
|
1444
|
+
every cell a triangle touches, dilated by `dilation_radius` spacings, so holes narrower than
|
|
1445
|
+
the dilation are sealed. Small interior pockets the dilation creates are released and the wall
|
|
1446
|
+
is resolved by neighbour agreement, leaving every vertex exterior or interior. Storage follows
|
|
1447
|
+
compute_flood_fill_cf, so memory scales with surface area rather than volume.
|
|
1448
|
+
|
|
1449
|
+
The wall trades thin detail for leak resistance: solid parts thinner than about
|
|
1450
|
+
`2 * dilation_radius + 3` spacings vanish, slots narrower than 3 spacings fill in, and a sealed-off
|
|
1451
|
+
pocket holding more than `cavity_max_voxels` free vertices stays interior.
|
|
1452
|
+
|
|
1453
|
+
The lattice has `grid_res` vertices per axis spanning [grid_min, grid_max]. The mesh must lie
|
|
1454
|
+
at least `dilation_radius + 2` spacings inside it; otherwise a RuntimeError names the padding
|
|
1455
|
+
required.
|
|
1456
|
+
|
|
1457
|
+
Args:
|
|
1458
|
+
vertices (torch.Tensor): (V, 3) float32 mesh vertices on CUDA.
|
|
1459
|
+
triangles (torch.Tensor): (F, 3) int32 triangle indices on CUDA.
|
|
1460
|
+
aabb_mins (torch.Tensor): (2F-1, 3) float32 BVH node min corners.
|
|
1461
|
+
aabb_maxs (torch.Tensor): (2F-1, 3) float32 BVH node max corners.
|
|
1462
|
+
bvh_children (torch.Tensor): (2F-1, 2) int32 BVH child node indices.
|
|
1463
|
+
object_ids (torch.Tensor): (F,) int32 leaf-to-triangle map.
|
|
1464
|
+
grid_min (List[float]): Lower grid corner [x, y, z].
|
|
1465
|
+
grid_max (List[float]): Upper grid corner [x, y, z].
|
|
1466
|
+
grid_res (List[int]): Vertices per axis [rx, ry, rz].
|
|
1467
|
+
dilation_radius (int, optional): Chebyshev dilation radius in spacings. Defaults to 2.
|
|
1468
|
+
cavity_max_voxels (int, optional): Largest interior component, in vertices, released for
|
|
1469
|
+
resolution; -1 selects (2 * dilation_radius + 1)^3 and 0 disables the release.
|
|
1470
|
+
Defaults to -1.
|
|
1471
|
+
|
|
1472
|
+
Returns:
|
|
1473
|
+
Tuple[Tensor, Tensor, Tensor, Tensor, List[int], List[int], Dict[str, int]]:
|
|
1474
|
+
- coarse_mask (Tensor): (Cx, Cy, Cz) int8 labels: 2 exterior, -1 interior, 1 band block.
|
|
1475
|
+
- band_block_coords (Tensor): (N, 3) int32 coarse coordinates of the band blocks.
|
|
1476
|
+
- band_block_lookup (Tensor): (Cx, Cy, Cz) int32 band slot, -1 elsewhere.
|
|
1477
|
+
- fine_masks (Tensor): (N, 8, 8, 8) int8 labels: 2 exterior, -1 interior.
|
|
1478
|
+
- block_size (List[int]): [8, 8, 8].
|
|
1479
|
+
- coarse_res (List[int]): [Cx, Cy, Cz] = ceil(grid_res / 8).
|
|
1480
|
+
- stats (Dict[str, int]): num_band_blocks, flood_rounds, num_released_cavity_voxels,
|
|
1481
|
+
resolution_rounds, num_unresolved_defaulted, bvh_stack_overflows.
|
|
1482
|
+
"""
|
|
1372
1483
|
def compute_flood_fill_cf(vertices: torch.Tensor, triangles: torch.Tensor, aabb_mins: torch.Tensor, aabb_maxs: torch.Tensor, bvh_children: torch.Tensor, object_ids: torch.Tensor, grid_min: list[float], grid_max: list[float], grid_res: list[int], block_size: list[int] = [], connectivity: int = 6) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, list[int], list[int]]:
|
|
1373
1484
|
"""
|
|
1374
1485
|
Computes a 2-level Coarse-to-Fine (CF) Volumetric Flood Fill on GPU (< 10 MB VRAM at 1024^3).
|
|
@@ -1456,8 +1567,7 @@ def compute_superquadric_mesh_func(scales: torch.Tensor, exponents: torch.Tensor
|
|
|
1456
1567
|
|
|
1457
1568
|
Each primitive is meshed analytically from Barr's parametric form on an
|
|
1458
1569
|
`(resolution, resolution)` grid of angles spaced by approximately equal arc length,
|
|
1459
|
-
|
|
1460
|
-
into one vertex and triangle array by offsetting indices.
|
|
1570
|
+
placed into world space, then packed into one vertex and triangle array.
|
|
1461
1571
|
|
|
1462
1572
|
Args:
|
|
1463
1573
|
scales (torch.Tensor): (K, 3) float32 semi-axes on CUDA, strictly positive.
|
|
@@ -1478,16 +1588,8 @@ def compute_superquadric_mesh_func(scales: torch.Tensor, exponents: torch.Tensor
|
|
|
1478
1588
|
when `return_labels` is False.
|
|
1479
1589
|
|
|
1480
1590
|
Note:
|
|
1481
|
-
The result is a concatenation, not a union:
|
|
1482
|
-
|
|
1483
|
-
another with no shared vertices. Each individual primitive is watertight with
|
|
1484
|
-
Euler characteristic 2.
|
|
1485
|
-
|
|
1486
|
-
Note:
|
|
1487
|
-
The surface is evaluated in float64 and narrowed on write. Near the poles a
|
|
1488
|
-
float32 angle perturbs the cosine by an order of magnitude, and the fractional
|
|
1489
|
-
power turns that into a visible displacement on exactly the sharp corners this
|
|
1490
|
-
tessellation exists to capture.
|
|
1591
|
+
The result is a concatenation, not a union: one closed surface per primitive,
|
|
1592
|
+
self-intersecting wherever two overlap. Each primitive alone is watertight.
|
|
1491
1593
|
|
|
1492
1594
|
Example:
|
|
1493
1595
|
>>> from conquer3d._C import compute_superquadric_mesh_func
|
|
@@ -1903,12 +2005,10 @@ def one_sided_chamfer_distance(query_points: torch.Tensor, reference_points: tor
|
|
|
1903
2005
|
- indices (torch.Tensor): (N,) int64 index of the closest reference point for each query point.
|
|
1904
2006
|
|
|
1905
2007
|
Note:
|
|
1906
|
-
This is the raw kernel entry point
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
prefer :func:`conquer3d.ops.one_sided_chamfer_distance`, which rejects an empty
|
|
1911
|
-
reference cloud outright.
|
|
2008
|
+
This is the raw kernel entry point: it signals empty inputs rather than raising.
|
|
2009
|
+
An empty query cloud yields empty tensors; an empty reference cloud yields +inf
|
|
2010
|
+
distances and -1 indices, which become NaN through any mean or backward pass.
|
|
2011
|
+
Prefer :func:`conquer3d.ops.one_sided_chamfer_distance`, which rejects it.
|
|
1912
2012
|
|
|
1913
2013
|
Example:
|
|
1914
2014
|
>>> import torch
|
|
Binary file
|
|
@@ -45,6 +45,8 @@ def tmesh2voxel(
|
|
|
45
45
|
- 3: Volumetric 3D flood fill mask (dense).
|
|
46
46
|
- 4: Hybrid WN + pseudonormals.
|
|
47
47
|
- 5: Coarse-to-Fine (CF) Hierarchical Volumetric Flood Fill (< 10 MB VRAM).
|
|
48
|
+
- 6: Band flood fill that seals holes narrower than the dilation (memory like 5).
|
|
49
|
+
The mesh must lie at least 4 grid spacings inside `grid_min`/`grid_max`.
|
|
48
50
|
return_occ (bool, optional): If True, additionally returns binary occupancy defined as
|
|
49
51
|
`sdfs < 0`. Points exactly on the surface classify as outside, and occupancy is exactly
|
|
50
52
|
as reliable as the sign produced by `sign_mode`. Defaults to False.
|
|
@@ -76,6 +78,8 @@ def tmesh2voxel(
|
|
|
76
78
|
tm.build_flood_fill_data(grid_min, grid_max, res_list)
|
|
77
79
|
elif sign_mode == 5:
|
|
78
80
|
tm.build_flood_fill_cf_data(grid_min, grid_max, res_list)
|
|
81
|
+
elif sign_mode == 6:
|
|
82
|
+
tm.build_flood_fill_band_data(grid_min, grid_max, res_list)
|
|
79
83
|
if sign_mode in [2, 4]:
|
|
80
84
|
tm.compute_triangle_normals()
|
|
81
85
|
tm.compute_vertex_normals(1)
|
|
@@ -143,6 +147,8 @@ def tmesh2sparse(
|
|
|
143
147
|
- 3: Volumetric flood fill (dense).
|
|
144
148
|
- 4: Hybrid WN + pseudonormals.
|
|
145
149
|
- 5: Coarse-to-Fine (CF) Hierarchical Volumetric Flood Fill (< 10 MB VRAM).
|
|
150
|
+
- 6: Band flood fill that seals holes narrower than the dilation (memory like 5).
|
|
151
|
+
The mesh must lie at least 4 grid spacings inside `grid_min`/`grid_max`.
|
|
146
152
|
pad (int, optional): Voxel layer dilation radius. Defaults to 0 (set `pad=1` for DMC / DC).
|
|
147
153
|
return_normals (bool, optional): If True, returns surface normal vectors. Defaults to False.
|
|
148
154
|
normal_mode (int, optional): Normal mode (0: face normals, 1: vertex normals, 2: displacement vector).
|
|
@@ -211,6 +217,8 @@ def tmesh2sparse(
|
|
|
211
217
|
tm.build_flood_fill_data(grid_min, grid_max, res_list)
|
|
212
218
|
elif sign_mode == 5:
|
|
213
219
|
tm.build_flood_fill_cf_data(grid_min, grid_max, res_list)
|
|
220
|
+
elif sign_mode == 6:
|
|
221
|
+
tm.build_flood_fill_band_data(grid_min, grid_max, res_list)
|
|
214
222
|
if sign_mode in [2, 4]:
|
|
215
223
|
tm.compute_triangle_normals()
|
|
216
224
|
tm.compute_vertex_normals(1)
|
|
@@ -269,7 +277,8 @@ def tmesh2voxelcloud(
|
|
|
269
277
|
chunk_size (int, optional): Chunk size for batch SDF querying. Defaults to 5,000,000.
|
|
270
278
|
device (str, optional): Computation device. Defaults to `'cuda'`.
|
|
271
279
|
show_progress (bool, optional): Whether to display a progress bar. Defaults to True.
|
|
272
|
-
sign_mode (int, optional): Sign evaluation mode (0: Ray casting, 1: FWN, 2: Pseudonormals, 5: CF Flood Fill
|
|
280
|
+
sign_mode (int, optional): Sign evaluation mode (0: Ray casting, 1: FWN, 2: Pseudonormals, 5: CF Flood Fill,
|
|
281
|
+
6: Band Flood Fill).
|
|
273
282
|
return_normals (bool, optional): If True, returns surface normal vectors. Defaults to False.
|
|
274
283
|
normal_mode (int, optional): Normal mode (0: face normals, 1: vertex normals, 2: displacement vector).
|
|
275
284
|
return_occ (bool, optional): If True, additionally returns binary occupancy defined as
|
|
@@ -113,10 +113,11 @@ MeshBVH::query_point(const torch::Tensor &query_points, const torch::Tensor &ver
|
|
|
113
113
|
std::optional<std::vector<int64_t>> cf_block_size,
|
|
114
114
|
std::optional<std::vector<int64_t>> cf_coarse_res, bool return_occ)
|
|
115
115
|
{
|
|
116
|
-
if (sign_mode
|
|
116
|
+
if (sign_mode < 0 || sign_mode > 6)
|
|
117
117
|
{
|
|
118
118
|
throw std::runtime_error("sign_mode must be 0 (ray casting), 1 (fast winding number), 2 (pseudonormals), 3 "
|
|
119
|
-
"(flood fill), 4 (hybrid WN + pseudonormal),
|
|
119
|
+
"(flood fill), 4 (hybrid WN + pseudonormal), 5 (coarse-to-fine flood fill), or 6 "
|
|
120
|
+
"(band flood fill)");
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
if ((sign_mode == 1 || sign_mode == 4) && !this->has_winding_data)
|
|
@@ -214,13 +215,16 @@ MeshBVH::query_point(const torch::Tensor &query_points, const torch::Tensor &ver
|
|
|
214
215
|
(ry > 1) ? (flood_grid_max->at(1) - flood_grid_min->at(1)) / (ry - 1) : 1.0f,
|
|
215
216
|
(rz > 1) ? (flood_grid_max->at(2) - flood_grid_min->at(2)) / (rz - 1) : 1.0f);
|
|
216
217
|
}
|
|
217
|
-
else if (sign_mode == 5)
|
|
218
|
+
else if (sign_mode == 5 || sign_mode == 6)
|
|
218
219
|
{
|
|
219
220
|
if (!cf_coarse_mask.has_value() || !cf_coarse_mask->defined() || !flood_grid_min.has_value() ||
|
|
220
221
|
!flood_grid_max.has_value() || !flood_grid_res.has_value())
|
|
221
222
|
{
|
|
222
|
-
throw std::runtime_error(
|
|
223
|
-
|
|
223
|
+
throw std::runtime_error(sign_mode == 5
|
|
224
|
+
? "For sign_mode == 5 (coarse-to-fine flood fill), CF flood fill data must be "
|
|
225
|
+
"provided or built beforehand."
|
|
226
|
+
: "For sign_mode == 6 (band flood fill), band flood fill data must be "
|
|
227
|
+
"provided or built beforehand.");
|
|
224
228
|
}
|
|
225
229
|
p_cf_coarse_mask = cf_coarse_mask->data_ptr<int8_t>();
|
|
226
230
|
if (cf_boundary_lookup.has_value() && cf_boundary_lookup->defined())
|
|
@@ -235,6 +239,8 @@ MeshBVH::query_point(const torch::Tensor &query_points, const torch::Tensor &ver
|
|
|
235
239
|
int64_t rx = flood_grid_res->at(0);
|
|
236
240
|
int64_t ry = flood_grid_res->at(1);
|
|
237
241
|
int64_t rz = flood_grid_res->at(2);
|
|
242
|
+
// The shared lookup range-checks against the fine grid, so modes 5 and 6 need its dims too.
|
|
243
|
+
f_dims = make_int3(static_cast<int>(rx), static_cast<int>(ry), static_cast<int>(rz));
|
|
238
244
|
f_spacing = make_float3((rx > 1) ? (flood_grid_max->at(0) - flood_grid_min->at(0)) / (rx - 1) : 1.0f,
|
|
239
245
|
(ry > 1) ? (flood_grid_max->at(1) - flood_grid_min->at(1)) / (ry - 1) : 1.0f,
|
|
240
246
|
(rz > 1) ? (flood_grid_max->at(2) - flood_grid_min->at(2)) / (rz - 1) : 1.0f);
|
|
@@ -502,7 +508,7 @@ void bind_ds_mesh_bvh(py::module_ &m)
|
|
|
502
508
|
triangles (torch.Tensor): (M, 3) int32 mesh triangles on CUDA.
|
|
503
509
|
return_sdf (bool, optional): Return signed distance instead of unsigned. Defaults to False.
|
|
504
510
|
return_prj_pts (bool, optional): Return closest surface projections. Defaults to True.
|
|
505
|
-
sign_mode (int, optional): Sign evaluation method (0: ray parity, 1: Fast Winding Number, 2: angle-weighted pseudonormals, 3: flood-fill mask, 4: hybrid, 5: coarse-to-fine flood fill). Defaults to 0.
|
|
511
|
+
sign_mode (int, optional): Sign evaluation method (0: ray parity, 1: Fast Winding Number, 2: angle-weighted pseudonormals, 3: flood-fill mask, 4: hybrid, 5: coarse-to-fine flood fill, 6: band flood fill that seals small holes). Defaults to 0.
|
|
506
512
|
return_occ (bool, optional): If True, additionally returns binary occupancy defined as
|
|
507
513
|
`distances < 0`. Only active when `return_sdf=True`; with an unsigned distance the
|
|
508
514
|
occupancy slot is returned as None, since unsigned distances carry no inside/outside
|