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.
- warp/__init__.py +334 -0
- warp/__init__.pyi +5856 -0
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1077 -0
- warp/_src/build.py +620 -0
- warp/_src/build_dll.py +642 -0
- warp/_src/builtins.py +10555 -0
- warp/_src/codegen.py +4361 -0
- warp/_src/config.py +178 -0
- warp/_src/constants.py +59 -0
- warp/_src/context.py +8352 -0
- warp/_src/dlpack.py +464 -0
- warp/_src/fabric.py +362 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +510 -0
- warp/_src/fem/cache.py +689 -0
- warp/_src/fem/dirichlet.py +190 -0
- warp/_src/fem/domain.py +553 -0
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +703 -0
- warp/_src/fem/field/nodal_field.py +403 -0
- warp/_src/fem/field/restriction.py +39 -0
- warp/_src/fem/field/virtual.py +1021 -0
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
- warp/_src/fem/geometry/closest_point.py +99 -0
- warp/_src/fem/geometry/deformed_geometry.py +277 -0
- warp/_src/fem/geometry/element.py +854 -0
- warp/_src/fem/geometry/geometry.py +693 -0
- warp/_src/fem/geometry/grid_2d.py +478 -0
- warp/_src/fem/geometry/grid_3d.py +539 -0
- warp/_src/fem/geometry/hexmesh.py +956 -0
- warp/_src/fem/geometry/nanogrid.py +660 -0
- warp/_src/fem/geometry/partition.py +483 -0
- warp/_src/fem/geometry/quadmesh.py +597 -0
- warp/_src/fem/geometry/tetmesh.py +762 -0
- warp/_src/fem/geometry/trimesh.py +588 -0
- warp/_src/fem/integrate.py +2507 -0
- warp/_src/fem/linalg.py +385 -0
- warp/_src/fem/operator.py +398 -0
- warp/_src/fem/polynomial.py +231 -0
- warp/_src/fem/quadrature/__init__.py +17 -0
- warp/_src/fem/quadrature/pic_quadrature.py +318 -0
- warp/_src/fem/quadrature/quadrature.py +665 -0
- warp/_src/fem/space/__init__.py +248 -0
- warp/_src/fem/space/basis_function_space.py +499 -0
- warp/_src/fem/space/basis_space.py +681 -0
- warp/_src/fem/space/dof_mapper.py +253 -0
- warp/_src/fem/space/function_space.py +312 -0
- warp/_src/fem/space/grid_2d_function_space.py +179 -0
- warp/_src/fem/space/grid_3d_function_space.py +229 -0
- warp/_src/fem/space/hexmesh_function_space.py +255 -0
- warp/_src/fem/space/nanogrid_function_space.py +199 -0
- warp/_src/fem/space/partition.py +435 -0
- warp/_src/fem/space/quadmesh_function_space.py +222 -0
- warp/_src/fem/space/restriction.py +221 -0
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
- warp/_src/fem/space/shape/shape_function.py +134 -0
- warp/_src/fem/space/shape/square_shape_function.py +928 -0
- warp/_src/fem/space/shape/tet_shape_function.py +829 -0
- warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
- warp/_src/fem/space/tetmesh_function_space.py +270 -0
- warp/_src/fem/space/topology.py +461 -0
- warp/_src/fem/space/trimesh_function_space.py +193 -0
- warp/_src/fem/types.py +114 -0
- warp/_src/fem/utils.py +488 -0
- warp/_src/jax.py +188 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +389 -0
- warp/_src/jax_experimental/ffi.py +1286 -0
- warp/_src/jax_experimental/xla_ffi.py +658 -0
- warp/_src/marching_cubes.py +710 -0
- warp/_src/math.py +416 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +165 -0
- warp/_src/optim/linear.py +1608 -0
- warp/_src/optim/sgd.py +114 -0
- warp/_src/paddle.py +408 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +291 -0
- warp/_src/render/render_opengl.py +3638 -0
- warp/_src/render/render_usd.py +939 -0
- warp/_src/render/utils.py +162 -0
- warp/_src/sparse.py +2718 -0
- warp/_src/tape.py +1208 -0
- warp/_src/thirdparty/__init__.py +0 -0
- warp/_src/thirdparty/appdirs.py +598 -0
- warp/_src/thirdparty/dlpack.py +145 -0
- warp/_src/thirdparty/unittest_parallel.py +676 -0
- warp/_src/torch.py +393 -0
- warp/_src/types.py +5888 -0
- warp/_src/utils.py +1695 -0
- warp/autograd.py +33 -0
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +29 -0
- warp/build_dll.py +24 -0
- warp/codegen.py +24 -0
- warp/constants.py +24 -0
- warp/context.py +33 -0
- warp/dlpack.py +24 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/assets/square_cloth.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +389 -0
- warp/examples/benchmarks/benchmark_cloth.py +296 -0
- warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
- warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
- warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
- warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
- warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
- warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
- warp/examples/benchmarks/benchmark_gemm.py +164 -0
- warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
- warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
- warp/examples/benchmarks/benchmark_launches.py +301 -0
- warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
- warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
- warp/examples/browse.py +37 -0
- warp/examples/core/example_cupy.py +86 -0
- warp/examples/core/example_dem.py +241 -0
- warp/examples/core/example_fluid.py +299 -0
- warp/examples/core/example_graph_capture.py +150 -0
- warp/examples/core/example_marching_cubes.py +195 -0
- warp/examples/core/example_mesh.py +180 -0
- warp/examples/core/example_mesh_intersect.py +211 -0
- warp/examples/core/example_nvdb.py +182 -0
- warp/examples/core/example_raycast.py +111 -0
- warp/examples/core/example_raymarch.py +205 -0
- warp/examples/core/example_render_opengl.py +290 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_spin_lock.py +93 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/core/example_work_queue.py +118 -0
- warp/examples/distributed/example_jacobi_mpi.py +506 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +469 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +181 -0
- warp/examples/fem/example_convection_diffusion_dg.py +225 -0
- warp/examples/fem/example_darcy_ls_optimization.py +489 -0
- warp/examples/fem/example_deformed_geometry.py +172 -0
- warp/examples/fem/example_diffusion.py +196 -0
- warp/examples/fem/example_diffusion_3d.py +225 -0
- warp/examples/fem/example_diffusion_mgpu.py +225 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_elastic_shape_optimization.py +387 -0
- warp/examples/fem/example_magnetostatics.py +242 -0
- warp/examples/fem/example_mixed_elasticity.py +293 -0
- warp/examples/fem/example_navier_stokes.py +263 -0
- warp/examples/fem/example_nonconforming_contact.py +300 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +357 -0
- warp/examples/fem/utils.py +1047 -0
- warp/examples/interop/example_jax_callable.py +146 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +232 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/tile/example_tile_block_cholesky.py +502 -0
- warp/examples/tile/example_tile_cholesky.py +88 -0
- warp/examples/tile/example_tile_convolution.py +66 -0
- warp/examples/tile/example_tile_fft.py +55 -0
- warp/examples/tile/example_tile_filtering.py +113 -0
- warp/examples/tile/example_tile_matmul.py +85 -0
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/examples/tile/example_tile_mlp.py +385 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/fabric.py +24 -0
- warp/fem/__init__.py +173 -0
- warp/fem/adaptivity.py +26 -0
- warp/fem/cache.py +30 -0
- warp/fem/dirichlet.py +24 -0
- warp/fem/field/__init__.py +24 -0
- warp/fem/field/field.py +26 -0
- warp/fem/geometry/__init__.py +21 -0
- warp/fem/geometry/closest_point.py +31 -0
- warp/fem/linalg.py +38 -0
- warp/fem/operator.py +32 -0
- warp/fem/polynomial.py +29 -0
- warp/fem/space/__init__.py +22 -0
- warp/fem/space/basis_space.py +24 -0
- warp/fem/space/shape/__init__.py +68 -0
- warp/fem/space/topology.py +24 -0
- warp/fem/types.py +24 -0
- warp/fem/utils.py +32 -0
- warp/jax.py +29 -0
- warp/jax_experimental/__init__.py +29 -0
- warp/jax_experimental/custom_call.py +29 -0
- warp/jax_experimental/ffi.py +39 -0
- warp/jax_experimental/xla_ffi.py +24 -0
- warp/marching_cubes.py +24 -0
- warp/math.py +37 -0
- warp/native/array.h +1687 -0
- warp/native/builtin.h +2327 -0
- warp/native/bvh.cpp +562 -0
- warp/native/bvh.cu +826 -0
- warp/native/bvh.h +555 -0
- warp/native/clang/clang.cpp +541 -0
- warp/native/coloring.cpp +622 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +568 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +677 -0
- warp/native/cuda_util.h +313 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +2023 -0
- warp/native/fabric.h +246 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +89 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1253 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +348 -0
- warp/native/mat.h +5189 -0
- warp/native/mathdx.cpp +93 -0
- warp/native/matnn.h +221 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +406 -0
- warp/native/mesh.h +2097 -0
- warp/native/nanovdb/GridHandle.h +533 -0
- warp/native/nanovdb/HostBuffer.h +591 -0
- warp/native/nanovdb/NanoVDB.h +6246 -0
- warp/native/nanovdb/NodeManager.h +323 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1664 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +145 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +363 -0
- warp/native/runlength_encode.cpp +79 -0
- warp/native/runlength_encode.cu +61 -0
- warp/native/scan.cpp +47 -0
- warp/native/scan.cu +55 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +286 -0
- warp/native/sort.h +35 -0
- warp/native/sparse.cpp +241 -0
- warp/native/sparse.cu +435 -0
- warp/native/spatial.h +1306 -0
- warp/native/svd.h +727 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +4124 -0
- warp/native/tile_radix_sort.h +1112 -0
- warp/native/tile_reduce.h +838 -0
- warp/native/tile_scan.h +240 -0
- warp/native/tuple.h +189 -0
- warp/native/vec.h +2199 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +68 -0
- warp/native/volume.h +970 -0
- warp/native/volume_builder.cu +483 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1143 -0
- warp/native/warp.cu +4604 -0
- warp/native/warp.h +358 -0
- warp/optim/__init__.py +20 -0
- warp/optim/adam.py +24 -0
- warp/optim/linear.py +35 -0
- warp/optim/sgd.py +24 -0
- warp/paddle.py +24 -0
- warp/py.typed +0 -0
- warp/render/__init__.py +22 -0
- warp/render/imgui_manager.py +29 -0
- warp/render/render_opengl.py +24 -0
- warp/render/render_usd.py +24 -0
- warp/render/utils.py +24 -0
- warp/sparse.py +51 -0
- warp/tape.py +24 -0
- warp/tests/__init__.py +1 -0
- warp/tests/__main__.py +4 -0
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/mlp_golden.npy +0 -0
- warp/tests/assets/pixel.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/assets/spiky.usd +0 -0
- warp/tests/assets/test_grid.nvdb +0 -0
- warp/tests/assets/test_index_grid.nvdb +0 -0
- warp/tests/assets/test_int32_grid.nvdb +0 -0
- warp/tests/assets/test_vec_grid.nvdb +0 -0
- warp/tests/assets/torus.nvdb +0 -0
- warp/tests/assets/torus.usda +105 -0
- warp/tests/aux_test_class_kernel.py +34 -0
- warp/tests/aux_test_compile_consts_dummy.py +18 -0
- warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
- warp/tests/aux_test_dependent.py +29 -0
- warp/tests/aux_test_grad_customs.py +29 -0
- warp/tests/aux_test_instancing_gc.py +26 -0
- warp/tests/aux_test_module_aot.py +7 -0
- warp/tests/aux_test_module_unload.py +23 -0
- warp/tests/aux_test_name_clash1.py +40 -0
- warp/tests/aux_test_name_clash2.py +40 -0
- warp/tests/aux_test_reference.py +9 -0
- warp/tests/aux_test_reference_reference.py +8 -0
- warp/tests/aux_test_square.py +16 -0
- warp/tests/aux_test_unresolved_func.py +22 -0
- warp/tests/aux_test_unresolved_symbol.py +22 -0
- warp/tests/cuda/__init__.py +0 -0
- warp/tests/cuda/test_async.py +676 -0
- warp/tests/cuda/test_conditional_captures.py +1147 -0
- warp/tests/cuda/test_ipc.py +124 -0
- warp/tests/cuda/test_mempool.py +233 -0
- warp/tests/cuda/test_multigpu.py +169 -0
- warp/tests/cuda/test_peer.py +139 -0
- warp/tests/cuda/test_pinned.py +84 -0
- warp/tests/cuda/test_streams.py +691 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +335 -0
- warp/tests/geometry/test_hash_grid.py +259 -0
- warp/tests/geometry/test_marching_cubes.py +294 -0
- warp/tests/geometry/test_mesh.py +318 -0
- warp/tests/geometry/test_mesh_query_aabb.py +392 -0
- warp/tests/geometry/test_mesh_query_point.py +935 -0
- warp/tests/geometry/test_mesh_query_ray.py +323 -0
- warp/tests/geometry/test_volume.py +1103 -0
- warp/tests/geometry/test_volume_write.py +346 -0
- warp/tests/interop/__init__.py +0 -0
- warp/tests/interop/test_dlpack.py +730 -0
- warp/tests/interop/test_jax.py +1673 -0
- warp/tests/interop/test_paddle.py +800 -0
- warp/tests/interop/test_torch.py +1001 -0
- warp/tests/run_coverage_serial.py +39 -0
- warp/tests/test_adam.py +162 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +3756 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +303 -0
- warp/tests/test_atomic.py +336 -0
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +312 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +732 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +974 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +298 -0
- warp/tests/test_context.py +35 -0
- warp/tests/test_copy.py +319 -0
- warp/tests/test_ctypes.py +618 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +127 -0
- warp/tests/test_enum.py +136 -0
- warp/tests/test_examples.py +424 -0
- warp/tests/test_fabricarray.py +998 -0
- warp/tests/test_fast_math.py +72 -0
- warp/tests/test_fem.py +2204 -0
- warp/tests/test_fixedarray.py +229 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +501 -0
- warp/tests/test_future_annotations.py +100 -0
- warp/tests/test_generics.py +656 -0
- warp/tests/test_grad.py +893 -0
- warp/tests/test_grad_customs.py +339 -0
- warp/tests/test_grad_debug.py +341 -0
- warp/tests/test_implicit_init.py +411 -0
- warp/tests/test_import.py +45 -0
- warp/tests/test_indexedarray.py +1140 -0
- warp/tests/test_intersect.py +103 -0
- warp/tests/test_iter.py +76 -0
- warp/tests/test_large.py +177 -0
- warp/tests/test_launch.py +411 -0
- warp/tests/test_lerp.py +151 -0
- warp/tests/test_linear_solvers.py +223 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_map.py +526 -0
- warp/tests/test_mat.py +3515 -0
- warp/tests/test_mat_assign_copy.py +178 -0
- warp/tests/test_mat_constructors.py +573 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +212 -0
- warp/tests/test_module_aot.py +287 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +70 -0
- warp/tests/test_noise.py +252 -0
- warp/tests/test_operators.py +299 -0
- warp/tests/test_options.py +129 -0
- warp/tests/test_overwrite.py +551 -0
- warp/tests/test_print.py +408 -0
- warp/tests/test_quat.py +2653 -0
- warp/tests/test_quat_assign_copy.py +145 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +303 -0
- warp/tests/test_rounding.py +157 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +133 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +845 -0
- warp/tests/test_spatial.py +2859 -0
- warp/tests/test_spatial_assign_copy.py +160 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +640 -0
- warp/tests/test_struct.py +901 -0
- warp/tests/test_tape.py +242 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +192 -0
- warp/tests/test_tuple.py +361 -0
- warp/tests/test_types.py +615 -0
- warp/tests/test_utils.py +594 -0
- warp/tests/test_vec.py +1408 -0
- warp/tests/test_vec_assign_copy.py +143 -0
- warp/tests/test_vec_constructors.py +325 -0
- warp/tests/test_vec_lite.py +80 -0
- warp/tests/test_vec_scalar_ops.py +2327 -0
- warp/tests/test_verify_fp.py +100 -0
- warp/tests/test_version.py +75 -0
- warp/tests/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +1519 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +608 -0
- warp/tests/tile/test_tile_load.py +724 -0
- warp/tests/tile/test_tile_mathdx.py +156 -0
- warp/tests/tile/test_tile_matmul.py +179 -0
- warp/tests/tile/test_tile_mlp.py +400 -0
- warp/tests/tile/test_tile_reduce.py +950 -0
- warp/tests/tile/test_tile_shared_memory.py +376 -0
- warp/tests/tile/test_tile_sort.py +121 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +430 -0
- warp/tests/unittest_utils.py +469 -0
- warp/tests/walkthrough_debug.py +95 -0
- warp/torch.py +24 -0
- warp/types.py +51 -0
- warp/utils.py +31 -0
- warp_lang-1.10.0.dist-info/METADATA +459 -0
- warp_lang-1.10.0.dist-info/RECORD +468 -0
- warp_lang-1.10.0.dist-info/WHEEL +5 -0
- warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- 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()
|