warp-lang 1.7.0__py3-none-manylinux_2_34_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

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,784 @@
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
+ import numpy as np
17
+
18
+ import warp as wp
19
+
20
+
21
+ def _usd_add_xform(prim):
22
+ from pxr import UsdGeom
23
+
24
+ prim = UsdGeom.Xform(prim)
25
+ prim.ClearXformOpOrder()
26
+
27
+ prim.AddTranslateOp()
28
+ prim.AddOrientOp()
29
+ prim.AddScaleOp()
30
+
31
+
32
+ def _usd_set_xform(xform, pos: tuple, rot: tuple, scale: tuple, time):
33
+ from pxr import Gf, UsdGeom
34
+
35
+ xform = UsdGeom.Xform(xform)
36
+
37
+ xform_ops = xform.GetOrderedXformOps()
38
+
39
+ if pos is not None:
40
+ xform_ops[0].Set(Gf.Vec3d(float(pos[0]), float(pos[1]), float(pos[2])), time)
41
+ if rot is not None:
42
+ xform_ops[1].Set(Gf.Quatf(float(rot[3]), float(rot[0]), float(rot[1]), float(rot[2])), time)
43
+ if scale is not None:
44
+ xform_ops[2].Set(Gf.Vec3d(float(scale[0]), float(scale[1]), float(scale[2])), time)
45
+
46
+
47
+ # transforms a cylinder such that it connects the two points pos0, pos1
48
+ def _compute_segment_xform(pos0, pos1):
49
+ from pxr import Gf
50
+
51
+ mid = (pos0 + pos1) * 0.5
52
+ height = (pos1 - pos0).GetLength()
53
+
54
+ dir = (pos1 - pos0) / height
55
+
56
+ rot = Gf.Rotation()
57
+ rot.SetRotateInto((0.0, 0.0, 1.0), Gf.Vec3d(dir))
58
+
59
+ scale = Gf.Vec3f(1.0, 1.0, height)
60
+
61
+ return (mid, Gf.Quath(rot.GetQuat()), scale)
62
+
63
+
64
+ class UsdRenderer:
65
+ """A USD renderer"""
66
+
67
+ def __init__(self, stage, up_axis="Y", fps=60, scaling=1.0):
68
+ """Construct a UsdRenderer object
69
+
70
+ Args:
71
+ model: A simulation model
72
+ stage (str/Usd.Stage): A USD stage (either in memory or on disk)
73
+ up_axis (str): The upfacing axis of the stage
74
+ fps: The number of frames per second to use in the USD file
75
+ scaling: Scaling factor to use for the entities in the scene
76
+ """
77
+ try:
78
+ from pxr import Gf, Sdf, Usd, UsdGeom, UsdLux
79
+ except ImportError as e:
80
+ raise ImportError("Failed to import pxr. Please install USD (e.g. via `pip install usd-core`).") from e
81
+
82
+ if isinstance(stage, str):
83
+ self.stage = stage = Usd.Stage.CreateNew(stage)
84
+ elif isinstance(stage, Usd.Stage):
85
+ self.stage = stage
86
+ else:
87
+ print("Failed to create stage in renderer. Please construct with stage path or stage object.")
88
+ self.up_axis = up_axis.upper()
89
+ self.fps = float(fps)
90
+ self.time = 0.0
91
+
92
+ self.draw_points = True
93
+ self.draw_springs = False
94
+ self.draw_triangles = False
95
+
96
+ self.root = UsdGeom.Xform.Define(stage, "/root")
97
+
98
+ # mapping from shape ID to UsdGeom class
99
+ self._shape_constructors = {}
100
+ # optional scaling applied to shape instances (e.g. cubes)
101
+ self._shape_custom_scale = {}
102
+
103
+ # apply scaling
104
+ self.root.ClearXformOpOrder()
105
+ s = self.root.AddScaleOp()
106
+ s.Set(Gf.Vec3d(float(scaling), float(scaling), float(scaling)), 0.0)
107
+
108
+ self.stage.SetDefaultPrim(self.root.GetPrim())
109
+ self.stage.SetStartTimeCode(0.0)
110
+ self.stage.SetEndTimeCode(0.0)
111
+ self.stage.SetTimeCodesPerSecond(self.fps)
112
+
113
+ if up_axis == "X":
114
+ UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.x)
115
+ elif up_axis == "Y":
116
+ UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.y)
117
+ elif up_axis == "Z":
118
+ UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.z)
119
+
120
+ dome_light = UsdLux.DomeLight.Define(stage, "/dome_light")
121
+ dome_light.AddRotateXYZOp().Set((-90.0, -30.0, 0.0))
122
+ dome_light.GetEnableColorTemperatureAttr().Set(True)
123
+ dome_light.GetColorTemperatureAttr().Set(6150.0)
124
+ dome_light.GetIntensityAttr().Set(1.0)
125
+ dome_light.GetExposureAttr().Set(9.0)
126
+ dome_light.GetPrim().CreateAttribute("visibleInPrimaryRay", Sdf.ValueTypeNames.Bool).Set(False)
127
+
128
+ distant_light = UsdLux.DistantLight.Define(stage, "/distant_light")
129
+ distant_light.AddRotateXYZOp().Set((-35.0, 45.0, 0.0))
130
+ distant_light.GetEnableColorTemperatureAttr().Set(True)
131
+ distant_light.GetColorTemperatureAttr().Set(7250.0)
132
+ distant_light.GetIntensityAttr().Set(1.0)
133
+ distant_light.GetExposureAttr().Set(10.0)
134
+
135
+ def begin_frame(self, time):
136
+ self.time = round(time * self.fps)
137
+ self.stage.SetEndTimeCode(self.time)
138
+
139
+ def end_frame(self):
140
+ pass
141
+
142
+ def register_body(self, body_name):
143
+ from pxr import UsdGeom
144
+
145
+ xform = UsdGeom.Xform.Define(self.stage, self.root.GetPath().AppendChild(body_name))
146
+
147
+ _usd_add_xform(xform)
148
+
149
+ def _resolve_path(self, name, parent_body=None, is_template=False):
150
+ # resolve the path to the prim with the given name and optional parent body
151
+ if is_template:
152
+ return self.root.GetPath().AppendChild("_template_shapes").AppendChild(name)
153
+ if parent_body is None:
154
+ return self.root.GetPath().AppendChild(name)
155
+ else:
156
+ return self.root.GetPath().AppendChild(parent_body).AppendChild(name)
157
+
158
+ def add_shape_instance(
159
+ self,
160
+ name: str,
161
+ shape,
162
+ body,
163
+ pos: tuple,
164
+ rot: tuple,
165
+ scale: tuple = (1.0, 1.0, 1.0),
166
+ color: tuple = (1.0, 1.0, 1.0),
167
+ custom_index: int = -1,
168
+ visible: bool = True,
169
+ ):
170
+ if not visible:
171
+ return
172
+ sdf_path = self._resolve_path(name, body)
173
+ instance = self._shape_constructors[shape.name].Define(self.stage, sdf_path)
174
+ instance.GetPrim().GetReferences().AddInternalReference(shape)
175
+
176
+ _usd_add_xform(instance)
177
+ if shape.name in self._shape_custom_scale:
178
+ cs = self._shape_custom_scale[shape.name]
179
+ scale = (scale[0] * cs[0], scale[1] * cs[1], scale[2] * cs[2])
180
+ _usd_set_xform(instance, pos, rot, scale, self.time)
181
+
182
+ def render_plane(
183
+ self,
184
+ name: str,
185
+ pos: tuple,
186
+ rot: tuple,
187
+ width: float,
188
+ length: float,
189
+ color: tuple = None,
190
+ parent_body: str = None,
191
+ is_template: bool = False,
192
+ ):
193
+ """
194
+ Render a plane with the given dimensions.
195
+
196
+ Args:
197
+ name: Name of the plane
198
+ pos: Position of the plane
199
+ rot: Rotation of the plane
200
+ width: Width of the plane
201
+ length: Length of the plane
202
+ color: Color of the plane
203
+ parent_body: Name of the parent body
204
+ is_template: Whether the plane is a template
205
+ """
206
+ from pxr import Sdf, UsdGeom
207
+
208
+ if is_template:
209
+ prim_path = self._resolve_path(name, parent_body, is_template)
210
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
211
+ blueprint_prim = blueprint.GetPrim()
212
+ blueprint_prim.SetInstanceable(True)
213
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
214
+ plane_path = prim_path.AppendChild("plane")
215
+ else:
216
+ plane_path = self._resolve_path(name, parent_body)
217
+ prim_path = plane_path
218
+
219
+ plane = UsdGeom.Mesh.Get(self.stage, plane_path)
220
+ if not plane:
221
+ plane = UsdGeom.Mesh.Define(self.stage, plane_path)
222
+ plane.CreateDoubleSidedAttr().Set(True)
223
+
224
+ width = width if width > 0.0 else 100.0
225
+ length = length if length > 0.0 else 100.0
226
+ points = ((-width, 0.0, -length), (width, 0.0, -length), (width, 0.0, length), (-width, 0.0, length))
227
+ normals = ((0.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 1.0, 0.0))
228
+ counts = (4,)
229
+ indices = [0, 1, 2, 3]
230
+
231
+ plane.GetPointsAttr().Set(points)
232
+ plane.GetNormalsAttr().Set(normals)
233
+ plane.GetFaceVertexCountsAttr().Set(counts)
234
+ plane.GetFaceVertexIndicesAttr().Set(indices)
235
+ _usd_add_xform(plane)
236
+
237
+ self._shape_constructors[name] = UsdGeom.Mesh
238
+
239
+ if not is_template:
240
+ _usd_set_xform(plane, pos, rot, (1.0, 1.0, 1.0), 0.0)
241
+
242
+ return prim_path
243
+
244
+ def render_ground(self, size: float = 100.0, plane=None):
245
+ from pxr import UsdGeom
246
+
247
+ mesh = UsdGeom.Mesh.Define(self.stage, self.root.GetPath().AppendChild("ground"))
248
+ mesh.CreateDoubleSidedAttr().Set(True)
249
+
250
+ if self.up_axis == "X":
251
+ points = ((0.0, size, -size), (0.0, -size, -size), (0.0, size, size), (0.0, -size, size))
252
+ normals = ((1.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 0.0, 0.0))
253
+ elif self.up_axis == "Y":
254
+ points = ((-size, 0.0, -size), (size, 0.0, -size), (-size, 0.0, size), (size, 0.0, size))
255
+ normals = ((0.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 1.0, 0.0))
256
+ elif self.up_axis == "Z":
257
+ points = ((-size, size, 0.0), (size, size, 0.0), (-size, -size, 0.0), (size, -size, 0.0))
258
+ normals = ((0.0, 0.0, 1.0), (0.0, 0.0, 1.0), (0.0, 0.0, 1.0), (0.0, 0.0, 1.0))
259
+ if plane is not None:
260
+ normal = np.array(plane[:3])
261
+ normal /= np.linalg.norm(normal)
262
+ pos = plane[3] * normal
263
+ axis_up = [0.0, 0.0, 0.0]
264
+ axis_up["XYZ".index(self.up_axis)] = 1.0
265
+ if np.allclose(normal, axis_up):
266
+ # no rotation necessary
267
+ q = (0.0, 0.0, 0.0, 1.0)
268
+ else:
269
+ c = np.cross(normal, axis_up)
270
+ angle = np.arcsin(np.linalg.norm(c))
271
+ axis = np.abs(c) / np.linalg.norm(c)
272
+ q = wp.quat_from_axis_angle(axis, angle)
273
+ tf = wp.transform(pos, q)
274
+ points = [wp.transform_point(tf, wp.vec3(p)) for p in points]
275
+ normals = [wp.transform_vector(tf, wp.vec3(n)) for n in normals]
276
+ counts = (4,)
277
+ indices = [0, 2, 3, 1]
278
+
279
+ mesh.GetPointsAttr().Set(points)
280
+ mesh.GetNormalsAttr().Set(normals)
281
+ mesh.GetFaceVertexCountsAttr().Set(counts)
282
+ mesh.GetFaceVertexIndicesAttr().Set(indices)
283
+
284
+ def render_sphere(
285
+ self,
286
+ name: str,
287
+ pos: tuple,
288
+ rot: tuple,
289
+ radius: float,
290
+ parent_body: str = None,
291
+ is_template: bool = False,
292
+ color: tuple = None,
293
+ ):
294
+ """Debug helper to add a sphere for visualization
295
+
296
+ Args:
297
+ pos: The position of the sphere
298
+ radius: The radius of the sphere
299
+ name: A name for the USD prim on the stage
300
+ color: The color of the sphere
301
+ """
302
+
303
+ from pxr import Gf, Sdf, UsdGeom
304
+
305
+ if is_template:
306
+ prim_path = self._resolve_path(name, parent_body, is_template)
307
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
308
+ blueprint_prim = blueprint.GetPrim()
309
+ blueprint_prim.SetInstanceable(True)
310
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
311
+ sphere_path = prim_path.AppendChild("sphere")
312
+ else:
313
+ sphere_path = self._resolve_path(name, parent_body)
314
+ prim_path = sphere_path
315
+
316
+ sphere = UsdGeom.Sphere.Get(self.stage, sphere_path)
317
+ if not sphere:
318
+ sphere = UsdGeom.Sphere.Define(self.stage, sphere_path)
319
+ _usd_add_xform(sphere)
320
+
321
+ sphere.GetRadiusAttr().Set(radius, self.time)
322
+
323
+ if color is not None:
324
+ sphere.GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
325
+
326
+ self._shape_constructors[name] = UsdGeom.Sphere
327
+
328
+ if not is_template:
329
+ _usd_set_xform(sphere, pos, rot, (1.0, 1.0, 1.0), self.time)
330
+
331
+ return prim_path
332
+
333
+ def render_capsule(
334
+ self,
335
+ name: str,
336
+ pos: tuple,
337
+ rot: tuple,
338
+ radius: float,
339
+ half_height: float,
340
+ parent_body: str = None,
341
+ is_template: bool = False,
342
+ color: tuple = None,
343
+ ):
344
+ """
345
+ Debug helper to add a capsule for visualization
346
+
347
+ Args:
348
+ pos: The position of the capsule
349
+ radius: The radius of the capsule
350
+ half_height: The half height of the capsule
351
+ name: A name for the USD prim on the stage
352
+ color: The color of the capsule
353
+ """
354
+
355
+ from pxr import Gf, Sdf, UsdGeom
356
+
357
+ if is_template:
358
+ prim_path = self._resolve_path(name, parent_body, is_template)
359
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
360
+ blueprint_prim = blueprint.GetPrim()
361
+ blueprint_prim.SetInstanceable(True)
362
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
363
+ capsule_path = prim_path.AppendChild("capsule")
364
+ else:
365
+ capsule_path = self._resolve_path(name, parent_body)
366
+ prim_path = capsule_path
367
+
368
+ capsule = UsdGeom.Capsule.Get(self.stage, capsule_path)
369
+ if not capsule:
370
+ capsule = UsdGeom.Capsule.Define(self.stage, capsule_path)
371
+ _usd_add_xform(capsule)
372
+
373
+ capsule.GetRadiusAttr().Set(float(radius))
374
+ capsule.GetHeightAttr().Set(float(half_height * 2.0))
375
+ capsule.GetAxisAttr().Set("Y")
376
+
377
+ if color is not None:
378
+ capsule.GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
379
+
380
+ self._shape_constructors[name] = UsdGeom.Capsule
381
+
382
+ if not is_template:
383
+ _usd_set_xform(capsule, pos, rot, (1.0, 1.0, 1.0), self.time)
384
+
385
+ return prim_path
386
+
387
+ def render_cylinder(
388
+ self,
389
+ name: str,
390
+ pos: tuple,
391
+ rot: tuple,
392
+ radius: float,
393
+ half_height: float,
394
+ parent_body: str = None,
395
+ is_template: bool = False,
396
+ color: tuple = None,
397
+ ):
398
+ """
399
+ Debug helper to add a cylinder for visualization
400
+
401
+ Args:
402
+ pos: The position of the cylinder
403
+ radius: The radius of the cylinder
404
+ half_height: The half height of the cylinder
405
+ name: A name for the USD prim on the stage
406
+ color: The color of the cylinder
407
+ """
408
+
409
+ from pxr import Gf, Sdf, UsdGeom
410
+
411
+ if is_template:
412
+ prim_path = self._resolve_path(name, parent_body, is_template)
413
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
414
+ blueprint_prim = blueprint.GetPrim()
415
+ blueprint_prim.SetInstanceable(True)
416
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
417
+ cylinder_path = prim_path.AppendChild("cylinder")
418
+ else:
419
+ cylinder_path = self._resolve_path(name, parent_body)
420
+ prim_path = cylinder_path
421
+
422
+ cylinder = UsdGeom.Cylinder.Get(self.stage, cylinder_path)
423
+ if not cylinder:
424
+ cylinder = UsdGeom.Cylinder.Define(self.stage, cylinder_path)
425
+ _usd_add_xform(cylinder)
426
+
427
+ cylinder.GetRadiusAttr().Set(float(radius))
428
+ cylinder.GetHeightAttr().Set(float(half_height * 2.0))
429
+ cylinder.GetAxisAttr().Set("Y")
430
+
431
+ if color is not None:
432
+ cylinder.GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
433
+
434
+ self._shape_constructors[name] = UsdGeom.Cylinder
435
+
436
+ if not is_template:
437
+ _usd_set_xform(cylinder, pos, rot, (1.0, 1.0, 1.0), self.time)
438
+
439
+ return prim_path
440
+
441
+ def render_cone(
442
+ self,
443
+ name: str,
444
+ pos: tuple,
445
+ rot: tuple,
446
+ radius: float,
447
+ half_height: float,
448
+ parent_body: str = None,
449
+ is_template: bool = False,
450
+ color: tuple = None,
451
+ ):
452
+ """
453
+ Debug helper to add a cone for visualization
454
+
455
+ Args:
456
+ pos: The position of the cone
457
+ radius: The radius of the cone
458
+ half_height: The half height of the cone
459
+ name: A name for the USD prim on the stage
460
+ color: The color of the cone
461
+ """
462
+
463
+ from pxr import Gf, Sdf, UsdGeom
464
+
465
+ if is_template:
466
+ prim_path = self._resolve_path(name, parent_body, is_template)
467
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
468
+ blueprint_prim = blueprint.GetPrim()
469
+ blueprint_prim.SetInstanceable(True)
470
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
471
+ cone_path = prim_path.AppendChild("cone")
472
+ else:
473
+ cone_path = self._resolve_path(name, parent_body)
474
+ prim_path = cone_path
475
+
476
+ cone = UsdGeom.Cone.Get(self.stage, cone_path)
477
+ if not cone:
478
+ cone = UsdGeom.Cone.Define(self.stage, cone_path)
479
+ _usd_add_xform(cone)
480
+
481
+ cone.GetRadiusAttr().Set(float(radius))
482
+ cone.GetHeightAttr().Set(float(half_height * 2.0))
483
+ cone.GetAxisAttr().Set("Y")
484
+
485
+ if color is not None:
486
+ cone.GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
487
+
488
+ self._shape_constructors[name] = UsdGeom.Cone
489
+
490
+ if not is_template:
491
+ _usd_set_xform(cone, pos, rot, (1.0, 1.0, 1.0), self.time)
492
+
493
+ return prim_path
494
+
495
+ def render_box(
496
+ self,
497
+ name: str,
498
+ pos: tuple,
499
+ rot: tuple,
500
+ extents: tuple,
501
+ parent_body: str = None,
502
+ is_template: bool = False,
503
+ color: tuple = None,
504
+ ):
505
+ """Debug helper to add a box for visualization
506
+
507
+ Args:
508
+ pos: The position of the box
509
+ extents: The radius of the box
510
+ name: A name for the USD prim on the stage
511
+ color: The color of the box
512
+ """
513
+
514
+ from pxr import Gf, Sdf, UsdGeom
515
+
516
+ if is_template:
517
+ prim_path = self._resolve_path(name, parent_body, is_template)
518
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
519
+ blueprint_prim = blueprint.GetPrim()
520
+ blueprint_prim.SetInstanceable(True)
521
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
522
+ cube_path = prim_path.AppendChild("cube")
523
+ else:
524
+ cube_path = self._resolve_path(name, parent_body)
525
+ prim_path = cube_path
526
+
527
+ cube = UsdGeom.Cube.Get(self.stage, cube_path)
528
+ if not cube:
529
+ cube = UsdGeom.Cube.Define(self.stage, cube_path)
530
+ _usd_add_xform(cube)
531
+
532
+ if color is not None:
533
+ cube.GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
534
+
535
+ self._shape_constructors[name] = UsdGeom.Cube
536
+ self._shape_custom_scale[name] = extents
537
+
538
+ if not is_template:
539
+ _usd_set_xform(cube, pos, rot, extents, self.time)
540
+
541
+ return prim_path
542
+
543
+ def render_ref(self, name: str, path: str, pos: tuple, rot: tuple, scale: tuple, color: tuple = None):
544
+ from pxr import Gf, Usd, UsdGeom
545
+
546
+ ref_path = "/root/" + name
547
+
548
+ ref = UsdGeom.Xform.Get(self.stage, ref_path)
549
+ if not ref:
550
+ ref = UsdGeom.Xform.Define(self.stage, ref_path)
551
+ ref.GetPrim().GetReferences().AddReference(path)
552
+ _usd_add_xform(ref)
553
+
554
+ # update transform
555
+ _usd_set_xform(ref, pos, rot, scale, self.time)
556
+
557
+ if color is not None:
558
+ it = iter(Usd.PrimRange(ref.GetPrim()))
559
+ for prim in it:
560
+ if prim.IsA(UsdGeom.Gprim):
561
+ UsdGeom.Gprim(prim).GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
562
+ it.PruneChildren()
563
+
564
+ def render_mesh(
565
+ self,
566
+ name: str,
567
+ points,
568
+ indices,
569
+ colors=None,
570
+ pos=(0.0, 0.0, 0.0),
571
+ rot=(0.0, 0.0, 0.0, 1.0),
572
+ scale=(1.0, 1.0, 1.0),
573
+ update_topology=False,
574
+ parent_body: str = None,
575
+ is_template: bool = False,
576
+ ):
577
+ from pxr import Sdf, UsdGeom
578
+
579
+ if is_template:
580
+ prim_path = self._resolve_path(name, parent_body, is_template)
581
+ blueprint = UsdGeom.Scope.Define(self.stage, prim_path)
582
+ blueprint_prim = blueprint.GetPrim()
583
+ blueprint_prim.SetInstanceable(True)
584
+ blueprint_prim.SetSpecifier(Sdf.SpecifierClass)
585
+ mesh_path = prim_path.AppendChild("mesh")
586
+ else:
587
+ mesh_path = self._resolve_path(name, parent_body)
588
+ prim_path = mesh_path
589
+
590
+ mesh = UsdGeom.Mesh.Get(self.stage, mesh_path)
591
+ if not mesh:
592
+ mesh = UsdGeom.Mesh.Define(self.stage, mesh_path)
593
+ if colors is not None and len(colors) == 3:
594
+ color_interp = "constant"
595
+ else:
596
+ color_interp = "vertex"
597
+
598
+ UsdGeom.Primvar(mesh.GetDisplayColorAttr()).SetInterpolation(color_interp)
599
+ _usd_add_xform(mesh)
600
+
601
+ # force topology update on first frame
602
+ update_topology = True
603
+
604
+ mesh.GetPointsAttr().Set(points, self.time)
605
+
606
+ if update_topology:
607
+ idxs = np.array(indices).reshape(-1, 3)
608
+ mesh.GetFaceVertexIndicesAttr().Set(idxs, self.time)
609
+ mesh.GetFaceVertexCountsAttr().Set([3] * len(idxs), self.time)
610
+
611
+ if colors is not None:
612
+ if len(colors) == 3:
613
+ colors = (colors,)
614
+
615
+ mesh.GetDisplayColorAttr().Set(colors, self.time)
616
+
617
+ self._shape_constructors[name] = UsdGeom.Mesh
618
+ self._shape_custom_scale[name] = scale
619
+
620
+ if not is_template:
621
+ _usd_set_xform(mesh, pos, rot, scale, self.time)
622
+
623
+ return prim_path
624
+
625
+ def render_line_list(self, name, vertices, indices, color, radius):
626
+ """Debug helper to add a line list as a set of capsules
627
+
628
+ Args:
629
+ vertices: The vertices of the line-strip
630
+ color: The color of the line
631
+ time: The time to update at
632
+ """
633
+
634
+ from pxr import Gf, UsdGeom
635
+
636
+ num_lines = int(len(indices) / 2)
637
+
638
+ if num_lines < 1:
639
+ return
640
+
641
+ # look up rope point instancer
642
+ instancer_path = self.root.GetPath().AppendChild(name)
643
+ instancer = UsdGeom.PointInstancer.Get(self.stage, instancer_path)
644
+
645
+ if not instancer:
646
+ instancer = UsdGeom.PointInstancer.Define(self.stage, instancer_path)
647
+ instancer_capsule = UsdGeom.Capsule.Define(self.stage, instancer.GetPath().AppendChild("capsule"))
648
+ instancer_capsule.GetRadiusAttr().Set(radius)
649
+ instancer.CreatePrototypesRel().SetTargets([instancer_capsule.GetPath()])
650
+ # instancer.CreatePrimvar("displayColor", Sdf.ValueTypeNames.Float3Array, "constant", 1)
651
+
652
+ line_positions = []
653
+ line_rotations = []
654
+ line_scales = []
655
+
656
+ for i in range(num_lines):
657
+ pos0 = vertices[indices[i * 2 + 0]]
658
+ pos1 = vertices[indices[i * 2 + 1]]
659
+
660
+ (pos, rot, scale) = _compute_segment_xform(
661
+ Gf.Vec3f(float(pos0[0]), float(pos0[1]), float(pos0[2])),
662
+ Gf.Vec3f(float(pos1[0]), float(pos1[1]), float(pos1[2])),
663
+ )
664
+
665
+ line_positions.append(pos)
666
+ line_rotations.append(rot)
667
+ line_scales.append(scale)
668
+ # line_colors.append(Gf.Vec3f((float(i)/num_lines, 0.5, 0.5)))
669
+
670
+ instancer.GetPositionsAttr().Set(line_positions, self.time)
671
+ instancer.GetOrientationsAttr().Set(line_rotations, self.time)
672
+ instancer.GetScalesAttr().Set(line_scales, self.time)
673
+ instancer.GetProtoIndicesAttr().Set([0] * num_lines, self.time)
674
+
675
+ # instancer.GetPrimvar("displayColor").Set(line_colors, time)
676
+
677
+ def render_line_strip(self, name: str, vertices, color: tuple, radius: float = 0.01):
678
+ from pxr import Gf, UsdGeom
679
+
680
+ num_lines = int(len(vertices) - 1)
681
+
682
+ if num_lines < 1:
683
+ return
684
+
685
+ # look up rope point instancer
686
+ instancer_path = self.root.GetPath().AppendChild(name)
687
+ instancer = UsdGeom.PointInstancer.Get(self.stage, instancer_path)
688
+
689
+ if not instancer:
690
+ instancer = UsdGeom.PointInstancer.Define(self.stage, instancer_path)
691
+ instancer_capsule = UsdGeom.Capsule.Define(self.stage, instancer.GetPath().AppendChild("capsule"))
692
+ instancer_capsule.GetRadiusAttr().Set(radius)
693
+ instancer.CreatePrototypesRel().SetTargets([instancer_capsule.GetPath()])
694
+
695
+ line_positions = []
696
+ line_rotations = []
697
+ line_scales = []
698
+
699
+ for i in range(num_lines):
700
+ pos0 = vertices[i]
701
+ pos1 = vertices[i + 1]
702
+
703
+ (pos, rot, scale) = _compute_segment_xform(
704
+ Gf.Vec3f(float(pos0[0]), float(pos0[1]), float(pos0[2])),
705
+ Gf.Vec3f(float(pos1[0]), float(pos1[1]), float(pos1[2])),
706
+ )
707
+
708
+ line_positions.append(pos)
709
+ line_rotations.append(rot)
710
+ line_scales.append(scale)
711
+
712
+ instancer.GetPositionsAttr().Set(line_positions, self.time)
713
+ instancer.GetOrientationsAttr().Set(line_rotations, self.time)
714
+ instancer.GetScalesAttr().Set(line_scales, self.time)
715
+ instancer.GetProtoIndicesAttr().Set([0] * num_lines, self.time)
716
+
717
+ instancer_capsule = UsdGeom.Capsule.Get(self.stage, instancer.GetPath().AppendChild("capsule"))
718
+ instancer_capsule.GetDisplayColorAttr().Set([Gf.Vec3f(color)], self.time)
719
+
720
+ def render_points(self, name: str, points, radius, colors=None):
721
+ from pxr import Gf, UsdGeom
722
+
723
+ instancer_path = self.root.GetPath().AppendChild(name)
724
+ instancer = UsdGeom.PointInstancer.Get(self.stage, instancer_path)
725
+ radius_is_scalar = np.isscalar(radius)
726
+ if not instancer:
727
+ if colors is None or len(colors) == 3:
728
+ instancer = UsdGeom.PointInstancer.Define(self.stage, instancer_path)
729
+ instancer_sphere = UsdGeom.Sphere.Define(self.stage, instancer.GetPath().AppendChild("sphere"))
730
+ if radius_is_scalar:
731
+ instancer_sphere.GetRadiusAttr().Set(radius)
732
+ else:
733
+ instancer_sphere.GetRadiusAttr().Set(1.0)
734
+ instancer.GetScalesAttr().Set(np.tile(radius, (3, 1)).T)
735
+
736
+ if colors is not None:
737
+ instancer_sphere.GetDisplayColorAttr().Set([Gf.Vec3f(colors)], self.time)
738
+
739
+ instancer.CreatePrototypesRel().SetTargets([instancer_sphere.GetPath()])
740
+ instancer.CreateProtoIndicesAttr().Set([0] * len(points))
741
+
742
+ # set identity rotations
743
+ quats = [Gf.Quath(1.0, 0.0, 0.0, 0.0)] * len(points)
744
+ instancer.GetOrientationsAttr().Set(quats, self.time)
745
+ else:
746
+ instancer = UsdGeom.Points.Define(self.stage, instancer_path)
747
+
748
+ if radius_is_scalar:
749
+ instancer.GetWidthsAttr().Set([radius * 2.0] * len(points))
750
+ else:
751
+ instancer.GetWidthsAttr().Set(radius * 2.0)
752
+
753
+ if colors is None or len(colors) == 3:
754
+ instancer.GetPositionsAttr().Set(points, self.time)
755
+ else:
756
+ instancer.GetPointsAttr().Set(points, self.time)
757
+ instancer.GetDisplayColorAttr().Set(colors, self.time)
758
+
759
+ def update_body_transforms(self, body_q):
760
+ from pxr import Sdf, UsdGeom
761
+
762
+ if isinstance(body_q, wp.array):
763
+ body_q = body_q.numpy()
764
+
765
+ with Sdf.ChangeBlock():
766
+ for b in range(self.model.body_count):
767
+ node_name = self.body_names[b]
768
+ node = UsdGeom.Xform(self.stage.GetPrimAtPath(self.root.GetPath().AppendChild(node_name)))
769
+
770
+ # unpack rigid transform
771
+ X_sb = wp.transform_expand(body_q[b])
772
+
773
+ _usd_set_xform(node, X_sb.p, X_sb.q, (1.0, 1.0, 1.0), self.time)
774
+
775
+ def save(self):
776
+ try:
777
+ self.stage.Save()
778
+ except Exception as e:
779
+ print("Failed to save USD stage:", e)
780
+ return False
781
+
782
+ file_path = self.stage.GetRootLayer().realPath
783
+ print(f"Saved the USD stage file at `{file_path}`")
784
+ return True