warp-lang 1.0.2__py3-none-win_amd64.whl → 1.2.0__py3-none-win_amd64.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 +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +88 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3693 -3354
- warp/codegen.py +2925 -2792
- warp/config.py +40 -36
- warp/constants.py +49 -45
- warp/context.py +5409 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +381 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -277
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +145 -146
- warp/examples/benchmarks/benchmark_launches.py +293 -295
- warp/examples/browse.py +29 -29
- warp/examples/core/example_dem.py +232 -219
- warp/examples/core/example_fluid.py +291 -267
- warp/examples/core/example_graph_capture.py +142 -126
- warp/examples/core/example_marching_cubes.py +186 -174
- warp/examples/core/example_mesh.py +172 -155
- warp/examples/core/example_mesh_intersect.py +203 -193
- warp/examples/core/example_nvdb.py +174 -170
- warp/examples/core/example_raycast.py +103 -90
- warp/examples/core/example_raymarch.py +197 -178
- warp/examples/core/example_render_opengl.py +183 -141
- warp/examples/core/example_sph.py +403 -387
- warp/examples/core/example_torch.py +219 -181
- warp/examples/core/example_wave.py +261 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +432 -389
- warp/examples/fem/example_burgers.py +262 -0
- warp/examples/fem/example_convection_diffusion.py +180 -168
- warp/examples/fem/example_convection_diffusion_dg.py +217 -209
- warp/examples/fem/example_deformed_geometry.py +175 -159
- warp/examples/fem/example_diffusion.py +199 -173
- warp/examples/fem/example_diffusion_3d.py +178 -152
- warp/examples/fem/example_diffusion_mgpu.py +219 -214
- warp/examples/fem/example_mixed_elasticity.py +242 -222
- warp/examples/fem/example_navier_stokes.py +257 -243
- warp/examples/fem/example_stokes.py +218 -192
- warp/examples/fem/example_stokes_transfer.py +263 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +258 -246
- warp/examples/optim/example_cloth_throw.py +220 -209
- warp/examples/optim/example_diffray.py +564 -536
- warp/examples/optim/example_drone.py +862 -835
- warp/examples/optim/example_inverse_kinematics.py +174 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +183 -169
- warp/examples/optim/example_spring_cage.py +237 -231
- warp/examples/optim/example_trajectory.py +221 -199
- warp/examples/optim/example_walker.py +304 -293
- warp/examples/sim/example_cartpole.py +137 -129
- warp/examples/sim/example_cloth.py +194 -186
- warp/examples/sim/example_granular.py +122 -111
- warp/examples/sim/example_granular_collision_sdf.py +195 -186
- warp/examples/sim/example_jacobian_ik.py +234 -214
- warp/examples/sim/example_particle_chain.py +116 -105
- warp/examples/sim/example_quadruped.py +191 -180
- warp/examples/sim/example_rigid_chain.py +195 -187
- warp/examples/sim/example_rigid_contact.py +187 -177
- warp/examples/sim/example_rigid_force.py +125 -125
- warp/examples/sim/example_rigid_gyroscopic.py +107 -95
- warp/examples/sim/example_rigid_soft_contact.py +132 -122
- warp/examples/sim/example_soft_body.py +188 -177
- warp/fabric.py +337 -335
- warp/fem/__init__.py +61 -27
- warp/fem/cache.py +403 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +16 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +748 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +437 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/nanogrid.py +455 -0
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1684 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +179 -292
- warp/fem/space/basis_space.py +522 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +148 -267
- warp/fem/space/grid_3d_function_space.py +167 -306
- warp/fem/space/hexmesh_function_space.py +253 -352
- warp/fem/space/nanogrid_function_space.py +202 -0
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +261 -369
- warp/fem/space/restriction.py +161 -160
- warp/fem/space/shape/__init__.py +90 -15
- warp/fem/space/shape/cube_shape_function.py +728 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +224 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +153 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1081 -1025
- warp/native/builtin.h +1603 -1560
- warp/native/bvh.cpp +402 -398
- warp/native/bvh.cu +533 -525
- warp/native/bvh.h +430 -429
- warp/native/clang/clang.cpp +496 -464
- warp/native/crt.cpp +42 -32
- warp/native/crt.h +352 -335
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/exports.h +187 -0
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1545 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +292 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -4782
- warp/native/nanovdb/PNanoVDB.h +3390 -2553
- warp/native/noise.h +850 -850
- warp/native/quat.h +1112 -1085
- warp/native/rand.h +303 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1177 -1133
- warp/native/volume.cpp +529 -297
- warp/native/volume.cu +58 -32
- warp/native/volume.h +960 -538
- warp/native/volume_builder.cu +446 -425
- warp/native/volume_builder.h +34 -19
- warp/native/volume_impl.h +61 -0
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2949 -2828
- warp/native/warp.h +321 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3356 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1917 -1991
- warp/sim/integrator_xpbd.py +3288 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1289 -1227
- warp/stubs.py +2192 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/test_index_grid.nvdb +0 -0
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +20 -22
- warp/tests/aux_test_grad_customs.py +21 -23
- warp/tests/aux_test_reference.py +9 -11
- warp/tests/aux_test_reference_reference.py +8 -10
- warp/tests/aux_test_square.py +15 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +237 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +155 -157
- warp/tests/test_arithmetic.py +1088 -1124
- warp/tests/test_array.py +2415 -2326
- warp/tests/test_array_reduce.py +148 -150
- warp/tests/test_async.py +666 -656
- warp/tests/test_atomic.py +139 -141
- warp/tests/test_bool.py +212 -149
- warp/tests/test_builtins_resolution.py +1290 -1292
- warp/tests/test_bvh.py +162 -171
- warp/tests/test_closest_point_edge_edge.py +227 -228
- warp/tests/test_codegen.py +562 -553
- warp/tests/test_compile_consts.py +217 -101
- warp/tests/test_conditional.py +244 -246
- warp/tests/test_copy.py +230 -215
- warp/tests/test_ctypes.py +630 -632
- warp/tests/test_dense.py +65 -67
- warp/tests/test_devices.py +89 -98
- warp/tests/test_dlpack.py +528 -529
- warp/tests/test_examples.py +403 -378
- warp/tests/test_fabricarray.py +952 -955
- warp/tests/test_fast_math.py +60 -54
- warp/tests/test_fem.py +1298 -1278
- warp/tests/test_fp16.py +128 -130
- warp/tests/test_func.py +336 -337
- warp/tests/test_generics.py +596 -571
- warp/tests/test_grad.py +885 -640
- warp/tests/test_grad_customs.py +331 -336
- warp/tests/test_hash_grid.py +208 -164
- warp/tests/test_import.py +37 -39
- warp/tests/test_indexedarray.py +1132 -1134
- warp/tests/test_intersect.py +65 -67
- warp/tests/test_jax.py +305 -307
- warp/tests/test_large.py +169 -164
- warp/tests/test_launch.py +352 -354
- warp/tests/test_lerp.py +217 -261
- warp/tests/test_linear_solvers.py +189 -171
- warp/tests/test_lvalue.py +419 -493
- warp/tests/test_marching_cubes.py +63 -65
- warp/tests/test_mat.py +1799 -1827
- warp/tests/test_mat_lite.py +113 -115
- warp/tests/test_mat_scalar_ops.py +2905 -2889
- warp/tests/test_math.py +124 -193
- warp/tests/test_matmul.py +498 -499
- warp/tests/test_matmul_lite.py +408 -410
- warp/tests/test_mempool.py +186 -190
- warp/tests/test_mesh.py +281 -324
- warp/tests/test_mesh_query_aabb.py +226 -241
- warp/tests/test_mesh_query_point.py +690 -702
- warp/tests/test_mesh_query_ray.py +290 -303
- warp/tests/test_mlp.py +274 -276
- warp/tests/test_model.py +108 -110
- warp/tests/test_module_hashing.py +111 -0
- warp/tests/test_modules_lite.py +36 -39
- warp/tests/test_multigpu.py +161 -163
- warp/tests/test_noise.py +244 -248
- warp/tests/test_operators.py +248 -250
- warp/tests/test_options.py +121 -125
- warp/tests/test_peer.py +131 -137
- warp/tests/test_pinned.py +76 -78
- warp/tests/test_print.py +52 -54
- warp/tests/test_quat.py +2084 -2086
- warp/tests/test_rand.py +324 -288
- warp/tests/test_reload.py +207 -217
- warp/tests/test_rounding.py +177 -179
- warp/tests/test_runlength_encode.py +188 -190
- warp/tests/test_sim_grad.py +241 -0
- warp/tests/test_sim_kinematics.py +89 -97
- warp/tests/test_smoothstep.py +166 -168
- warp/tests/test_snippet.py +303 -266
- warp/tests/test_sparse.py +466 -460
- warp/tests/test_spatial.py +2146 -2148
- warp/tests/test_special_values.py +362 -0
- warp/tests/test_streams.py +484 -473
- warp/tests/test_struct.py +708 -675
- warp/tests/test_tape.py +171 -148
- warp/tests/test_torch.py +741 -743
- warp/tests/test_transient_module.py +85 -87
- warp/tests/test_types.py +554 -659
- warp/tests/test_utils.py +488 -499
- warp/tests/test_vec.py +1262 -1268
- warp/tests/test_vec_lite.py +71 -73
- warp/tests/test_vec_scalar_ops.py +2097 -2099
- warp/tests/test_verify_fp.py +92 -94
- warp/tests/test_volume.py +961 -736
- warp/tests/test_volume_write.py +338 -265
- warp/tests/unittest_serial.py +38 -37
- warp/tests/unittest_suites.py +367 -359
- warp/tests/unittest_utils.py +434 -578
- warp/tests/unused_test_misc.py +69 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +563 -561
- warp/torch.py +321 -295
- warp/types.py +4941 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/METADATA +365 -400
- warp_lang-1.2.0.dist-info/RECORD +359 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp/examples/fem/example_convection_diffusion_dg0.py +0 -194
- warp/native/nanovdb/PNanoVDBWrite.h +0 -295
- warp_lang-1.0.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/top_level.txt +0 -0
|
@@ -1,126 +1,142 @@
|
|
|
1
|
-
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
-
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
-
# and proprietary rights in and to this software, related documentation
|
|
4
|
-
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
-
# distribution of this software and related documentation without an express
|
|
6
|
-
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
-
|
|
8
|
-
###########################################################################
|
|
9
|
-
# Example Graph Capture
|
|
10
|
-
#
|
|
11
|
-
# Shows how to implement CUDA graph capture using wp.ScopedCapture().
|
|
12
|
-
#
|
|
13
|
-
###########################################################################
|
|
14
|
-
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
import
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
self.
|
|
60
|
-
self.
|
|
61
|
-
self.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
self.
|
|
66
|
-
self.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
1
|
+
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
###########################################################################
|
|
9
|
+
# Example Graph Capture
|
|
10
|
+
#
|
|
11
|
+
# Shows how to implement CUDA graph capture using wp.ScopedCapture().
|
|
12
|
+
#
|
|
13
|
+
###########################################################################
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
import warp as wp
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@wp.kernel
|
|
21
|
+
def fbm(
|
|
22
|
+
kernel_seed: int,
|
|
23
|
+
frequency: float,
|
|
24
|
+
amplitude: float,
|
|
25
|
+
x: wp.array(dtype=float),
|
|
26
|
+
y: wp.array(dtype=float),
|
|
27
|
+
z: wp.array2d(dtype=float),
|
|
28
|
+
):
|
|
29
|
+
i, j = wp.tid()
|
|
30
|
+
state = wp.rand_init(kernel_seed)
|
|
31
|
+
|
|
32
|
+
p = frequency * wp.vec2(x[j], y[i])
|
|
33
|
+
n = amplitude * wp.noise(state, p)
|
|
34
|
+
|
|
35
|
+
z[i, j] += n
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@wp.kernel
|
|
39
|
+
def slide(x: wp.array(dtype=float), shift: float):
|
|
40
|
+
tid = wp.tid()
|
|
41
|
+
x[tid] += shift
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Example:
|
|
45
|
+
def __init__(self):
|
|
46
|
+
self.width = 128
|
|
47
|
+
self.height = 128
|
|
48
|
+
min_x, max_x = 0.0, 2.0
|
|
49
|
+
min_y, max_y = 0.0, 2.0
|
|
50
|
+
|
|
51
|
+
# create a grid of pixels
|
|
52
|
+
x = np.linspace(min_x, max_x, self.width)
|
|
53
|
+
y = np.linspace(min_y, max_y, self.height)
|
|
54
|
+
|
|
55
|
+
self.x = wp.array(x, dtype=float)
|
|
56
|
+
self.y = wp.array(y, dtype=float)
|
|
57
|
+
self.pixel_values = wp.zeros((self.width, self.height), dtype=float)
|
|
58
|
+
|
|
59
|
+
self.seed = 42
|
|
60
|
+
self.shift = 2e-2
|
|
61
|
+
self.frequency = 1.0
|
|
62
|
+
self.amplitude = 1.0
|
|
63
|
+
|
|
64
|
+
# use graph capture if launching from a CUDA-capable device
|
|
65
|
+
self.use_cuda_graph = wp.get_device().is_cuda
|
|
66
|
+
if self.use_cuda_graph:
|
|
67
|
+
# record launches
|
|
68
|
+
with wp.ScopedCapture() as capture:
|
|
69
|
+
self.fbm()
|
|
70
|
+
self.graph = capture.graph
|
|
71
|
+
|
|
72
|
+
def fbm(self):
|
|
73
|
+
for _ in range(16):
|
|
74
|
+
wp.launch(
|
|
75
|
+
kernel=fbm,
|
|
76
|
+
dim=(self.height, self.width),
|
|
77
|
+
inputs=[self.seed, self.frequency, self.amplitude, self.x, self.y],
|
|
78
|
+
outputs=[self.pixel_values],
|
|
79
|
+
)
|
|
80
|
+
self.frequency *= 2.0
|
|
81
|
+
self.amplitude *= 0.5
|
|
82
|
+
|
|
83
|
+
def step(self):
|
|
84
|
+
self.pixel_values.zero_()
|
|
85
|
+
self.frequency = 1.0
|
|
86
|
+
self.amplitude = 1.0
|
|
87
|
+
|
|
88
|
+
with wp.ScopedTimer("step", active=True):
|
|
89
|
+
wp.launch(kernel=slide, dim=self.width, inputs=[self.x, self.shift])
|
|
90
|
+
|
|
91
|
+
if self.use_cuda_graph:
|
|
92
|
+
wp.capture_launch(self.graph)
|
|
93
|
+
else: # cpu path
|
|
94
|
+
self.fbm()
|
|
95
|
+
|
|
96
|
+
def step_and_render(self, frame_num=None, img=None):
|
|
97
|
+
self.step()
|
|
98
|
+
|
|
99
|
+
with wp.ScopedTimer("render"):
|
|
100
|
+
if img:
|
|
101
|
+
pixels = self.pixel_values.numpy()
|
|
102
|
+
pixels = (pixels + 1.0) / 2.0
|
|
103
|
+
img.set_array(pixels)
|
|
104
|
+
|
|
105
|
+
return (img,)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
if __name__ == "__main__":
|
|
109
|
+
import argparse
|
|
110
|
+
|
|
111
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
112
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
113
|
+
parser.add_argument("--num_frames", type=int, default=1000, help="Total number of frames.")
|
|
114
|
+
parser.add_argument(
|
|
115
|
+
"--headless",
|
|
116
|
+
action="store_true",
|
|
117
|
+
help="Run in headless mode, suppressing the opening of any graphical windows.",
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
args = parser.parse_known_args()[0]
|
|
121
|
+
|
|
122
|
+
with wp.ScopedDevice(args.device):
|
|
123
|
+
example = Example()
|
|
124
|
+
|
|
125
|
+
if not args.headless:
|
|
126
|
+
import matplotlib.colors
|
|
127
|
+
import matplotlib.pyplot as plt
|
|
128
|
+
from matplotlib.animation import FuncAnimation
|
|
129
|
+
|
|
130
|
+
# Create the animation
|
|
131
|
+
fig = plt.figure()
|
|
132
|
+
img = plt.imshow(example.pixel_values.numpy(), "gray", origin="lower", animated=True)
|
|
133
|
+
img.set_norm(matplotlib.colors.Normalize(0.0, 1.0))
|
|
134
|
+
|
|
135
|
+
ani = FuncAnimation(fig, example.step_and_render, fargs=(img,), frames=1000, interval=30)
|
|
136
|
+
|
|
137
|
+
# Display the animation
|
|
138
|
+
plt.show()
|
|
139
|
+
|
|
140
|
+
else:
|
|
141
|
+
for _ in range(args.num_frames):
|
|
142
|
+
example.step()
|
|
@@ -1,174 +1,186 @@
|
|
|
1
|
-
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
-
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
-
# and proprietary rights in and to this software, related documentation
|
|
4
|
-
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
-
# distribution of this software and related documentation without an express
|
|
6
|
-
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
-
|
|
8
|
-
###########################################################################
|
|
9
|
-
# Example Marching Cubes
|
|
10
|
-
#
|
|
11
|
-
# Shows how use the built-in marching cubes functionality to extract
|
|
12
|
-
# the iso-surface from a density field.
|
|
13
|
-
#
|
|
14
|
-
# Note: requires a CUDA-capable device
|
|
15
|
-
###########################################################################
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
self.
|
|
112
|
-
self.
|
|
113
|
-
|
|
114
|
-
self.
|
|
115
|
-
|
|
116
|
-
self.
|
|
117
|
-
self.
|
|
118
|
-
|
|
119
|
-
self.
|
|
120
|
-
self.
|
|
121
|
-
|
|
122
|
-
self.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
self.
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
self.mc.verts
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
1
|
+
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
###########################################################################
|
|
9
|
+
# Example Marching Cubes
|
|
10
|
+
#
|
|
11
|
+
# Shows how use the built-in marching cubes functionality to extract
|
|
12
|
+
# the iso-surface from a density field.
|
|
13
|
+
#
|
|
14
|
+
# Note: requires a CUDA-capable device
|
|
15
|
+
###########################################################################
|
|
16
|
+
|
|
17
|
+
import warp as wp
|
|
18
|
+
import warp.render
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@wp.func
|
|
22
|
+
def sdf_create_box(pos: wp.vec3, size: wp.vec3):
|
|
23
|
+
"""Creates a SDF box primitive."""
|
|
24
|
+
# https://iquilezles.org/articles/distfunctions
|
|
25
|
+
q = wp.vec3(
|
|
26
|
+
wp.abs(pos[0]) - size[0],
|
|
27
|
+
wp.abs(pos[1]) - size[1],
|
|
28
|
+
wp.abs(pos[2]) - size[2],
|
|
29
|
+
)
|
|
30
|
+
qp = wp.vec3(wp.max(q[0], 0.0), wp.max(q[1], 0.0), wp.max(q[2], 0.0))
|
|
31
|
+
return wp.length(qp) + wp.min(wp.max(q[0], wp.max(q[1], q[2])), 0.0)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@wp.func
|
|
35
|
+
def sdf_create_torus(pos: wp.vec3, major_radius: float, minor_radius: float):
|
|
36
|
+
"""Creates a SDF torus primitive."""
|
|
37
|
+
# https://iquilezles.org/articles/distfunctions
|
|
38
|
+
q = wp.vec2(wp.length(wp.vec2(pos[0], pos[2])) - major_radius, pos[1])
|
|
39
|
+
return wp.length(q) - minor_radius
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@wp.func
|
|
43
|
+
def sdf_translate(pos: wp.vec3, offset: wp.vec3):
|
|
44
|
+
"""Translates a SDF position vector with an offset."""
|
|
45
|
+
return pos - offset
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@wp.func
|
|
49
|
+
def sdf_rotate(pos: wp.vec3, angles: wp.vec3):
|
|
50
|
+
"""Rotates a SDF position vector using Euler angles."""
|
|
51
|
+
rot = wp.quat_rpy(
|
|
52
|
+
wp.radians(angles[0]),
|
|
53
|
+
wp.radians(angles[1]),
|
|
54
|
+
wp.radians(angles[2]),
|
|
55
|
+
)
|
|
56
|
+
return wp.quat_rotate_inv(rot, pos)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@wp.func
|
|
60
|
+
def sdf_smooth_min(a: float, b: float, radius: float):
|
|
61
|
+
"""Creates a SDF torus primitive."""
|
|
62
|
+
# https://iquilezles.org/articles/smin
|
|
63
|
+
h = wp.max(radius - wp.abs(a - b), 0.0) / radius
|
|
64
|
+
return wp.min(a, b) - h * h * h * radius * (1.0 / 6.0)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@wp.kernel(enable_backward=False)
|
|
68
|
+
def make_field(
|
|
69
|
+
torus_altitude: float,
|
|
70
|
+
torus_major_radius: float,
|
|
71
|
+
torus_minor_radius: float,
|
|
72
|
+
smooth_min_radius: float,
|
|
73
|
+
dim: int,
|
|
74
|
+
time: float,
|
|
75
|
+
out_data: wp.array3d(dtype=float),
|
|
76
|
+
):
|
|
77
|
+
"""Kernel to generate a SDF volume based on primitives."""
|
|
78
|
+
i, j, k = wp.tid()
|
|
79
|
+
|
|
80
|
+
# Retrieve the position of the current cell in a normalized [-1, 1] range
|
|
81
|
+
# for each dimension.
|
|
82
|
+
pos = wp.vec3(
|
|
83
|
+
2.0 * ((float(i) + 0.5) / float(dim)) - 1.0,
|
|
84
|
+
2.0 * ((float(j) + 0.5) / float(dim)) - 1.0,
|
|
85
|
+
2.0 * ((float(k) + 0.5) / float(dim)) - 1.0,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
box = sdf_create_box(
|
|
89
|
+
sdf_translate(pos, wp.vec3(0.0, -0.7, 0.0)),
|
|
90
|
+
wp.vec3(0.9, 0.3, 0.9),
|
|
91
|
+
)
|
|
92
|
+
torus = sdf_create_torus(
|
|
93
|
+
sdf_rotate(
|
|
94
|
+
sdf_translate(pos, wp.vec3(0.0, torus_altitude, 0.0)),
|
|
95
|
+
wp.vec3(wp.sin(time) * 90.0, wp.cos(time) * 45.0, 0.0),
|
|
96
|
+
),
|
|
97
|
+
torus_major_radius,
|
|
98
|
+
torus_minor_radius,
|
|
99
|
+
)
|
|
100
|
+
out_data[i, j, k] = sdf_smooth_min(box, torus, smooth_min_radius)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class Example:
|
|
104
|
+
def __init__(self, stage_path="example_marching_cubes.usd", verbose=False):
|
|
105
|
+
self.verbose = verbose
|
|
106
|
+
|
|
107
|
+
self.dim = 64
|
|
108
|
+
self.max_verts = int(1e6)
|
|
109
|
+
self.max_tris = int(1e6)
|
|
110
|
+
|
|
111
|
+
self.torus_altitude = -0.5
|
|
112
|
+
self.torus_major_radius = 0.5
|
|
113
|
+
self.torus_minor_radius = 0.1
|
|
114
|
+
self.smooth_min_radius = 0.5
|
|
115
|
+
|
|
116
|
+
self.fps = 60
|
|
117
|
+
self.frame = 0
|
|
118
|
+
|
|
119
|
+
self.field = wp.zeros((self.dim, self.dim, self.dim), dtype=float)
|
|
120
|
+
self.mc = wp.MarchingCubes(self.dim, self.dim, self.dim, self.max_verts, self.max_tris)
|
|
121
|
+
|
|
122
|
+
self.renderer = None
|
|
123
|
+
if stage_path:
|
|
124
|
+
self.renderer = wp.render.UsdRenderer(stage_path)
|
|
125
|
+
|
|
126
|
+
def step(self):
|
|
127
|
+
with wp.ScopedTimer("step"):
|
|
128
|
+
with wp.ScopedTimer("Update Field", active=self.verbose):
|
|
129
|
+
wp.launch(
|
|
130
|
+
make_field,
|
|
131
|
+
dim=self.field.shape,
|
|
132
|
+
inputs=(
|
|
133
|
+
self.torus_altitude,
|
|
134
|
+
self.torus_major_radius,
|
|
135
|
+
self.torus_minor_radius,
|
|
136
|
+
self.smooth_min_radius,
|
|
137
|
+
self.dim,
|
|
138
|
+
self.frame / self.fps,
|
|
139
|
+
),
|
|
140
|
+
outputs=(self.field,),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
with wp.ScopedTimer("Surface Extraction", active=self.verbose):
|
|
144
|
+
self.mc.surface(self.field, 0.0)
|
|
145
|
+
|
|
146
|
+
def render(self):
|
|
147
|
+
if self.renderer is None:
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
with wp.ScopedTimer("Render"):
|
|
151
|
+
self.renderer.begin_frame(self.frame / self.fps)
|
|
152
|
+
self.renderer.render_mesh(
|
|
153
|
+
"surface",
|
|
154
|
+
self.mc.verts.numpy(),
|
|
155
|
+
self.mc.indices.numpy(),
|
|
156
|
+
colors=((0.35, 0.55, 0.9),) * len(self.mc.verts),
|
|
157
|
+
update_topology=True,
|
|
158
|
+
)
|
|
159
|
+
self.renderer.end_frame()
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
if __name__ == "__main__":
|
|
163
|
+
import argparse
|
|
164
|
+
|
|
165
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
166
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
167
|
+
parser.add_argument(
|
|
168
|
+
"--stage_path",
|
|
169
|
+
type=lambda x: None if x == "None" else str(x),
|
|
170
|
+
default="example_marching_cubes.usd",
|
|
171
|
+
help="Path to the output USD file.",
|
|
172
|
+
)
|
|
173
|
+
parser.add_argument("--num_frames", type=int, default=240, help="Total number of frames.")
|
|
174
|
+
parser.add_argument("--verbose", action="store_true", help="Print out additional status messages during execution.")
|
|
175
|
+
|
|
176
|
+
args = parser.parse_known_args()[0]
|
|
177
|
+
|
|
178
|
+
with wp.ScopedDevice(args.device):
|
|
179
|
+
example = Example(stage_path=args.stage_path, verbose=args.verbose)
|
|
180
|
+
for _ in range(args.num_frames):
|
|
181
|
+
example.step()
|
|
182
|
+
example.render()
|
|
183
|
+
example.frame += 1
|
|
184
|
+
|
|
185
|
+
if example.renderer is not None:
|
|
186
|
+
example.renderer.save()
|