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.
- fusemesh-0.2.0/.clang-format +8 -0
- fusemesh-0.2.0/.cmake-format.yaml +4 -0
- fusemesh-0.2.0/.format_all +5 -0
- fusemesh-0.2.0/.github/actionlint.yaml +7 -0
- fusemesh-0.2.0/.github/workflows/wheels.yml +178 -0
- fusemesh-0.2.0/.gitignore +13 -0
- fusemesh-0.2.0/.gitmodules +3 -0
- fusemesh-0.2.0/CMakeLists.txt +137 -0
- fusemesh-0.2.0/LICENSE +28 -0
- fusemesh-0.2.0/PKG-INFO +155 -0
- fusemesh-0.2.0/README.md +128 -0
- fusemesh-0.2.0/VERSION +1 -0
- fusemesh-0.2.0/benchmarks/baselines/dense-rtx4060.json +365 -0
- fusemesh-0.2.0/benchmarks/baselines/reconstruction-before-optimization-rtx4060.json +2216 -0
- fusemesh-0.2.0/benchmarks/baselines/reconstruction-rtx4060.json +2793 -0
- fusemesh-0.2.0/benchmarks/baselines/sparse-original-rtx4060.json +1251 -0
- fusemesh-0.2.0/benchmarks/benchmark_simplify.py +91 -0
- fusemesh-0.2.0/benchmarks/m1_baseline.py +65 -0
- fusemesh-0.2.0/benchmarks/m2_sparse.py +69 -0
- fusemesh-0.2.0/benchmarks/m3_performance.py +181 -0
- fusemesh-0.2.0/bindings/module.cpp +115 -0
- fusemesh-0.2.0/cmake/FUSEConfig.cmake.in +4 -0
- fusemesh-0.2.0/cmake/build_config.h.in +5 -0
- fusemesh-0.2.0/docs/FUSE-design.md +162 -0
- fusemesh-0.2.0/docs/README.md +24 -0
- fusemesh-0.2.0/docs/api.md +161 -0
- fusemesh-0.2.0/docs/distribution-requirements.md +56 -0
- fusemesh-0.2.0/docs/installation.md +100 -0
- fusemesh-0.2.0/docs/mesh-loading.md +109 -0
- fusemesh-0.2.0/docs/quality.md +208 -0
- fusemesh-0.2.0/docs/releasing.md +156 -0
- fusemesh-0.2.0/docs/simplification.md +155 -0
- fusemesh-0.2.0/docs/testing.md +116 -0
- fusemesh-0.2.0/docs/troubleshooting.md +95 -0
- fusemesh-0.2.0/examples/fuse_files.py +107 -0
- fusemesh-0.2.0/examples/quality_demo.py +104 -0
- fusemesh-0.2.0/examples/union_demo.py +103 -0
- fusemesh-0.2.0/external/openvdb/LICENSE +176 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/CMakeLists.txt +428 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/CNanoVDB.h +958 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/GridHandle.h +707 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/HostBuffer.h +657 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/NanoVDB.h +6546 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/NodeManager.h +346 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/PNanoVDB.h +3604 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/Readme.md +15 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/CMakeLists.txt +48 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/convert/nanovdb_convert.cc +317 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/print/nanovdb_print.cc +331 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/updateFiles.py +222 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/updateFiles.sh +101 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cmd/validate/nanovdb_validate.cc +115 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/Buffer.h +481 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceBuffer.h +539 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceMesh.h +229 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceResource.h +358 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/DeviceStreamMap.h +124 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/GridHandle.cuh +279 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/HandleStorage.h +246 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/ManagedResource.h +73 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/NodeManager.cuh +193 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/PinnedResource.h +63 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/TempPool.h +89 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/cuda/UnifiedBuffer.h +355 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/docs/CMakeLists.txt +35 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/docs/codingstyle.txt +305 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/docs/doxygen-config +2354 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/CMakeLists.txt +151 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_bump_pool_buffer/bump_pool_buffer.cc +131 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_coarsen_nanovdb_cuda/coarsen_nanovdb_cuda.cpp +151 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_coarsen_nanovdb_cuda/coarsen_nanovdb_cuda_kernels.cu +58 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/common.h +29 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/main.cc +47 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/nanovdb.cu +159 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_collide_level_set/openvdb.cc +39 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_dilate_nanovdb_cuda/dilate_nanovdb_cuda.cpp +134 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_dilate_nanovdb_cuda/dilate_nanovdb_cuda_kernels.cu +104 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_index_grid_cuda/index_grid_cuda.cc +45 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_index_grid_cuda/index_grid_cuda_kernel.cu +44 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_custom_nanovdb/make_custom_nanovdb.cc +34 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_custom_nanovdb_cuda/make_custom_nanovdb_cuda.cc +51 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_custom_nanovdb_cuda/make_custom_nanovdb_cuda_kernel.cu +37 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_funny_nanovdb/make_funny_nanovdb.cc +34 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_mgpu_nanovdb/main.cu +316 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_nanovdb_sphere/make_nanovdb_sphere.cc +27 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_make_typed_grids/make_typed_grids.cc +95 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_map_pool_buffer/map_pool_buffer.cc +186 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_merge_nanovdb_cuda/merge_nanovdb_cuda.cpp +166 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_merge_nanovdb_cuda/merge_nanovdb_cuda_kernels.cu +61 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_mesh_to_grid_cuda/mesh_to_grid_cuda.cpp +179 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_mesh_to_grid_cuda/mesh_to_grid_cuda_kernels.cu +123 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_modify_nanovdb_thrust/modify_nanovdb_thrust.cc +45 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_modify_nanovdb_thrust/modify_nanovdb_thrust.cu +26 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_nodemanager_cuda/nodemanager_cuda.cc +55 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_nodemanager_cuda/nodemanager_cuda_kernel.cu +39 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb/openvdb_to_nanovdb.cc +31 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_accessor/openvdb_to_nanovdb_accessor.cc +43 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_cuda/openvdb_to_nanovdb_cuda.cc +44 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_cuda/openvdb_to_nanovdb_cuda_kernel.cu +28 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/common.h +147 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/main.cc +46 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/nanovdb.cu +111 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_fog_volume/openvdb.cc +92 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_iso_surface/common.h +189 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_iso_surface/main.cc +47 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_iso_surface/nanovdb.cu +67 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/common.h +177 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/main.cc +46 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/nanovdb.cu +143 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_raytrace_level_set/openvdb.cc +96 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere/read_nanovdb_sphere.cc +27 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor/read_nanovdb_sphere_accessor.cc +30 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda.cu +46 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda_kernel.cu +38 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_refine_nanovdb_cuda/refine_nanovdb_cuda.cpp +201 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_refine_nanovdb_cuda/refine_nanovdb_cuda_kernels.cu +58 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_util/ComputePrimitives.h +171 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_vox_to_nanovdb/VoxToNanoVDB.h +199 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_vox_to_nanovdb/vox_to_nanovdb.cc +31 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_voxels_to_grid_cuda/ex_voxels_to_grid_cuda.cu +52 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_voxels_to_grid_mgpu/ex_voxels_to_grid_mgpu.cu +63 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/examples/ex_write_nanovdb_grids/write_nanovdb_grids.cc +34 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/io/IO.h +782 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/CSampleFromVoxels.h +327 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/DitherLUT.h +189 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/HDDA.h +566 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Math.h +2247 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Proximity.h +150 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Ray.h +557 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/SampleFromVoxels.h +996 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/math/Stencils.h +1032 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/putil/IO.h +781 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/CMakeLists.txt +70 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/NanoVDBModule.cc +429 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyCreateNanoGrid.cc +55 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyCreateNanoGrid.h +20 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridChecksum.cc +36 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridChecksum.h +18 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridHandle.cc +27 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridHandle.h +75 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridStats.cc +23 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridStats.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridValidator.cc +29 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyGridValidator.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyHostBuffer.cc +17 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyHostBuffer.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyIO.cc +162 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyIO.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyMath.cc +409 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyMath.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyNanoToOpenVDB.cc +31 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyNanoToOpenVDB.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyPrimitives.cc +204 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyPrimitives.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PySampleFromVoxels.cc +88 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PySampleFromVoxels.h +19 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyTools.cc +61 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/PyTools.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/__init__.py +9 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyDeviceBuffer.cc +21 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyDeviceBuffer.h +18 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyDeviceGridHandle.cu +47 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyPointsToGrid.cu +58 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PyPointsToGrid.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySampleFromVoxels.cu +91 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySampleFromVoxels.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySignedFloodFill.cu +22 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/cuda/PySignedFloodFill.h +16 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/python/test/TestNanoVDB.py +923 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/CreateNanoGrid.h +2117 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/CreatePrimitives.h +1752 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridBuilder.h +2315 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridChecksum.h +422 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridStats.h +878 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/GridValidator.h +244 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/NanoToOpenVDB.h +558 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/VoxelBlockManager.h +476 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/AddBlindData.cuh +157 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/CoarsenGrid.cuh +257 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/DilateGrid.cuh +301 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/DistributedPointsToGrid.cuh +1239 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/GridChecksum.cuh +549 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/GridStats.cuh +371 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/GridValidator.cuh +59 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/IndexToGrid.cuh +459 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/MergeGrids.cuh +286 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/MeshToGrid.cuh +1200 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/PointsToGrid.cuh +1517 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/PruneGrid.cuh +260 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/RefineGrid.cuh +272 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/SignedFloodFill.cuh +278 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/TopologyBuilder.cuh +719 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/tools/cuda/VoxelBlockManager.cuh +441 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/CMakeLists.txt +93 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestBuffer.cu +1379 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestMemoryResource.cu +590 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestMultiGPU.cu +695 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestNanoVDB.cc +8823 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestNanoVDB.cu +4520 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestOpenVDB.cc +3597 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/TestUtilCuda.cu +75 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/unittest/pnanovdb_validate_strides.h +209 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/CpuTimer.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/CreateNanoGrid.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/DitherLUT.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/ForEach.h +116 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridBuilder.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridChecksum.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridStats.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/GridValidator.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/HDDA.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/HostBuffer.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/IO.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Invoke.h +97 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/MaskPrefixSum.h +224 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/MorphologyHelpers.h +127 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/NanoToOpenVDB.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/NodeManager.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/OpenToNanoVDB.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/PrefixSum.h +91 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Primitives.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Range.h +158 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Ray.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Reduce.h +133 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/SampleFromVoxels.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Stencils.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Timer.h +99 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/Util.h +751 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaAddBlindData.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaDeviceBuffer.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridChecksum.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridHandle.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridStats.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaGridValidator.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaIndexToGrid.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaNodeManager.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaPointsToGrid.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaSignedFloodFill.cuh +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/CudaUtils.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/DeviceGridTraits.cuh +89 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/GpuTimer.h +6 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Injection.cuh +197 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Morphology.cuh +907 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/MorphologyHelpers.cuh +128 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Rasterization.cuh +195 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Timer.h +163 -0
- fusemesh-0.2.0/external/openvdb/nanovdb/nanovdb/util/cuda/Util.h +401 -0
- fusemesh-0.2.0/include/fuse/reconstruct.h +44 -0
- fusemesh-0.2.0/include/fuse/smoke.h +13 -0
- fusemesh-0.2.0/include/fuse/version.h +5 -0
- fusemesh-0.2.0/licenses/CUB-LICENSE.txt +24 -0
- fusemesh-0.2.0/licenses/CUDA-12.8-EULA.txt +1632 -0
- fusemesh-0.2.0/licenses/LLVM-Apache-2.0-exception.txt +192 -0
- fusemesh-0.2.0/licenses/NanoVDB-Apache-2.0.txt +176 -0
- fusemesh-0.2.0/licenses/THIRD-PARTY-NOTICES.txt +46 -0
- fusemesh-0.2.0/licenses/nanobind-LICENSE.txt +26 -0
- fusemesh-0.2.0/licenses/robin-map-LICENSE.txt +21 -0
- fusemesh-0.2.0/pyproject.toml +80 -0
- fusemesh-0.2.0/python/fusemesh/__init__.py +167 -0
- fusemesh-0.2.0/python/fusemesh/io.py +177 -0
- fusemesh-0.2.0/python/fusemesh/quality.py +294 -0
- fusemesh-0.2.0/python/fusemesh/simplification.py +431 -0
- fusemesh-0.2.0/requirements/format.txt +6 -0
- fusemesh-0.2.0/requirements/release.txt +3 -0
- fusemesh-0.2.0/scripts/check_artifacts.py +187 -0
- fusemesh-0.2.0/scripts/check_no_driver.py +30 -0
- fusemesh-0.2.0/scripts/ci_gpu_test.sh +32 -0
- fusemesh-0.2.0/scripts/ci_native_build.sh +20 -0
- fusemesh-0.2.0/scripts/format_all.py +66 -0
- fusemesh-0.2.0/scripts/runtime_evidence.py +55 -0
- fusemesh-0.2.0/scripts/test_without_toolkit.sh +20 -0
- fusemesh-0.2.0/src/core/reconstruct.cpp +26 -0
- fusemesh-0.2.0/src/core/version.cpp +7 -0
- fusemesh-0.2.0/src/cuda/reconstruct.cu +529 -0
- fusemesh-0.2.0/src/cuda/smoke.cu +92 -0
- fusemesh-0.2.0/src/geometry/queries.cuh +124 -0
- fusemesh-0.2.0/src/geometry/scene.cpp +214 -0
- fusemesh-0.2.0/src/geometry/scene.h +86 -0
- fusemesh-0.2.0/src/meshing/cell.h +90 -0
- fusemesh-0.2.0/src/volume/topology.cpp +160 -0
- fusemesh-0.2.0/src/volume/topology.h +14 -0
- fusemesh-0.2.0/tests/geometry_helpers.py +198 -0
- fusemesh-0.2.0/tests/native_cells.cpp +45 -0
- fusemesh-0.2.0/tests/native_extraction.cpp +59 -0
- fusemesh-0.2.0/tests/native_reconstruct.cpp +32 -0
- fusemesh-0.2.0/tests/native_smoke.cpp +14 -0
- fusemesh-0.2.0/tests/native_version.cpp +8 -0
- fusemesh-0.2.0/tests/test_benchmark_policy.py +64 -0
- fusemesh-0.2.0/tests/test_io.py +261 -0
- fusemesh-0.2.0/tests/test_m3.py +86 -0
- fusemesh-0.2.0/tests/test_quality.py +322 -0
- fusemesh-0.2.0/tests/test_quality_demo.py +72 -0
- fusemesh-0.2.0/tests/test_reconstruct.py +324 -0
- fusemesh-0.2.0/tests/test_release_artifacts.py +64 -0
- fusemesh-0.2.0/tests/test_simplification.py +328 -0
- fusemesh-0.2.0/tests/test_smoke.py +63 -0
- fusemesh-0.2.0/tests/test_sparse.py +133 -0
|
@@ -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,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.
|
fusemesh-0.2.0/PKG-INFO
ADDED
|
@@ -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.
|
fusemesh-0.2.0/README.md
ADDED
|
@@ -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
|