Skip to content

Commit a9e3eba

Browse files
authored
Allows to specify render callback. (#150)
1 parent 041f9f1 commit a9e3eba

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

examples/render_callback.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Shows how to use render callback.
4+
"""
5+
from mujoco_py import load_model_from_path, MjSim, MjViewer
6+
from mujoco_py.modder import TextureModder
7+
import os
8+
9+
modder = None
10+
def render_callback(sim, viewer):
11+
global modder
12+
if modder is None:
13+
modder = TextureModder(sim)
14+
for name in sim.model.geom_names:
15+
modder.rand_all(name)
16+
17+
model = load_model_from_path("xmls/fetch/main.xml")
18+
sim = MjSim(model, render_callback=render_callback)
19+
20+
viewer = MjViewer(sim)
21+
22+
t = 0
23+
24+
while True:
25+
viewer.render()
26+
t += 1
27+
if t > 100 and os.getenv('TESTING') is not None:
28+
break

mujoco_py/mjrendercontext.pyx

+3
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ cdef class MjRenderContext(object):
120120
rect.width = width
121121
rect.height = height
122122

123+
if self.sim.render_callback is not None:
124+
self.sim.render_callback(self.sim, self)
125+
123126
# Sometimes buffers are too small.
124127
if width > self._con.offWidth or height > self._con.offHeight:
125128
new_width = max(width, self._model_ptr.vis.global_.offwidth)

mujoco_py/mjsim.pyx

+6-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ cdef class MjSim(object):
3838
userdata_names : list of strings or None
3939
This is a convenience parameter which is just set on the model.
4040
Equivalent to calling ``model.set_userdata_names``
41+
render_callback : callback for rendering.
4142
"""
4243
# MjRenderContext for rendering camera views.
4344
cdef readonly list render_contexts
@@ -61,9 +62,12 @@ cdef class MjSim(object):
6162
cdef readonly dict extras
6263
# Function pointer for substep callback, stored as uintptr
6364
cdef readonly uintptr_t substep_callback_ptr
65+
# Callback executed before rendering.
66+
cdef public object render_callback
6467

6568
def __cinit__(self, PyMjModel model, PyMjData data=None, int nsubsteps=1,
66-
udd_callback=None, substep_callback=None, userdata_names=None):
69+
udd_callback=None, substep_callback=None, userdata_names=None,
70+
render_callback=None):
6771
self.nsubsteps = nsubsteps
6872
self.model = model
6973
if data is None:
@@ -80,6 +84,7 @@ cdef class MjSim(object):
8084
self._render_context_window = None
8185
self.udd_state = None
8286
self.udd_callback = udd_callback
87+
self.render_callback = render_callback
8388
self.extras = {}
8489
self.set_substep_callback(substep_callback, userdata_names)
8590

mujoco_py/mjviewer.py

-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ def render_inner_loop(self):
175175
for k, v in self._user_overlay.items():
176176
self._overlay[k] = copy.deepcopy(v)
177177
self._create_full_overlay()
178-
179178
super().render()
180179
if self._record_video:
181180
frame = self._read_pixels_as_in_window()

mujoco_py/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__all__ = ['__version__', 'get_version']
22

3-
version_info = (1, 50, 1, 23)
3+
version_info = (1, 50, 1, 24)
44
# format:
55
# ('mujoco_major', 'mujoco_minor', 'mujoco_py_major', 'mujoco_py_minor')
66

0 commit comments

Comments
 (0)