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
@@ -0,0 +1,180 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ ###########################################################################
17
+ # Example Mesh
18
+ #
19
+ # Shows how to implement a PBD particle simulation with collision against
20
+ # a deforming triangle mesh. The mesh collision uses wp.mesh_query_point_sign_normal()
21
+ # to compute the closest point, and wp.Mesh.refit() to update the mesh
22
+ # object after deformation.
23
+ #
24
+ ###########################################################################
25
+
26
+ import os
27
+
28
+ import numpy as np
29
+ from pxr import Usd, UsdGeom
30
+
31
+ import warp as wp
32
+ import warp.examples
33
+ import warp.render
34
+
35
+
36
+ @wp.kernel
37
+ def deform(positions: wp.array(dtype=wp.vec3), t: float):
38
+ tid = wp.tid()
39
+
40
+ x = positions[tid]
41
+
42
+ offset = -wp.sin(x[0]) * 0.02
43
+ scale = wp.sin(t)
44
+
45
+ x = x + wp.vec3(0.0, offset * scale, 0.0)
46
+
47
+ positions[tid] = x
48
+
49
+
50
+ @wp.kernel
51
+ def simulate(
52
+ positions: wp.array(dtype=wp.vec3),
53
+ velocities: wp.array(dtype=wp.vec3),
54
+ mesh: wp.uint64,
55
+ margin: float,
56
+ dt: float,
57
+ ):
58
+ tid = wp.tid()
59
+
60
+ x = positions[tid]
61
+ v = velocities[tid]
62
+
63
+ v = v + wp.vec3(0.0, 0.0 - 9.8, 0.0) * dt - v * 0.1 * dt
64
+ xpred = x + v * dt
65
+
66
+ max_dist = 1.5
67
+
68
+ query = wp.mesh_query_point_sign_normal(mesh, xpred, max_dist)
69
+ if query.result:
70
+ p = wp.mesh_eval_position(mesh, query.face, query.u, query.v)
71
+
72
+ delta = xpred - p
73
+
74
+ dist = wp.length(delta) * query.sign
75
+ err = dist - margin
76
+
77
+ # mesh collision
78
+ if err < 0.0:
79
+ n = wp.normalize(delta) * query.sign
80
+ xpred = xpred - n * err
81
+
82
+ # pbd update
83
+ v = (xpred - x) * (1.0 / dt)
84
+ x = xpred
85
+
86
+ positions[tid] = x
87
+ velocities[tid] = v
88
+
89
+
90
+ class Example:
91
+ def __init__(self, stage_path="example_mesh.usd"):
92
+ rng = np.random.default_rng(42)
93
+ self.num_particles = 1000
94
+
95
+ self.sim_dt = 1.0 / 60.0
96
+
97
+ self.sim_time = 0.0
98
+ self.sim_timers = {}
99
+
100
+ self.sim_margin = 0.1
101
+
102
+ usd_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"))
103
+ usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath("/root/bunny"))
104
+ usd_scale = 10.0
105
+
106
+ # create collision mesh
107
+ self.mesh = wp.Mesh(
108
+ points=wp.array(usd_geom.GetPointsAttr().Get() * usd_scale, dtype=wp.vec3),
109
+ indices=wp.array(usd_geom.GetFaceVertexIndicesAttr().Get(), dtype=int),
110
+ )
111
+
112
+ # random particles
113
+ init_pos = (rng.random((self.num_particles, 3)) - np.array([0.5, -1.5, 0.5])) * 10.0
114
+ init_vel = rng.random((self.num_particles, 3)) * 0.0
115
+
116
+ self.positions = wp.from_numpy(init_pos, dtype=wp.vec3)
117
+ self.velocities = wp.from_numpy(init_vel, dtype=wp.vec3)
118
+
119
+ # renderer
120
+ self.renderer = None
121
+ if stage_path:
122
+ self.renderer = wp.render.UsdRenderer(stage_path)
123
+
124
+ def step(self):
125
+ with wp.ScopedTimer("step", dict=self.sim_timers):
126
+ wp.launch(kernel=deform, dim=len(self.mesh.points), inputs=[self.mesh.points, self.sim_time])
127
+
128
+ # refit the mesh BVH to account for the deformation
129
+ self.mesh.refit()
130
+
131
+ wp.launch(
132
+ kernel=simulate,
133
+ dim=self.num_particles,
134
+ inputs=[self.positions, self.velocities, self.mesh.id, self.sim_margin, self.sim_dt],
135
+ )
136
+
137
+ self.sim_time += self.sim_dt
138
+
139
+ def render(self):
140
+ if self.renderer is None:
141
+ return
142
+
143
+ with wp.ScopedTimer("render"):
144
+ self.renderer.begin_frame(self.sim_time)
145
+ self.renderer.render_mesh(
146
+ name="mesh",
147
+ points=self.mesh.points.numpy(),
148
+ indices=self.mesh.indices.numpy(),
149
+ colors=(0.35, 0.55, 0.9),
150
+ )
151
+ self.renderer.render_points(
152
+ name="points", points=self.positions.numpy(), radius=self.sim_margin, colors=(0.8, 0.3, 0.2)
153
+ )
154
+ self.renderer.end_frame()
155
+
156
+
157
+ if __name__ == "__main__":
158
+ import argparse
159
+
160
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
161
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
162
+ parser.add_argument(
163
+ "--stage_path",
164
+ type=lambda x: None if x == "None" else str(x),
165
+ default="example_mesh.usd",
166
+ help="Path to the output USD file.",
167
+ )
168
+ parser.add_argument("--num_frames", type=int, default=500, help="Total number of frames.")
169
+
170
+ args = parser.parse_known_args()[0]
171
+
172
+ with wp.ScopedDevice(args.device):
173
+ example = Example(stage_path=args.stage_path)
174
+
175
+ for _ in range(args.num_frames):
176
+ example.step()
177
+ example.render()
178
+
179
+ if example.renderer:
180
+ example.renderer.save()
@@ -0,0 +1,211 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ #############################################################################
17
+ # Example Mesh Intersection
18
+ #
19
+ # Show how to use built-in BVH query to test if two triangle meshes intersect.
20
+ #
21
+ ##############################################################################
22
+
23
+ import os
24
+
25
+ import numpy as np
26
+ from pxr import Usd, UsdGeom
27
+
28
+ import warp as wp
29
+ import warp.examples
30
+ import warp.render
31
+
32
+
33
+ @wp.func
34
+ def cw_min(a: wp.vec3, b: wp.vec3):
35
+ return wp.vec3(wp.min(a[0], b[0]), wp.min(a[1], b[1]), wp.min(a[2], b[2]))
36
+
37
+
38
+ @wp.func
39
+ def cw_max(a: wp.vec3, b: wp.vec3):
40
+ return wp.vec3(wp.max(a[0], b[0]), wp.max(a[1], b[1]), wp.max(a[2], b[2]))
41
+
42
+
43
+ @wp.kernel
44
+ def intersect(
45
+ mesh_0: wp.uint64,
46
+ mesh_1: wp.uint64,
47
+ num_faces: int,
48
+ xforms: wp.array(dtype=wp.transform),
49
+ result: wp.array(dtype=int),
50
+ ):
51
+ tid = wp.tid()
52
+
53
+ # mesh_0 is assumed to be the query mesh, we launch one thread
54
+ # for each face in mesh_0 and test it against the opposing mesh's BVH
55
+ face = tid % num_faces
56
+ batch = tid // num_faces
57
+
58
+ # transforms from mesh_0 -> mesh_1 space
59
+ xform = xforms[batch]
60
+
61
+ # load query triangles points and transform to mesh_1's space
62
+ v0 = wp.transform_point(xform, wp.mesh_eval_position(mesh_0, face, 1.0, 0.0))
63
+ v1 = wp.transform_point(xform, wp.mesh_eval_position(mesh_0, face, 0.0, 1.0))
64
+ v2 = wp.transform_point(xform, wp.mesh_eval_position(mesh_0, face, 0.0, 0.0))
65
+
66
+ # compute bounds of the query triangle
67
+ lower = cw_min(cw_min(v0, v1), v2)
68
+ upper = cw_max(cw_max(v0, v1), v2)
69
+
70
+ query = wp.mesh_query_aabb(mesh_1, lower, upper)
71
+
72
+ for f in query:
73
+ u0 = wp.mesh_eval_position(mesh_1, f, 1.0, 0.0)
74
+ u1 = wp.mesh_eval_position(mesh_1, f, 0.0, 1.0)
75
+ u2 = wp.mesh_eval_position(mesh_1, f, 0.0, 0.0)
76
+
77
+ # test for triangle intersection
78
+ i = wp.intersect_tri_tri(v0, v1, v2, u0, u1, u2)
79
+
80
+ if i > 0:
81
+ result[batch] = 1
82
+ return
83
+
84
+ # use if you want to count all intersections
85
+ # wp.atomic_add(result, batch, i)
86
+
87
+
88
+ class Example:
89
+ def __init__(self, stage_path="example_mesh_intersect.usd"):
90
+ rng = np.random.default_rng(42)
91
+
92
+ self.query_count = 1024
93
+ self.has_queried = False
94
+
95
+ self.path_0 = os.path.join(warp.examples.get_asset_directory(), "cube.usd")
96
+ self.path_1 = os.path.join(warp.examples.get_asset_directory(), "sphere.usd")
97
+
98
+ self.mesh_0 = self.load_mesh(self.path_0, "/root/cube")
99
+ self.mesh_1 = self.load_mesh(self.path_1, "/root/sphere")
100
+
101
+ self.query_num_faces = int(len(self.mesh_0.indices) / 3)
102
+ self.query_num_points = len(self.mesh_0.points)
103
+
104
+ # generate random relative transforms
105
+ self.xforms = []
106
+
107
+ for _ in range(self.query_count):
108
+ # random offset
109
+ p = wp.vec3(rng.random(size=3) * 0.5 - 0.5) * 5.0
110
+
111
+ # random orientation
112
+ axis = wp.normalize(wp.vec3(rng.random(size=3) * 0.5 - 0.5))
113
+ angle = rng.random()
114
+
115
+ q = wp.quat_from_axis_angle(wp.normalize(axis), angle)
116
+
117
+ self.xforms.append(wp.transform(p, q))
118
+
119
+ self.array_result = wp.zeros(self.query_count, dtype=int)
120
+ self.array_xforms = wp.array(self.xforms, dtype=wp.transform)
121
+
122
+ # renderer
123
+ if stage_path:
124
+ self.renderer = wp.render.UsdRenderer(stage_path)
125
+ else:
126
+ self.renderer = None
127
+
128
+ def step(self):
129
+ with wp.ScopedTimer("step"):
130
+ wp.launch(
131
+ kernel=intersect,
132
+ dim=self.query_num_faces * self.query_count,
133
+ inputs=[self.mesh_0.id, self.mesh_1.id, self.query_num_faces, self.array_xforms, self.array_result],
134
+ )
135
+
136
+ def render(self):
137
+ if self.renderer is None:
138
+ return
139
+
140
+ # bring results back to host
141
+ result = self.array_result.numpy()
142
+
143
+ with wp.ScopedTimer("render", active=True):
144
+ self.renderer.begin_frame(0.0)
145
+
146
+ for i in range(self.query_count):
147
+ spacing = 8.0
148
+ offset = i * spacing
149
+
150
+ xform = self.xforms[i]
151
+ self.renderer.render_ref(
152
+ f"mesh_{i}_0",
153
+ self.path_0,
154
+ pos=wp.vec3(xform.p[0] + offset, xform.p[1], xform.p[2]),
155
+ rot=xform.q,
156
+ scale=wp.vec3(1.0, 1.0, 1.0),
157
+ )
158
+ self.renderer.render_ref(
159
+ f"mesh_{i}_1",
160
+ self.path_1,
161
+ pos=wp.vec3(offset, 0.0, 0.0),
162
+ rot=wp.quat_identity(),
163
+ scale=wp.vec3(1.0, 1.0, 1.0),
164
+ )
165
+
166
+ # if pair intersects then draw a small box above the pair
167
+ if result[i] > 0:
168
+ self.renderer.render_box(
169
+ f"result_{i}",
170
+ pos=wp.vec3(xform.p[0] + offset, xform.p[1] + 5.0, xform.p[2]),
171
+ rot=wp.quat_identity(),
172
+ extents=(0.1, 0.1, 0.1),
173
+ )
174
+
175
+ self.renderer.end_frame()
176
+
177
+ # create collision meshes
178
+ def load_mesh(self, path, prim):
179
+ usd_stage = Usd.Stage.Open(path)
180
+ usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath(prim))
181
+
182
+ mesh = wp.Mesh(
183
+ points=wp.array(usd_geom.GetPointsAttr().Get(), dtype=wp.vec3),
184
+ indices=wp.array(usd_geom.GetFaceVertexIndicesAttr().Get(), dtype=int),
185
+ )
186
+
187
+ return mesh
188
+
189
+
190
+ if __name__ == "__main__":
191
+ import argparse
192
+
193
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
194
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
195
+ parser.add_argument(
196
+ "--stage_path",
197
+ type=lambda x: None if x == "None" else str(x),
198
+ default="example_mesh_intersect.usd",
199
+ help="Path to the output USD file.",
200
+ )
201
+
202
+ args = parser.parse_known_args()[0]
203
+
204
+ with wp.ScopedDevice(args.device):
205
+ example = Example(stage_path=args.stage_path)
206
+
207
+ example.step()
208
+ example.render()
209
+
210
+ if example.renderer:
211
+ example.renderer.save()
@@ -0,0 +1,182 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ ###########################################################################
17
+ # Example NanoVDB
18
+ #
19
+ # Shows how to implement a particle simulation with collision against
20
+ # a NanoVDB signed-distance field. In this example the NanoVDB field
21
+ # is created offline in Houdini. The particle kernel uses the Warp
22
+ # wp.volume_sample_f() method to compute the SDF and normal at a point.
23
+ #
24
+ ###########################################################################
25
+
26
+ import os
27
+
28
+ import numpy as np
29
+
30
+ import warp as wp
31
+ import warp.examples
32
+ import warp.render
33
+
34
+
35
+ @wp.func
36
+ def volume_grad(volume: wp.uint64, p: wp.vec3):
37
+ eps = 1.0
38
+ q = wp.volume_world_to_index(volume, p)
39
+
40
+ # compute gradient of the SDF using finite differences
41
+ dx = wp.volume_sample_f(volume, q + wp.vec3(eps, 0.0, 0.0), wp.Volume.LINEAR) - wp.volume_sample_f(
42
+ volume, q - wp.vec3(eps, 0.0, 0.0), wp.Volume.LINEAR
43
+ )
44
+ dy = wp.volume_sample_f(volume, q + wp.vec3(0.0, eps, 0.0), wp.Volume.LINEAR) - wp.volume_sample_f(
45
+ volume, q - wp.vec3(0.0, eps, 0.0), wp.Volume.LINEAR
46
+ )
47
+ dz = wp.volume_sample_f(volume, q + wp.vec3(0.0, 0.0, eps), wp.Volume.LINEAR) - wp.volume_sample_f(
48
+ volume, q - wp.vec3(0.0, 0.0, eps), wp.Volume.LINEAR
49
+ )
50
+
51
+ return wp.normalize(wp.vec3(dx, dy, dz))
52
+
53
+
54
+ @wp.kernel
55
+ def simulate(
56
+ positions: wp.array(dtype=wp.vec3),
57
+ velocities: wp.array(dtype=wp.vec3),
58
+ volume: wp.uint64,
59
+ margin: float,
60
+ dt: float,
61
+ ):
62
+ tid = wp.tid()
63
+
64
+ x = positions[tid]
65
+ v = velocities[tid]
66
+
67
+ v = v + wp.vec3(0.0, -9.8, 0.0) * dt - v * 0.1 * dt
68
+ xpred = x + v * dt
69
+ xpred_local = wp.volume_world_to_index(volume, xpred)
70
+
71
+ # d = wp.volume_sample_f(volume, xpred_local, wp.Volume.LINEAR)
72
+ n = wp.vec3()
73
+ d = wp.volume_sample_grad_f(volume, xpred_local, wp.Volume.LINEAR, n)
74
+
75
+ if d < margin:
76
+ # n = volume_grad(volume, xpred)
77
+ n = wp.normalize(n)
78
+ err = d - margin
79
+
80
+ # mesh collision
81
+ xpred = xpred - n * err
82
+
83
+ # ground collision
84
+ if xpred[1] < 0.0:
85
+ xpred = wp.vec3(xpred[0], 0.0, xpred[2])
86
+
87
+ # pbd update
88
+ v = (xpred - x) * (1.0 / dt)
89
+ x = xpred
90
+
91
+ positions[tid] = x
92
+ velocities[tid] = v
93
+
94
+
95
+ class Example:
96
+ def __init__(self, stage_path="example_nvdb.usd"):
97
+ rng = np.random.default_rng(42)
98
+ self.num_particles = 10000
99
+
100
+ fps = 60
101
+ frame_dt = 1.0 / fps
102
+ self.sim_substeps = 3
103
+ self.sim_dt = frame_dt / self.sim_substeps
104
+
105
+ self.sim_time = 0.0
106
+ self.sim_timers = {}
107
+
108
+ self.sim_margin = 0.15
109
+
110
+ init_pos = 10.0 * (rng.random((self.num_particles, 3)) * 2.0 - 1.0) + np.array((0.0, 30.0, 0.0))
111
+ init_vel = rng.random((self.num_particles, 3))
112
+
113
+ self.positions = wp.from_numpy(init_pos.astype(np.float32), dtype=wp.vec3)
114
+ self.velocities = wp.from_numpy(init_vel.astype(np.float32), dtype=wp.vec3)
115
+
116
+ # load collision volume
117
+ with open(os.path.join(warp.examples.get_asset_directory(), "rocks.nvdb"), "rb") as file:
118
+ # create Volume object
119
+ self.volume = wp.Volume.load_from_nvdb(file)
120
+
121
+ # renderer
122
+ self.renderer = None
123
+ if stage_path:
124
+ self.renderer = wp.render.UsdRenderer(stage_path)
125
+ self.renderer.render_ground(size=100.0)
126
+
127
+ def step(self):
128
+ with wp.ScopedTimer("step", dict=self.sim_timers):
129
+ for _ in range(self.sim_substeps):
130
+ wp.launch(
131
+ kernel=simulate,
132
+ dim=self.num_particles,
133
+ inputs=[self.positions, self.velocities, self.volume.id, self.sim_margin, self.sim_dt],
134
+ )
135
+ self.sim_time += self.sim_dt
136
+
137
+ def render(self):
138
+ if self.renderer is None:
139
+ return
140
+
141
+ with wp.ScopedTimer("render"):
142
+ self.renderer.begin_frame(self.sim_time)
143
+
144
+ self.renderer.render_ref(
145
+ name="collision",
146
+ path=os.path.join(warp.examples.get_asset_directory(), "rocks.usd"),
147
+ pos=wp.vec3(0.0, 0.0, 0.0),
148
+ rot=wp.quat(0.0, 0.0, 0.0, 1.0),
149
+ scale=wp.vec3(1.0, 1.0, 1.0),
150
+ color=(0.35, 0.55, 0.9),
151
+ )
152
+ self.renderer.render_points(
153
+ name="points", points=self.positions.numpy(), radius=self.sim_margin, colors=(0.8, 0.3, 0.2)
154
+ )
155
+
156
+ self.renderer.end_frame()
157
+
158
+
159
+ if __name__ == "__main__":
160
+ import argparse
161
+
162
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
163
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
164
+ parser.add_argument(
165
+ "--stage_path",
166
+ type=lambda x: None if x == "None" else str(x),
167
+ default="example_nvdb.usd",
168
+ help="Path to the output USD file.",
169
+ )
170
+ parser.add_argument("--num_frames", type=int, default=1000, help="Total number of frames.")
171
+
172
+ args = parser.parse_known_args()[0]
173
+
174
+ with wp.ScopedDevice(args.device):
175
+ example = Example(stage_path=args.stage_path)
176
+
177
+ for _ in range(args.num_frames):
178
+ example.step()
179
+ example.render()
180
+
181
+ if example.renderer:
182
+ example.renderer.save()
@@ -0,0 +1,111 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ #############################################################################
17
+ # Example Ray Cast
18
+ #
19
+ # Shows how to use the built-in wp.Mesh data structure and wp.mesh_query_ray()
20
+ # function to implement a basic ray-tracer.
21
+ #
22
+ ##############################################################################
23
+
24
+ import os
25
+
26
+ import numpy as np
27
+ from pxr import Usd, UsdGeom
28
+
29
+ import warp as wp
30
+ import warp.examples
31
+
32
+
33
+ @wp.kernel
34
+ def draw(mesh: wp.uint64, cam_pos: wp.vec3, width: int, height: int, pixels: wp.array(dtype=wp.vec3)):
35
+ tid = wp.tid()
36
+
37
+ x = tid % width
38
+ y = tid // width
39
+
40
+ sx = 2.0 * float(x) / float(height) - 1.0
41
+ sy = 2.0 * float(y) / float(height) - 1.0
42
+
43
+ # compute view ray
44
+ ro = cam_pos
45
+ rd = wp.normalize(wp.vec3(sx, sy, -1.0))
46
+
47
+ color = wp.vec3(0.0, 0.0, 0.0)
48
+
49
+ query = wp.mesh_query_ray(mesh, ro, rd, 1.0e6)
50
+ if query.result:
51
+ color = query.normal * 0.5 + wp.vec3(0.5, 0.5, 0.5)
52
+
53
+ pixels[tid] = color
54
+
55
+
56
+ class Example:
57
+ def __init__(self, height=1024, width=1024):
58
+ self.height = height
59
+ self.width = width
60
+ self.cam_pos = (0.0, 1.0, 2.0)
61
+
62
+ asset_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"))
63
+ mesh_geom = UsdGeom.Mesh(asset_stage.GetPrimAtPath("/root/bunny"))
64
+
65
+ points = np.array(mesh_geom.GetPointsAttr().Get())
66
+ indices = np.array(mesh_geom.GetFaceVertexIndicesAttr().Get())
67
+
68
+ self.pixels = wp.zeros(self.width * self.height, dtype=wp.vec3)
69
+
70
+ # create wp mesh
71
+ self.mesh = wp.Mesh(
72
+ points=wp.array(points, dtype=wp.vec3), velocities=None, indices=wp.array(indices, dtype=int)
73
+ )
74
+
75
+ def render(self):
76
+ with wp.ScopedTimer("render"):
77
+ wp.launch(
78
+ kernel=draw,
79
+ dim=self.width * self.height,
80
+ inputs=[self.mesh.id, self.cam_pos, self.width, self.height, self.pixels],
81
+ )
82
+
83
+
84
+ if __name__ == "__main__":
85
+ import argparse
86
+
87
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
88
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
89
+ parser.add_argument("--width", type=int, default=1024, help="Output image width in pixels.")
90
+ parser.add_argument("--height", type=int, default=1024, help="Output image height in pixels.")
91
+ parser.add_argument(
92
+ "--headless",
93
+ action="store_true",
94
+ help="Run in headless mode, suppressing the opening of any graphical windows.",
95
+ )
96
+
97
+ args = parser.parse_known_args()[0]
98
+
99
+ with wp.ScopedDevice(args.device):
100
+ example = Example(height=args.height, width=args.width)
101
+ example.render()
102
+
103
+ if not args.headless:
104
+ import matplotlib.pyplot as plt
105
+
106
+ plt.imshow(
107
+ example.pixels.numpy().reshape((example.height, example.width, 3)),
108
+ origin="lower",
109
+ interpolation="antialiased",
110
+ )
111
+ plt.show()