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.

Files changed (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,477 @@
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 "volume_builder.h"
19
+
20
+ #include <nanovdb/tools/cuda/PointsToGrid.cuh>
21
+
22
+ #include <cuda.h>
23
+ #include <cuda_runtime_api.h>
24
+
25
+ #include <cub/cub.cuh>
26
+
27
+ #if defined(__NVCC_DIAG_PRAGMA_SUPPORT__)
28
+ // dynamic initialization is not supported for a function-scope static __shared__ variable within a
29
+ // __device__/__global__ function
30
+ #pragma nv_diag_suppress 20054
31
+ #elif defined(__NVCC__)
32
+ #pragma diag_suppress 20054
33
+ #endif
34
+ namespace
35
+ {
36
+ /// Allocator class following interface of cub::cachingDeviceAllocator, as expected by naovdb::PointsToGrid
37
+ struct Allocator
38
+ {
39
+
40
+ cudaError_t DeviceAllocate(void **d_ptr, ///< [out] Reference to pointer to the allocation
41
+ size_t bytes, ///< [in] Minimum number of bytes for the allocation
42
+ cudaStream_t active_stream) ///< [in] The stream to be associated with this allocation
43
+ {
44
+ // in PointsToGrid stream argument always coincide with current stream, ignore
45
+ *d_ptr = alloc_device(WP_CURRENT_CONTEXT, bytes);
46
+ return cudaSuccess;
47
+ }
48
+
49
+ cudaError_t DeviceFree(void *d_ptr)
50
+ {
51
+ free_device(WP_CURRENT_CONTEXT, d_ptr);
52
+ return cudaSuccess;
53
+ }
54
+
55
+ cudaError_t FreeAllCached()
56
+ {
57
+ return cudaSuccess;
58
+ }
59
+ };
60
+
61
+ /// @brief Implementation of NanoVDB's DeviceBuffer that uses warp allocators
62
+ class DeviceBuffer
63
+ {
64
+ uint64_t mSize; // total number of bytes managed by this buffer (assumed to be identical for host and device)
65
+ void *mCpuData, *mGpuData; // raw pointers to the host and device buffers
66
+ bool mManaged;
67
+
68
+ public:
69
+ /// @brief Static factory method that return an instance of this buffer
70
+ /// @param size byte size of buffer to be initialized
71
+ /// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
72
+ /// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
73
+ /// @param stream optional stream argument (defaults to stream NULL)
74
+ /// @return An instance of this class using move semantics
75
+ static DeviceBuffer create(uint64_t size, const DeviceBuffer *dummy = nullptr, bool host = true,
76
+ void *stream = nullptr)
77
+ {
78
+ return DeviceBuffer(size, host, stream);
79
+ }
80
+
81
+ /// @brief Static factory method that return an instance of this buffer that wraps externally managed memory
82
+ /// @param size byte size of buffer specified by external memory
83
+ /// @param cpuData pointer to externally managed host memory
84
+ /// @param gpuData pointer to externally managed device memory
85
+ /// @return An instance of this class using move semantics
86
+ static DeviceBuffer create(uint64_t size, void *cpuData, void *gpuData)
87
+ {
88
+ return DeviceBuffer(size, cpuData, gpuData);
89
+ }
90
+
91
+ /// @brief Constructor
92
+ /// @param size byte size of buffer to be initialized
93
+ /// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
94
+ /// @param stream optional stream argument (defaults to stream NULL)
95
+ DeviceBuffer(uint64_t size = 0, bool host = true, void *stream = nullptr)
96
+ : mSize(0), mCpuData(nullptr), mGpuData(nullptr), mManaged(false)
97
+ {
98
+ if (size > 0)
99
+ this->init(size, host, stream);
100
+ }
101
+
102
+ DeviceBuffer(uint64_t size, void *cpuData, void *gpuData)
103
+ : mSize(size), mCpuData(cpuData), mGpuData(gpuData), mManaged(false)
104
+ {
105
+ }
106
+
107
+ /// @brief Disallow copy-construction
108
+ DeviceBuffer(const DeviceBuffer &) = delete;
109
+
110
+ /// @brief Move copy-constructor
111
+ DeviceBuffer(DeviceBuffer &&other) noexcept
112
+ : mSize(other.mSize), mCpuData(other.mCpuData), mGpuData(other.mGpuData), mManaged(other.mManaged)
113
+ {
114
+ other.mSize = 0;
115
+ other.mCpuData = nullptr;
116
+ other.mGpuData = nullptr;
117
+ other.mManaged = false;
118
+ }
119
+
120
+ /// @brief Disallow copy assignment operation
121
+ DeviceBuffer &operator=(const DeviceBuffer &) = delete;
122
+
123
+ /// @brief Move copy assignment operation
124
+ DeviceBuffer &operator=(DeviceBuffer &&other) noexcept
125
+ {
126
+ this->clear();
127
+ mSize = other.mSize;
128
+ mCpuData = other.mCpuData;
129
+ mGpuData = other.mGpuData;
130
+ mManaged = other.mManaged;
131
+ other.mSize = 0;
132
+ other.mCpuData = nullptr;
133
+ other.mGpuData = nullptr;
134
+ other.mManaged = false;
135
+ return *this;
136
+ }
137
+
138
+ /// @brief Destructor frees memory on both the host and device
139
+ ~DeviceBuffer()
140
+ {
141
+ this->clear();
142
+ };
143
+
144
+ /// @brief Initialize buffer
145
+ /// @param size byte size of buffer to be initialized
146
+ /// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
147
+ /// @note All existing buffers are first cleared
148
+ /// @warning size is expected to be non-zero. Use clear() clear buffer!
149
+ void init(uint64_t size, bool host = true, void *stream = nullptr)
150
+ {
151
+ if (mSize > 0)
152
+ this->clear(stream);
153
+ NANOVDB_ASSERT(size > 0);
154
+ if (host)
155
+ {
156
+ mCpuData =
157
+ alloc_pinned(size); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
158
+ }
159
+ else
160
+ {
161
+ mGpuData = alloc_device(WP_CURRENT_CONTEXT, size);
162
+ }
163
+ mSize = size;
164
+ mManaged = true;
165
+ }
166
+
167
+ /// @brief Returns a raw pointer to the host/CPU buffer managed by this allocator.
168
+ /// @warning Note that the pointer can be NULL!
169
+ void *data() const
170
+ {
171
+ return mCpuData;
172
+ }
173
+
174
+ /// @brief Returns a raw pointer to the device/GPU buffer managed by this allocator.
175
+ /// @warning Note that the pointer can be NULL!
176
+ void *deviceData() const
177
+ {
178
+ return mGpuData;
179
+ }
180
+
181
+ /// @brief Returns the size in bytes of the raw memory buffer managed by this allocator.
182
+ uint64_t size() const
183
+ {
184
+ return mSize;
185
+ }
186
+
187
+ //@{
188
+ /// @brief Returns true if this allocator is empty, i.e. has no allocated memory
189
+ bool empty() const
190
+ {
191
+ return mSize == 0;
192
+ }
193
+ bool isEmpty() const
194
+ {
195
+ return mSize == 0;
196
+ }
197
+ //@}
198
+
199
+ /// @brief Detach device data so it is not dealloced when this buffer is destroyed
200
+ void detachDeviceData()
201
+ {
202
+ mGpuData = nullptr;
203
+ if (!mCpuData)
204
+ {
205
+ mSize = 0;
206
+ }
207
+ }
208
+
209
+ /// @brief De-allocate all memory managed by this allocator and set all pointers to NULL
210
+ void clear(void *stream = nullptr)
211
+ {
212
+ if (mManaged && mGpuData)
213
+ free_device(WP_CURRENT_CONTEXT, mGpuData);
214
+ if (mManaged && mCpuData)
215
+ free_pinned(mCpuData);
216
+ mCpuData = mGpuData = nullptr;
217
+ mSize = 0;
218
+ mManaged = false;
219
+ }
220
+
221
+ }; // DeviceBuffer class
222
+
223
+ template <typename Tree> __global__ void activateAllLeafVoxels(Tree *tree)
224
+ {
225
+ const unsigned leaf_count = tree->mNodeCount[0];
226
+
227
+ const unsigned tid = blockIdx.x * blockDim.x + threadIdx.x;
228
+
229
+ if (tid < leaf_count)
230
+ {
231
+ // activate all leaf voxels
232
+ typename Tree::LeafNodeType *const leaf_nodes = tree->getFirstLeaf();
233
+ typename Tree::LeafNodeType &leaf = leaf_nodes[tid];
234
+ leaf.mValueMask.setOn();
235
+ leaf.updateBBox();
236
+ }
237
+
238
+ if (tid == 0)
239
+ {
240
+ tree->mVoxelCount = Tree::LeafNodeType::SIZE * leaf_count; // full leaves
241
+ }
242
+ }
243
+
244
+ template <typename Node>
245
+ __device__ std::enable_if_t<!nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
246
+ Node &node, unsigned tile_id, const typename Node::BuildType background_value)
247
+ {
248
+ node.setValue(tile_id, background_value);
249
+ }
250
+
251
+ template <typename Node>
252
+ __device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
253
+ Node &node, unsigned tile_id, const typename Node::BuildType background_value)
254
+ {
255
+ }
256
+
257
+ template <typename Node>
258
+ __device__ std::enable_if_t<!nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
259
+ Node &node, const typename Node::BuildType background_value)
260
+ {
261
+ node.mBackground = background_value;
262
+ }
263
+
264
+ template <typename Node>
265
+ __device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
266
+ Node &node, const typename Node::BuildType background_value)
267
+ {
268
+ }
269
+
270
+ template <typename T>
271
+ struct alignas(alignof(T)) AlignedProxy
272
+ {
273
+ char data[sizeof(T)];
274
+ };
275
+
276
+ template <typename Tree, typename NodeT>
277
+ __global__ void setInternalBBoxAndBackgroundValue(Tree *tree, const typename Tree::BuildType background_value)
278
+ {
279
+ using BBox = nanovdb::math::BBox<typename NodeT::CoordT>;
280
+ using BBoxProxy = AlignedProxy<BBox>;
281
+
282
+ __shared__ BBoxProxy bbox_mem;
283
+
284
+ BBox& bbox = reinterpret_cast<BBox&>(bbox_mem);
285
+
286
+ const unsigned node_count = tree->mNodeCount[NodeT::LEVEL];
287
+ const unsigned node_id = blockIdx.x;
288
+
289
+ if (node_id < node_count)
290
+ {
291
+
292
+ if (threadIdx.x == 0)
293
+ {
294
+ new(&bbox) BBox();
295
+ }
296
+
297
+ __syncthreads();
298
+
299
+ NodeT &node = tree->template getFirstNode<NodeT>()[node_id];
300
+ for (unsigned child_id = threadIdx.x; child_id < NodeT::SIZE; child_id += blockDim.x)
301
+ {
302
+ if (node.isChild(child_id))
303
+ {
304
+ bbox.expandAtomic(node.getChild(child_id)->bbox());
305
+ }
306
+ else
307
+ {
308
+ setBackgroundValue(node, child_id, background_value);
309
+ }
310
+ }
311
+
312
+ __syncthreads();
313
+
314
+ if (threadIdx.x == 0)
315
+ {
316
+ node.mBBox = bbox;
317
+ }
318
+ }
319
+ }
320
+
321
+ template <typename Tree>
322
+ __global__ void setRootBBoxAndBackgroundValue(nanovdb::Grid<Tree> *grid,
323
+ const typename Tree::BuildType background_value)
324
+ {
325
+ using BBox = typename Tree::RootNodeType::BBoxType;
326
+ using BBoxProxy = AlignedProxy<BBox>;
327
+ __shared__ BBoxProxy bbox_mem;
328
+
329
+ BBox& bbox = reinterpret_cast<BBox&>(bbox_mem);
330
+
331
+ Tree &tree = grid->tree();
332
+ const unsigned upper_count = tree.mNodeCount[2];
333
+
334
+ if (threadIdx.x == 0)
335
+ {
336
+ new(&bbox) BBox();
337
+ }
338
+
339
+ __syncthreads();
340
+
341
+ for (unsigned upper_id = threadIdx.x; upper_id < upper_count; upper_id += blockDim.x)
342
+ {
343
+ typename Tree::UpperNodeType &upper = tree.getFirstUpper()[upper_id];
344
+ bbox.expandAtomic(upper.bbox());
345
+ }
346
+
347
+ __syncthreads();
348
+
349
+ if (threadIdx.x == 0)
350
+ {
351
+ typename Tree::RootNodeType &root = tree.root();
352
+ setBackgroundValue(root, background_value);
353
+ root.mBBox = bbox;
354
+
355
+ grid->mWorldBBox = root.mBBox.transform(grid->map());
356
+ }
357
+ }
358
+
359
+ template <typename BuildT>
360
+ void finalize_grid(nanovdb::Grid<nanovdb::NanoTree<BuildT>> &out_grid, const BuildGridParams<BuildT> &params)
361
+ {
362
+ // set background value, activate all voxels for allocated tiles and update bbox
363
+
364
+ using Tree = nanovdb::NanoTree<BuildT>;
365
+ Tree *tree = &out_grid.tree();
366
+
367
+ int node_counts[3];
368
+ memcpy_d2h(WP_CURRENT_CONTEXT, node_counts, tree->mNodeCount, sizeof(node_counts));
369
+ // synchronization below is unnecessary as node_counts is in pageable memory.
370
+ // keep it for clarity
371
+ cudaStream_t stream = static_cast<cudaStream_t>(cuda_stream_get_current());
372
+ cuda_stream_synchronize(stream);
373
+
374
+ const unsigned int leaf_count = node_counts[0];
375
+ const unsigned int lower_count = node_counts[1];
376
+ const unsigned int upper_count = node_counts[2];
377
+
378
+ constexpr unsigned NUM_THREADS = 256;
379
+ const unsigned leaf_blocks = (leaf_count + NUM_THREADS - 1) / NUM_THREADS;
380
+ activateAllLeafVoxels<Tree><<<leaf_blocks, NUM_THREADS, 0, stream>>>(tree);
381
+
382
+ setInternalBBoxAndBackgroundValue<Tree, typename Tree::LowerNodeType>
383
+ <<<lower_count, NUM_THREADS, 0, stream>>>(tree, params.background_value);
384
+ setInternalBBoxAndBackgroundValue<Tree, typename Tree::UpperNodeType>
385
+ <<<upper_count, NUM_THREADS, 0, stream>>>(tree, params.background_value);
386
+ setRootBBoxAndBackgroundValue<Tree><<<1, NUM_THREADS, 0, stream>>>(&out_grid, params.background_value);
387
+
388
+ check_cuda(cuda_context_check(WP_CURRENT_CONTEXT));
389
+ }
390
+
391
+ template <>
392
+ void finalize_grid(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> &out_grid,
393
+ const BuildGridParams<nanovdb::ValueOnIndex> &params)
394
+ {
395
+ // nothing to do for OnIndex grids
396
+ }
397
+
398
+ /// "fancy-pointer" that transforms from world to index coordinates
399
+ struct WorldSpacePointsPtr
400
+ {
401
+ const nanovdb::Vec3f *points;
402
+ const nanovdb::Map map;
403
+
404
+ __device__ nanovdb::Vec3f operator[](int idx) const
405
+ {
406
+ return map.applyInverseMapF(points[idx]);
407
+ }
408
+
409
+ __device__ nanovdb::Vec3f operator*() const
410
+ {
411
+ return (*this)[0];
412
+ }
413
+ };
414
+
415
+ } // namespace
416
+
417
+ namespace nanovdb
418
+ {
419
+ template <> struct BufferTraits<DeviceBuffer>
420
+ {
421
+ static constexpr bool hasDeviceDual = true;
422
+ };
423
+
424
+ } // namespace nanovdb
425
+
426
+ template <typename BuildT>
427
+ void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<BuildT>> *&out_grid, size_t &out_grid_size,
428
+ const void *points, size_t num_points, bool points_in_world_space,
429
+ const BuildGridParams<BuildT> &params)
430
+ {
431
+
432
+ out_grid = nullptr;
433
+ out_grid_size = 0;
434
+
435
+ cudaStream_t stream = static_cast<cudaStream_t>(cuda_stream_get_current());
436
+ nanovdb::tools::cuda::PointsToGrid<BuildT, Allocator> p2g(params.map, stream);
437
+
438
+ // p2g.setVerbose(2);
439
+ p2g.setGridName(params.name);
440
+ p2g.setChecksum(nanovdb::CheckMode::Disable);
441
+
442
+ // Only compute bbox for OnIndex grids. Otherwise bbox will be computed after activating all leaf voxels
443
+ p2g.includeBBox(nanovdb::BuildTraits<BuildT>::is_onindex);
444
+
445
+ nanovdb::GridHandle<DeviceBuffer> grid_handle;
446
+
447
+ if (points_in_world_space)
448
+ {
449
+ grid_handle = p2g.getHandle(WorldSpacePointsPtr{static_cast<const nanovdb::Vec3f *>(points), params.map}, num_points,
450
+ DeviceBuffer());
451
+ }
452
+ else
453
+ {
454
+ grid_handle = p2g.getHandle(static_cast<const nanovdb::Coord *>(points), num_points, DeviceBuffer());
455
+ }
456
+
457
+ out_grid = grid_handle.deviceGrid<BuildT>();
458
+ out_grid_size = grid_handle.gridSize();
459
+
460
+ finalize_grid(*out_grid, params);
461
+
462
+ // So that buffer is not destroyed when handles goes out of scope
463
+ grid_handle.buffer().detachDeviceData();
464
+ }
465
+
466
+
467
+ #define EXPAND_BUILDER_TYPE(type) \
468
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<type>> *&, size_t &, const void *, size_t, bool, \
469
+ const BuildGridParams<type> &);
470
+
471
+ WP_VOLUME_BUILDER_INSTANTIATE_TYPES
472
+ #undef EXPAND_BUILDER_TYPE
473
+
474
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueIndex>> *&, size_t &, const void *,
475
+ size_t, bool, const BuildGridParams<nanovdb::ValueIndex> &);
476
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> *&, size_t &, const void *,
477
+ size_t, bool, const BuildGridParams<nanovdb::ValueOnIndex> &);
@@ -0,0 +1,52 @@
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
+ #pragma once
19
+
20
+ #include <nanovdb/NanoVDB.h>
21
+
22
+ #define WP_VOLUME_BUILDER_INSTANTIATE_TYPES \
23
+ EXPAND_BUILDER_TYPE(int32_t) \
24
+ EXPAND_BUILDER_TYPE(float) \
25
+ EXPAND_BUILDER_TYPE(nanovdb::Vec3f) \
26
+ EXPAND_BUILDER_TYPE(nanovdb::Vec4f) \
27
+
28
+ template <typename BuildT> struct BuildGridParams
29
+ {
30
+ nanovdb::Map map;
31
+ BuildT background_value{0};
32
+ char name[256] = "";
33
+ };
34
+
35
+ template <> struct BuildGridParams<nanovdb::ValueIndex>
36
+ {
37
+ nanovdb::Map map;
38
+ nanovdb::ValueIndex background_value;
39
+ char name[256] = "";
40
+ };
41
+
42
+ template <> struct BuildGridParams<nanovdb::ValueOnIndex>
43
+ {
44
+ nanovdb::Map map;
45
+ double voxel_size = 1.0;
46
+ char name[256] = "";
47
+ };
48
+
49
+ template <typename BuildT>
50
+ void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<BuildT>>*& out_grid, size_t& out_grid_size,
51
+ const void* points, size_t num_points, bool points_in_world_space,
52
+ const BuildGridParams<BuildT>& params);
@@ -0,0 +1,70 @@
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
+ #pragma once
19
+
20
+ #include "volume.h"
21
+
22
+ // Helper functions for cpp/cu files, not to be exposed to user kernels
23
+
24
+ namespace wp
25
+ {
26
+
27
+ namespace volume
28
+ {
29
+
30
+ inline CUDA_CALLABLE pnanovdb_leaf_handle_t get_leaf(const pnanovdb_buf_t buf, const uint32_t leaf_id)
31
+ {
32
+ const pnanovdb_tree_handle_t tree = get_tree(buf);
33
+ const uint64_t first_leaf_offset = pnanovdb_tree_get_node_offset_leaf(buf, tree);
34
+ const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(get_grid_type(buf), leaf_size);
35
+ return {pnanovdb_address_offset64(tree.address, first_leaf_offset + uint64_t(leaf_id) * leaf_stride)};
36
+ }
37
+
38
+ inline CUDA_CALLABLE pnanovdb_coord_t leaf_origin(const pnanovdb_buf_t buf, const pnanovdb_leaf_handle_t leaf)
39
+ {
40
+ pnanovdb_coord_t origin = pnanovdb_leaf_get_bbox_min(buf, leaf);
41
+ // mask out last three bits corresponding to voxel coordinates within leaf
42
+ constexpr uint32_t MASK = (1u << 3u) - 1u;
43
+ origin.x &= ~MASK;
44
+ origin.y &= ~MASK;
45
+ origin.z &= ~MASK;
46
+ return origin;
47
+ }
48
+
49
+ inline CUDA_CALLABLE uint64_t leaf_voxel_index(const pnanovdb_buf_t buf, const uint32_t leaf_id,
50
+ const pnanovdb_coord_t &ijk)
51
+ {
52
+ const uint32_t grid_type = get_grid_type(buf);
53
+
54
+ const pnanovdb_leaf_handle_t leaf = get_leaf(buf, leaf_id);
55
+ const pnanovdb_address_t value_address = pnanovdb_leaf_get_value_address(grid_type, buf, leaf, &ijk);
56
+ return volume::get_grid_voxel_index(grid_type, buf, value_address, ijk) - 1;
57
+ }
58
+
59
+ inline CUDA_CALLABLE pnanovdb_coord_t leaf_offset_to_local_coord(uint32_t offset)
60
+ {
61
+ pnanovdb_coord_t coord;
62
+ coord.x = (offset >> 6) & 7;
63
+ coord.y = (offset >> 3) & 7;
64
+ coord.z = (offset >> 0) & 7;
65
+ return coord;
66
+ }
67
+
68
+ } // namespace volume
69
+
70
+ } // namespace wp