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.
Files changed (163) hide show
  1. {conquer3d-0.8.2/conquer3d.egg-info → conquer3d-0.8.4}/PKG-INFO +2 -2
  2. {conquer3d-0.8.2 → conquer3d-0.8.4}/README.md +1 -1
  3. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/_C.pyi +120 -20
  4. conquer3d-0.8.4/conquer3d/_C.so +0 -0
  5. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/tmesh.py +10 -1
  6. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/mesh_bvh.cpp +12 -6
  7. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/triangle_mesh.cpp +265 -8
  8. conquer3d-0.8.4/conquer3d/csrc/binds/ops/flood_fill_band.cpp +96 -0
  9. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/bvh_traverse.cuh +9 -1
  10. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/mesh_bvh.cu +50 -35
  11. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/mesh_bvh.h +5 -3
  12. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/triangle_mesh.h +95 -0
  13. conquer3d-0.8.4/conquer3d/csrc/ops/flood_fill_band.cu +1004 -0
  14. conquer3d-0.8.4/conquer3d/csrc/ops/flood_fill_band.h +84 -0
  15. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill_cf.cu +0 -45
  16. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill_common.cuh +50 -0
  17. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/pybind.cpp +6 -0
  18. {conquer3d-0.8.2 → conquer3d-0.8.4/conquer3d.egg-info}/PKG-INFO +2 -2
  19. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/SOURCES.txt +3 -0
  20. {conquer3d-0.8.2 → conquer3d-0.8.4}/pyproject.toml +1 -1
  21. conquer3d-0.8.2/conquer3d/_C.so +0 -0
  22. {conquer3d-0.8.2 → conquer3d-0.8.4}/LICENSE +0 -0
  23. {conquer3d-0.8.2 → conquer3d-0.8.4}/MANIFEST.in +0 -0
  24. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/__init__.py +0 -0
  25. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/__init__.py +0 -0
  26. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/grid.py +0 -0
  27. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/conversion/mesh.py +0 -0
  28. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/creation/__init__.py +0 -0
  29. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/creation/triangle_creation.py +0 -0
  30. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/creation/triangle_creation.cpp +0 -0
  31. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/bvh.cpp +0 -0
  32. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/grid.cpp +0 -0
  33. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/gs_bvh.cpp +0 -0
  34. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/kdtree.cpp +0 -0
  35. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/pgs_bvh.cpp +0 -0
  36. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/data_structure/zcurve.cpp +0 -0
  37. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/chamfer.cpp +0 -0
  38. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/dc.cpp +0 -0
  39. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/dmc.cpp +0 -0
  40. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/flood_fill.cpp +0 -0
  41. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/flood_fill_cf.cpp +0 -0
  42. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mc.cpp +0 -0
  43. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mca.cpp +0 -0
  44. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mt.cpp +0 -0
  45. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/mtg.cpp +0 -0
  46. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/ops/volint.cpp +0 -0
  47. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/gs.cpp +0 -0
  48. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/pgs.cpp +0 -0
  49. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/ray.cpp +0 -0
  50. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/superquadric.cpp +0 -0
  51. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/binds/primitive/triangle.cpp +0 -0
  52. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/check.h +0 -0
  53. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/constants.h +0 -0
  54. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/creation/triangle_creation.h +0 -0
  55. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/bvh.cu +0 -0
  56. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/bvh.h +0 -0
  57. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/grid.cu +0 -0
  58. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/grid.h +0 -0
  59. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/gs_bvh.h +0 -0
  60. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/kdtree.cu +0 -0
  61. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/kdtree.h +0 -0
  62. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/pgs_bvh.h +0 -0
  63. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/triangle_mesh.cu +0 -0
  64. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/zcurve.cu +0 -0
  65. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/data_structure/zcurve.h +0 -0
  66. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f2x2.h +0 -0
  67. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f3x1.h +0 -0
  68. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f3x3.h +0 -0
  69. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f3x4.h +0 -0
  70. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f4x1.h +0 -0
  71. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/f4x4.h +0 -0
  72. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/maths.h +0 -0
  73. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/ops.h +0 -0
  74. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/maths/qef.h +0 -0
  75. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/chamfer.cu +0 -0
  76. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/chamfer.h +0 -0
  77. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dc.cu +0 -0
  78. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dc.h +0 -0
  79. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dc_data.h +0 -0
  80. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dmc.cu +0 -0
  81. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dmc.h +0 -0
  82. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/dmc_data.h +0 -0
  83. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill.cu +0 -0
  84. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill.h +0 -0
  85. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/flood_fill_cf.h +0 -0
  86. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mc.cu +0 -0
  87. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mc.h +0 -0
  88. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mc_data.h +0 -0
  89. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mca.cu +0 -0
  90. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mca.h +0 -0
  91. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mca_data.h +0 -0
  92. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mt.cu +0 -0
  93. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mt.h +0 -0
  94. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mt_data.h +0 -0
  95. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mtg.cu +0 -0
  96. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mtg.h +0 -0
  97. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/mtg_data.h +0 -0
  98. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/volint.cu +0 -0
  99. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/volint.h +0 -0
  100. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/ops/voxel_classify.cuh +0 -0
  101. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/aabb.h +0 -0
  102. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/edge.h +0 -0
  103. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs.cu +0 -0
  104. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs.h +0 -0
  105. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs_aabb.cu +0 -0
  106. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/gs_math.cuh +0 -0
  107. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs.cu +0 -0
  108. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs.h +0 -0
  109. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs_aabb.cu +0 -0
  110. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/pgs_math.cuh +0 -0
  111. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/ray.h +0 -0
  112. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/superquadric.cu +0 -0
  113. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/superquadric.h +0 -0
  114. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/csrc/primitive/triangle.h +0 -0
  115. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/__init__.py +0 -0
  116. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/assets/__init__.py +0 -0
  117. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/assets/common.py +0 -0
  118. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/assets/iphigenia.py +0 -0
  119. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/collate/__init__.py +0 -0
  120. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/collate/mesh.py +0 -0
  121. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/collate/sparse_tensor.py +0 -0
  122. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/__init__.py +0 -0
  123. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/base_mesh.py +0 -0
  124. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/digit3d.py +0 -0
  125. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/digit3dmv.py +0 -0
  126. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/mesh.py +0 -0
  127. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/dataset/redwood.py +0 -0
  128. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/__init__.py +0 -0
  129. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/base.py +0 -0
  130. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/ops.py +0 -0
  131. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data/transform/vertex.py +0 -0
  132. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/__init__.py +0 -0
  133. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/bmesh.py +0 -0
  134. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/grid.py +0 -0
  135. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/data_structure/sort.py +0 -0
  136. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/__init__.py +0 -0
  137. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/obj.py +0 -0
  138. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/off.py +0 -0
  139. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/io/ply.py +0 -0
  140. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/__init__.py +0 -0
  141. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/delaunay_triangulation.py +0 -0
  142. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/diff_marching_cubes.py +0 -0
  143. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/diff_marching_tetrahedra_grid.py +0 -0
  144. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/distance.py +0 -0
  145. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/dpsr.py +0 -0
  146. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/dual_contouring.py +0 -0
  147. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/dual_marching_cubes.py +0 -0
  148. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/hermite.py +0 -0
  149. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_cubes.py +0 -0
  150. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_cubes_asymptotic.py +0 -0
  151. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_tetrahedra.py +0 -0
  152. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/marching_tetrahedra_grid.py +0 -0
  153. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/ops/volint.py +0 -0
  154. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/__init__.py +0 -0
  155. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/gs.py +0 -0
  156. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/pgs.py +0 -0
  157. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d/primitive/sq.py +0 -0
  158. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/dependency_links.txt +0 -0
  159. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/not-zip-safe +0 -0
  160. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/requires.txt +0 -0
  161. {conquer3d-0.8.2 → conquer3d-0.8.4}/conquer3d.egg-info/top_level.txt +0 -0
  162. {conquer3d-0.8.2 → conquer3d-0.8.4}/setup.cfg +0 -0
  163. {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.2
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 a mesh, signed by each of the six ways of deciding inside.
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 a mesh, signed by each of the six ways of deciding inside.
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
- then rotated and translated into world space. The per-primitive meshes are packed
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: it holds one closed surface per
1482
- primitive, and wherever two primitives overlap their triangles pass through one
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 and reports empty inputs with sentinels rather
1907
- than raising. An empty query cloud yields two empty tensors; an empty reference
1908
- cloud yields distances of +inf and indices of -1, since no nearest neighbour
1909
- exists. Those +inf values turn into NaN through any mean or backward pass, so
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 != 0 && sign_mode != 1 && sign_mode != 2 && sign_mode != 3 && sign_mode != 4 && sign_mode != 5)
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), or 5 (coarse-to-fine flood fill)");
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("For sign_mode == 5 (coarse-to-fine flood fill), CF flood fill data must be "
223
- "provided or built beforehand.");
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