warp-lang 1.9.1__py3-none-win_amd64.whl → 1.10.0rc2__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 +301 -287
- warp/__init__.pyi +794 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1382 -377
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +1 -1
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +57 -29
- warp/native/warp.cu +253 -171
- warp/native/warp.h +11 -8
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3618
- warp/render/render_usd.py +6 -919
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +772 -49
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +527 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +33 -14
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +56 -10
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +35 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_types.py +27 -15
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +178 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.1.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 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
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import warp as wp
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ImGuiManager:
|
|
22
|
+
"""Base class for managing an ImGui UI."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, renderer):
|
|
25
|
+
try:
|
|
26
|
+
import imgui
|
|
27
|
+
from imgui.integrations.pyglet import PygletProgrammablePipelineRenderer
|
|
28
|
+
|
|
29
|
+
self.imgui = imgui
|
|
30
|
+
self.is_available = True
|
|
31
|
+
except ImportError:
|
|
32
|
+
self.is_available = False
|
|
33
|
+
print('Warning: imgui not found. To use the UI, please install it with: pip install "imgui[pyglet]"')
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
self.imgui.create_context()
|
|
37
|
+
self.renderer = renderer
|
|
38
|
+
self.impl = PygletProgrammablePipelineRenderer(self.renderer.window)
|
|
39
|
+
|
|
40
|
+
def render_frame(self):
|
|
41
|
+
"""Renders a single frame of the UI. This should be called from the main render loop."""
|
|
42
|
+
if not self.is_available:
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
io = self.imgui.get_io()
|
|
46
|
+
self.renderer.enable_mouse_interaction = not io.want_capture_mouse
|
|
47
|
+
self.renderer.enable_keyboard_interaction = not io.want_capture_keyboard
|
|
48
|
+
io.display_size = self.renderer.screen_width, self.renderer.screen_height
|
|
49
|
+
|
|
50
|
+
self.imgui.new_frame()
|
|
51
|
+
|
|
52
|
+
self.draw_ui()
|
|
53
|
+
|
|
54
|
+
self.imgui.render()
|
|
55
|
+
self.imgui.end_frame()
|
|
56
|
+
self.impl.render(self.imgui.get_draw_data())
|
|
57
|
+
|
|
58
|
+
def draw_ui(self):
|
|
59
|
+
"""Draws the UI. To be implemented by subclasses."""
|
|
60
|
+
pass
|
|
61
|
+
|
|
62
|
+
def open_save_file_dialog(
|
|
63
|
+
self,
|
|
64
|
+
title: str = "Save File",
|
|
65
|
+
defaultextension: str = "",
|
|
66
|
+
filetypes: list[tuple[str, str]] | None = None,
|
|
67
|
+
) -> str | None:
|
|
68
|
+
"""Opens a file dialog for saving a file and returns the selected path."""
|
|
69
|
+
try:
|
|
70
|
+
import tkinter as tk
|
|
71
|
+
from tkinter import filedialog
|
|
72
|
+
except ImportError:
|
|
73
|
+
print("Warning: tkinter not found. To use the file dialog, please install it.")
|
|
74
|
+
return None
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
root = tk.Tk()
|
|
78
|
+
except tk.TclError:
|
|
79
|
+
print("Warning: no display found - cannot open file dialog.")
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
root.withdraw() # Hide the main window
|
|
83
|
+
file_path = filedialog.asksaveasfilename(
|
|
84
|
+
defaultextension=defaultextension,
|
|
85
|
+
filetypes=filetypes or [("All Files", "*.*")],
|
|
86
|
+
title=title,
|
|
87
|
+
)
|
|
88
|
+
root.destroy()
|
|
89
|
+
return file_path
|
|
90
|
+
|
|
91
|
+
def open_load_file_dialog(
|
|
92
|
+
self, title: str = "Open File", filetypes: list[tuple[str, str]] | None = None
|
|
93
|
+
) -> str | None:
|
|
94
|
+
"""Opens a file dialog for loading a file and returns the selected path."""
|
|
95
|
+
try:
|
|
96
|
+
import tkinter as tk
|
|
97
|
+
from tkinter import filedialog
|
|
98
|
+
except ImportError:
|
|
99
|
+
print("Warning: tkinter not found. To use the file dialog, please install it.")
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
root = tk.Tk()
|
|
104
|
+
except tk.TclError:
|
|
105
|
+
print("Warning: no display found - cannot open file dialog.")
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
root.withdraw() # Hide the main window
|
|
109
|
+
file_path = filedialog.askopenfilename(
|
|
110
|
+
filetypes=filetypes or [("All Files", "*.*")],
|
|
111
|
+
title=title,
|
|
112
|
+
)
|
|
113
|
+
root.destroy()
|
|
114
|
+
return file_path
|
|
115
|
+
|
|
116
|
+
def drag_vec3(self, label, vec, speed=0.1, min_val=0.0, max_val=100.0):
|
|
117
|
+
"""Helper method to create a drag widget for a wp.vec3"""
|
|
118
|
+
changed, *values = self.imgui.drag_float3(label, *vec, speed, min_val, max_val)
|
|
119
|
+
if changed:
|
|
120
|
+
vec = wp.vec3(*values)
|
|
121
|
+
return changed, vec
|
|
122
|
+
|
|
123
|
+
def drag_vec3_list(
|
|
124
|
+
self,
|
|
125
|
+
label_prefix: str,
|
|
126
|
+
vec_list: list[wp.vec3] | wp.array,
|
|
127
|
+
speed: float = 0.1,
|
|
128
|
+
min_val: float = 0.0,
|
|
129
|
+
max_val: float = 100.0,
|
|
130
|
+
max_num_elements: int = 10,
|
|
131
|
+
) -> tuple[bool, list[wp.vec3] | wp.array]:
|
|
132
|
+
"""Helper method to create drag widgets for a list of wp.vec3.
|
|
133
|
+
|
|
134
|
+
Note: The `label_prefix` is used to create unique IDs for each widget.
|
|
135
|
+
If you are displaying multiple lists, ensure that `label_prefix` is unique
|
|
136
|
+
for each list to prevent UI elements from interfering with each other.
|
|
137
|
+
"""
|
|
138
|
+
self.imgui.text(f"List: {label_prefix} with {len(vec_list)} elements")
|
|
139
|
+
changed = False
|
|
140
|
+
|
|
141
|
+
# Convert to numpy array if it's a warp array
|
|
142
|
+
is_warp_array = isinstance(vec_list, wp.array)
|
|
143
|
+
working_array = vec_list.numpy() if is_warp_array else vec_list
|
|
144
|
+
|
|
145
|
+
for i, vec in enumerate(working_array[:max_num_elements]):
|
|
146
|
+
vec_changed, new_vec = self.drag_vec3(f"{label_prefix} {i}", vec, speed, min_val, max_val)
|
|
147
|
+
if vec_changed:
|
|
148
|
+
working_array[i] = new_vec
|
|
149
|
+
changed = True
|
|
150
|
+
|
|
151
|
+
if is_warp_array:
|
|
152
|
+
if changed:
|
|
153
|
+
return changed, wp.array(working_array, dtype=wp.vec3)
|
|
154
|
+
return changed, vec_list
|
|
155
|
+
return changed, working_array
|
|
156
|
+
|
|
157
|
+
def drag_vec2(
|
|
158
|
+
self, label: str, vec: wp.vec2, speed: float = 0.1, min_val: float = 0.0, max_val: float = 100.0
|
|
159
|
+
) -> tuple[bool, wp.vec2]:
|
|
160
|
+
"""Helper method to create a drag widget for a wp.vec2"""
|
|
161
|
+
changed, *values = self.imgui.drag_float2(label, *vec, speed, min_val, max_val)
|
|
162
|
+
if changed:
|
|
163
|
+
vec = wp.vec2(*values)
|
|
164
|
+
return changed, vec
|
|
165
|
+
|
|
166
|
+
def drag_vec2_list(
|
|
167
|
+
self,
|
|
168
|
+
label_prefix: str,
|
|
169
|
+
vec_list: list[wp.vec2] | wp.array,
|
|
170
|
+
speed: float = 0.1,
|
|
171
|
+
min_val: float = 0.0,
|
|
172
|
+
max_val: float = 100.0,
|
|
173
|
+
max_num_elements: int = 10,
|
|
174
|
+
) -> tuple[bool, list[wp.vec2] | wp.array]:
|
|
175
|
+
"""Helper method to create drag widgets for a list of wp.vec2.
|
|
176
|
+
|
|
177
|
+
Note: The `label_prefix` is used to create unique IDs for each widget.
|
|
178
|
+
If you are displaying multiple lists, ensure that `label_prefix` is unique
|
|
179
|
+
for each list to prevent UI elements from interfering with each other.
|
|
180
|
+
"""
|
|
181
|
+
self.imgui.text(f"List: {label_prefix} with {len(vec_list)} elements")
|
|
182
|
+
changed = False
|
|
183
|
+
|
|
184
|
+
# Convert to numpy array if it's a warp array
|
|
185
|
+
is_warp_array = isinstance(vec_list, wp.array)
|
|
186
|
+
working_array = vec_list.numpy() if is_warp_array else vec_list
|
|
187
|
+
|
|
188
|
+
for i, vec in enumerate(working_array[:max_num_elements]):
|
|
189
|
+
vec_changed, new_vec = self.drag_vec2(f"{label_prefix} {i}", vec, speed, min_val, max_val)
|
|
190
|
+
if vec_changed:
|
|
191
|
+
working_array[i] = new_vec
|
|
192
|
+
changed = True
|
|
193
|
+
|
|
194
|
+
if is_warp_array:
|
|
195
|
+
if changed:
|
|
196
|
+
return changed, wp.array(working_array, dtype=wp.vec2)
|
|
197
|
+
return changed, vec_list
|
|
198
|
+
return changed, working_array
|
|
199
|
+
|
|
200
|
+
def drag_vec4(
|
|
201
|
+
self, label: str, vec: wp.vec4, speed: float = 0.1, min_val: float = 0.0, max_val: float = 100.0
|
|
202
|
+
) -> tuple[bool, wp.vec4]:
|
|
203
|
+
"""Helper method to create a drag widget for a wp.vec4"""
|
|
204
|
+
changed, *values = self.imgui.drag_float4(label, *vec, speed, min_val, max_val)
|
|
205
|
+
if changed:
|
|
206
|
+
vec = wp.vec4(*values)
|
|
207
|
+
return changed, vec
|
|
208
|
+
|
|
209
|
+
def drag_vec4_list(
|
|
210
|
+
self,
|
|
211
|
+
label_prefix: str,
|
|
212
|
+
vec_list: list[wp.vec4] | wp.array,
|
|
213
|
+
speed: float = 0.1,
|
|
214
|
+
min_val: float = 0.0,
|
|
215
|
+
max_val: float = 100.0,
|
|
216
|
+
max_num_elements: int = 10,
|
|
217
|
+
) -> tuple[bool, list[wp.vec4] | wp.array]:
|
|
218
|
+
"""Helper method to create drag widgets for a list of wp.vec4.
|
|
219
|
+
|
|
220
|
+
Note: The `label_prefix` is used to create unique IDs for each widget.
|
|
221
|
+
If you are displaying multiple lists, ensure that `label_prefix` is unique
|
|
222
|
+
for each list to prevent UI elements from interfering with each other.
|
|
223
|
+
"""
|
|
224
|
+
self.imgui.text(f"List: {label_prefix} with {len(vec_list)} elements")
|
|
225
|
+
changed = False
|
|
226
|
+
|
|
227
|
+
# Convert to numpy array if it's a warp array
|
|
228
|
+
is_warp_array = isinstance(vec_list, wp.array)
|
|
229
|
+
working_array = vec_list.numpy() if is_warp_array else vec_list
|
|
230
|
+
|
|
231
|
+
for i, vec in enumerate(working_array[:max_num_elements]):
|
|
232
|
+
vec_changed, new_vec = self.drag_vec4(f"{label_prefix} {i}", vec, speed, min_val, max_val)
|
|
233
|
+
if vec_changed:
|
|
234
|
+
working_array[i] = new_vec
|
|
235
|
+
changed = True
|
|
236
|
+
|
|
237
|
+
if is_warp_array:
|
|
238
|
+
if changed:
|
|
239
|
+
return changed, wp.array(working_array, dtype=wp.vec4)
|
|
240
|
+
return changed, vec_list
|
|
241
|
+
return changed, working_array
|
|
242
|
+
|
|
243
|
+
def drag_float(
|
|
244
|
+
self, label: str, val: float, speed: float = 0.1, min_val: float = 0.0, max_val: float = 100.0
|
|
245
|
+
) -> tuple[bool, float]:
|
|
246
|
+
"""Helper method to create a drag widget for a float"""
|
|
247
|
+
changed, value = self.imgui.drag_float(label, val, speed, min_val, max_val)
|
|
248
|
+
if changed:
|
|
249
|
+
val = value
|
|
250
|
+
return changed, val
|
|
251
|
+
|
|
252
|
+
def drag_float_list(
|
|
253
|
+
self,
|
|
254
|
+
label_prefix: str,
|
|
255
|
+
float_list: list[float] | wp.array,
|
|
256
|
+
speed: float = 0.1,
|
|
257
|
+
min_val: float = 0.0,
|
|
258
|
+
max_val: float = 100.0,
|
|
259
|
+
max_num_elements: int = 10,
|
|
260
|
+
) -> tuple[bool, list[float] | wp.array]:
|
|
261
|
+
"""Helper method to create drag widgets for a list of floats.
|
|
262
|
+
|
|
263
|
+
Note: The `label_prefix` is used to create unique IDs for each widget.
|
|
264
|
+
If you are displaying multiple lists, ensure that `label_prefix` is unique
|
|
265
|
+
for each list to prevent UI elements from interfering with each other.
|
|
266
|
+
"""
|
|
267
|
+
self.imgui.text(f"List: {label_prefix} with {len(float_list)} elements")
|
|
268
|
+
changed = False
|
|
269
|
+
|
|
270
|
+
# Convert to numpy array if it's a warp array
|
|
271
|
+
is_warp_array = isinstance(float_list, wp.array)
|
|
272
|
+
working_array = float_list.numpy() if is_warp_array else float_list
|
|
273
|
+
|
|
274
|
+
for i, val in enumerate(working_array[:max_num_elements]):
|
|
275
|
+
val_changed, new_val = self.drag_float(f"{label_prefix} {i}", val, speed, min_val, max_val)
|
|
276
|
+
if val_changed:
|
|
277
|
+
working_array[i] = new_val
|
|
278
|
+
changed = True
|
|
279
|
+
|
|
280
|
+
if is_warp_array:
|
|
281
|
+
if changed:
|
|
282
|
+
return changed, wp.array(working_array, dtype=float_list.dtype)
|
|
283
|
+
return changed, float_list
|
|
284
|
+
return changed, working_array
|
|
285
|
+
|
|
286
|
+
def shutdown(self):
|
|
287
|
+
if not self.is_available:
|
|
288
|
+
return
|
|
289
|
+
self.impl.shutdown()
|