Skip to content

Commit 878c812

Browse files
DeepMindcopybara-github
authored andcommitted
Add Flex component.
PiperOrigin-RevId: 572830650 Change-Id: Ia47527e0acdb5760173549014e23d30036ee2971
1 parent c9deca6 commit 878c812

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

dm_control/mujoco/engine.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161

6262
Contexts = collections.namedtuple('Contexts', ['gl', 'mujoco'])
6363
Selected = collections.namedtuple(
64-
'Selected', ['body', 'geom', 'skin', 'world_position'])
64+
'Selected', ['body', 'geom', 'flex', 'skin', 'world_position'])
6565
NamedIndexStructs = collections.namedtuple(
6666
'NamedIndexStructs', ['model', 'data'])
6767
Pose = collections.namedtuple(
@@ -937,12 +937,14 @@ def select(self, cursor_position):
937937
cursor_x, cursor_y = cursor_position
938938
pos = np.empty(3, np.double)
939939
geom_id_arr = np.intc([-1])
940+
flex_id_arr = np.intc([-1])
940941
skin_id_arr = np.intc([-1])
941942
body_id = mujoco.mjv_select(self._physics.model.ptr, self._physics.data.ptr,
942943
self._scene_option.ptr, aspect_ratio, cursor_x,
943944
cursor_y, self._scene.ptr, pos, geom_id_arr,
944-
skin_id_arr)
945+
flex_id_arr, skin_id_arr)
945946
[geom_id] = geom_id_arr
947+
[flex_id] = flex_id_arr
946948
[skin_id] = skin_id_arr
947949

948950
# Validate IDs
@@ -954,6 +956,10 @@ def select(self, cursor_position):
954956
assert 0 <= geom_id < self._physics.model.ngeom
955957
else:
956958
geom_id = None
959+
if flex_id != -1:
960+
assert 0 <= flex_id < self._physics.model.nflex
961+
else:
962+
flex_id = None
957963
if skin_id != -1:
958964
assert 0 <= skin_id < self._physics.model.nskin
959965
else:
@@ -963,7 +969,12 @@ def select(self, cursor_position):
963969
pos = None
964970

965971
return Selected(
966-
body=body_id, geom=geom_id, skin=skin_id, world_position=pos)
972+
body=body_id,
973+
geom=geom_id,
974+
flex=flex_id,
975+
skin=skin_id,
976+
world_position=pos,
977+
)
967978

968979

969980
class MovableCamera(Camera):

dm_control/viewer/renderer.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,7 @@ def raycast(self, viewport, screen_pos):
494494
viewport_pos = viewport.screen_to_inverse_viewport(screen_pos)
495495
grab_world_pos = np.empty(3, dtype=np.double)
496496
selected_geom_id_arr = np.intc([-1])
497+
selected_flex_id_arr = np.intc([-1])
497498
selected_skin_id_arr = np.intc([-1])
498499
selected_body_id = mujoco.mjv_select(
499500
self._model.ptr,
@@ -505,9 +506,14 @@ def raycast(self, viewport, screen_pos):
505506
self._scene.ptr,
506507
grab_world_pos,
507508
selected_geom_id_arr,
509+
selected_flex_id_arr,
508510
selected_skin_id_arr,
509511
)
510-
del selected_geom_id_arr, selected_skin_id_arr # Unused.
512+
del (
513+
selected_geom_id_arr,
514+
selected_skin_id_arr,
515+
selected_flex_id_arr,
516+
) # Unused.
511517
if selected_body_id < 0:
512518
selected_body_id = _INVALID_BODY_INDEX
513519
grab_world_pos = None

dm_control/viewer/renderer_test.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -422,12 +422,25 @@ def initialize_camera(self, enable):
422422

423423
def test_raycast_mapping_geom_to_body_id(self):
424424
def build_mjv_select(mock_body_id, mock_geom_id, mock_position):
425+
425426
def mock_select(
426-
m, d, vopt, aspectratio, relx, rely, scn, selpnt, geomid, skinid):
427-
del m, d, vopt, aspectratio, relx, rely, scn, skinid # Unused.
427+
m,
428+
d,
429+
vopt,
430+
aspectratio,
431+
relx,
432+
rely,
433+
scn,
434+
selpnt,
435+
geomid,
436+
flexid,
437+
skinid,
438+
):
439+
del m, d, vopt, aspectratio, relx, rely, scn, flexid, skinid # Unused.
428440
selpnt[:] = mock_position
429441
geomid[:] = mock_geom_id
430442
return mock_body_id
443+
431444
return mock_select
432445

433446
geom_id = 0
@@ -444,9 +457,11 @@ def mock_select(
444457
np.testing.assert_array_equal(hit_world_pos, world_pos)
445458

446459
def test_raycast_hitting_empty_space(self):
460+
447461
def mock_select(
448-
m, d, vopt, aspectratio, relx, rely, scn, selpnt, geomid, skinid):
449-
del (m, d, vopt, aspectratio, relx, rely, scn, selpnt, geomid,
462+
m, d, vopt, aspectratio, relx, rely, scn, selpnt, geomid, flexid, skinid
463+
):
464+
del (m, d, vopt, aspectratio, relx, rely, scn, selpnt, geomid, flexid,
450465
skinid) # Unused.
451466
mock_body_id = -1 # Nothing selected.
452467
return mock_body_id
@@ -459,13 +474,26 @@ def mock_select(
459474

460475
def test_raycast_maps_coordinates_to_viewport_space(self):
461476
def build_mjv_select(expected_aspect_ratio, expected_viewport_pos):
477+
462478
def mock_select(
463-
m, d, vopt, aspectratio, relx, rely, scn, selpnt, geomid, skinid):
464-
del m, d, vopt, scn, selpnt, geomid, skinid # Unused.
479+
m,
480+
d,
481+
vopt,
482+
aspectratio,
483+
relx,
484+
rely,
485+
scn,
486+
selpnt,
487+
geomid,
488+
flexid,
489+
skinid,
490+
):
491+
del m, d, vopt, scn, selpnt, geomid, flexid, skinid # Unused.
465492
self.assertEqual(expected_aspect_ratio, aspectratio)
466493
np.testing.assert_array_equal(expected_viewport_pos, [relx, rely])
467494
mock_body_id = 0
468495
return mock_body_id
496+
469497
return mock_select
470498

471499
viewport_pos = [.5, .5]

0 commit comments

Comments
 (0)