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.
- warp/__init__.py +139 -0
- warp/__init__.pyi +1 -0
- warp/autograd.py +1142 -0
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +557 -0
- warp/build_dll.py +405 -0
- warp/builtins.py +6855 -0
- warp/codegen.py +3969 -0
- warp/config.py +158 -0
- warp/constants.py +57 -0
- warp/context.py +6812 -0
- warp/dlpack.py +462 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -0
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -0
- warp/examples/assets/nv_humanoid.xml +183 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/assets/quadruped.urdf +268 -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/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 +194 -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 +193 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +423 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +178 -0
- warp/examples/fem/example_convection_diffusion_dg.py +204 -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 +220 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_magnetostatics.py +240 -0
- warp/examples/fem/example_mixed_elasticity.py +291 -0
- warp/examples/fem/example_navier_stokes.py +261 -0
- warp/examples/fem/example_nonconforming_contact.py +298 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +352 -0
- warp/examples/fem/utils.py +1000 -0
- warp/examples/interop/example_jax_callable.py +116 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +205 -0
- warp/examples/optim/example_bounce.py +266 -0
- warp/examples/optim/example_cloth_throw.py +228 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_drone.py +870 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/optim/example_inverse_kinematics.py +182 -0
- warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
- warp/examples/optim/example_softbody_properties.py +400 -0
- warp/examples/optim/example_spring_cage.py +245 -0
- warp/examples/optim/example_trajectory.py +227 -0
- warp/examples/sim/example_cartpole.py +143 -0
- warp/examples/sim/example_cloth.py +225 -0
- warp/examples/sim/example_cloth_self_contact.py +322 -0
- warp/examples/sim/example_granular.py +130 -0
- warp/examples/sim/example_granular_collision_sdf.py +202 -0
- warp/examples/sim/example_jacobian_ik.py +244 -0
- warp/examples/sim/example_particle_chain.py +124 -0
- warp/examples/sim/example_quadruped.py +203 -0
- warp/examples/sim/example_rigid_chain.py +203 -0
- warp/examples/sim/example_rigid_contact.py +195 -0
- warp/examples/sim/example_rigid_force.py +133 -0
- warp/examples/sim/example_rigid_gyroscopic.py +115 -0
- warp/examples/sim/example_rigid_soft_contact.py +140 -0
- warp/examples/sim/example_soft_body.py +196 -0
- warp/examples/tile/example_tile_cholesky.py +87 -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_mlp.py +383 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/examples/tile/example_tile_walker.py +327 -0
- warp/fabric.py +355 -0
- warp/fem/__init__.py +106 -0
- warp/fem/adaptivity.py +508 -0
- warp/fem/cache.py +572 -0
- warp/fem/dirichlet.py +202 -0
- warp/fem/domain.py +411 -0
- warp/fem/field/__init__.py +125 -0
- warp/fem/field/field.py +619 -0
- warp/fem/field/nodal_field.py +326 -0
- warp/fem/field/restriction.py +37 -0
- warp/fem/field/virtual.py +848 -0
- warp/fem/geometry/__init__.py +32 -0
- warp/fem/geometry/adaptive_nanogrid.py +857 -0
- warp/fem/geometry/closest_point.py +84 -0
- warp/fem/geometry/deformed_geometry.py +221 -0
- warp/fem/geometry/element.py +776 -0
- warp/fem/geometry/geometry.py +362 -0
- warp/fem/geometry/grid_2d.py +392 -0
- warp/fem/geometry/grid_3d.py +452 -0
- warp/fem/geometry/hexmesh.py +911 -0
- warp/fem/geometry/nanogrid.py +571 -0
- warp/fem/geometry/partition.py +389 -0
- warp/fem/geometry/quadmesh.py +663 -0
- warp/fem/geometry/tetmesh.py +855 -0
- warp/fem/geometry/trimesh.py +806 -0
- warp/fem/integrate.py +2335 -0
- warp/fem/linalg.py +419 -0
- warp/fem/operator.py +293 -0
- warp/fem/polynomial.py +229 -0
- warp/fem/quadrature/__init__.py +17 -0
- warp/fem/quadrature/pic_quadrature.py +299 -0
- warp/fem/quadrature/quadrature.py +591 -0
- warp/fem/space/__init__.py +228 -0
- warp/fem/space/basis_function_space.py +468 -0
- warp/fem/space/basis_space.py +667 -0
- warp/fem/space/dof_mapper.py +251 -0
- warp/fem/space/function_space.py +309 -0
- warp/fem/space/grid_2d_function_space.py +177 -0
- warp/fem/space/grid_3d_function_space.py +227 -0
- warp/fem/space/hexmesh_function_space.py +257 -0
- warp/fem/space/nanogrid_function_space.py +201 -0
- warp/fem/space/partition.py +367 -0
- warp/fem/space/quadmesh_function_space.py +223 -0
- warp/fem/space/restriction.py +179 -0
- warp/fem/space/shape/__init__.py +143 -0
- warp/fem/space/shape/cube_shape_function.py +1105 -0
- warp/fem/space/shape/shape_function.py +133 -0
- warp/fem/space/shape/square_shape_function.py +926 -0
- warp/fem/space/shape/tet_shape_function.py +834 -0
- warp/fem/space/shape/triangle_shape_function.py +672 -0
- warp/fem/space/tetmesh_function_space.py +271 -0
- warp/fem/space/topology.py +424 -0
- warp/fem/space/trimesh_function_space.py +194 -0
- warp/fem/types.py +99 -0
- warp/fem/utils.py +420 -0
- warp/jax.py +187 -0
- warp/jax_experimental/__init__.py +16 -0
- warp/jax_experimental/custom_call.py +351 -0
- warp/jax_experimental/ffi.py +698 -0
- warp/jax_experimental/xla_ffi.py +602 -0
- warp/math.py +244 -0
- warp/native/array.h +1145 -0
- warp/native/builtin.h +1800 -0
- warp/native/bvh.cpp +492 -0
- warp/native/bvh.cu +791 -0
- warp/native/bvh.h +554 -0
- warp/native/clang/clang.cpp +536 -0
- warp/native/coloring.cpp +613 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +362 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +646 -0
- warp/native/cuda_util.h +307 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +1878 -0
- warp/native/fabric.h +245 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +87 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1230 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +339 -0
- warp/native/marching.cpp +19 -0
- warp/native/marching.cu +514 -0
- warp/native/marching.h +19 -0
- warp/native/mat.h +2220 -0
- warp/native/mathdx.cpp +87 -0
- warp/native/matnn.h +343 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +404 -0
- warp/native/mesh.h +1980 -0
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1371 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +139 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +364 -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 +53 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +277 -0
- warp/native/sort.h +33 -0
- warp/native/sparse.cpp +378 -0
- warp/native/sparse.cu +524 -0
- warp/native/spatial.h +657 -0
- warp/native/svd.h +702 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +2584 -0
- warp/native/tile_reduce.h +264 -0
- warp/native/vec.h +1426 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +67 -0
- warp/native/volume.h +969 -0
- warp/native/volume_builder.cu +477 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1082 -0
- warp/native/warp.cu +3636 -0
- warp/native/warp.h +381 -0
- warp/optim/__init__.py +17 -0
- warp/optim/adam.py +163 -0
- warp/optim/linear.py +1137 -0
- warp/optim/sgd.py +112 -0
- warp/paddle.py +407 -0
- warp/render/__init__.py +18 -0
- warp/render/render_opengl.py +3518 -0
- warp/render/render_usd.py +784 -0
- warp/render/utils.py +160 -0
- warp/sim/__init__.py +65 -0
- warp/sim/articulation.py +793 -0
- warp/sim/collide.py +2395 -0
- warp/sim/graph_coloring.py +300 -0
- warp/sim/import_mjcf.py +790 -0
- warp/sim/import_snu.py +227 -0
- warp/sim/import_urdf.py +579 -0
- warp/sim/import_usd.py +894 -0
- warp/sim/inertia.py +324 -0
- warp/sim/integrator.py +242 -0
- warp/sim/integrator_euler.py +1997 -0
- warp/sim/integrator_featherstone.py +2101 -0
- warp/sim/integrator_vbd.py +2048 -0
- warp/sim/integrator_xpbd.py +3292 -0
- warp/sim/model.py +4791 -0
- warp/sim/particles.py +121 -0
- warp/sim/render.py +427 -0
- warp/sim/utils.py +428 -0
- warp/sparse.py +2057 -0
- warp/stubs.py +3333 -0
- warp/tape.py +1203 -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_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_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 +634 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +200 -0
- warp/tests/geometry/test_hash_grid.py +221 -0
- warp/tests/geometry/test_marching_cubes.py +74 -0
- warp/tests/geometry/test_mesh.py +316 -0
- warp/tests/geometry/test_mesh_query_aabb.py +399 -0
- warp/tests/geometry/test_mesh_query_point.py +932 -0
- warp/tests/geometry/test_mesh_query_ray.py +311 -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 +729 -0
- warp/tests/interop/test_jax.py +371 -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/sim/__init__.py +0 -0
- warp/tests/sim/disabled_kinematics.py +244 -0
- warp/tests/sim/flaky_test_sim_grad.py +290 -0
- warp/tests/sim/test_collision.py +604 -0
- warp/tests/sim/test_coloring.py +258 -0
- warp/tests/sim/test_model.py +224 -0
- warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
- warp/tests/sim/test_sim_kinematics.py +98 -0
- warp/tests/sim/test_vbd.py +597 -0
- warp/tests/test_adam.py +163 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +2972 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +250 -0
- warp/tests/test_atomic.py +153 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +1298 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +810 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +252 -0
- warp/tests/test_context.py +42 -0
- warp/tests/test_copy.py +238 -0
- warp/tests/test_ctypes.py +638 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +97 -0
- warp/tests/test_examples.py +482 -0
- warp/tests/test_fabricarray.py +996 -0
- warp/tests/test_fast_math.py +74 -0
- warp/tests/test_fem.py +2003 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +454 -0
- warp/tests/test_future_annotations.py +98 -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 +73 -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 +193 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_mat.py +2089 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +178 -0
- warp/tests/test_mlp.py +282 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +44 -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 +339 -0
- warp/tests/test_quat.py +2315 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +302 -0
- warp/tests/test_rounding.py +185 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +105 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +582 -0
- warp/tests/test_spatial.py +2229 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +592 -0
- warp/tests/test_struct.py +734 -0
- warp/tests/test_tape.py +204 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +145 -0
- warp/tests/test_types.py +562 -0
- warp/tests/test_utils.py +588 -0
- warp/tests/test_vec.py +1487 -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/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +780 -0
- warp/tests/tile/test_tile_load.py +407 -0
- warp/tests/tile/test_tile_mathdx.py +208 -0
- warp/tests/tile/test_tile_mlp.py +402 -0
- warp/tests/tile/test_tile_reduce.py +447 -0
- warp/tests/tile/test_tile_shared_memory.py +247 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +427 -0
- warp/tests/unittest_utils.py +468 -0
- warp/tests/walkthrough_debug.py +93 -0
- warp/thirdparty/__init__.py +0 -0
- warp/thirdparty/appdirs.py +598 -0
- warp/thirdparty/dlpack.py +145 -0
- warp/thirdparty/unittest_parallel.py +570 -0
- warp/torch.py +391 -0
- warp/types.py +5230 -0
- warp/utils.py +1137 -0
- warp_lang-1.7.0.dist-info/METADATA +516 -0
- warp_lang-1.7.0.dist-info/RECORD +429 -0
- warp_lang-1.7.0.dist-info/WHEEL +5 -0
- warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
- warp_lang-1.7.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,194 @@
|
|
|
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 Marching Cubes
|
|
18
|
+
#
|
|
19
|
+
# Shows how use the built-in marching cubes functionality to extract
|
|
20
|
+
# the iso-surface from a density field.
|
|
21
|
+
#
|
|
22
|
+
# Note: requires a CUDA-capable device
|
|
23
|
+
###########################################################################
|
|
24
|
+
|
|
25
|
+
import warp as wp
|
|
26
|
+
import warp.render
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@wp.func
|
|
30
|
+
def sdf_create_box(pos: wp.vec3, size: wp.vec3):
|
|
31
|
+
"""Creates a SDF box primitive."""
|
|
32
|
+
# https://iquilezles.org/articles/distfunctions
|
|
33
|
+
q = wp.vec3(
|
|
34
|
+
wp.abs(pos[0]) - size[0],
|
|
35
|
+
wp.abs(pos[1]) - size[1],
|
|
36
|
+
wp.abs(pos[2]) - size[2],
|
|
37
|
+
)
|
|
38
|
+
qp = wp.vec3(wp.max(q[0], 0.0), wp.max(q[1], 0.0), wp.max(q[2], 0.0))
|
|
39
|
+
return wp.length(qp) + wp.min(wp.max(q[0], wp.max(q[1], q[2])), 0.0)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@wp.func
|
|
43
|
+
def sdf_create_torus(pos: wp.vec3, major_radius: float, minor_radius: float):
|
|
44
|
+
"""Creates a SDF torus primitive."""
|
|
45
|
+
# https://iquilezles.org/articles/distfunctions
|
|
46
|
+
q = wp.vec2(wp.length(wp.vec2(pos[0], pos[2])) - major_radius, pos[1])
|
|
47
|
+
return wp.length(q) - minor_radius
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@wp.func
|
|
51
|
+
def sdf_translate(pos: wp.vec3, offset: wp.vec3):
|
|
52
|
+
"""Translates a SDF position vector with an offset."""
|
|
53
|
+
return pos - offset
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@wp.func
|
|
57
|
+
def sdf_rotate(pos: wp.vec3, angles: wp.vec3):
|
|
58
|
+
"""Rotates a SDF position vector using Euler angles."""
|
|
59
|
+
rot = wp.quat_rpy(
|
|
60
|
+
wp.radians(angles[0]),
|
|
61
|
+
wp.radians(angles[1]),
|
|
62
|
+
wp.radians(angles[2]),
|
|
63
|
+
)
|
|
64
|
+
return wp.quat_rotate_inv(rot, pos)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@wp.func
|
|
68
|
+
def sdf_smooth_min(a: float, b: float, radius: float):
|
|
69
|
+
"""Creates a SDF torus primitive."""
|
|
70
|
+
# https://iquilezles.org/articles/smin
|
|
71
|
+
h = wp.max(radius - wp.abs(a - b), 0.0) / radius
|
|
72
|
+
return wp.min(a, b) - h * h * h * radius * (1.0 / 6.0)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@wp.kernel(enable_backward=False)
|
|
76
|
+
def make_field(
|
|
77
|
+
torus_altitude: float,
|
|
78
|
+
torus_major_radius: float,
|
|
79
|
+
torus_minor_radius: float,
|
|
80
|
+
smooth_min_radius: float,
|
|
81
|
+
dim: int,
|
|
82
|
+
time: float,
|
|
83
|
+
out_data: wp.array3d(dtype=float),
|
|
84
|
+
):
|
|
85
|
+
"""Kernel to generate a SDF volume based on primitives."""
|
|
86
|
+
i, j, k = wp.tid()
|
|
87
|
+
|
|
88
|
+
# Retrieve the position of the current cell in a normalized [-1, 1] range
|
|
89
|
+
# for each dimension.
|
|
90
|
+
pos = wp.vec3(
|
|
91
|
+
2.0 * ((float(i) + 0.5) / float(dim)) - 1.0,
|
|
92
|
+
2.0 * ((float(j) + 0.5) / float(dim)) - 1.0,
|
|
93
|
+
2.0 * ((float(k) + 0.5) / float(dim)) - 1.0,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
box = sdf_create_box(
|
|
97
|
+
sdf_translate(pos, wp.vec3(0.0, -0.7, 0.0)),
|
|
98
|
+
wp.vec3(0.9, 0.3, 0.9),
|
|
99
|
+
)
|
|
100
|
+
torus = sdf_create_torus(
|
|
101
|
+
sdf_rotate(
|
|
102
|
+
sdf_translate(pos, wp.vec3(0.0, torus_altitude, 0.0)),
|
|
103
|
+
wp.vec3(wp.sin(time) * 90.0, wp.cos(time) * 45.0, 0.0),
|
|
104
|
+
),
|
|
105
|
+
torus_major_radius,
|
|
106
|
+
torus_minor_radius,
|
|
107
|
+
)
|
|
108
|
+
out_data[i, j, k] = sdf_smooth_min(box, torus, smooth_min_radius)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class Example:
|
|
112
|
+
def __init__(self, stage_path="example_marching_cubes.usd", verbose=False):
|
|
113
|
+
self.verbose = verbose
|
|
114
|
+
|
|
115
|
+
self.dim = 64
|
|
116
|
+
self.max_verts = int(1e6)
|
|
117
|
+
self.max_tris = int(1e6)
|
|
118
|
+
|
|
119
|
+
self.torus_altitude = -0.5
|
|
120
|
+
self.torus_major_radius = 0.5
|
|
121
|
+
self.torus_minor_radius = 0.1
|
|
122
|
+
self.smooth_min_radius = 0.5
|
|
123
|
+
|
|
124
|
+
self.fps = 60
|
|
125
|
+
self.frame = 0
|
|
126
|
+
|
|
127
|
+
self.field = wp.zeros((self.dim, self.dim, self.dim), dtype=float)
|
|
128
|
+
self.mc = wp.MarchingCubes(self.dim, self.dim, self.dim, self.max_verts, self.max_tris)
|
|
129
|
+
|
|
130
|
+
self.renderer = None
|
|
131
|
+
if stage_path:
|
|
132
|
+
self.renderer = wp.render.UsdRenderer(stage_path)
|
|
133
|
+
|
|
134
|
+
def step(self):
|
|
135
|
+
with wp.ScopedTimer("step"):
|
|
136
|
+
with wp.ScopedTimer("Update Field", active=self.verbose):
|
|
137
|
+
wp.launch(
|
|
138
|
+
make_field,
|
|
139
|
+
dim=self.field.shape,
|
|
140
|
+
inputs=(
|
|
141
|
+
self.torus_altitude,
|
|
142
|
+
self.torus_major_radius,
|
|
143
|
+
self.torus_minor_radius,
|
|
144
|
+
self.smooth_min_radius,
|
|
145
|
+
self.dim,
|
|
146
|
+
self.frame / self.fps,
|
|
147
|
+
),
|
|
148
|
+
outputs=(self.field,),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
with wp.ScopedTimer("Surface Extraction", active=self.verbose):
|
|
152
|
+
self.mc.surface(self.field, 0.0)
|
|
153
|
+
|
|
154
|
+
def render(self):
|
|
155
|
+
if self.renderer is None:
|
|
156
|
+
return
|
|
157
|
+
|
|
158
|
+
with wp.ScopedTimer("Render"):
|
|
159
|
+
self.renderer.begin_frame(self.frame / self.fps)
|
|
160
|
+
self.renderer.render_mesh(
|
|
161
|
+
"surface",
|
|
162
|
+
self.mc.verts.numpy(),
|
|
163
|
+
self.mc.indices.numpy(),
|
|
164
|
+
colors=(0.35, 0.55, 0.9),
|
|
165
|
+
update_topology=True,
|
|
166
|
+
)
|
|
167
|
+
self.renderer.end_frame()
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
if __name__ == "__main__":
|
|
171
|
+
import argparse
|
|
172
|
+
|
|
173
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
174
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
175
|
+
parser.add_argument(
|
|
176
|
+
"--stage_path",
|
|
177
|
+
type=lambda x: None if x == "None" else str(x),
|
|
178
|
+
default="example_marching_cubes.usd",
|
|
179
|
+
help="Path to the output USD file.",
|
|
180
|
+
)
|
|
181
|
+
parser.add_argument("--num_frames", type=int, default=240, help="Total number of frames.")
|
|
182
|
+
parser.add_argument("--verbose", action="store_true", help="Print out additional status messages during execution.")
|
|
183
|
+
|
|
184
|
+
args = parser.parse_known_args()[0]
|
|
185
|
+
|
|
186
|
+
with wp.ScopedDevice(args.device):
|
|
187
|
+
example = Example(stage_path=args.stage_path, verbose=args.verbose)
|
|
188
|
+
for _ in range(args.num_frames):
|
|
189
|
+
example.step()
|
|
190
|
+
example.render()
|
|
191
|
+
example.frame += 1
|
|
192
|
+
|
|
193
|
+
if example.renderer is not None:
|
|
194
|
+
example.renderer.save()
|
|
@@ -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()
|