Skip to content

Commit 7ed22bf

Browse files
DeepMindcopybara-github
authored andcommitted
Add scene callbacks to viewer/renderer.py and viewer/viewer.py
PiperOrigin-RevId: 472485161 Change-Id: Ic5fa30c97e1a33b6e0c8878818d0f51539795acb
1 parent 154e039 commit 7ed22bf

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

dm_control/viewer/renderer.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ def __init__(self,
378378
data,
379379
options,
380380
settings=None,
381-
zoom_factor=_FULL_SCENE_ZOOM_FACTOR):
381+
zoom_factor=_FULL_SCENE_ZOOM_FACTOR,
382+
scene_callback=None):
382383
"""Instance initializer.
383384
384385
Args:
@@ -388,6 +389,9 @@ def __init__(self,
388389
settings: Optional, internal camera settings obtained from another
389390
SceneCamera instance using 'settings' property.
390391
zoom_factor: The initial zoom factor for zooming into the scene.
392+
scene_callback: Scene callback.
393+
This is a callable of the form: `my_callable(MjModel, MjData, MjvScene)`
394+
that gets applied to every rendered scene.
391395
"""
392396
# Design notes:
393397
# We need to recreate the camera for each new model, because each model
@@ -403,6 +407,7 @@ def __init__(self,
403407
self._camera.fixedcamid = _FREE_CAMERA_INDEX
404408
self._camera.type_ = mujoco.mjtCamera.mjCAMERA_FREE
405409
self._zoom_factor = zoom_factor
410+
self._scene_callback = scene_callback
406411

407412
if settings is not None:
408413
self._settings = settings
@@ -499,6 +504,10 @@ def render(self, perturbation=None):
499504
self._options.visualization.ptr, perturb_to_render,
500505
self._camera.ptr, mujoco.mjtCatBit.mjCAT_ALL,
501506
self._scene.ptr)
507+
508+
# Apply callback if defined.
509+
if self._scene_callback is not None:
510+
self._scene_callback(self._model, self._data, self._scene)
502511
return self._scene
503512

504513
def zoom_to_scene(self):

dm_control/viewer/viewer.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class Viewer:
9595
"""Viewport displaying the contents of a physics world."""
9696

9797
def __init__(self, viewport, mouse, keyboard, camera_settings=None,
98-
zoom_factor=_FULL_SCENE_ZOOM_FACTOR):
98+
zoom_factor=_FULL_SCENE_ZOOM_FACTOR, scene_callback=None):
9999
"""Instance initializer.
100100
101101
Args:
@@ -104,6 +104,9 @@ def __init__(self, viewport, mouse, keyboard, camera_settings=None,
104104
keyboard: A keyboard device.
105105
camera_settings: Properties of the scene MjvCamera.
106106
zoom_factor: Initial scale factor for zooming into the scene.
107+
scene_callback: Scene callback.
108+
This is a callable of the form: `my_callable(MjModel, MjData, MjvScene)`
109+
that gets applied to every rendered scene.
107110
"""
108111
self._viewport = viewport
109112
self._mouse = mouse
@@ -119,6 +122,7 @@ def __init__(self, viewport, mouse, keyboard, camera_settings=None,
119122
self._free_camera = None
120123
self._camera_select = None
121124
self._zoom_factor = zoom_factor
125+
self._scene_callback = scene_callback
122126

123127
def __del__(self):
124128
del self._camera
@@ -136,8 +140,12 @@ def initialize(self, physics, renderer_instance, touchpad):
136140
touchpad: A boolean, use input dedicated to touchpad.
137141
"""
138142
self._camera = renderer.SceneCamera(
139-
physics.model, physics.data, self._render_settings,
140-
settings=self._camera_settings, zoom_factor=self._zoom_factor)
143+
physics.model,
144+
physics.data,
145+
self._render_settings,
146+
settings=self._camera_settings,
147+
zoom_factor=self._zoom_factor,
148+
scene_callback=self._scene_callback)
141149

142150
self._manipulator = ManipulationController(
143151
self._viewport, self._camera, self._mouse)

0 commit comments

Comments
 (0)