Skip to content

Commit e2ef651

Browse files
committed
add fixes
1 parent da1526c commit e2ef651

File tree

3 files changed

+30
-25
lines changed

3 files changed

+30
-25
lines changed

.github/workflows/examples.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ jobs:
5454
run: |
5555
python -m pip install --upgrade pip setuptools wheel
5656
pip install torch --index-url https://download.pytorch.org/whl/cpu
57+
pip install -e '.[dev,usd]'
5758
5859
- name: Get gstaichi version
5960
id: gstaichi_version

examples/IPC_Solver/ipc_arm_cloth.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def build_scene(use_ipc=False, show_viewer=False, enable_ipc_gui=False):
139139
return scene, entities
140140

141141

142-
def run_sim(scene, entities, mode="interactive", trajectory_file=None):
142+
def run_sim(scene, entities, add_keybinds, mode="interactive", trajectory_file=None):
143143
robot = entities["robot"]
144144
target_entity = entities["target"]
145145
is_running = True
@@ -175,8 +175,8 @@ def reset_scene():
175175
# entities["cube"].set_pos((random.uniform(0.2, 0.4), random.uniform(-0.2, 0.2), 0.05))
176176
# entities["cube"].set_quat(R.from_euler("z", random.uniform(0, np.pi * 2)).as_quat(scalar_first=True))
177177

178-
# Register keybindings (only for interactive and record modes)
179-
if mode in ["interactive", "record"]:
178+
# Register keybindings
179+
if add_keybinds:
180180

181181
def move(dpos_delta: tuple[float, float, float]):
182182
target_pos[:] += np.array(dpos_delta, dtype=gs.np_float)
@@ -408,7 +408,13 @@ def main():
408408
trajectory_file = os.path.join(traj_dir, os.path.basename(trajectory_file))
409409

410410
scene, entities = build_scene(use_ipc=args.ipc, show_viewer=args.vis, enable_ipc_gui=False)
411-
run_sim(scene, entities, mode=args.mode, trajectory_file=trajectory_file)
411+
run_sim(
412+
scene,
413+
entities,
414+
add_keybinds=args.vis or args.mode in ["interactive", "record"],
415+
mode=args.mode,
416+
trajectory_file=trajectory_file,
417+
)
412418

413419

414420
if __name__ == "__main__":

tests/test_viewer.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,20 @@
1414
CAM_RES = (480, 320)
1515

1616

17+
def wait_for_viewer_events(viewer, condition_fn, timeout=2.0, sleep_interval=0.1):
18+
"""Utility function to wait for viewer events to be processed in a threaded viewer."""
19+
if not viewer.run_in_thread:
20+
viewer.dispatch_pending_events()
21+
viewer.dispatch_events()
22+
23+
for _ in range(int(timeout / sleep_interval)):
24+
if condition_fn():
25+
return
26+
time.sleep(sleep_interval)
27+
else:
28+
raise AssertionError("Keyboard event not processed before timeout")
29+
30+
1731
@pytest.mark.required
1832
@pytest.mark.skipif(not IS_INTERACTIVE_VIEWER_AVAILABLE, reason="Interactive viewer not supported on this platform.")
1933
@pytest.mark.xfail(sys.platform == "win32", raises=OpenGL.error.Error, reason="Invalid OpenGL context.")
@@ -79,9 +93,6 @@ def test_default_viewer_plugin():
7993

8094
assert len(pyrender_viewer._keybindings) > 0, "Expected default keybindings to be registered."
8195

82-
# Press key toggle world frame
83-
pyrender_viewer.dispatch_event("on_key_press", Key.W, 0)
84-
8596
# Add a custom keybind
8697
flags = [False, False, False]
8798

@@ -109,20 +120,14 @@ def toggle_flag(idx):
109120
pyrender_viewer.dispatch_event("on_key_press", Key._0, 0)
110121
# Press key with modifiers to toggle flag off
111122
pyrender_viewer.dispatch_event("on_key_press", Key._1, KeyMod.SHIFT | KeyMod.CTRL)
123+
# Press key toggle world frame
124+
pyrender_viewer.dispatch_event("on_key_press", Key.W, 0)
112125

113-
if pyrender_viewer.run_in_thread:
114-
for i in range(100):
115-
if flags[0] and flags[1]:
116-
break
117-
time.sleep(0.1)
118-
else:
119-
pyrender_viewer.dispatch_pending_events()
120-
pyrender_viewer.dispatch_events()
121-
122-
assert pyrender_viewer.gs_context.world_frame_shown, "Expected world frame to be shown after pressing 'W' key."
126+
wait_for_viewer_events(pyrender_viewer, lambda: flags[0] and flags[1])
123127

124128
assert flags[0], "Expected custom keybind callback to toggle flag on."
125129
assert flags[1], "Expected custom keybind with key modifiers to toggle flag on."
130+
assert pyrender_viewer.gs_context.world_frame_shown, "Expected world frame to be shown after pressing 'W' key."
126131

127132
# Remove the keybind and press key to verify it no longer works
128133
scene.viewer.remove_keybind("toggle_flag_0")
@@ -131,14 +136,7 @@ def toggle_flag(idx):
131136
scene.viewer.remap_keybind("toggle_flag_1", new_key=Key._2, new_key_mods=None)
132137
pyrender_viewer.dispatch_event("on_key_press", Key._2, 0)
133138

134-
if pyrender_viewer.run_in_thread:
135-
for i in range(1000):
136-
if not flags[1]:
137-
break
138-
time.sleep(0.1)
139-
else:
140-
pyrender_viewer.dispatch_pending_events()
141-
pyrender_viewer.dispatch_events()
139+
wait_for_viewer_events(pyrender_viewer, lambda: not flags[1])
142140

143141
assert flags[0], "Keybind was not removed properly."
144142
assert not flags[1], "Expected rebinded keybind to toggle flag off."

0 commit comments

Comments
 (0)