Fix alternative rendering
This commit is contained in:
parent
100432fceb
commit
e12e38e64e
@ -1,92 +0,0 @@
|
|||||||
"""
|
|
||||||
2D rendering framework
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
if "Apple" in sys.version:
|
|
||||||
if "DYLD_FALLBACK_LIBRARY_PATH" in os.environ:
|
|
||||||
os.environ["DYLD_FALLBACK_LIBRARY_PATH"] += ":/usr/lib"
|
|
||||||
# (JDS 2016/04/15): avoid bug on Anaconda 2.3.0 / Yosemite
|
|
||||||
|
|
||||||
from gym import error
|
|
||||||
|
|
||||||
|
|
||||||
import pyglet
|
|
||||||
|
|
||||||
from pyglet import gl
|
|
||||||
|
|
||||||
|
|
||||||
RAD2DEG = 57.29577951308232
|
|
||||||
|
|
||||||
|
|
||||||
def get_display(spec):
|
|
||||||
"""Convert a display specification (such as :0) into an actual Display
|
|
||||||
object.
|
|
||||||
|
|
||||||
Pyglet only supports multiple Displays on Linux.
|
|
||||||
"""
|
|
||||||
if spec is None:
|
|
||||||
return pyglet.canvas.get_display()
|
|
||||||
# returns already available pyglet_display,
|
|
||||||
# if there is no pyglet display available then it creates one
|
|
||||||
elif isinstance(spec, str):
|
|
||||||
return pyglet.canvas.Display(spec)
|
|
||||||
else:
|
|
||||||
raise error.Error(
|
|
||||||
f"Invalid display specification: {spec}. (Must be a string like :0 or None.)"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_window(width, height, display, **kwargs):
|
|
||||||
"""
|
|
||||||
Will create a pyglet window from the display specification provided.
|
|
||||||
"""
|
|
||||||
screen = display.get_screens() # available screens
|
|
||||||
config = screen[0].get_best_config() # selecting the first screen
|
|
||||||
context = config.create_context(None) # create GL context
|
|
||||||
|
|
||||||
return pyglet.window.Window(
|
|
||||||
width=width,
|
|
||||||
height=height,
|
|
||||||
display=display,
|
|
||||||
config=config,
|
|
||||||
context=context,
|
|
||||||
**kwargs,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ImageViewer:
|
|
||||||
def __init__(self, width, height, display=None):
|
|
||||||
display = get_display(display)
|
|
||||||
|
|
||||||
self.width = width
|
|
||||||
self.height = height
|
|
||||||
self.window = get_window(width=width, height=height, display=display)
|
|
||||||
self.window.on_close = self.window_closed_by_user
|
|
||||||
self.isopen = True
|
|
||||||
|
|
||||||
gl.glEnable(gl.GL_BLEND)
|
|
||||||
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
|
|
||||||
|
|
||||||
def imshow(self, arr):
|
|
||||||
assert len(arr.shape) == 3, "You passed in an image with the wrong number shape"
|
|
||||||
self.window.clear()
|
|
||||||
self.window.switch_to()
|
|
||||||
self.window.dispatch_events()
|
|
||||||
image = pyglet.image.ImageData(
|
|
||||||
arr.shape[1], arr.shape[0], "RGB", arr.tobytes(), pitch=arr.shape[1] * -3
|
|
||||||
)
|
|
||||||
image.blit(0, 0) # draw
|
|
||||||
self.window.flip()
|
|
||||||
|
|
||||||
def close(self):
|
|
||||||
if self.isopen and sys.meta_path:
|
|
||||||
self.window.close()
|
|
||||||
self.isopen = False
|
|
||||||
|
|
||||||
def window_closed_by_user(self):
|
|
||||||
self.isopen = False
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
self.close()
|
|
@ -363,14 +363,25 @@ class MazeEnv(gym.Env):
|
|||||||
|
|
||||||
def render(self, mode="human", **kwargs) -> Any:
|
def render(self, mode="human", **kwargs) -> Any:
|
||||||
if self._use_alt_viewer:
|
if self._use_alt_viewer:
|
||||||
image = self.wrapped_env.sim.render(640, 480)[::-1, :, :]
|
|
||||||
if self._alt_viewer is None:
|
if self._alt_viewer is None:
|
||||||
from mujoco_maze.alt_rendering import ImageViewer
|
from gym.envs.classic_control.rendering import SimpleImageViewer
|
||||||
|
import mujoco_py
|
||||||
|
|
||||||
self._alt_viewer = ImageViewer(640, 480)
|
self._mj_viewer = mujoco_py.MjRenderContextOffscreen(
|
||||||
|
self.wrapped_env.sim
|
||||||
|
)
|
||||||
|
self._alt_viewer = SimpleImageViewer()
|
||||||
|
|
||||||
|
self._mj_viewer._set_mujoco_buffers()
|
||||||
|
self._mj_viewer.render(640, 480)
|
||||||
|
image = np.asarray(
|
||||||
|
self._mj_viewer.read_pixels(640, 480, depth=False)[::-1, :, :],
|
||||||
|
dtype=np.uint8,
|
||||||
|
)
|
||||||
if mode == "rgb_array":
|
if mode == "rgb_array":
|
||||||
return image
|
return image
|
||||||
else:
|
else:
|
||||||
|
if not (image.min() == 0 and image.max() == 0):
|
||||||
self._alt_viewer.imshow(image)
|
self._alt_viewer.imshow(image)
|
||||||
return self._alt_viewer.isopen
|
return self._alt_viewer.isopen
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user