fusemesh 0.2.0__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 (297) hide show
  1. fusemesh-0.2.0/.clang-format +8 -0
  2. fusemesh-0.2.0/.cmake-format.yaml +4 -0
  3. fusemesh-0.2.0/.format_all +5 -0
  4. fusemesh-0.2.0/.github/actionlint.yaml +7 -0
  5. fusemesh-0.2.0/.github/workflows/wheels.yml +178 -0
  6. fusemesh-0.2.0/.gitignore +13 -0
  7. fusemesh-0.2.0/.gitmodules +3 -0
  8. fusemesh-0.2.0/CMakeLists.txt +137 -0
  9. fusemesh-0.2.0/LICENSE +28 -0
  10. fusemesh-0.2.0/PKG-INFO +155 -0
  11. fusemesh-0.2.0/README.md +128 -0
  12. fusemesh-0.2.0/VERSION +1 -0
  13. fusemesh-0.2.0/benchmarks/baselines/dense-rtx4060.json +365 -0
  14. fusemesh-0.2.0/benchmarks/baselines/reconstruction-before-optimization-rtx4060.json +2216 -0
  15. fusemesh-0.2.0/benchmarks/baselines/reconstruction-rtx4060.json +2793 -0
  16. fusemesh-0.2.0/benchmarks/baselines/sparse-original-rtx4060.json +1251 -0
  17. fusemesh-0.2.0/benchmarks/benchmark_simplify.py +91 -0
  18. fusemesh-0.2.0/benchmarks/m1_baseline.py +65 -0
  19. fusemesh-0.2.0/benchmarks/m2_sparse.py +69 -0
  20. fusemesh-0.2.0/benchmarks/m3_performance.py +181 -0
  21. fusemesh-0.2.0/bindings/module.cpp +115 -0
  22. fusemesh-0.2.0/cmake/FUSEConfig.cmake.in +4 -0
  23. fusemesh-0.2.0/cmake/build_config.h.in +5 -0
  24. fusemesh-0.2.0/docs/FUSE-design.md +162 -0
  25. fusemesh-0.2.0/docs/README.md +24 -0
  26. fusemesh-0.2.0/docs/api.md +161 -0
  27. fusemesh-0.2.0/docs/distribution-requirements.md +56 -0
  28. fusemesh-0.2.0/docs/installation.md +100 -0
  29. fusemesh-0.2.0/docs/mesh-loading.md +109 -0
  30. fusemesh-0.2.0/docs/quality.md +208 -0
  31. fusemesh-0.2.0/docs/releasing.md +156 -0
  32. fusemesh-0.2.0/docs/simplification.md +155 -0
  33. fusemesh-0.2.0/docs/testing.md +116 -0
  34. fusemesh-0.2.0/docs/troubleshooting.md +95 -0
  35. fusemesh-0.2.0/examples/fuse_files.py +107 -0
  36. fusemesh-0.2.0/examples/quality_demo.py +104 -0
  37. fusemesh-0.2.0/examples/union_demo.py +103 -0
  38. fusemesh-0.2.0/external/openvdb/LICENSE +176 -0
  39. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/CMakeLists.txt +428 -0
  40. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/CNanoVDB.h +958 -0
  41. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/GridHandle.h +707 -0
  42. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/HostBuffer.h +657 -0
  43. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/NanoVDB.h +6546 -0
  44. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/NodeManager.h +346 -0
  45. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/PNanoVDB.h +3604 -0
  46. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/Readme.md +15 -0
  47. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/CMakeLists.txt +48 -0
  48. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/convert/nanovdb_convert.cc +317 -0
  49. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/print/nanovdb_print.cc +331 -0
  50. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/updateFiles.py +222 -0
  51. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/updateFiles.sh +101 -0
  52. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/validate/nanovdb_validate.cc +115 -0
  53. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/Buffer.h +481 -0
  54. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceBuffer.h +539 -0
  55. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceMesh.h +229 -0
  56. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceResource.h +358 -0
  57. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceStreamMap.h +124 -0
  58. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/GridHandle.cuh +279 -0
  59. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/HandleStorage.h +246 -0
  60. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/ManagedResource.h +73 -0
  61. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/NodeManager.cuh +193 -0
  62. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/PinnedResource.h +63 -0
  63. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/TempPool.h +89 -0
  64. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/UnifiedBuffer.h +355 -0
  65. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/docs/CMakeLists.txt +35 -0
  66. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/docs/codingstyle.txt +305 -0
  67. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/docs/doxygen-config +2354 -0
  68. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/CMakeLists.txt +151 -0
  69. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_bump_pool_buffer/bump_pool_buffer.cc +131 -0
  70. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_coarsen_nanovdb_cuda/coarsen_nanovdb_cuda.cpp +151 -0
  71. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_coarsen_nanovdb_cuda/coarsen_nanovdb_cuda_kernels.cu +58 -0
  72. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/common.h +29 -0
  73. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/main.cc +47 -0
  74. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/nanovdb.cu +159 -0
  75. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/openvdb.cc +39 -0
  76. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_dilate_nanovdb_cuda/dilate_nanovdb_cuda.cpp +134 -0
  77. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_dilate_nanovdb_cuda/dilate_nanovdb_cuda_kernels.cu +104 -0
  78. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_index_grid_cuda/index_grid_cuda.cc +45 -0
  79. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_index_grid_cuda/index_grid_cuda_kernel.cu +44 -0
  80. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_custom_nanovdb/make_custom_nanovdb.cc +34 -0
  81. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_custom_nanovdb_cuda/make_custom_nanovdb_cuda.cc +51 -0
  82. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_custom_nanovdb_cuda/make_custom_nanovdb_cuda_kernel.cu +37 -0
  83. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_funny_nanovdb/make_funny_nanovdb.cc +34 -0
  84. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_mgpu_nanovdb/main.cu +316 -0
  85. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_nanovdb_sphere/make_nanovdb_sphere.cc +27 -0
  86. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_typed_grids/make_typed_grids.cc +95 -0
  87. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_map_pool_buffer/map_pool_buffer.cc +186 -0
  88. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_merge_nanovdb_cuda/merge_nanovdb_cuda.cpp +166 -0
  89. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_merge_nanovdb_cuda/merge_nanovdb_cuda_kernels.cu +61 -0
  90. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_mesh_to_grid_cuda/mesh_to_grid_cuda.cpp +179 -0
  91. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_mesh_to_grid_cuda/mesh_to_grid_cuda_kernels.cu +123 -0
  92. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_modify_nanovdb_thrust/modify_nanovdb_thrust.cc +45 -0
  93. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_modify_nanovdb_thrust/modify_nanovdb_thrust.cu +26 -0
  94. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_nodemanager_cuda/nodemanager_cuda.cc +55 -0
  95. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_nodemanager_cuda/nodemanager_cuda_kernel.cu +39 -0
  96. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb/openvdb_to_nanovdb.cc +31 -0
  97. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_accessor/openvdb_to_nanovdb_accessor.cc +43 -0
  98. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_cuda/openvdb_to_nanovdb_cuda.cc +44 -0
  99. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_cuda/openvdb_to_nanovdb_cuda_kernel.cu +28 -0
  100. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/common.h +147 -0
  101. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/main.cc +46 -0
  102. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/nanovdb.cu +111 -0
  103. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/openvdb.cc +92 -0
  104. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_iso_surface/common.h +189 -0
  105. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_iso_surface/main.cc +47 -0
  106. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_iso_surface/nanovdb.cu +67 -0
  107. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/common.h +177 -0
  108. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/main.cc +46 -0
  109. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/nanovdb.cu +143 -0
  110. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/openvdb.cc +96 -0
  111. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere/read_nanovdb_sphere.cc +27 -0
  112. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor/read_nanovdb_sphere_accessor.cc +30 -0
  113. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda.cu +46 -0
  114. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda_kernel.cu +38 -0
  115. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_refine_nanovdb_cuda/refine_nanovdb_cuda.cpp +201 -0
  116. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_refine_nanovdb_cuda/refine_nanovdb_cuda_kernels.cu +58 -0
  117. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_util/ComputePrimitives.h +171 -0
  118. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_vox_to_nanovdb/VoxToNanoVDB.h +199 -0
  119. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_vox_to_nanovdb/vox_to_nanovdb.cc +31 -0
  120. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_voxels_to_grid_cuda/ex_voxels_to_grid_cuda.cu +52 -0
  121. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_voxels_to_grid_mgpu/ex_voxels_to_grid_mgpu.cu +63 -0
  122. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_write_nanovdb_grids/write_nanovdb_grids.cc +34 -0
  123. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/io/IO.h +782 -0
  124. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/CSampleFromVoxels.h +327 -0
  125. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/DitherLUT.h +189 -0
  126. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/HDDA.h +566 -0
  127. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Math.h +2247 -0
  128. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Proximity.h +150 -0
  129. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Ray.h +557 -0
  130. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/SampleFromVoxels.h +996 -0
  131. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Stencils.h +1032 -0
  132. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/putil/IO.h +781 -0
  133. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/CMakeLists.txt +70 -0
  134. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/NanoVDBModule.cc +429 -0
  135. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyCreateNanoGrid.cc +55 -0
  136. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyCreateNanoGrid.h +20 -0
  137. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridChecksum.cc +36 -0
  138. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridChecksum.h +18 -0
  139. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridHandle.cc +27 -0
  140. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridHandle.h +75 -0
  141. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridStats.cc +23 -0
  142. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridStats.h +16 -0
  143. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridValidator.cc +29 -0
  144. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridValidator.h +16 -0
  145. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyHostBuffer.cc +17 -0
  146. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyHostBuffer.h +16 -0
  147. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyIO.cc +162 -0
  148. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyIO.h +16 -0
  149. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyMath.cc +409 -0
  150. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyMath.h +16 -0
  151. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyNanoToOpenVDB.cc +31 -0
  152. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyNanoToOpenVDB.h +16 -0
  153. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyPrimitives.cc +204 -0
  154. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyPrimitives.h +16 -0
  155. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PySampleFromVoxels.cc +88 -0
  156. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PySampleFromVoxels.h +19 -0
  157. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyTools.cc +61 -0
  158. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyTools.h +16 -0
  159. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/__init__.py +9 -0
  160. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyDeviceBuffer.cc +21 -0
  161. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyDeviceBuffer.h +18 -0
  162. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyDeviceGridHandle.cu +47 -0
  163. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyPointsToGrid.cu +58 -0
  164. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyPointsToGrid.h +16 -0
  165. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySampleFromVoxels.cu +91 -0
  166. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySampleFromVoxels.h +16 -0
  167. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySignedFloodFill.cu +22 -0
  168. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySignedFloodFill.h +16 -0
  169. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/test/TestNanoVDB.py +923 -0
  170. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/CreateNanoGrid.h +2117 -0
  171. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/CreatePrimitives.h +1752 -0
  172. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridBuilder.h +2315 -0
  173. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridChecksum.h +422 -0
  174. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridStats.h +878 -0
  175. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridValidator.h +244 -0
  176. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/NanoToOpenVDB.h +558 -0
  177. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/VoxelBlockManager.h +476 -0
  178. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/AddBlindData.cuh +157 -0
  179. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/CoarsenGrid.cuh +257 -0
  180. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/DilateGrid.cuh +301 -0
  181. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/DistributedPointsToGrid.cuh +1239 -0
  182. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/GridChecksum.cuh +549 -0
  183. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/GridStats.cuh +371 -0
  184. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/GridValidator.cuh +59 -0
  185. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/IndexToGrid.cuh +459 -0
  186. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/MergeGrids.cuh +286 -0
  187. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/MeshToGrid.cuh +1200 -0
  188. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/PointsToGrid.cuh +1517 -0
  189. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/PruneGrid.cuh +260 -0
  190. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/RefineGrid.cuh +272 -0
  191. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/SignedFloodFill.cuh +278 -0
  192. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/TopologyBuilder.cuh +719 -0
  193. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/VoxelBlockManager.cuh +441 -0
  194. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/CMakeLists.txt +93 -0
  195. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestBuffer.cu +1379 -0
  196. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestMemoryResource.cu +590 -0
  197. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestMultiGPU.cu +695 -0
  198. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestNanoVDB.cc +8823 -0
  199. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestNanoVDB.cu +4520 -0
  200. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestOpenVDB.cc +3597 -0
  201. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestUtilCuda.cu +75 -0
  202. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/pnanovdb_validate_strides.h +209 -0
  203. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/CpuTimer.h +6 -0
  204. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/CreateNanoGrid.h +6 -0
  205. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/DitherLUT.h +6 -0
  206. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/ForEach.h +116 -0
  207. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridBuilder.h +6 -0
  208. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridChecksum.h +6 -0
  209. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridStats.h +6 -0
  210. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridValidator.h +6 -0
  211. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/HDDA.h +6 -0
  212. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/HostBuffer.h +6 -0
  213. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/IO.h +6 -0
  214. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Invoke.h +97 -0
  215. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/MaskPrefixSum.h +224 -0
  216. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/MorphologyHelpers.h +127 -0
  217. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/NanoToOpenVDB.h +6 -0
  218. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/NodeManager.h +6 -0
  219. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/OpenToNanoVDB.h +6 -0
  220. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/PrefixSum.h +91 -0
  221. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Primitives.h +6 -0
  222. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Range.h +158 -0
  223. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Ray.h +6 -0
  224. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Reduce.h +133 -0
  225. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/SampleFromVoxels.h +6 -0
  226. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Stencils.h +6 -0
  227. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Timer.h +99 -0
  228. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Util.h +751 -0
  229. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaAddBlindData.cuh +6 -0
  230. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaDeviceBuffer.h +6 -0
  231. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridChecksum.cuh +6 -0
  232. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridHandle.cuh +6 -0
  233. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridStats.cuh +6 -0
  234. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridValidator.cuh +6 -0
  235. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaIndexToGrid.cuh +6 -0
  236. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaNodeManager.cuh +6 -0
  237. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaPointsToGrid.cuh +6 -0
  238. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaSignedFloodFill.cuh +6 -0
  239. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaUtils.h +6 -0
  240. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/DeviceGridTraits.cuh +89 -0
  241. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/GpuTimer.h +6 -0
  242. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Injection.cuh +197 -0
  243. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Morphology.cuh +907 -0
  244. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/MorphologyHelpers.cuh +128 -0
  245. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Rasterization.cuh +195 -0
  246. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Timer.h +163 -0
  247. fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Util.h +401 -0
  248. fusemesh-0.2.0/include/fuse/reconstruct.h +44 -0
  249. fusemesh-0.2.0/include/fuse/smoke.h +13 -0
  250. fusemesh-0.2.0/include/fuse/version.h +5 -0
  251. fusemesh-0.2.0/licenses/CUB-LICENSE.txt +24 -0
  252. fusemesh-0.2.0/licenses/CUDA-12.8-EULA.txt +1632 -0
  253. fusemesh-0.2.0/licenses/LLVM-Apache-2.0-exception.txt +192 -0
  254. fusemesh-0.2.0/licenses/NanoVDB-Apache-2.0.txt +176 -0
  255. fusemesh-0.2.0/licenses/THIRD-PARTY-NOTICES.txt +46 -0
  256. fusemesh-0.2.0/licenses/nanobind-LICENSE.txt +26 -0
  257. fusemesh-0.2.0/licenses/robin-map-LICENSE.txt +21 -0
  258. fusemesh-0.2.0/pyproject.toml +80 -0
  259. fusemesh-0.2.0/python/fusemesh/__init__.py +167 -0
  260. fusemesh-0.2.0/python/fusemesh/io.py +177 -0
  261. fusemesh-0.2.0/python/fusemesh/quality.py +294 -0
  262. fusemesh-0.2.0/python/fusemesh/simplification.py +431 -0
  263. fusemesh-0.2.0/requirements/format.txt +6 -0
  264. fusemesh-0.2.0/requirements/release.txt +3 -0
  265. fusemesh-0.2.0/scripts/check_artifacts.py +187 -0
  266. fusemesh-0.2.0/scripts/check_no_driver.py +30 -0
  267. fusemesh-0.2.0/scripts/ci_gpu_test.sh +32 -0
  268. fusemesh-0.2.0/scripts/ci_native_build.sh +20 -0
  269. fusemesh-0.2.0/scripts/format_all.py +66 -0
  270. fusemesh-0.2.0/scripts/runtime_evidence.py +55 -0
  271. fusemesh-0.2.0/scripts/test_without_toolkit.sh +20 -0
  272. fusemesh-0.2.0/src/core/reconstruct.cpp +26 -0
  273. fusemesh-0.2.0/src/core/version.cpp +7 -0
  274. fusemesh-0.2.0/src/cuda/reconstruct.cu +529 -0
  275. fusemesh-0.2.0/src/cuda/smoke.cu +92 -0
  276. fusemesh-0.2.0/src/geometry/queries.cuh +124 -0
  277. fusemesh-0.2.0/src/geometry/scene.cpp +214 -0
  278. fusemesh-0.2.0/src/geometry/scene.h +86 -0
  279. fusemesh-0.2.0/src/meshing/cell.h +90 -0
  280. fusemesh-0.2.0/src/volume/topology.cpp +160 -0
  281. fusemesh-0.2.0/src/volume/topology.h +14 -0
  282. fusemesh-0.2.0/tests/geometry_helpers.py +198 -0
  283. fusemesh-0.2.0/tests/native_cells.cpp +45 -0
  284. fusemesh-0.2.0/tests/native_extraction.cpp +59 -0
  285. fusemesh-0.2.0/tests/native_reconstruct.cpp +32 -0
  286. fusemesh-0.2.0/tests/native_smoke.cpp +14 -0
  287. fusemesh-0.2.0/tests/native_version.cpp +8 -0
  288. fusemesh-0.2.0/tests/test_benchmark_policy.py +64 -0
  289. fusemesh-0.2.0/tests/test_io.py +261 -0
  290. fusemesh-0.2.0/tests/test_m3.py +86 -0
  291. fusemesh-0.2.0/tests/test_quality.py +322 -0
  292. fusemesh-0.2.0/tests/test_quality_demo.py +72 -0
  293. fusemesh-0.2.0/tests/test_reconstruct.py +324 -0
  294. fusemesh-0.2.0/tests/test_release_artifacts.py +64 -0
  295. fusemesh-0.2.0/tests/test_simplification.py +328 -0
  296. fusemesh-0.2.0/tests/test_smoke.py +63 -0
  297. fusemesh-0.2.0/tests/test_sparse.py +133 -0
