warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
warp/native/bvh.cpp ADDED
@@ -0,0 +1,562 @@
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 <cassert>
26
+ #include <map>
27
+ #include <climits>
28
+
29
+ using namespace wp;
30
+
31
+ namespace wp
32
+ {
33
+
34
+
35
+ /////////////////////////////////////////////////////////////////////////////////////////////
36
+
37
+ class TopDownBVHBuilder
38
+ {
39
+ public:
40
+
41
+ void build(BVH& bvh, const vec3* lowers, const vec3* uppers, int n, int in_constructor_type);
42
+ void rebuild(BVH& bvh, int in_constructor_type);
43
+
44
+ private:
45
+
46
+ void initialize_empty(BVH& bvh);
47
+
48
+ bounds3 calc_bounds(const vec3* lowers, const vec3* uppers, const int* indices, int start, int end);
49
+ int build_recursive(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, int depth, int parent);
50
+ int partition_median(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds);
51
+ int partition_midpoint(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds);
52
+ float partition_sah(BVH& bvh, const vec3* lowers, const vec3* uppers,
53
+ int start, int end, bounds3 range_bounds, int& split_axis);
54
+
55
+ int constructor_type = -1;
56
+ };
57
+
58
+ //////////////////////////////////////////////////////////////////////
59
+
60
+ void TopDownBVHBuilder::initialize_empty(BVH& bvh)
61
+ {
62
+ bvh.max_depth = 0;
63
+ bvh.max_nodes = 0;
64
+ bvh.node_lowers = nullptr;
65
+ bvh.node_uppers = nullptr;
66
+ bvh.node_parents = nullptr;
67
+ bvh.node_counts = nullptr;
68
+ bvh.root = nullptr;
69
+ bvh.primitive_indices = nullptr;
70
+ bvh.num_leaf_nodes = 0;
71
+ bvh.num_items = 0;
72
+ }
73
+
74
+ void TopDownBVHBuilder::build(BVH& bvh, const vec3* lowers, const vec3* uppers, int n, int in_constructor_type)
75
+ {
76
+ assert(n >= 0);
77
+ if (n > 0)
78
+ {
79
+ assert(lowers != nullptr && uppers != nullptr && "Pointers must be valid for n > 0");
80
+ }
81
+
82
+ constructor_type = in_constructor_type;
83
+ if (constructor_type != BVH_CONSTRUCTOR_SAH && constructor_type != BVH_CONSTRUCTOR_MEDIAN)
84
+ {
85
+ fprintf(stderr, "Unrecognized Constructor type: %d! For CPU constructor it should be either SAH (%d) or Median (%d)!\n",
86
+ constructor_type, BVH_CONSTRUCTOR_SAH, BVH_CONSTRUCTOR_MEDIAN);
87
+ return;
88
+ }
89
+
90
+ if (n < 0)
91
+ {
92
+ fprintf(stderr, "Error: Cannot build BVH with a negative primitive count: %d\n", n);
93
+ initialize_empty(bvh);
94
+ return;
95
+ }
96
+ else if (n == 0)
97
+ {
98
+ initialize_empty(bvh);
99
+ return;
100
+ }
101
+ else if (n > INT_MAX / 2)
102
+ {
103
+ fprintf(stderr, "Error: Primitive count %d is too large and would cause an integer overflow.\n", n);
104
+ initialize_empty(bvh);
105
+ return;
106
+ }
107
+
108
+ bvh.max_depth = 0;
109
+ bvh.max_nodes = 2*n-1;
110
+
111
+ bvh.node_lowers = new BVHPackedNodeHalf[bvh.max_nodes];
112
+ bvh.node_uppers = new BVHPackedNodeHalf[bvh.max_nodes];
113
+ bvh.node_parents = new int[bvh.max_nodes];
114
+ bvh.node_counts = nullptr;
115
+ bvh.num_items = n;
116
+
117
+ // root is always in first slot for top down builders
118
+ bvh.root = new int[1];
119
+ bvh.root[0] = 0;
120
+
121
+ bvh.primitive_indices = new int[n];
122
+ for (int i = 0; i < n; ++i)
123
+ bvh.primitive_indices[i] = i;
124
+
125
+ build_recursive(bvh, lowers, uppers, 0, n, 0, -1);
126
+ }
127
+
128
+ void TopDownBVHBuilder::rebuild(BVH& bvh, int in_constructor_type)
129
+ {
130
+ if (in_constructor_type != BVH_CONSTRUCTOR_SAH && in_constructor_type != BVH_CONSTRUCTOR_MEDIAN)
131
+ {
132
+ fprintf(stderr, "Unrecognized Constructor type: %d! For CPU constructor it should be either SAH (%d) or Median (%d)!\n",
133
+ in_constructor_type, BVH_CONSTRUCTOR_SAH, BVH_CONSTRUCTOR_MEDIAN);
134
+ return;
135
+ }
136
+ if (bvh.num_items == 0)
137
+ return;
138
+
139
+ constructor_type = in_constructor_type;
140
+ for (int i = 0; i < bvh.num_items; ++i)
141
+ bvh.primitive_indices[i] = i;
142
+
143
+ bvh.max_depth = 0;
144
+ bvh.num_nodes = 0;
145
+ bvh.num_leaf_nodes = 0;
146
+ build_recursive(bvh, bvh.item_lowers, bvh.item_uppers, 0, bvh.num_items, 0, -1);
147
+ }
148
+
149
+
150
+ bounds3 TopDownBVHBuilder::calc_bounds(const vec3* lowers, const vec3* uppers, const int* indices, int start, int end)
151
+ {
152
+ bounds3 u;
153
+
154
+ for (int i=start; i < end; ++i)
155
+ {
156
+ u.add_bounds(lowers[indices[i]], uppers[indices[i]]);
157
+ }
158
+
159
+ return u;
160
+ }
161
+
162
+ struct PartitionPredicateMedian
163
+ {
164
+ PartitionPredicateMedian(const vec3* lowers, const vec3* uppers, int a) : lowers(lowers), uppers(uppers), axis(a) {}
165
+
166
+ bool operator()(int a, int b) const
167
+ {
168
+ vec3 a_center = 0.5f*(lowers[a] + uppers[a]);
169
+ vec3 b_center = 0.5f*(lowers[b] + uppers[b]);
170
+
171
+ return a_center[axis] < b_center[axis];
172
+ }
173
+
174
+ const vec3* lowers;
175
+ const vec3* uppers;
176
+ int axis;
177
+ };
178
+
179
+
180
+ int TopDownBVHBuilder::partition_median(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds)
181
+ {
182
+ assert(end-start >= 2);
183
+
184
+ vec3 edges = range_bounds.edges();
185
+
186
+ int axis = longest_axis(edges);
187
+
188
+ const int k = (start+end)/2;
189
+
190
+ std::nth_element(&indices[start], &indices[k], &indices[end], PartitionPredicateMedian(lowers, uppers, axis));
191
+
192
+ return k;
193
+ }
194
+
195
+ struct PartitionPredicateMidPoint
196
+ {
197
+ PartitionPredicateMidPoint(const vec3* lowers, const vec3* uppers, int a, float m) : lowers(lowers), uppers(uppers), axis(a), mid(m) {}
198
+
199
+ bool operator()(int index) const
200
+ {
201
+ vec3 center = 0.5f*(lowers[index] + uppers[index]);
202
+
203
+ return center[axis] <= mid;
204
+ }
205
+
206
+ const vec3* lowers;
207
+ const vec3* uppers;
208
+
209
+ int axis;
210
+ float mid;
211
+ };
212
+
213
+
214
+ int TopDownBVHBuilder::partition_midpoint(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds)
215
+ {
216
+ assert(end-start >= 2);
217
+
218
+ vec3 edges = range_bounds.edges();
219
+ vec3 center = range_bounds.center();
220
+
221
+ int axis = longest_axis(edges);
222
+ float mid = center[axis];
223
+
224
+ int* upper = std::partition(indices+start, indices+end, PartitionPredicateMidPoint(lowers, uppers, axis, mid));
225
+
226
+ int k = upper-indices;
227
+
228
+ // if we failed to split items then just split in the middle
229
+ if (k == start || k == end)
230
+ k = (start+end)/2;
231
+
232
+ return k;
233
+ }
234
+
235
+ float TopDownBVHBuilder::partition_sah(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, bounds3 range_bounds, int& split_axis)
236
+ {
237
+ int buckets_counts[SAH_NUM_BUCKETS];
238
+ bounds3 buckets[SAH_NUM_BUCKETS];
239
+ float left_areas[SAH_NUM_BUCKETS - 1];
240
+ float right_areas[SAH_NUM_BUCKETS - 1];
241
+
242
+ assert(end - start >= 2);
243
+
244
+ int n = end - start;
245
+ vec3 edges = range_bounds.edges();
246
+
247
+ bounds3 b = calc_bounds(lowers, uppers, bvh.primitive_indices, start, end);
248
+
249
+ split_axis = longest_axis(edges);
250
+
251
+ // compute each bucket
252
+ float range_start = b.lower[split_axis];
253
+ float range_end = b.upper[split_axis];
254
+
255
+ std::fill(buckets_counts, buckets_counts + SAH_NUM_BUCKETS, 0);
256
+ for (int item_idx = start; item_idx < end; item_idx++)
257
+ {
258
+ vec3 item_center = 0.5f * (lowers[bvh.primitive_indices[item_idx]] + uppers[bvh.primitive_indices[item_idx]]);
259
+ int bucket_idx = SAH_NUM_BUCKETS * (item_center[split_axis] - range_start) / (range_end - range_start);
260
+ assert(bucket_idx >= 0 && bucket_idx <= SAH_NUM_BUCKETS);
261
+ // one of them will have the range_end, we put it into the last bucket
262
+ bucket_idx = bucket_idx < SAH_NUM_BUCKETS ? bucket_idx : SAH_NUM_BUCKETS - 1;
263
+
264
+ bounds3 item_bound(lowers[bvh.primitive_indices[item_idx]], uppers[bvh.primitive_indices[item_idx]]);
265
+
266
+ if (buckets_counts[bucket_idx])
267
+ {
268
+ buckets[bucket_idx] = bounds_union(item_bound, buckets[bucket_idx]);
269
+ }
270
+ else
271
+ {
272
+ buckets[bucket_idx] = item_bound;
273
+ }
274
+
275
+ buckets_counts[bucket_idx]++;
276
+ }
277
+
278
+ bounds3 left;
279
+ bounds3 right;
280
+
281
+ // n - 1 division points for n buckets
282
+ int counts_l[SAH_NUM_BUCKETS - 1];
283
+ int counts_r[SAH_NUM_BUCKETS - 1];
284
+
285
+ int count_l = 0;
286
+ int count_r = 0;
287
+ // build cumulative bounds and area from left and right
288
+ for (int i = 0; i < SAH_NUM_BUCKETS - 1; ++i)
289
+ {
290
+ bounds3 bound_start = buckets[i];
291
+ bounds3 bound_end = buckets[SAH_NUM_BUCKETS - i - 1];
292
+
293
+ left = bounds_union(left, bound_start);
294
+ right = bounds_union(right, bound_end);
295
+
296
+ left_areas[i] = left.area();
297
+ right_areas[SAH_NUM_BUCKETS - i - 2] = right.area();
298
+
299
+ count_l += buckets_counts[i];
300
+ count_r += buckets_counts[SAH_NUM_BUCKETS - i - 1];
301
+
302
+ counts_l[i] = count_l;
303
+ counts_r[SAH_NUM_BUCKETS - i - 2] = count_r;
304
+ }
305
+
306
+ float invTotalArea = 1.0f / range_bounds.area();
307
+
308
+ // find split point i that minimizes area(left[i]) * count[left[i]] + area(right[i]) * count[right[i]]
309
+ int minSplit = 0;
310
+ float minCost = FLT_MAX;
311
+ for (int i = 0; i < SAH_NUM_BUCKETS - 1; ++i)
312
+ {
313
+ float pBelow = left_areas[i] * invTotalArea;
314
+ float pAbove = right_areas[i] * invTotalArea;
315
+
316
+ float cost = pBelow * counts_l[i] + pAbove * counts_r[i];
317
+
318
+ if (cost < minCost)
319
+ {
320
+ minCost = cost;
321
+ minSplit = i;
322
+ }
323
+ }
324
+
325
+ // return the dividing
326
+ assert(minSplit >= 0 && minSplit < SAH_NUM_BUCKETS - 1);
327
+ float split_point = range_start + (minSplit + 1) * (range_end - range_start) / SAH_NUM_BUCKETS;
328
+
329
+ return split_point;
330
+ }
331
+
332
+ int TopDownBVHBuilder::build_recursive(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, int depth, int parent)
333
+ {
334
+ assert(start < end);
335
+
336
+ const int n = end - start;
337
+ const int node_index = bvh.num_nodes++;
338
+
339
+ assert(node_index < bvh.max_nodes);
340
+
341
+ if (depth > bvh.max_depth)
342
+ bvh.max_depth = depth;
343
+
344
+ bounds3 b = calc_bounds(lowers, uppers, bvh.primitive_indices, start, end);
345
+
346
+ // If the depth exceeds BVH_QUERY_STACK_SIZE, an out-of-bounds access bug may occur during querying.
347
+ // In that case, we merge the following nodes into a single large leaf node.
348
+ if (n <= bvh.leaf_size || depth >= BVH_QUERY_STACK_SIZE)
349
+ {
350
+ bvh.node_lowers[node_index] = make_node(b.lower, start, true);
351
+ bvh.node_uppers[node_index] = make_node(b.upper, end, false);
352
+ bvh.node_parents[node_index] = parent;
353
+ bvh.num_leaf_nodes++;
354
+ }
355
+ else
356
+ {
357
+ int split = -1;
358
+ if (constructor_type == BVH_CONSTRUCTOR_SAH)
359
+ // SAH constructor
360
+ {
361
+ int split_axis = -1;
362
+ float split_point = partition_sah(bvh, lowers, uppers, start, end, b, split_axis);
363
+ auto boundary = std::partition(bvh.primitive_indices + start, bvh.primitive_indices + end,
364
+ [&](int i) {
365
+ return 0.5f * (lowers[i] + uppers[i])[split_axis] < split_point;
366
+ });
367
+
368
+ split = std::distance(bvh.primitive_indices + start, boundary) + start;
369
+ }
370
+ else if (constructor_type == BVH_CONSTRUCTOR_MEDIAN)
371
+ // Median constructor
372
+ {
373
+ split = partition_median(lowers, uppers, bvh.primitive_indices, start, end, b);
374
+ }
375
+ else
376
+ {
377
+ printf("Unknown type of BVH constructor: %d!\n", constructor_type);
378
+ return -1;
379
+ }
380
+
381
+ if (split == start || split == end)
382
+ {
383
+ // partitioning failed, split down the middle
384
+ split = (start + end) / 2;
385
+ }
386
+
387
+ int left_child = build_recursive(bvh, lowers, uppers, start, split, depth + 1, node_index);
388
+ int right_child = build_recursive(bvh, lowers, uppers, split, end, depth + 1, node_index);
389
+
390
+ bvh.node_lowers[node_index] = make_node(b.lower, left_child, false);
391
+ bvh.node_uppers[node_index] = make_node(b.upper, right_child, false);
392
+ bvh.node_parents[node_index] = parent;
393
+ }
394
+
395
+ return node_index;
396
+ }
397
+
398
+
399
+ void bvh_refit_recursive(BVH& bvh, int index)
400
+ {
401
+ BVHPackedNodeHalf& lower = bvh.node_lowers[index];
402
+ BVHPackedNodeHalf& upper = bvh.node_uppers[index];
403
+
404
+ if (lower.b)
405
+ {
406
+ // update leaf from items
407
+ bounds3 bound;
408
+ for (int item_counter = lower.i; item_counter < upper.i; item_counter++)
409
+ {
410
+ const int item = bvh.primitive_indices[item_counter];
411
+ bound.add_bounds(bvh.item_lowers[item], bvh.item_uppers[item]);
412
+ }
413
+
414
+ reinterpret_cast<vec3&>(lower) = bound.lower;
415
+ reinterpret_cast<vec3&>(upper) = bound.upper;
416
+ }
417
+ else
418
+ {
419
+ int left_index = lower.i;
420
+ int right_index = upper.i;
421
+
422
+ bvh_refit_recursive(bvh, left_index);
423
+ bvh_refit_recursive(bvh, right_index);
424
+
425
+ // compute union of children
426
+ const vec3& left_lower = reinterpret_cast<const vec3&>(bvh.node_lowers[left_index]);
427
+ const vec3& left_upper = reinterpret_cast<const vec3&>(bvh.node_uppers[left_index]);
428
+
429
+ const vec3& right_lower = reinterpret_cast<const vec3&>(bvh.node_lowers[right_index]);
430
+ const vec3& right_upper = reinterpret_cast<const vec3&>(bvh.node_uppers[right_index]);
431
+
432
+ // union of child bounds
433
+ vec3 new_lower = min(left_lower, right_lower);
434
+ vec3 new_upper = max(left_upper, right_upper);
435
+
436
+ // write new BVH nodes
437
+ reinterpret_cast<vec3&>(lower) = new_lower;
438
+ reinterpret_cast<vec3&>(upper) = new_upper;
439
+ }
440
+ }
441
+
442
+ void bvh_refit_host(BVH& bvh)
443
+ {
444
+ bvh_refit_recursive(bvh, 0);
445
+ }
446
+ void bvh_rebuild_host(BVH& bvh, int constructor_type)
447
+ {
448
+ TopDownBVHBuilder builder;
449
+ builder.rebuild(bvh, constructor_type);
450
+ }
451
+
452
+ } // namespace wp
453
+
454
+
455
+ // making the class accessible from python
456
+
457
+
458
+ namespace
459
+ {
460
+ // host-side copy of bvh descriptors, maps GPU bvh address (id) to a CPU desc
461
+ std::map<uint64_t, BVH> g_bvh_descriptors;
462
+
463
+ } // anonymous namespace
464
+
465
+
466
+ namespace wp
467
+ {
468
+
469
+ bool bvh_get_descriptor(uint64_t id, BVH& bvh)
470
+ {
471
+ const auto& iter = g_bvh_descriptors.find(id);
472
+ if (iter == g_bvh_descriptors.end())
473
+ return false;
474
+ else
475
+ bvh = iter->second;
476
+ return true;
477
+ }
478
+
479
+ void bvh_add_descriptor(uint64_t id, const BVH& bvh)
480
+ {
481
+ g_bvh_descriptors[id] = bvh;
482
+
483
+ }
484
+
485
+ void bvh_rem_descriptor(uint64_t id)
486
+ {
487
+ g_bvh_descriptors.erase(id);
488
+
489
+ }
490
+
491
+
492
+ // create in-place given existing descriptor
493
+ void bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type, BVH& bvh, int leaf_size)
494
+ {
495
+ memset(&bvh, 0, sizeof(BVH));
496
+
497
+ bvh.item_lowers = lowers;
498
+ bvh.item_uppers = uppers;
499
+ bvh.num_items = num_items;
500
+ bvh.leaf_size = leaf_size;
501
+
502
+ TopDownBVHBuilder builder;
503
+ builder.build(bvh, lowers, uppers, num_items, constructor_type);
504
+ }
505
+
506
+ void bvh_destroy_host(BVH& bvh)
507
+ {
508
+ delete[] bvh.node_lowers;
509
+ delete[] bvh.node_uppers;
510
+ delete[] bvh.node_parents;
511
+ delete[] bvh.primitive_indices;
512
+ delete[] bvh.root;
513
+
514
+ bvh.node_lowers = nullptr;
515
+ bvh.node_uppers = nullptr;
516
+ bvh.node_parents = nullptr;
517
+ bvh.primitive_indices = nullptr;
518
+ bvh.root = nullptr;
519
+
520
+ bvh.max_nodes = 0;
521
+ bvh.num_items = 0;
522
+ }
523
+
524
+ } // namespace wp
525
+
526
+ uint64_t wp_bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type, int leaf_size)
527
+ {
528
+ BVH* bvh = new BVH();
529
+ wp::bvh_create_host(lowers, uppers, num_items, constructor_type, *bvh, leaf_size);
530
+
531
+ return (uint64_t)bvh;
532
+ }
533
+
534
+ void wp_bvh_refit_host(uint64_t id)
535
+ {
536
+ BVH* bvh = (BVH*)(id);
537
+ wp::bvh_refit_host(*bvh);
538
+ }
539
+
540
+ void wp_bvh_rebuild_host(uint64_t id, int constructor_type)
541
+ {
542
+ BVH* bvh = (BVH*)(id);
543
+ wp::bvh_rebuild_host(*bvh, constructor_type);
544
+ }
545
+
546
+ void wp_bvh_destroy_host(uint64_t id)
547
+ {
548
+ BVH* bvh = (BVH*)(id);
549
+ wp::bvh_destroy_host(*bvh);
550
+ delete bvh;
551
+ }
552
+
553
+
554
+ // stubs for non-CUDA platforms
555
+ #if !WP_ENABLE_CUDA
556
+
557
+ uint64_t wp_bvh_create_device(void* context, wp::vec3* lowers, wp::vec3* uppers, int num_items, int constructor_type, int leaf_size) { return 0; }
558
+ void wp_bvh_refit_device(uint64_t id) {}
559
+ void wp_bvh_destroy_device(uint64_t id) {}
560
+ void wp_bvh_rebuild_device(uint64_t id) {}
561
+
562
+ #endif // !WP_ENABLE_CUDA