warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0rc2__py3-none-manylinux_2_34_aarch64.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 +301 -287
- warp/__init__.pyi +794 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1382 -377
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +1 -1
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +57 -29
- warp/native/warp.cu +253 -171
- warp/native/warp.h +11 -8
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3618
- warp/render/render_usd.py +6 -919
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +772 -49
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +527 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +33 -14
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +56 -10
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +35 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_types.py +27 -15
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +178 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.1.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/native/bvh.h
CHANGED
|
@@ -20,7 +20,12 @@
|
|
|
20
20
|
#include "builtin.h"
|
|
21
21
|
#include "intersect.h"
|
|
22
22
|
|
|
23
|
-
#
|
|
23
|
+
#ifdef __CUDA_ARCH__
|
|
24
|
+
#define BVH_SHARED_STACK 1
|
|
25
|
+
#else
|
|
26
|
+
#define BVH_SHARED_STACK 0
|
|
27
|
+
#endif
|
|
28
|
+
|
|
24
29
|
#define SAH_NUM_BUCKETS (16)
|
|
25
30
|
#define USE_LOAD4
|
|
26
31
|
#define BVH_QUERY_STACK_SIZE (32)
|
|
@@ -34,133 +39,133 @@ namespace wp
|
|
|
34
39
|
|
|
35
40
|
struct bounds3
|
|
36
41
|
{
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
42
|
+
CUDA_CALLABLE inline bounds3() : lower( FLT_MAX)
|
|
43
|
+
, upper(-FLT_MAX) {}
|
|
44
|
+
|
|
45
|
+
CUDA_CALLABLE inline bounds3(const vec3& lower, const vec3& upper) : lower(lower), upper(upper) {}
|
|
46
|
+
|
|
47
|
+
CUDA_CALLABLE inline vec3 center() const { return 0.5f*(lower+upper); }
|
|
48
|
+
CUDA_CALLABLE inline vec3 edges() const { return upper-lower; }
|
|
49
|
+
|
|
50
|
+
CUDA_CALLABLE inline void expand(float r)
|
|
51
|
+
{
|
|
52
|
+
lower -= vec3(r);
|
|
53
|
+
upper += vec3(r);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
CUDA_CALLABLE inline void expand(const vec3& r)
|
|
57
|
+
{
|
|
58
|
+
lower -= r;
|
|
59
|
+
upper += r;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
CUDA_CALLABLE inline bool empty() const { return lower[0] >= upper[0] || lower[1] >= upper[1] || lower[2] >= upper[2]; }
|
|
63
|
+
|
|
64
|
+
CUDA_CALLABLE inline bool overlaps(const vec3& p) const
|
|
65
|
+
{
|
|
66
|
+
if (p[0] < lower[0] ||
|
|
67
|
+
p[1] < lower[1] ||
|
|
68
|
+
p[2] < lower[2] ||
|
|
69
|
+
p[0] > upper[0] ||
|
|
70
|
+
p[1] > upper[1] ||
|
|
71
|
+
p[2] > upper[2])
|
|
72
|
+
{
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
else
|
|
76
|
+
{
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
CUDA_CALLABLE inline bool overlaps(const bounds3& b) const
|
|
82
|
+
{
|
|
83
|
+
if (lower[0] > b.upper[0] ||
|
|
84
|
+
lower[1] > b.upper[1] ||
|
|
85
|
+
lower[2] > b.upper[2] ||
|
|
86
|
+
upper[0] < b.lower[0] ||
|
|
87
|
+
upper[1] < b.lower[1] ||
|
|
88
|
+
upper[2] < b.lower[2])
|
|
89
|
+
{
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
{
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
CUDA_CALLABLE inline bool overlaps(const vec3& b_lower, const vec3& b_upper) const
|
|
99
|
+
{
|
|
100
|
+
if (lower[0] > b_upper[0] ||
|
|
101
|
+
lower[1] > b_upper[1] ||
|
|
102
|
+
lower[2] > b_upper[2] ||
|
|
103
|
+
upper[0] < b_lower[0] ||
|
|
104
|
+
upper[1] < b_lower[1] ||
|
|
105
|
+
upper[2] < b_lower[2])
|
|
106
|
+
{
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
else
|
|
110
|
+
{
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
CUDA_CALLABLE inline void add_point(const vec3& p)
|
|
116
|
+
{
|
|
117
|
+
lower = min(lower, p);
|
|
118
|
+
upper = max(upper, p);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
CUDA_CALLABLE inline void add_bounds(const vec3& lower_other, const vec3& upper_other)
|
|
122
|
+
{
|
|
123
|
+
// lower_other will only impact the lower of the new bounds
|
|
124
|
+
// upper_other will only impact the upper of the new bounds
|
|
125
|
+
// this costs only half of the computation of adding lower_other and upper_other separately
|
|
126
|
+
lower = min(lower, lower_other);
|
|
127
|
+
upper = max(upper, upper_other);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
CUDA_CALLABLE inline float area() const
|
|
131
|
+
{
|
|
132
|
+
vec3 e = upper-lower;
|
|
133
|
+
return 2.0f*(e[0]*e[1] + e[0]*e[2] + e[1]*e[2]);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
vec3 lower;
|
|
137
|
+
vec3 upper;
|
|
133
138
|
};
|
|
134
139
|
|
|
135
140
|
CUDA_CALLABLE inline bounds3 bounds_union(const bounds3& a, const vec3& b)
|
|
136
141
|
{
|
|
137
|
-
|
|
142
|
+
return bounds3(min(a.lower, b), max(a.upper, b));
|
|
138
143
|
}
|
|
139
144
|
|
|
140
145
|
CUDA_CALLABLE inline bounds3 bounds_union(const bounds3& a, const bounds3& b)
|
|
141
146
|
{
|
|
142
|
-
|
|
147
|
+
return bounds3(min(a.lower, b.lower), max(a.upper, b.upper));
|
|
143
148
|
}
|
|
144
149
|
|
|
145
150
|
CUDA_CALLABLE inline bounds3 bounds_intersection(const bounds3& a, const bounds3& b)
|
|
146
151
|
{
|
|
147
|
-
|
|
152
|
+
return bounds3(max(a.lower, b.lower), min(a.upper, b.upper));
|
|
148
153
|
}
|
|
149
154
|
|
|
150
155
|
struct BVHPackedNodeHalf
|
|
151
156
|
{
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
157
|
+
float x;
|
|
158
|
+
float y;
|
|
159
|
+
float z;
|
|
160
|
+
// For non-leaf nodes:
|
|
161
|
+
// - 'lower.i' represents the index of the left child node.
|
|
162
|
+
// - 'upper.i' represents the index of the right child node.
|
|
163
|
+
//
|
|
164
|
+
// For leaf nodes:
|
|
165
|
+
// - 'lower.i' indicates the start index of the primitives in 'primitive_indices'.
|
|
166
|
+
// - 'upper.i' indicates the index just after the last primitive in 'primitive_indices'
|
|
167
|
+
unsigned int i : 31;
|
|
168
|
+
unsigned int b : 1;
|
|
164
169
|
};
|
|
165
170
|
|
|
166
171
|
struct BVH
|
|
@@ -168,30 +173,32 @@ struct BVH
|
|
|
168
173
|
BVHPackedNodeHalf* node_lowers;
|
|
169
174
|
BVHPackedNodeHalf* node_uppers;
|
|
170
175
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
176
|
+
// used for fast refits
|
|
177
|
+
int* node_parents;
|
|
178
|
+
int* node_counts;
|
|
179
|
+
// reordered primitive indices corresponds to the ordering of leaf nodes
|
|
180
|
+
int* primitive_indices;
|
|
181
|
+
|
|
182
|
+
int max_depth;
|
|
183
|
+
int max_nodes;
|
|
184
|
+
int num_nodes;
|
|
185
|
+
// since we use packed leaf nodes, the number of them is no longer the number of items, but variable
|
|
186
|
+
int num_leaf_nodes;
|
|
187
|
+
|
|
188
|
+
// pointer (CPU or GPU) to a single integer index in node_lowers, node_uppers
|
|
189
|
+
// representing the root of the tree, this is not always the first node
|
|
190
|
+
// for bottom-up builders
|
|
191
|
+
int* root;
|
|
192
|
+
|
|
193
|
+
// item bounds are not owned by the BVH but by the caller
|
|
189
194
|
vec3* item_lowers;
|
|
190
|
-
|
|
191
|
-
|
|
195
|
+
vec3* item_uppers;
|
|
196
|
+
int num_items;
|
|
192
197
|
|
|
193
|
-
|
|
194
|
-
|
|
198
|
+
int leaf_size;
|
|
199
|
+
|
|
200
|
+
// cuda context
|
|
201
|
+
void* context;
|
|
195
202
|
};
|
|
196
203
|
|
|
197
204
|
CUDA_CALLABLE inline BVHPackedNodeHalf make_node(const vec3& bound, int child, bool leaf)
|
|
@@ -220,17 +227,18 @@ CUDA_CALLABLE inline void make_node(volatile BVHPackedNodeHalf* n, const vec3& b
|
|
|
220
227
|
__device__ inline wp::BVHPackedNodeHalf bvh_load_node(const wp::BVHPackedNodeHalf* nodes, int index)
|
|
221
228
|
{
|
|
222
229
|
#ifdef USE_LOAD4
|
|
223
|
-
|
|
224
|
-
|
|
230
|
+
float4 f4 = __ldg((const float4*)(nodes)+index);
|
|
231
|
+
return (const wp::BVHPackedNodeHalf&)f4;
|
|
232
|
+
//return (const wp::BVHPackedNodeHalf&)(*((const float4*)(nodes)+index));
|
|
225
233
|
#else
|
|
226
|
-
|
|
234
|
+
return nodes[index];
|
|
227
235
|
#endif // USE_LOAD4
|
|
228
236
|
|
|
229
237
|
}
|
|
230
238
|
#else
|
|
231
239
|
inline wp::BVHPackedNodeHalf bvh_load_node(const wp::BVHPackedNodeHalf* nodes, int index)
|
|
232
240
|
{
|
|
233
|
-
|
|
241
|
+
return nodes[index];
|
|
234
242
|
}
|
|
235
243
|
#endif // __CUDACC__
|
|
236
244
|
|
|
@@ -272,10 +280,22 @@ CUDA_CALLABLE inline BVH bvh_get(uint64_t id)
|
|
|
272
280
|
|
|
273
281
|
CUDA_CALLABLE inline int bvh_get_num_bounds(uint64_t id)
|
|
274
282
|
{
|
|
275
|
-
|
|
276
|
-
|
|
283
|
+
BVH bvh = bvh_get(id);
|
|
284
|
+
return bvh.num_items;
|
|
277
285
|
}
|
|
278
286
|
|
|
287
|
+
// represents a strided stack in shared memory
|
|
288
|
+
// so each level of the stack is stored contiguously
|
|
289
|
+
// across the block
|
|
290
|
+
struct bvh_stack_t
|
|
291
|
+
{
|
|
292
|
+
inline int operator[](int depth) const { return ptr[depth*WP_TILE_BLOCK_DIM]; }
|
|
293
|
+
inline int& operator[](int depth) { return ptr[depth*WP_TILE_BLOCK_DIM]; }
|
|
294
|
+
|
|
295
|
+
int* ptr;
|
|
296
|
+
|
|
297
|
+
};
|
|
298
|
+
|
|
279
299
|
|
|
280
300
|
// stores state required to traverse the BVH nodes that
|
|
281
301
|
// overlap with a query AABB.
|
|
@@ -289,7 +309,7 @@ struct bvh_query_t
|
|
|
289
309
|
input_lower(),
|
|
290
310
|
input_upper(),
|
|
291
311
|
bounds_nr(0),
|
|
292
|
-
|
|
312
|
+
primitive_counter(-1)
|
|
293
313
|
{}
|
|
294
314
|
|
|
295
315
|
// Required for adjoint computations.
|
|
@@ -300,214 +320,194 @@ struct bvh_query_t
|
|
|
300
320
|
|
|
301
321
|
BVH bvh;
|
|
302
322
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
323
|
+
// BVH traversal stack:
|
|
324
|
+
#if BVH_SHARED_STACK
|
|
325
|
+
bvh_stack_t stack;
|
|
326
|
+
#else
|
|
327
|
+
int stack[BVH_QUERY_STACK_SIZE];
|
|
328
|
+
#endif
|
|
306
329
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
330
|
+
int count;
|
|
331
|
+
|
|
332
|
+
// >= 0 if currently in a packed leaf node
|
|
333
|
+
int primitive_counter;
|
|
334
|
+
|
|
310
335
|
// inputs
|
|
311
336
|
wp::vec3 input_lower; // start for ray
|
|
312
337
|
wp::vec3 input_upper; // dir for ray
|
|
313
338
|
|
|
314
|
-
|
|
315
|
-
|
|
339
|
+
int bounds_nr;
|
|
340
|
+
bool is_ray;
|
|
316
341
|
};
|
|
317
342
|
|
|
318
343
|
CUDA_CALLABLE inline bool bvh_query_intersection_test(const bvh_query_t& query, const vec3& node_lower, const vec3& node_upper)
|
|
319
344
|
{
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
345
|
+
if (query.is_ray)
|
|
346
|
+
{
|
|
347
|
+
float t = 0.0f;
|
|
348
|
+
return intersect_ray_aabb(query.input_lower, query.input_upper, node_lower, node_upper, t);
|
|
349
|
+
}
|
|
350
|
+
else
|
|
351
|
+
{
|
|
352
|
+
return intersect_aabb_aabb(query.input_lower, query.input_upper, node_lower, node_upper);
|
|
353
|
+
}
|
|
329
354
|
}
|
|
330
355
|
|
|
331
356
|
CUDA_CALLABLE inline bvh_query_t bvh_query(
|
|
332
|
-
|
|
357
|
+
uint64_t id, bool is_ray, const vec3& lower, const vec3& upper)
|
|
333
358
|
{
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
359
|
+
// This routine traverses the BVH tree until it finds
|
|
360
|
+
// the first overlapping bound.
|
|
361
|
+
|
|
362
|
+
// initialize empty
|
|
363
|
+
bvh_query_t query;
|
|
364
|
+
|
|
365
|
+
#if BVH_SHARED_STACK
|
|
366
|
+
__shared__ int stack[BVH_QUERY_STACK_SIZE*WP_TILE_BLOCK_DIM];
|
|
367
|
+
query.stack.ptr = &stack[threadIdx.x];
|
|
368
|
+
#endif
|
|
339
369
|
|
|
340
|
-
|
|
370
|
+
query.bounds_nr = -1;
|
|
341
371
|
|
|
342
|
-
|
|
372
|
+
BVH bvh = bvh_get(id);
|
|
343
373
|
|
|
344
|
-
|
|
345
|
-
|
|
374
|
+
query.bvh = bvh;
|
|
375
|
+
query.is_ray = is_ray;
|
|
346
376
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
377
|
+
// optimization: make the latest
|
|
378
|
+
query.stack[0] = *bvh.root;
|
|
379
|
+
query.count = 1;
|
|
380
|
+
query.input_lower = lower;
|
|
381
|
+
query.input_upper = upper;
|
|
352
382
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
383
|
+
// Navigate through the bvh, find the first overlapping leaf node.
|
|
384
|
+
while (query.count)
|
|
385
|
+
{
|
|
386
|
+
const int node_index = query.stack[--query.count];
|
|
387
|
+
BVHPackedNodeHalf node_lower = bvh_load_node(bvh.node_lowers, node_index);
|
|
388
|
+
BVHPackedNodeHalf node_upper = bvh_load_node(bvh.node_uppers, node_index);
|
|
359
389
|
|
|
360
390
|
if (!bvh_query_intersection_test(query, reinterpret_cast<vec3&>(node_lower), reinterpret_cast<vec3&>(node_upper)))
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
391
|
+
{
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
const int left_index = node_lower.i;
|
|
396
|
+
const int right_index = node_upper.i;
|
|
397
|
+
// Make bounds from this AABB
|
|
398
|
+
if (node_lower.b)
|
|
399
|
+
{
|
|
400
|
+
// Reached a leaf node, point to its first primitive
|
|
401
|
+
// Back up one level and return
|
|
402
|
+
query.primitive_counter = 0;
|
|
403
|
+
query.stack[query.count++] = node_index;
|
|
404
|
+
return query;
|
|
405
|
+
}
|
|
406
|
+
else
|
|
407
|
+
{
|
|
408
|
+
query.stack[query.count++] = left_index;
|
|
409
|
+
query.stack[query.count++] = right_index;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return query;
|
|
384
414
|
}
|
|
385
415
|
|
|
386
416
|
CUDA_CALLABLE inline bvh_query_t bvh_query_aabb(
|
|
387
417
|
uint64_t id, const vec3& lower, const vec3& upper)
|
|
388
418
|
{
|
|
389
|
-
|
|
419
|
+
return bvh_query(id, false, lower, upper);
|
|
390
420
|
}
|
|
391
421
|
|
|
392
|
-
|
|
393
|
-
CUDA_CALLABLE inline bvh_query_t bvh_query_ray(
|
|
394
|
-
uint64_t id, const vec3& start, const vec3& dir)
|
|
422
|
+
CUDA_CALLABLE inline bvh_query_t bvh_query_ray(uint64_t id, const vec3& start, const vec3& dir)
|
|
395
423
|
{
|
|
396
|
-
|
|
424
|
+
return bvh_query(id, true, start, 1.0f / dir);
|
|
397
425
|
}
|
|
398
426
|
|
|
399
427
|
//Stub
|
|
400
428
|
CUDA_CALLABLE inline void adj_bvh_query_aabb(uint64_t id, const vec3& lower, const vec3& upper,
|
|
401
|
-
|
|
429
|
+
uint64_t, vec3&, vec3&, bvh_query_t&)
|
|
402
430
|
{
|
|
403
431
|
}
|
|
404
432
|
|
|
405
433
|
|
|
406
434
|
CUDA_CALLABLE inline void adj_bvh_query_ray(uint64_t id, const vec3& start, const vec3& dir,
|
|
407
|
-
|
|
435
|
+
uint64_t, vec3&, vec3&, bvh_query_t&)
|
|
408
436
|
{
|
|
409
437
|
}
|
|
410
438
|
|
|
411
439
|
|
|
412
440
|
CUDA_CALLABLE inline bool bvh_query_next(bvh_query_t& query, int& index)
|
|
413
441
|
{
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
if (query.primitive_counter != -1)
|
|
417
|
-
// currently in a leaf node which is the last node in the stack
|
|
418
|
-
{
|
|
419
|
-
const int node_index = query.stack[query.count - 1];
|
|
420
|
-
BVHPackedNodeHalf node_lower = bvh_load_node(bvh.node_lowers, node_index);
|
|
421
|
-
BVHPackedNodeHalf node_upper = bvh_load_node(bvh.node_uppers, node_index);
|
|
422
|
-
|
|
423
|
-
const int end = node_upper.i;
|
|
424
|
-
for (int primitive_counter = query.primitive_counter; primitive_counter < end; primitive_counter++)
|
|
425
|
-
{
|
|
426
|
-
int primitive_index = bvh.primitive_indices[primitive_counter];
|
|
427
|
-
if (bvh_query_intersection_test(query, bvh.item_lowers[primitive_index], bvh.item_uppers[primitive_index]))
|
|
428
|
-
{
|
|
429
|
-
if (primitive_counter < end - 1)
|
|
430
|
-
// still need to come back to this leaf node for the leftover primitives
|
|
431
|
-
{
|
|
432
|
-
query.primitive_counter = primitive_counter + 1;
|
|
433
|
-
}
|
|
434
|
-
else
|
|
435
|
-
// no need to come back to this leaf node
|
|
436
|
-
{
|
|
437
|
-
query.count--;
|
|
438
|
-
query.primitive_counter = -1;
|
|
439
|
-
}
|
|
440
|
-
index = primitive_index;
|
|
441
|
-
query.bounds_nr = primitive_index;
|
|
442
|
-
|
|
443
|
-
return true;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
// if we reach here that means we have finished the current leaf node without finding intersections
|
|
447
|
-
query.primitive_counter = -1;
|
|
448
|
-
// remove the leaf node from the back of the stack because it is finished
|
|
449
|
-
// and continue the bvh traversal
|
|
450
|
-
query.count--;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// Navigate through the bvh, find the first overlapping leaf node.
|
|
454
|
-
while (query.count)
|
|
455
|
-
{
|
|
456
|
-
const int node_index = query.stack[--query.count];
|
|
457
|
-
BVHPackedNodeHalf node_lower = bvh_load_node(bvh.node_lowers, node_index);
|
|
458
|
-
BVHPackedNodeHalf node_upper = bvh_load_node(bvh.node_uppers, node_index);
|
|
459
|
-
|
|
460
|
-
const int left_index = node_lower.i;
|
|
461
|
-
const int right_index = node_upper.i;
|
|
462
|
-
|
|
463
|
-
wp::vec3 lower_pos(node_lower.x, node_lower.y, node_lower.z);
|
|
464
|
-
wp::vec3 upper_pos(node_upper.x, node_upper.y, node_upper.z);
|
|
465
|
-
wp::bounds3 current_bounds(lower_pos, upper_pos);
|
|
442
|
+
BVH bvh = query.bvh;
|
|
466
443
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
444
|
+
// Navigate through the bvh, find the first overlapping leaf node.
|
|
445
|
+
while (query.count)
|
|
446
|
+
{
|
|
447
|
+
const int node_index = query.stack[--query.count];
|
|
448
|
+
|
|
449
|
+
BVHPackedNodeHalf node_lower = bvh_load_node(bvh.node_lowers, node_index);
|
|
450
|
+
BVHPackedNodeHalf node_upper = bvh_load_node(bvh.node_uppers, node_index);
|
|
451
|
+
|
|
452
|
+
if (query.primitive_counter == 0) {
|
|
453
|
+
if (!bvh_query_intersection_test(query, reinterpret_cast<vec3&>(node_lower), reinterpret_cast<vec3&>(node_upper)))
|
|
454
|
+
{
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const int left_index = node_lower.i;
|
|
460
|
+
const int right_index = node_upper.i;
|
|
461
|
+
|
|
462
|
+
if (node_lower.b)
|
|
463
|
+
{
|
|
464
|
+
// found leaf, loop through its content primitives
|
|
465
|
+
const int start = left_index;
|
|
466
|
+
|
|
467
|
+
if (bvh.leaf_size == 1)
|
|
468
|
+
{
|
|
469
|
+
int primitive_index = bvh.primitive_indices[start];
|
|
470
|
+
index = primitive_index;
|
|
471
|
+
query.bounds_nr = primitive_index;
|
|
472
|
+
return true;
|
|
473
|
+
}
|
|
474
|
+
else
|
|
475
|
+
{
|
|
476
|
+
const int end = right_index;
|
|
477
|
+
int primitive_index = bvh.primitive_indices[start + (query.primitive_counter++)];
|
|
478
|
+
|
|
479
|
+
// if already visited the last primitive in the leaf node
|
|
480
|
+
// move to the next node and reset the primitive counter to 0
|
|
481
|
+
if (start + query.primitive_counter == end)
|
|
482
|
+
{
|
|
483
|
+
query.primitive_counter = 0;
|
|
484
|
+
}
|
|
485
|
+
// otherwise we need to keep this leaf node in stack for a future visit
|
|
486
|
+
else
|
|
487
|
+
{
|
|
488
|
+
query.stack[query.count++] = node_index;
|
|
489
|
+
}
|
|
490
|
+
// return true;
|
|
491
|
+
if (bvh_query_intersection_test(query, bvh.item_lowers[primitive_index], bvh.item_uppers[primitive_index]))
|
|
492
|
+
{
|
|
493
|
+
index = primitive_index;
|
|
494
|
+
query.bounds_nr = primitive_index;
|
|
495
|
+
|
|
496
|
+
return true;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
else
|
|
501
|
+
{
|
|
502
|
+
// if it's not a leaf node we treat it as if we have visited the last primitive
|
|
503
|
+
query.primitive_counter = 0;
|
|
504
|
+
query.stack[query.count++] = left_index;
|
|
505
|
+
query.stack[query.count++] = right_index;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return false;
|
|
508
509
|
}
|
|
509
510
|
|
|
510
|
-
|
|
511
511
|
CUDA_CALLABLE inline int iter_next(bvh_query_t& query)
|
|
512
512
|
{
|
|
513
513
|
return query.bounds_nr;
|
|
@@ -540,15 +540,16 @@ CUDA_CALLABLE bool bvh_get_descriptor(uint64_t id, BVH& bvh);
|
|
|
540
540
|
CUDA_CALLABLE void bvh_add_descriptor(uint64_t id, const BVH& bvh);
|
|
541
541
|
CUDA_CALLABLE void bvh_rem_descriptor(uint64_t id);
|
|
542
542
|
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
void bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type, BVH& bvh);
|
|
543
|
+
void bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type, BVH& bvh, int leaf_size);
|
|
546
544
|
void bvh_destroy_host(wp::BVH& bvh);
|
|
547
545
|
void bvh_refit_host(wp::BVH& bvh);
|
|
548
546
|
|
|
549
|
-
|
|
550
|
-
void bvh_refit_device(uint64_t id);
|
|
547
|
+
#if WP_ENABLE_CUDA
|
|
551
548
|
|
|
552
|
-
|
|
549
|
+
void bvh_create_device(void* context, vec3* lowers, vec3* uppers, int num_items, int constructor_type, BVH& bvh_device_on_host, int leaf_size);
|
|
550
|
+
void bvh_destroy_device(BVH& bvh);
|
|
551
|
+
void bvh_refit_device(BVH& bvh);
|
|
552
|
+
|
|
553
|
+
#endif // WP_ENABLE_CUDA
|
|
553
554
|
|
|
554
555
|
} // namespace wp
|