@@ -0,0 +1,8 @@
1
+ BasedOnStyle: Chromium
2
+ ColumnLimit: 120
3
+ IndentWidth: 4
4
+ IndentPPDirectives: BeforeHash
5
+ TabWidth: 4
6
+ AccessModifierOffset: -2
7
+ SortUsingDeclarations: false
8
+ SortIncludes: false
@@ -0,0 +1,4 @@
1
+ format:
2
+ line_width: 100
3
+ tab_size: 2
4
+ dangle_parens: true
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ # Like MoPhi's utility: clang-format + Black, with CMake and CI check support.
3
+ set -euo pipefail
4
+ repo_dir=$(cd "$(dirname "$0")" && pwd)
5
+ exec "${PYTHON:-python3}" "$repo_dir/scripts/format_all.py" "$@"
@@ -0,0 +1,7 @@
1
+ self-hosted-runner:
2
+ labels:
3
+ - fuse-gpu
4
+ - sm80
5
+ - sm86
6
+ - sm89
7
+ - sm90
@@ -0,0 +1,178 @@
1
+ name: Wheels and release
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+ workflow_dispatch:
8
+ inputs:
9
+ publish:
10
+ description: Registry (requires protected environment and Trusted Publisher)
11
+ type: choice
12
+ options: [none, testpypi, pypi]
13
+ default: none
14
+ gpu:
15
+ description: Optional GPU validation (requires a matching self-hosted runner)
16
+ type: choice
17
+ options: [none, sm89, sm80, sm86, sm90]
18
+ default: none
19
+
20
+ permissions:
21
+ contents: read
22
+
23
+ jobs:
24
+ format:
25
+ runs-on: ubuntu-24.04
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: '3.13'
31
+ - run: python -m pip install -r requirements/format.txt
32
+ - run: ./.format_all --check
33
+ - run: actionlint
34
+ - run: shellcheck .format_all scripts/*.sh
35
+
36
+ source:
37
+ runs-on: ubuntu-24.04
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ with:
41
+ submodules: recursive
42
+ - uses: actions/setup-python@v5
43
+ with:
44
+ python-version: '3.13'
45
+ - run: python -m pip install -r requirements/release.txt
46
+ - run: python -m build --sdist
47
+ - run: python scripts/check_artifacts.py dist --source-only
48
+ - run: python -m twine check --strict dist/*
49
+ - uses: actions/upload-artifact@v4
50
+ with:
51
+ name: sdist
52
+ path: dist/*.tar.gz
53
+ if-no-files-found: error
54
+
55
+ wheels:
56
+ needs: [source, format]
57
+ runs-on: ubuntu-24.04
58
+ strategy:
59
+ fail-fast: false
60
+ matrix:
61
+ python: [cp39, cp310, cp311, cp312, cp313, cp314]
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ - uses: actions/setup-python@v5
65
+ with:
66
+ python-version: '3.13'
67
+ - uses: actions/download-artifact@v4
68
+ with:
69
+ name: sdist
70
+ path: dist
71
+ - run: python -m pip install -r requirements/release.txt
72
+ # Every wheel is compiled from the self-contained sdist, without Git/submodules.
73
+ - run: python -m cibuildwheel dist/*.tar.gz --output-dir wheelhouse
74
+ env:
75
+ CIBW_BUILD: ${{ matrix.python }}-manylinux_x86_64
76
+ - run: python scripts/check_artifacts.py wheelhouse --python-tag ${{ matrix.python }}
77
+ - run: python -m twine check --strict wheelhouse/*
78
+ - uses: actions/upload-artifact@v4
79
+ with:
80
+ name: wheel-${{ matrix.python }}
81
+ path: wheelhouse/*.whl
82
+ if-no-files-found: error
83
+
84
+ native:
85
+ needs: [source, format]
86
+ runs-on: ubuntu-24.04
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - uses: actions/setup-python@v5
90
+ with:
91
+ python-version: '3.13'
92
+ - uses: actions/download-artifact@v4
93
+ with:
94
+ name: sdist
95
+ path: dist
96
+ - name: Build standalone native tests from source archive
97
+ run: |
98
+ image=$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["tool"]["cibuildwheel"]["linux"]["manylinux-x86_64-image"])')
99
+ mkdir -p build/native-tests
100
+ docker run --rm -v "$PWD:/project" -w /project "$image" bash -c 'bash scripts/ci_native_build.sh dist/*.tar.gz build/native-tests'
101
+ - uses: actions/upload-artifact@v4
102
+ with:
103
+ name: native-tests
104
+ path: build/native-tests/*
105
+ if-no-files-found: error
106
+
107
+ gpu:
108
+ # Never execute pull-request code on a persistent GPU runner. Maintainers dispatch
109
+ # only main or version tags. Each runner needs Docker + NVIDIA Container Toolkit.
110
+ if: github.event_name == 'workflow_dispatch' && inputs.gpu != 'none' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))
111
+ needs: [wheels, native]
112
+ strategy:
113
+ fail-fast: false
114
+ matrix:
115
+ python: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
116
+ runs-on: [self-hosted, linux, x64, fuse-gpu, '${{ inputs.gpu }}']
117
+ steps:
118
+ - uses: actions/checkout@v4
119
+ - uses: actions/download-artifact@v4
120
+ with:
121
+ pattern: wheel-*
122
+ path: wheelhouse
123
+ merge-multiple: true
124
+ - uses: actions/download-artifact@v4
125
+ with:
126
+ name: native-tests
127
+ path: build/native-tests
128
+ - run: chmod +x build/native-tests/fuse_*
129
+ - run: bash scripts/ci_gpu_test.sh '${{ matrix.python }}' '${{ inputs.gpu }}'
130
+ - uses: actions/upload-artifact@v4
131
+ if: always()
132
+ with:
133
+ name: gpu-${{ inputs.gpu }}-py${{ matrix.python }}
134
+ path: build/gpu-evidence/*
135
+ if-no-files-found: error
136
+
137
+ publish:
138
+ # An intentionally skipped GPU job must not skip publication. A requested
139
+ # GPU run must pass; failed/cancelled build or validation jobs block uploads.
140
+ if: >-
141
+ always() && !cancelled() &&
142
+ github.event_name == 'workflow_dispatch' && inputs.publish != 'none' &&
143
+ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) &&
144
+ needs.format.result == 'success' && needs.source.result == 'success' &&
145
+ needs.wheels.result == 'success' && needs.native.result == 'success' &&
146
+ ((inputs.gpu == 'none' && needs.gpu.result == 'skipped') ||
147
+ (inputs.gpu != 'none' && needs.gpu.result == 'success'))
148
+ needs: [gpu, wheels, native, source, format]
149
+ runs-on: ubuntu-24.04
150
+ environment:
151
+ name: ${{ inputs.publish }}
152
+ permissions:
153
+ id-token: write
154
+ contents: read
155
+ steps:
156
+ - uses: actions/checkout@v4
157
+ - uses: actions/setup-python@v5
158
+ with:
159
+ python-version: '3.13'
160
+ - uses: actions/download-artifact@v4
161
+ with:
162
+ pattern: wheel-*
163
+ path: dist
164
+ merge-multiple: true
165
+ - uses: actions/download-artifact@v4
166
+ with:
167
+ name: sdist
168
+ path: dist
169
+ - name: Validate complete release and optional version tag
170
+ run: |
171
+ if [[ "$GITHUB_REF" == refs/tags/* ]]; then
172
+ python scripts/check_artifacts.py dist --complete --tag "$GITHUB_REF_NAME"
173
+ else
174
+ python scripts/check_artifacts.py dist --complete
175
+ fi
176
+ - uses: pypa/gh-action-pypi-publish@release/v1
177
+ with:
178
+ repository-url: ${{ inputs.publish == 'testpypi' && 'https://test.pypi.org/legacy/' || 'https://upload.pypi.org/legacy/' }}
@@ -0,0 +1,13 @@
1
+ *.i
2
+ *.ii
3
+ *.gpu
4
+ *.ptx
5
+ *.cubin
6
+ *.fatbin
7
+
8
+ .venv*/
9
+ build/
10
+ dist/
11
+ __pycache__/
12
+ .pytest_cache/
13
+ *.egg-info/
@@ -0,0 +1,3 @@
1
+ [submodule "external/openvdb"]
2
+ path = external/openvdb
3
+ url = https://github.com/AcademySoftwareFoundation/openvdb.git
@@ -0,0 +1,137 @@
1
+ cmake_minimum_required(VERSION 3.24)
2
+ file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" FUSE_VERSION)
3
+ string(STRIP "${FUSE_VERSION}" FUSE_VERSION)
4
+ if(NOT FUSE_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$")
5
+ message(FATAL_ERROR "VERSION must contain a release version MAJOR.MINOR.PATCH")
6
+ endif()
7
+ set_property(
8
+ DIRECTORY
9
+ APPEND
10
+ PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION"
11
+ )
12
+ project(
13
+ FUSE
14
+ VERSION ${FUSE_VERSION}
15
+ LANGUAGES CXX CUDA
16
+ )
17
+
18
+ option(FUSE_BUILD_PYTHON "Build the fusemesh Python extension" ON)
19
+ option(FUSE_BUILD_TESTS "Build native validation tests" OFF)
20
+ set(CMAKE_CXX_STANDARD 17)
21
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
22
+ set(CMAKE_CUDA_STANDARD 17)
23
+ set(CMAKE_CUDA_STANDARD_REQUIRED ON)
24
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
25
+ # Explicit fat binary: Ampere, Ada, Hopper plus forward PTX. Never host-only.
26
+ set(FUSE_CUDA_ARCHITECTURES
27
+ "80-real;86-real;89-real;90-real;90-virtual"
28
+ CACHE STRING "CUDA architectures"
29
+ )
30
+ set(CMAKE_CUDA_ARCHITECTURES "${FUSE_CUDA_ARCHITECTURES}")
31
+ set(CMAKE_CUDA_RUNTIME_LIBRARY Static)
32
+ find_package(CUDAToolkit 12.8 REQUIRED)
33
+ if(NOT CUDAToolkit_VERSION VERSION_LESS 12.9)
34
+ message(FATAL_ERROR "FUSE currently supports the CUDA 12.8 toolkit family only")
35
+ endif()
36
+
37
+ set(FUSE_NANOVDB_REVISION "e26f5a569201d3236e0c30580572101022d3d754")
38
+ set(NANOVDB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/external/openvdb/nanovdb")
39
+ if(NOT EXISTS "${NANOVDB_ROOT}/nanovdb/NanoVDB.h")
40
+ message(FATAL_ERROR "NanoVDB sources missing. Run git submodule update --init --recursive")
41
+ endif()
42
+ # Check a checkout when Git is available; self-contained sdists need no Git.
43
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external/openvdb/.git")
44
+ find_package(Git QUIET)
45
+ if(Git_FOUND)
46
+ execute_process(
47
+ COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD
48
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/openvdb"
49
+ OUTPUT_VARIABLE revision
50
+ OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
51
+ )
52
+ if(NOT revision STREQUAL FUSE_NANOVDB_REVISION)
53
+ message(FATAL_ERROR "NanoVDB checkout differs from the pinned revision")
54
+ endif()
55
+ endif()
56
+ endif()
57
+ string(REPLACE ";" "," FUSE_ARCH_STRING "${FUSE_CUDA_ARCHITECTURES}")
58
+ configure_file(cmake/build_config.h.in generated/fuse/build_config.h @ONLY)
59
+ add_library(
60
+ fuse STATIC src/cuda/smoke.cu src/core/reconstruct.cpp src/core/version.cpp
61
+ src/geometry/scene.cpp src/volume/topology.cpp src/cuda/reconstruct.cu
62
+ )
63
+ add_library(FUSE::fuse ALIAS fuse)
64
+ target_include_directories(
65
+ fuse
66
+ PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>
67
+ PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${NANOVDB_ROOT}"
68
+ "${CMAKE_CURRENT_BINARY_DIR}/generated"
69
+ )
70
+ target_link_libraries(fuse PUBLIC CUDA::cudart_static)
71
+ target_compile_options(fuse PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--extended-lambda;--fmad=false>)
72
+ set_target_properties(fuse PROPERTIES CUDA_RUNTIME_LIBRARY Static)
73
+
74
+ if(FUSE_BUILD_PYTHON)
75
+ find_package(
76
+ Python 3.9
77
+ COMPONENTS Interpreter Development.Module
78
+ REQUIRED
79
+ )
80
+ execute_process(
81
+ COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
82
+ OUTPUT_VARIABLE nanobind_DIR
83
+ OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
84
+ )
85
+ find_package(nanobind CONFIG REQUIRED)
86
+ nanobind_add_module(_native bindings/module.cpp)
87
+ target_link_libraries(_native PRIVATE FUSE::fuse)
88
+ install(TARGETS _native LIBRARY DESTINATION fusemesh)
89
+ endif()
90
+ if(NOT SKBUILD)
91
+ include(GNUInstallDirs)
92
+ include(CMakePackageConfigHelpers)
93
+ install(
94
+ TARGETS fuse
95
+ EXPORT FUSETARGETS
96
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
97
+ )
98
+ install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
99
+ install(
100
+ EXPORT FUSETARGETS
101
+ NAMESPACE FUSE::
102
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FUSE
103
+ )
104
+ configure_package_config_file(
105
+ cmake/FUSEConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/FUSEConfig.cmake"
106
+ INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FUSE
107
+ )
108
+ write_basic_package_version_file(
109
+ "${CMAKE_CURRENT_BINARY_DIR}/FUSEConfigVersion.cmake"
110
+ VERSION ${PROJECT_VERSION}
111
+ COMPATIBILITY ExactVersion
112
+ )
113
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/FUSEConfigVersion.cmake"
114
+ "${CMAKE_CURRENT_BINARY_DIR}/FUSEConfig.cmake"
115
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FUSE
116
+ )
117
+ endif()
118
+ if(FUSE_BUILD_TESTS)
119
+ enable_testing()
120
+ add_executable(fuse_version tests/native_version.cpp)
121
+ target_compile_definitions(fuse_version PRIVATE FUSE_EXPECTED_VERSION="${PROJECT_VERSION}")
122
+ target_link_libraries(fuse_version PRIVATE FUSE::fuse)
123
+ add_test(NAME fuse_version COMMAND fuse_version)
124
+ add_executable(fuse_smoke tests/native_smoke.cpp)
125
+ target_link_libraries(fuse_smoke PRIVATE FUSE::fuse)
126
+ add_test(NAME fuse_smoke COMMAND fuse_smoke)
127
+ add_executable(fuse_cells tests/native_cells.cpp)
128
+ target_include_directories(fuse_cells PRIVATE src include)
129
+ add_test(NAME fuse_cells COMMAND fuse_cells)
130
+ add_executable(fuse_reconstruct tests/native_reconstruct.cpp)
131
+ target_link_libraries(fuse_reconstruct PRIVATE FUSE::fuse)
132
+ add_test(NAME fuse_reconstruct COMMAND fuse_reconstruct)
133
+ add_executable(fuse_extraction tests/native_extraction.cpp)
134
+ target_include_directories(fuse_extraction PRIVATE src)
135
+ target_link_libraries(fuse_extraction PRIVATE FUSE::fuse)
136
+ add_test(NAME fuse_extraction COMMAND fuse_extraction)
137
+ endif()
fusemesh-0.2.0/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Ruochun Zhang
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,155 @@
1
+ Metadata-Version: 2.4
2
+ Name: fusemesh
3
+ Version: 0.2.0
4
+ Summary: Fast Union Surface Extraction — CUDA/NanoVDB backend
5
+ License-Expression: BSD-3-Clause
6
+ License-File: LICENSE
7
+ License-File: licenses/CUB-LICENSE.txt
8
+ License-File: licenses/CUDA-12.8-EULA.txt
9
+ License-File: licenses/LLVM-Apache-2.0-exception.txt
10
+ License-File: licenses/NanoVDB-Apache-2.0.txt
11
+ License-File: licenses/THIRD-PARTY-NOTICES.txt
12
+ License-File: licenses/nanobind-LICENSE.txt
13
+ License-File: licenses/robin-map-LICENSE.txt
14
+ Requires-Python: >=3.9
15
+ Requires-Dist: numpy<2.1,>=1.23; python_version < "3.10"
16
+ Requires-Dist: numpy>=1.23; python_version >= "3.10"
17
+ Requires-Dist: trimesh<5,>=4.12.2
18
+ Requires-Dist: fast-simplification==0.1.12; python_version < "3.10"
19
+ Requires-Dist: fast-simplification==0.2.0; python_version >= "3.10"
20
+ Requires-Dist: rtree==1.4.1
21
+ Provides-Extra: test
22
+ Requires-Dist: pytest>=8; extra == "test"
23
+ Requires-Dist: manifold3d==3.5.4; extra == "test"
24
+ Provides-Extra: quality
25
+ Requires-Dist: manifold3d==3.5.4; extra == "quality"
26
+ Description-Content-Type: text/markdown
27
+
28
+ # FUSE — Fast Union Surface Extraction
29
+
30
+ FUSE reconstructs a triangle mesh approximating the solid union of one or more
31
+ closed meshes. It uses CUDA for field evaluation and surface extraction, sparse
32
+ NanoVDB indexing to reduce work around empty space, and a Python API for loading,
33
+ fusing, simplifying, comparing, and saving meshes.
34
+
35
+ Choose a uniform voxel size in your mesh's units to control sampling resolution.
36
+ FUSE handles overlapping solids, containment, disconnected components, and
37
+ resolved cavities. Optional CPU simplification reduces the output triangle count.
38
+ It is an approximate reconstruction tool: original triangles and subvoxel features
39
+ are not necessarily preserved.
40
+
41
+ ## Install
42
+
43
+ Use a Linux x86-64 wheel matching your CPython version (3.9–3.14). Download and
44
+ extract the corresponding `wheel-cp…` artifact from a successful
45
+ [GitHub Actions build](https://github.com/Ruochun/FUSE/actions/workflows/wheels.yml),
46
+ then install the **single matching wheel**:
47
+
48
+ ```bash
49
+ python -m pip install /path/to/fusemesh-<version>-<python>-<abi>-<platform>.whl
50
+ python -c 'import fusemesh; print(fusemesh.build_info()); print(fusemesh.smoke_test())'
51
+ ```
52
+
53
+ Replace the placeholder path with the downloaded filename. Reconstruction and
54
+ `smoke_test()` require an NVIDIA GPU and driver. Wheel installations include the
55
+ CUDA runtime and Python dependencies; a CUDA toolkit or compiler is not required.
56
+ Loading, saving, simplification, and quality comparisons run on the CPU without
57
+ initializing CUDA.
58
+
59
+ See [installation and compatibility](docs/installation.md) for GPU requirements,
60
+ source builds, and reinstalling a changed wheel with the same version number.
61
+
62
+ ## Fuse mesh files
63
+
64
+ ```python
65
+ import fusemesh
66
+
67
+ result = fusemesh.reconstruct(["a.off", "b.obj"], voxel_size=0.05)
68
+ fusemesh.save_mesh("union.obj", result)
69
+ print(result.metadata)
70
+ ```
71
+
72
+ A single path also works: `fusemesh.reconstruct("model.off", voxel_size=0.05)`.
73
+ For arrays, use `reconstruct([(vertices, faces)], voxel_size=0.05)`; each array
74
+ pair represents one solid. Returned vertices are float64 `(N, 3)` coordinates
75
+ and faces are uint64 `(M, 3)` indices.
76
+
77
+ From a repository checkout, run the file example:
78
+
79
+ ```bash
80
+ python examples/fuse_files.py a.off b.obj \
81
+ --voxel-size 0.05 --memory-mib 512 --output union.obj
82
+ ```
83
+
84
+ To try generated geometry without supplying a file:
85
+
86
+ ```bash
87
+ python examples/union_demo.py
88
+ ```
89
+
90
+ ## Reduce output triangles
91
+
92
+ ```python
93
+ reduced = fusemesh.simplify(result, max_error=0.01, target_faces=5000)
94
+ fusemesh.save_mesh("reduced.obj", reduced)
95
+ ```
96
+
97
+ Simplification checks surface and sharp-edge deviation, per-shell volume, and
98
+ manifold topology. `target_faces` is a soft goal; quality checks take priority.
99
+ `max_error` is relative to the mesh being simplified, not the original union
100
+ inputs. See [simplification](docs/simplification.md) for controls and limitations.
101
+
102
+ ## Measure surface accuracy
103
+
104
+ ```python
105
+ report = fusemesh.compare_surfaces(
106
+ "original.off", "reconstructed.obj", tolerance=0.05,
107
+ degenerate_faces="drop",
108
+ )
109
+ print(report["symmetric"]["rms"])
110
+ print(report["symmetric"]["f_score"])
111
+ ```
112
+
113
+ This CPU comparison accepts open or nonmanifold surfaces. The explicit `drop`
114
+ option excludes zero-area triangles and reports removal counts; the default is
115
+ `error`. Distances use mesh coordinate units. Coverage and F-score depend on the
116
+ chosen tolerance, and sampled maxima are not certified Hausdorff bounds.
117
+
118
+ From a checkout, compare existing files with
119
+ `python examples/quality_demo.py --inputs original.off reconstructed.obj`.
120
+ Without `--inputs`, the demo reconstructs two boxes and requires a GPU and the
121
+ `quality` extra. Multiple original solids also require that extra to construct
122
+ an independent Boolean reference union. See [quality comparisons](docs/quality.md)
123
+ for installation, metric definitions, and examples.
124
+
125
+ ## Reconstruction requirements and limits
126
+
127
+ - Inputs must describe closed, consistently oriented manifold solids.
128
+ `validation="basic"` skips topology checks but does not make open or
129
+ nonmanifold solids supported. Self-intersections are not detected or repaired.
130
+ - Trimesh loads local files. OFF faces must already be triangles; other formats
131
+ follow their reader's triangulation and grouping rules. See [mesh loading](docs/mesh-loading.md).
132
+ - Smaller voxel sizes can resolve finer detail but require more work and memory.
133
+ Thin walls, narrow gaps, and small components may disappear. Voxel size is not
134
+ a guaranteed surface-error bound; output is not guaranteed manifold in
135
+ degenerate or unresolved cases.
136
+ - The Python API defaults to a 512 MiB limit on explicit FUSE GPU buffers.
137
+ The file example defaults to 16 GiB; use `--memory-mib` to set it explicitly.
138
+ CUDA context memory and host memory are outside that limit.
139
+ - Reconstruction does not perform exact triangle Booleans, mesh repair, adaptive voxel
140
+ refinement, automatic smoothing, or material/texture transfer.
141
+
142
+ ## Documentation
143
+
144
+ Start with the [documentation index](docs/README.md), or go directly to:
145
+
146
+ - [Installation and compatibility](docs/installation.md)
147
+ - [Mesh loading and file examples](docs/mesh-loading.md)
148
+ - [Python and native API](docs/api.md)
149
+ - [Surface simplification](docs/simplification.md)
150
+ - [Reconstruction quality](docs/quality.md)
151
+ - [Troubleshooting](docs/troubleshooting.md)
152
+ - [Testing and benchmarks](docs/testing.md)
153
+
154
+ FUSE uses BSD-3-Clause. Third-party notices are in [licenses](licenses/THIRD-PARTY-NOTICES.txt)
155
+ and the installed wheel metadata.
@@ -0,0 +1,128 @@
1
+ # FUSE — Fast Union Surface Extraction
2
+
3
+ FUSE reconstructs a triangle mesh approximating the solid union of one or more
4
+ closed meshes. It uses CUDA for field evaluation and surface extraction, sparse
5
+ NanoVDB indexing to reduce work around empty space, and a Python API for loading,
6
+ fusing, simplifying, comparing, and saving meshes.
7
+
8
+ Choose a uniform voxel size in your mesh's units to control sampling resolution.
9
+ FUSE handles overlapping solids, containment, disconnected components, and
10
+ resolved cavities. Optional CPU simplification reduces the output triangle count.
11
+ It is an approximate reconstruction tool: original triangles and subvoxel features
12
+ are not necessarily preserved.
13
+
14
+ ## Install
15
+
16
+ Use a Linux x86-64 wheel matching your CPython version (3.9–3.14). Download and
17
+ extract the corresponding `wheel-cp…` artifact from a successful
18
+ [GitHub Actions build](https://github.com/Ruochun/FUSE/actions/workflows/wheels.yml),
19
+ then install the **single matching wheel**:
20
+
21
+ ```bash
22
+ python -m pip install /path/to/fusemesh-<version>-<python>-<abi>-<platform>.whl
23
+ python -c 'import fusemesh; print(fusemesh.build_info()); print(fusemesh.smoke_test())'
24
+ ```
25
+
26
+ Replace the placeholder path with the downloaded filename. Reconstruction and
27
+ `smoke_test()` require an NVIDIA GPU and driver. Wheel installations include the
28
+ CUDA runtime and Python dependencies; a CUDA toolkit or compiler is not required.
29
+ Loading, saving, simplification, and quality comparisons run on the CPU without
30
+ initializing CUDA.
31
+
32
+ See [installation and compatibility](docs/installation.md) for GPU requirements,
33
+ source builds, and reinstalling a changed wheel with the same version number.
34
+
35
+ ## Fuse mesh files
36
+
37
+ ```python
38
+ import fusemesh
39
+
40
+ result = fusemesh.reconstruct(["a.off", "b.obj"], voxel_size=0.05)
41
+ fusemesh.save_mesh("union.obj", result)
42
+ print(result.metadata)
43
+ ```
44
+
45
+ A single path also works: `fusemesh.reconstruct("model.off", voxel_size=0.05)`.
46
+ For arrays, use `reconstruct([(vertices, faces)], voxel_size=0.05)`; each array
47
+ pair represents one solid. Returned vertices are float64 `(N, 3)` coordinates
48
+ and faces are uint64 `(M, 3)` indices.
49
+
50
+ From a repository checkout, run the file example:
51
+
52
+ ```bash
53
+ python examples/fuse_files.py a.off b.obj \
54
+ --voxel-size 0.05 --memory-mib 512 --output union.obj
55
+ ```
56
+
57
+ To try generated geometry without supplying a file:
58
+
59
+ ```bash
60
+ python examples/union_demo.py
61
+ ```
62
+
63
+ ## Reduce output triangles
64
+
65
+ ```python
66
+ reduced = fusemesh.simplify(result, max_error=0.01, target_faces=5000)
67
+ fusemesh.save_mesh("reduced.obj", reduced)
68
+ ```
69
+
70
+ Simplification checks surface and sharp-edge deviation, per-shell volume, and
71
+ manifold topology. `target_faces` is a soft goal; quality checks take priority.
72
+ `max_error` is relative to the mesh being simplified, not the original union
73
+ inputs. See [simplification](docs/simplification.md) for controls and limitations.
74
+
75
+ ## Measure surface accuracy
76
+
77
+ ```python
78
+ report = fusemesh.compare_surfaces(
79
+ "original.off", "reconstructed.obj", tolerance=0.05,
80
+ degenerate_faces="drop",
81
+ )
82
+ print(report["symmetric"]["rms"])
83
+ print(report["symmetric"]["f_score"])
84
+ ```
85
+
86
+ This CPU comparison accepts open or nonmanifold surfaces. The explicit `drop`
87
+ option excludes zero-area triangles and reports removal counts; the default is
88
+ `error`. Distances use mesh coordinate units. Coverage and F-score depend on the
89
+ chosen tolerance, and sampled maxima are not certified Hausdorff bounds.
90
+
91
+ From a checkout, compare existing files with
92
+ `python examples/quality_demo.py --inputs original.off reconstructed.obj`.
93
+ Without `--inputs`, the demo reconstructs two boxes and requires a GPU and the
94
+ `quality` extra. Multiple original solids also require that extra to construct
95
+ an independent Boolean reference union. See [quality comparisons](docs/quality.md)
96
+ for installation, metric definitions, and examples.
97
+
98
+ ## Reconstruction requirements and limits
99
+
100
+ - Inputs must describe closed, consistently oriented manifold solids.
101
+ `validation="basic"` skips topology checks but does not make open or
102
+ nonmanifold solids supported. Self-intersections are not detected or repaired.
103
+ - Trimesh loads local files. OFF faces must already be triangles; other formats
104
+ follow their reader's triangulation and grouping rules. See [mesh loading](docs/mesh-loading.md).
105
+ - Smaller voxel sizes can resolve finer detail but require more work and memory.
106
+ Thin walls, narrow gaps, and small components may disappear. Voxel size is not
107
+ a guaranteed surface-error bound; output is not guaranteed manifold in
108
+ degenerate or unresolved cases.
109
+ - The Python API defaults to a 512 MiB limit on explicit FUSE GPU buffers.
110
+ The file example defaults to 16 GiB; use `--memory-mib` to set it explicitly.
111
+ CUDA context memory and host memory are outside that limit.
112
+ - Reconstruction does not perform exact triangle Booleans, mesh repair, adaptive voxel
113
+ refinement, automatic smoothing, or material/texture transfer.
114
+
115
+ ## Documentation
116
+
117
+ Start with the [documentation index](docs/README.md), or go directly to:
118
+
119
+ - [Installation and compatibility](docs/installation.md)
120
+ - [Mesh loading and file examples](docs/mesh-loading.md)
121
+ - [Python and native API](docs/api.md)
122
+ - [Surface simplification](docs/simplification.md)
123
+ - [Reconstruction quality](docs/quality.md)
124
+ - [Troubleshooting](docs/troubleshooting.md)
125
+ - [Testing and benchmarks](docs/testing.md)
126
+
127
+ FUSE uses BSD-3-Clause. Third-party notices are in [licenses](licenses/THIRD-PARTY-NOTICES.txt)
128
+ and the installed wheel metadata.
fusemesh-0.2.0/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0