warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.whl
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.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/__init__.py +139 -0
- warp/__init__.pyi +1 -0
- warp/autograd.py +1142 -0
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +557 -0
- warp/build_dll.py +405 -0
- warp/builtins.py +6855 -0
- warp/codegen.py +3969 -0
- warp/config.py +158 -0
- warp/constants.py +57 -0
- warp/context.py +6812 -0
- warp/dlpack.py +462 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -0
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -0
- warp/examples/assets/nv_humanoid.xml +183 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/assets/quadruped.urdf +268 -0
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/assets/square_cloth.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +389 -0
- warp/examples/benchmarks/benchmark_cloth.py +296 -0
- warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
- warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
- warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
- warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
- warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
- warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
- warp/examples/benchmarks/benchmark_gemm.py +164 -0
- warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
- warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
- warp/examples/benchmarks/benchmark_launches.py +301 -0
- warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
- warp/examples/browse.py +37 -0
- warp/examples/core/example_cupy.py +86 -0
- warp/examples/core/example_dem.py +241 -0
- warp/examples/core/example_fluid.py +299 -0
- warp/examples/core/example_graph_capture.py +150 -0
- warp/examples/core/example_marching_cubes.py +194 -0
- warp/examples/core/example_mesh.py +180 -0
- warp/examples/core/example_mesh_intersect.py +211 -0
- warp/examples/core/example_nvdb.py +182 -0
- warp/examples/core/example_raycast.py +111 -0
- warp/examples/core/example_raymarch.py +205 -0
- warp/examples/core/example_render_opengl.py +193 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +423 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +178 -0
- warp/examples/fem/example_convection_diffusion_dg.py +204 -0
- warp/examples/fem/example_deformed_geometry.py +172 -0
- warp/examples/fem/example_diffusion.py +196 -0
- warp/examples/fem/example_diffusion_3d.py +225 -0
- warp/examples/fem/example_diffusion_mgpu.py +220 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_magnetostatics.py +240 -0
- warp/examples/fem/example_mixed_elasticity.py +291 -0
- warp/examples/fem/example_navier_stokes.py +261 -0
- warp/examples/fem/example_nonconforming_contact.py +298 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +352 -0
- warp/examples/fem/utils.py +1000 -0
- warp/examples/interop/example_jax_callable.py +116 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +205 -0
- warp/examples/optim/example_bounce.py +266 -0
- warp/examples/optim/example_cloth_throw.py +228 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_drone.py +870 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/optim/example_inverse_kinematics.py +182 -0
- warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
- warp/examples/optim/example_softbody_properties.py +400 -0
- warp/examples/optim/example_spring_cage.py +245 -0
- warp/examples/optim/example_trajectory.py +227 -0
- warp/examples/sim/example_cartpole.py +143 -0
- warp/examples/sim/example_cloth.py +225 -0
- warp/examples/sim/example_cloth_self_contact.py +322 -0
- warp/examples/sim/example_granular.py +130 -0
- warp/examples/sim/example_granular_collision_sdf.py +202 -0
- warp/examples/sim/example_jacobian_ik.py +244 -0
- warp/examples/sim/example_particle_chain.py +124 -0
- warp/examples/sim/example_quadruped.py +203 -0
- warp/examples/sim/example_rigid_chain.py +203 -0
- warp/examples/sim/example_rigid_contact.py +195 -0
- warp/examples/sim/example_rigid_force.py +133 -0
- warp/examples/sim/example_rigid_gyroscopic.py +115 -0
- warp/examples/sim/example_rigid_soft_contact.py +140 -0
- warp/examples/sim/example_soft_body.py +196 -0
- warp/examples/tile/example_tile_cholesky.py +87 -0
- warp/examples/tile/example_tile_convolution.py +66 -0
- warp/examples/tile/example_tile_fft.py +55 -0
- warp/examples/tile/example_tile_filtering.py +113 -0
- warp/examples/tile/example_tile_matmul.py +85 -0
- warp/examples/tile/example_tile_mlp.py +383 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/examples/tile/example_tile_walker.py +327 -0
- warp/fabric.py +355 -0
- warp/fem/__init__.py +106 -0
- warp/fem/adaptivity.py +508 -0
- warp/fem/cache.py +572 -0
- warp/fem/dirichlet.py +202 -0
- warp/fem/domain.py +411 -0
- warp/fem/field/__init__.py +125 -0
- warp/fem/field/field.py +619 -0
- warp/fem/field/nodal_field.py +326 -0
- warp/fem/field/restriction.py +37 -0
- warp/fem/field/virtual.py +848 -0
- warp/fem/geometry/__init__.py +32 -0
- warp/fem/geometry/adaptive_nanogrid.py +857 -0
- warp/fem/geometry/closest_point.py +84 -0
- warp/fem/geometry/deformed_geometry.py +221 -0
- warp/fem/geometry/element.py +776 -0
- warp/fem/geometry/geometry.py +362 -0
- warp/fem/geometry/grid_2d.py +392 -0
- warp/fem/geometry/grid_3d.py +452 -0
- warp/fem/geometry/hexmesh.py +911 -0
- warp/fem/geometry/nanogrid.py +571 -0
- warp/fem/geometry/partition.py +389 -0
- warp/fem/geometry/quadmesh.py +663 -0
- warp/fem/geometry/tetmesh.py +855 -0
- warp/fem/geometry/trimesh.py +806 -0
- warp/fem/integrate.py +2335 -0
- warp/fem/linalg.py +419 -0
- warp/fem/operator.py +293 -0
- warp/fem/polynomial.py +229 -0
- warp/fem/quadrature/__init__.py +17 -0
- warp/fem/quadrature/pic_quadrature.py +299 -0
- warp/fem/quadrature/quadrature.py +591 -0
- warp/fem/space/__init__.py +228 -0
- warp/fem/space/basis_function_space.py +468 -0
- warp/fem/space/basis_space.py +667 -0
- warp/fem/space/dof_mapper.py +251 -0
- warp/fem/space/function_space.py +309 -0
- warp/fem/space/grid_2d_function_space.py +177 -0
- warp/fem/space/grid_3d_function_space.py +227 -0
- warp/fem/space/hexmesh_function_space.py +257 -0
- warp/fem/space/nanogrid_function_space.py +201 -0
- warp/fem/space/partition.py +367 -0
- warp/fem/space/quadmesh_function_space.py +223 -0
- warp/fem/space/restriction.py +179 -0
- warp/fem/space/shape/__init__.py +143 -0
- warp/fem/space/shape/cube_shape_function.py +1105 -0
- warp/fem/space/shape/shape_function.py +133 -0
- warp/fem/space/shape/square_shape_function.py +926 -0
- warp/fem/space/shape/tet_shape_function.py +834 -0
- warp/fem/space/shape/triangle_shape_function.py +672 -0
- warp/fem/space/tetmesh_function_space.py +271 -0
- warp/fem/space/topology.py +424 -0
- warp/fem/space/trimesh_function_space.py +194 -0
- warp/fem/types.py +99 -0
- warp/fem/utils.py +420 -0
- warp/jax.py +187 -0
- warp/jax_experimental/__init__.py +16 -0
- warp/jax_experimental/custom_call.py +351 -0
- warp/jax_experimental/ffi.py +698 -0
- warp/jax_experimental/xla_ffi.py +602 -0
- warp/math.py +244 -0
- warp/native/array.h +1145 -0
- warp/native/builtin.h +1800 -0
- warp/native/bvh.cpp +492 -0
- warp/native/bvh.cu +791 -0
- warp/native/bvh.h +554 -0
- warp/native/clang/clang.cpp +536 -0
- warp/native/coloring.cpp +613 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +362 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +646 -0
- warp/native/cuda_util.h +307 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +1878 -0
- warp/native/fabric.h +245 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +87 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1230 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +339 -0
- warp/native/marching.cpp +19 -0
- warp/native/marching.cu +514 -0
- warp/native/marching.h +19 -0
- warp/native/mat.h +2220 -0
- warp/native/mathdx.cpp +87 -0
- warp/native/matnn.h +343 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +404 -0
- warp/native/mesh.h +1980 -0
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1371 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +139 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +364 -0
- warp/native/runlength_encode.cpp +79 -0
- warp/native/runlength_encode.cu +61 -0
- warp/native/scan.cpp +47 -0
- warp/native/scan.cu +53 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +277 -0
- warp/native/sort.h +33 -0
- warp/native/sparse.cpp +378 -0
- warp/native/sparse.cu +524 -0
- warp/native/spatial.h +657 -0
- warp/native/svd.h +702 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +2584 -0
- warp/native/tile_reduce.h +264 -0
- warp/native/vec.h +1426 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +67 -0
- warp/native/volume.h +969 -0
- warp/native/volume_builder.cu +477 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1082 -0
- warp/native/warp.cu +3636 -0
- warp/native/warp.h +381 -0
- warp/optim/__init__.py +17 -0
- warp/optim/adam.py +163 -0
- warp/optim/linear.py +1137 -0
- warp/optim/sgd.py +112 -0
- warp/paddle.py +407 -0
- warp/render/__init__.py +18 -0
- warp/render/render_opengl.py +3518 -0
- warp/render/render_usd.py +784 -0
- warp/render/utils.py +160 -0
- warp/sim/__init__.py +65 -0
- warp/sim/articulation.py +793 -0
- warp/sim/collide.py +2395 -0
- warp/sim/graph_coloring.py +300 -0
- warp/sim/import_mjcf.py +790 -0
- warp/sim/import_snu.py +227 -0
- warp/sim/import_urdf.py +579 -0
- warp/sim/import_usd.py +894 -0
- warp/sim/inertia.py +324 -0
- warp/sim/integrator.py +242 -0
- warp/sim/integrator_euler.py +1997 -0
- warp/sim/integrator_featherstone.py +2101 -0
- warp/sim/integrator_vbd.py +2048 -0
- warp/sim/integrator_xpbd.py +3292 -0
- warp/sim/model.py +4791 -0
- warp/sim/particles.py +121 -0
- warp/sim/render.py +427 -0
- warp/sim/utils.py +428 -0
- warp/sparse.py +2057 -0
- warp/stubs.py +3333 -0
- warp/tape.py +1203 -0
- warp/tests/__init__.py +1 -0
- warp/tests/__main__.py +4 -0
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/mlp_golden.npy +0 -0
- warp/tests/assets/pixel.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/assets/spiky.usd +0 -0
- warp/tests/assets/test_grid.nvdb +0 -0
- warp/tests/assets/test_index_grid.nvdb +0 -0
- warp/tests/assets/test_int32_grid.nvdb +0 -0
- warp/tests/assets/test_vec_grid.nvdb +0 -0
- warp/tests/assets/torus.nvdb +0 -0
- warp/tests/assets/torus.usda +105 -0
- warp/tests/aux_test_class_kernel.py +34 -0
- warp/tests/aux_test_compile_consts_dummy.py +18 -0
- warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
- warp/tests/aux_test_dependent.py +29 -0
- warp/tests/aux_test_grad_customs.py +29 -0
- warp/tests/aux_test_instancing_gc.py +26 -0
- warp/tests/aux_test_module_unload.py +23 -0
- warp/tests/aux_test_name_clash1.py +40 -0
- warp/tests/aux_test_name_clash2.py +40 -0
- warp/tests/aux_test_reference.py +9 -0
- warp/tests/aux_test_reference_reference.py +8 -0
- warp/tests/aux_test_square.py +16 -0
- warp/tests/aux_test_unresolved_func.py +22 -0
- warp/tests/aux_test_unresolved_symbol.py +22 -0
- warp/tests/cuda/__init__.py +0 -0
- warp/tests/cuda/test_async.py +676 -0
- warp/tests/cuda/test_ipc.py +124 -0
- warp/tests/cuda/test_mempool.py +233 -0
- warp/tests/cuda/test_multigpu.py +169 -0
- warp/tests/cuda/test_peer.py +139 -0
- warp/tests/cuda/test_pinned.py +84 -0
- warp/tests/cuda/test_streams.py +634 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +200 -0
- warp/tests/geometry/test_hash_grid.py +221 -0
- warp/tests/geometry/test_marching_cubes.py +74 -0
- warp/tests/geometry/test_mesh.py +316 -0
- warp/tests/geometry/test_mesh_query_aabb.py +399 -0
- warp/tests/geometry/test_mesh_query_point.py +932 -0
- warp/tests/geometry/test_mesh_query_ray.py +311 -0
- warp/tests/geometry/test_volume.py +1103 -0
- warp/tests/geometry/test_volume_write.py +346 -0
- warp/tests/interop/__init__.py +0 -0
- warp/tests/interop/test_dlpack.py +729 -0
- warp/tests/interop/test_jax.py +371 -0
- warp/tests/interop/test_paddle.py +800 -0
- warp/tests/interop/test_torch.py +1001 -0
- warp/tests/run_coverage_serial.py +39 -0
- warp/tests/sim/__init__.py +0 -0
- warp/tests/sim/disabled_kinematics.py +244 -0
- warp/tests/sim/flaky_test_sim_grad.py +290 -0
- warp/tests/sim/test_collision.py +604 -0
- warp/tests/sim/test_coloring.py +258 -0
- warp/tests/sim/test_model.py +224 -0
- warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
- warp/tests/sim/test_sim_kinematics.py +98 -0
- warp/tests/sim/test_vbd.py +597 -0
- warp/tests/test_adam.py +163 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +2972 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +250 -0
- warp/tests/test_atomic.py +153 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +1298 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +810 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +252 -0
- warp/tests/test_context.py +42 -0
- warp/tests/test_copy.py +238 -0
- warp/tests/test_ctypes.py +638 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +97 -0
- warp/tests/test_examples.py +482 -0
- warp/tests/test_fabricarray.py +996 -0
- warp/tests/test_fast_math.py +74 -0
- warp/tests/test_fem.py +2003 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +454 -0
- warp/tests/test_future_annotations.py +98 -0
- warp/tests/test_generics.py +656 -0
- warp/tests/test_grad.py +893 -0
- warp/tests/test_grad_customs.py +339 -0
- warp/tests/test_grad_debug.py +341 -0
- warp/tests/test_implicit_init.py +411 -0
- warp/tests/test_import.py +45 -0
- warp/tests/test_indexedarray.py +1140 -0
- warp/tests/test_intersect.py +73 -0
- warp/tests/test_iter.py +76 -0
- warp/tests/test_large.py +177 -0
- warp/tests/test_launch.py +411 -0
- warp/tests/test_lerp.py +151 -0
- warp/tests/test_linear_solvers.py +193 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_mat.py +2089 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +178 -0
- warp/tests/test_mlp.py +282 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +44 -0
- warp/tests/test_noise.py +252 -0
- warp/tests/test_operators.py +299 -0
- warp/tests/test_options.py +129 -0
- warp/tests/test_overwrite.py +551 -0
- warp/tests/test_print.py +339 -0
- warp/tests/test_quat.py +2315 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +302 -0
- warp/tests/test_rounding.py +185 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +105 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +582 -0
- warp/tests/test_spatial.py +2229 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +592 -0
- warp/tests/test_struct.py +734 -0
- warp/tests/test_tape.py +204 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +145 -0
- warp/tests/test_types.py +562 -0
- warp/tests/test_utils.py +588 -0
- warp/tests/test_vec.py +1487 -0
- warp/tests/test_vec_lite.py +80 -0
- warp/tests/test_vec_scalar_ops.py +2327 -0
- warp/tests/test_verify_fp.py +100 -0
- warp/tests/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +780 -0
- warp/tests/tile/test_tile_load.py +407 -0
- warp/tests/tile/test_tile_mathdx.py +208 -0
- warp/tests/tile/test_tile_mlp.py +402 -0
- warp/tests/tile/test_tile_reduce.py +447 -0
- warp/tests/tile/test_tile_shared_memory.py +247 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +427 -0
- warp/tests/unittest_utils.py +468 -0
- warp/tests/walkthrough_debug.py +93 -0
- warp/thirdparty/__init__.py +0 -0
- warp/thirdparty/appdirs.py +598 -0
- warp/thirdparty/dlpack.py +145 -0
- warp/thirdparty/unittest_parallel.py +570 -0
- warp/torch.py +391 -0
- warp/types.py +5230 -0
- warp/utils.py +1137 -0
- warp_lang-1.7.0.dist-info/METADATA +516 -0
- warp_lang-1.7.0.dist-info/RECORD +429 -0
- warp_lang-1.7.0.dist-info/WHEEL +5 -0
- warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
- warp_lang-1.7.0.dist-info/top_level.txt +1 -0
warp/native/bvh.cpp
ADDED
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include <vector>
|
|
19
|
+
#include <algorithm>
|
|
20
|
+
|
|
21
|
+
#include "bvh.h"
|
|
22
|
+
#include "warp.h"
|
|
23
|
+
#include "cuda_util.h"
|
|
24
|
+
|
|
25
|
+
#include <map>
|
|
26
|
+
|
|
27
|
+
using namespace wp;
|
|
28
|
+
|
|
29
|
+
namespace wp
|
|
30
|
+
{
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
34
|
+
|
|
35
|
+
class TopDownBVHBuilder
|
|
36
|
+
{
|
|
37
|
+
public:
|
|
38
|
+
|
|
39
|
+
void build(BVH& bvh, const vec3* lowers, const vec3* uppers, int n, int in_constructor_type);
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
|
|
43
|
+
bounds3 calc_bounds(const vec3* lowers, const vec3* uppers, const int* indices, int start, int end);
|
|
44
|
+
|
|
45
|
+
int partition_median(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds);
|
|
46
|
+
int partition_midpoint(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds);
|
|
47
|
+
float partition_sah(BVH& bvh, const vec3* lowers, const vec3* uppers,
|
|
48
|
+
int start, int end, bounds3 range_bounds, int& split_axis);
|
|
49
|
+
|
|
50
|
+
int build_recursive(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, int depth, int parent);
|
|
51
|
+
|
|
52
|
+
int constructor_type = -1;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
//////////////////////////////////////////////////////////////////////
|
|
56
|
+
|
|
57
|
+
void TopDownBVHBuilder::build(BVH& bvh, const vec3* lowers, const vec3* uppers, int n, int in_constructor_type)
|
|
58
|
+
{
|
|
59
|
+
constructor_type = in_constructor_type;
|
|
60
|
+
if (constructor_type != BVH_CONSTRUCTOR_SAH && constructor_type != BVH_CONSTRUCTOR_MEDIAN)
|
|
61
|
+
{
|
|
62
|
+
printf("Unrecognized Constructor type: %d! For CPU constructor it should be either SAH (%d) or Median (%d)!\n",
|
|
63
|
+
constructor_type, BVH_CONSTRUCTOR_SAH, BVH_CONSTRUCTOR_MEDIAN);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
bvh.max_depth = 0;
|
|
68
|
+
bvh.max_nodes = 2*n-1;
|
|
69
|
+
|
|
70
|
+
bvh.node_lowers = new BVHPackedNodeHalf[bvh.max_nodes];
|
|
71
|
+
bvh.node_uppers = new BVHPackedNodeHalf[bvh.max_nodes];
|
|
72
|
+
bvh.node_parents = new int[bvh.max_nodes];
|
|
73
|
+
bvh.node_counts = NULL;
|
|
74
|
+
|
|
75
|
+
// root is always in first slot for top down builders
|
|
76
|
+
bvh.root = new int[1];
|
|
77
|
+
bvh.root[0] = 0;
|
|
78
|
+
|
|
79
|
+
if (n == 0)
|
|
80
|
+
return;
|
|
81
|
+
|
|
82
|
+
bvh.primitive_indices = new int[n];
|
|
83
|
+
for (int i = 0; i < n; ++i)
|
|
84
|
+
bvh.primitive_indices[i] = i;
|
|
85
|
+
|
|
86
|
+
build_recursive(bvh, lowers, uppers, 0, n, 0, -1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
bounds3 TopDownBVHBuilder::calc_bounds(const vec3* lowers, const vec3* uppers, const int* indices, int start, int end)
|
|
91
|
+
{
|
|
92
|
+
bounds3 u;
|
|
93
|
+
|
|
94
|
+
for (int i=start; i < end; ++i)
|
|
95
|
+
{
|
|
96
|
+
u.add_bounds(lowers[indices[i]], uppers[indices[i]]);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return u;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
struct PartitionPredicateMedian
|
|
103
|
+
{
|
|
104
|
+
PartitionPredicateMedian(const vec3* lowers, const vec3* uppers, int a) : lowers(lowers), uppers(uppers), axis(a) {}
|
|
105
|
+
|
|
106
|
+
bool operator()(int a, int b) const
|
|
107
|
+
{
|
|
108
|
+
vec3 a_center = 0.5f*(lowers[a] + uppers[a]);
|
|
109
|
+
vec3 b_center = 0.5f*(lowers[b] + uppers[b]);
|
|
110
|
+
|
|
111
|
+
return a_center[axis] < b_center[axis];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const vec3* lowers;
|
|
115
|
+
const vec3* uppers;
|
|
116
|
+
int axis;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
int TopDownBVHBuilder::partition_median(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds)
|
|
121
|
+
{
|
|
122
|
+
assert(end-start >= 2);
|
|
123
|
+
|
|
124
|
+
vec3 edges = range_bounds.edges();
|
|
125
|
+
|
|
126
|
+
int axis = longest_axis(edges);
|
|
127
|
+
|
|
128
|
+
const int k = (start+end)/2;
|
|
129
|
+
|
|
130
|
+
std::nth_element(&indices[start], &indices[k], &indices[end], PartitionPredicateMedian(lowers, uppers, axis));
|
|
131
|
+
|
|
132
|
+
return k;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
struct PartitionPredicateMidPoint
|
|
136
|
+
{
|
|
137
|
+
PartitionPredicateMidPoint(const vec3* lowers, const vec3* uppers, int a, float m) : lowers(lowers), uppers(uppers), axis(a), mid(m) {}
|
|
138
|
+
|
|
139
|
+
bool operator()(int index) const
|
|
140
|
+
{
|
|
141
|
+
vec3 center = 0.5f*(lowers[index] + uppers[index]);
|
|
142
|
+
|
|
143
|
+
return center[axis] <= mid;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const vec3* lowers;
|
|
147
|
+
const vec3* uppers;
|
|
148
|
+
|
|
149
|
+
int axis;
|
|
150
|
+
float mid;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
int TopDownBVHBuilder::partition_midpoint(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds)
|
|
155
|
+
{
|
|
156
|
+
assert(end-start >= 2);
|
|
157
|
+
|
|
158
|
+
vec3 edges = range_bounds.edges();
|
|
159
|
+
vec3 center = range_bounds.center();
|
|
160
|
+
|
|
161
|
+
int axis = longest_axis(edges);
|
|
162
|
+
float mid = center[axis];
|
|
163
|
+
|
|
164
|
+
int* upper = std::partition(indices+start, indices+end, PartitionPredicateMidPoint(lowers, uppers, axis, mid));
|
|
165
|
+
|
|
166
|
+
int k = upper-indices;
|
|
167
|
+
|
|
168
|
+
// if we failed to split items then just split in the middle
|
|
169
|
+
if (k == start || k == end)
|
|
170
|
+
k = (start+end)/2;
|
|
171
|
+
|
|
172
|
+
return k;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
float TopDownBVHBuilder::partition_sah(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, bounds3 range_bounds, int& split_axis)
|
|
176
|
+
{
|
|
177
|
+
int buckets_counts[SAH_NUM_BUCKETS];
|
|
178
|
+
bounds3 buckets[SAH_NUM_BUCKETS];
|
|
179
|
+
float left_areas[SAH_NUM_BUCKETS - 1];
|
|
180
|
+
float right_areas[SAH_NUM_BUCKETS - 1];
|
|
181
|
+
|
|
182
|
+
assert(end - start >= 2);
|
|
183
|
+
|
|
184
|
+
int n = end - start;
|
|
185
|
+
vec3 edges = range_bounds.edges();
|
|
186
|
+
|
|
187
|
+
bounds3 b = calc_bounds(lowers, uppers, bvh.primitive_indices, start, end);
|
|
188
|
+
|
|
189
|
+
split_axis = longest_axis(edges);
|
|
190
|
+
|
|
191
|
+
// compute each bucket
|
|
192
|
+
float range_start = b.lower[split_axis];
|
|
193
|
+
float range_end = b.upper[split_axis];
|
|
194
|
+
|
|
195
|
+
std::fill(buckets_counts, buckets_counts + SAH_NUM_BUCKETS, 0);
|
|
196
|
+
for (int item_idx = start; item_idx < end; item_idx++)
|
|
197
|
+
{
|
|
198
|
+
vec3 item_center = 0.5f * (lowers[bvh.primitive_indices[item_idx]] + uppers[bvh.primitive_indices[item_idx]]);
|
|
199
|
+
int bucket_idx = SAH_NUM_BUCKETS * (item_center[split_axis] - range_start) / (range_end - range_start);
|
|
200
|
+
assert(bucket_idx >= 0 && bucket_idx <= SAH_NUM_BUCKETS);
|
|
201
|
+
// one of them will have the range_end, we put it into the last bucket
|
|
202
|
+
bucket_idx = bucket_idx < SAH_NUM_BUCKETS ? bucket_idx : SAH_NUM_BUCKETS - 1;
|
|
203
|
+
|
|
204
|
+
bounds3 item_bound(lowers[bvh.primitive_indices[item_idx]], uppers[bvh.primitive_indices[item_idx]]);
|
|
205
|
+
|
|
206
|
+
if (buckets_counts[bucket_idx])
|
|
207
|
+
{
|
|
208
|
+
buckets[bucket_idx] = bounds_union(item_bound, buckets[bucket_idx]);
|
|
209
|
+
}
|
|
210
|
+
else
|
|
211
|
+
{
|
|
212
|
+
buckets[bucket_idx] = item_bound;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
buckets_counts[bucket_idx]++;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
bounds3 left;
|
|
219
|
+
bounds3 right;
|
|
220
|
+
|
|
221
|
+
// n - 1 division points for n buckets
|
|
222
|
+
int counts_l[SAH_NUM_BUCKETS - 1];
|
|
223
|
+
int counts_r[SAH_NUM_BUCKETS - 1];
|
|
224
|
+
|
|
225
|
+
int count_l = 0;
|
|
226
|
+
int count_r = 0;
|
|
227
|
+
// build cumulative bounds and area from left and right
|
|
228
|
+
for (int i = 0; i < SAH_NUM_BUCKETS - 1; ++i)
|
|
229
|
+
{
|
|
230
|
+
bounds3 bound_start = buckets[i];
|
|
231
|
+
bounds3 bound_end = buckets[SAH_NUM_BUCKETS - i - 1];
|
|
232
|
+
|
|
233
|
+
left = bounds_union(left, bound_start);
|
|
234
|
+
right = bounds_union(right, bound_end);
|
|
235
|
+
|
|
236
|
+
left_areas[i] = left.area();
|
|
237
|
+
right_areas[SAH_NUM_BUCKETS - i - 2] = right.area();
|
|
238
|
+
|
|
239
|
+
count_l += buckets_counts[i];
|
|
240
|
+
count_r += buckets_counts[SAH_NUM_BUCKETS - i - 1];
|
|
241
|
+
|
|
242
|
+
counts_l[i] = count_l;
|
|
243
|
+
counts_r[SAH_NUM_BUCKETS - i - 2] = count_r;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
float invTotalArea = 1.0f / range_bounds.area();
|
|
247
|
+
|
|
248
|
+
// find split point i that minimizes area(left[i]) * count[left[i]] + area(right[i]) * count[right[i]]
|
|
249
|
+
int minSplit = 0;
|
|
250
|
+
float minCost = FLT_MAX;
|
|
251
|
+
for (int i = 0; i < SAH_NUM_BUCKETS - 1; ++i)
|
|
252
|
+
{
|
|
253
|
+
float pBelow = left_areas[i] * invTotalArea;
|
|
254
|
+
float pAbove = right_areas[i] * invTotalArea;
|
|
255
|
+
|
|
256
|
+
float cost = pBelow * counts_l[i] + pAbove * counts_r[i];
|
|
257
|
+
|
|
258
|
+
if (cost < minCost)
|
|
259
|
+
{
|
|
260
|
+
minCost = cost;
|
|
261
|
+
minSplit = i;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// return the dividing
|
|
266
|
+
assert(minSplit >= 0 && minSplit < SAH_NUM_BUCKETS - 1);
|
|
267
|
+
float split_point = range_start + (minSplit + 1) * (range_end - range_start) / SAH_NUM_BUCKETS;
|
|
268
|
+
|
|
269
|
+
return split_point;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
int TopDownBVHBuilder::build_recursive(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, int depth, int parent)
|
|
273
|
+
{
|
|
274
|
+
assert(start < end);
|
|
275
|
+
|
|
276
|
+
// printf("start %d end %d\n", start, end);
|
|
277
|
+
|
|
278
|
+
const int n = end - start;
|
|
279
|
+
const int node_index = bvh.num_nodes++;
|
|
280
|
+
|
|
281
|
+
assert(node_index < bvh.max_nodes);
|
|
282
|
+
|
|
283
|
+
if (depth > bvh.max_depth)
|
|
284
|
+
bvh.max_depth = depth;
|
|
285
|
+
|
|
286
|
+
bounds3 b = calc_bounds(lowers, uppers, bvh.primitive_indices, start, end);
|
|
287
|
+
|
|
288
|
+
// If the depth exceeds BVH_QUERY_STACK_SIZE, an out-of-bounds access bug may occur during querying.
|
|
289
|
+
// In that case, we merge the following nodes into a single large leaf node.
|
|
290
|
+
if (n <= BVH_LEAF_SIZE || depth >= BVH_QUERY_STACK_SIZE - 1)
|
|
291
|
+
{
|
|
292
|
+
bvh.node_lowers[node_index] = make_node(b.lower, start, true);
|
|
293
|
+
bvh.node_uppers[node_index] = make_node(b.upper, end, false);
|
|
294
|
+
bvh.node_parents[node_index] = parent;
|
|
295
|
+
bvh.num_leaf_nodes++;
|
|
296
|
+
}
|
|
297
|
+
else
|
|
298
|
+
{
|
|
299
|
+
int split = -1;
|
|
300
|
+
if (constructor_type == BVH_CONSTRUCTOR_SAH)
|
|
301
|
+
// SAH constructor
|
|
302
|
+
{
|
|
303
|
+
int split_axis = -1;
|
|
304
|
+
float split_point = partition_sah(bvh, lowers, uppers, start, end, b, split_axis);
|
|
305
|
+
auto boundary = std::partition(bvh.primitive_indices + start, bvh.primitive_indices + end,
|
|
306
|
+
[&](int i) {
|
|
307
|
+
return 0.5f * (lowers[i] + uppers[i])[split_axis] < split_point;
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
split = std::distance(bvh.primitive_indices + start, boundary) + start;
|
|
311
|
+
}
|
|
312
|
+
else if (constructor_type == BVH_CONSTRUCTOR_MEDIAN)
|
|
313
|
+
// Median constructor
|
|
314
|
+
{
|
|
315
|
+
split = partition_median(lowers, uppers, bvh.primitive_indices, start, end, b);
|
|
316
|
+
}
|
|
317
|
+
else
|
|
318
|
+
{
|
|
319
|
+
printf("Unknown type of BVH constructor: %d!\n", constructor_type);
|
|
320
|
+
return -1;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (split == start || split == end)
|
|
324
|
+
{
|
|
325
|
+
// partitioning failed, split down the middle
|
|
326
|
+
split = (start + end) / 2;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
int left_child = build_recursive(bvh, lowers, uppers, start, split, depth + 1, node_index);
|
|
330
|
+
int right_child = build_recursive(bvh, lowers, uppers, split, end, depth + 1, node_index);
|
|
331
|
+
|
|
332
|
+
bvh.node_lowers[node_index] = make_node(b.lower, left_child, false);
|
|
333
|
+
bvh.node_uppers[node_index] = make_node(b.upper, right_child, false);
|
|
334
|
+
bvh.node_parents[node_index] = parent;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return node_index;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
void bvh_refit_recursive(BVH& bvh, int index)
|
|
342
|
+
{
|
|
343
|
+
BVHPackedNodeHalf& lower = bvh.node_lowers[index];
|
|
344
|
+
BVHPackedNodeHalf& upper = bvh.node_uppers[index];
|
|
345
|
+
|
|
346
|
+
if (lower.b)
|
|
347
|
+
{
|
|
348
|
+
// update leaf from items
|
|
349
|
+
bounds3 bound;
|
|
350
|
+
for (int item_counter = lower.i; item_counter < upper.i; item_counter++)
|
|
351
|
+
{
|
|
352
|
+
const int item = bvh.primitive_indices[item_counter];
|
|
353
|
+
bound.add_bounds(bvh.item_lowers[item], bvh.item_uppers[item]);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
(vec3&)lower = bound.lower;
|
|
357
|
+
(vec3&)upper = bound.upper;
|
|
358
|
+
}
|
|
359
|
+
else
|
|
360
|
+
{
|
|
361
|
+
int left_index = lower.i;
|
|
362
|
+
int right_index = upper.i;
|
|
363
|
+
|
|
364
|
+
bvh_refit_recursive(bvh, left_index);
|
|
365
|
+
bvh_refit_recursive(bvh, right_index);
|
|
366
|
+
|
|
367
|
+
// compute union of children
|
|
368
|
+
const vec3& left_lower = (vec3&)bvh.node_lowers[left_index];
|
|
369
|
+
const vec3& left_upper = (vec3&)bvh.node_uppers[left_index];
|
|
370
|
+
|
|
371
|
+
const vec3& right_lower = (vec3&)bvh.node_lowers[right_index];
|
|
372
|
+
const vec3& right_upper = (vec3&)bvh.node_uppers[right_index];
|
|
373
|
+
|
|
374
|
+
// union of child bounds
|
|
375
|
+
vec3 new_lower = min(left_lower, right_lower);
|
|
376
|
+
vec3 new_upper = max(left_upper, right_upper);
|
|
377
|
+
|
|
378
|
+
// write new BVH nodes
|
|
379
|
+
(vec3&)lower = new_lower;
|
|
380
|
+
(vec3&)upper = new_upper;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
void bvh_refit_host(BVH& bvh)
|
|
385
|
+
{
|
|
386
|
+
bvh_refit_recursive(bvh, 0);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
} // namespace wp
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
// making the class accessible from python
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
namespace
|
|
397
|
+
{
|
|
398
|
+
// host-side copy of bvh descriptors, maps GPU bvh address (id) to a CPU desc
|
|
399
|
+
std::map<uint64_t, BVH> g_bvh_descriptors;
|
|
400
|
+
|
|
401
|
+
} // anonymous namespace
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
namespace wp
|
|
405
|
+
{
|
|
406
|
+
|
|
407
|
+
bool bvh_get_descriptor(uint64_t id, BVH& bvh)
|
|
408
|
+
{
|
|
409
|
+
const auto& iter = g_bvh_descriptors.find(id);
|
|
410
|
+
if (iter == g_bvh_descriptors.end())
|
|
411
|
+
return false;
|
|
412
|
+
else
|
|
413
|
+
bvh = iter->second;
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
void bvh_add_descriptor(uint64_t id, const BVH& bvh)
|
|
418
|
+
{
|
|
419
|
+
g_bvh_descriptors[id] = bvh;
|
|
420
|
+
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
void bvh_rem_descriptor(uint64_t id)
|
|
424
|
+
{
|
|
425
|
+
g_bvh_descriptors.erase(id);
|
|
426
|
+
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
// create in-place given existing descriptor
|
|
431
|
+
void bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type, BVH& bvh)
|
|
432
|
+
{
|
|
433
|
+
memset(&bvh, 0, sizeof(BVH));
|
|
434
|
+
|
|
435
|
+
bvh.item_lowers = lowers;
|
|
436
|
+
bvh.item_uppers = uppers;
|
|
437
|
+
bvh.num_items = num_items;
|
|
438
|
+
|
|
439
|
+
TopDownBVHBuilder builder;
|
|
440
|
+
builder.build(bvh, lowers, uppers, num_items, constructor_type);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
void bvh_destroy_host(BVH& bvh)
|
|
444
|
+
{
|
|
445
|
+
delete[] bvh.node_lowers;
|
|
446
|
+
delete[] bvh.node_uppers;
|
|
447
|
+
delete[] bvh.node_parents;
|
|
448
|
+
delete[] bvh.primitive_indices;
|
|
449
|
+
delete[] bvh.root;
|
|
450
|
+
|
|
451
|
+
bvh.node_lowers = NULL;
|
|
452
|
+
bvh.node_uppers = NULL;
|
|
453
|
+
bvh.node_parents = NULL;
|
|
454
|
+
bvh.primitive_indices = NULL;
|
|
455
|
+
bvh.root = NULL;
|
|
456
|
+
|
|
457
|
+
bvh.max_nodes = 0;
|
|
458
|
+
bvh.num_items = 0;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
} // namespace wp
|
|
462
|
+
|
|
463
|
+
uint64_t bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type)
|
|
464
|
+
{
|
|
465
|
+
BVH* bvh = new BVH();
|
|
466
|
+
wp::bvh_create_host(lowers, uppers, num_items, constructor_type, *bvh);
|
|
467
|
+
|
|
468
|
+
return (uint64_t)bvh;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
void bvh_refit_host(uint64_t id)
|
|
472
|
+
{
|
|
473
|
+
BVH* bvh = (BVH*)(id);
|
|
474
|
+
bvh_refit_host(*bvh);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
void bvh_destroy_host(uint64_t id)
|
|
478
|
+
{
|
|
479
|
+
BVH* bvh = (BVH*)(id);
|
|
480
|
+
bvh_destroy_host(*bvh);
|
|
481
|
+
delete bvh;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
// stubs for non-CUDA platforms
|
|
486
|
+
#if !WP_ENABLE_CUDA
|
|
487
|
+
|
|
488
|
+
uint64_t bvh_create_device(void* context, wp::vec3* lowers, wp::vec3* uppers, int num_items, int constructor_type) { return 0; }
|
|
489
|
+
void bvh_refit_device(uint64_t id) {}
|
|
490
|
+
void bvh_destroy_device(uint64_t id) {}
|
|
491
|
+
|
|
492
|
+
#endif // !WP_ENABLE_CUDA
|