Browse Source

Render doors. Fix bug in fill_coords() function.

Maxime Chevalier-Boisvert 5 years ago
parent
commit
669270d1b5
3 changed files with 26 additions and 37 deletions
  1. 20 31
      gym_minigrid/minigrid.py
  2. 5 5
      gym_minigrid/rendering.py
  3. 1 1
      manual_control.py

+ 20 - 31
gym_minigrid/minigrid.py

@@ -276,44 +276,31 @@ class Door(WorldObj):
 
         return (OBJECT_TO_IDX[self.type], COLOR_TO_IDX[self.color], state)
 
-    def render(self, r):
+    def render(self, img):
         c = COLORS[self.color]
-        r.setLineColor(c[0], c[1], c[2])
-        r.setColor(c[0], c[1], c[2], 50 if self.is_locked else 0)
 
         if self.is_open:
-            r.drawPolygon([
-                (TILE_PIXELS-2, TILE_PIXELS),
-                (TILE_PIXELS  , TILE_PIXELS),
-                (TILE_PIXELS  ,           0),
-                (TILE_PIXELS-2,           0)
-            ])
+            fill_coords(img, point_in_rect(0.88, 1.00, 0.00, 1.00), c)
+            fill_coords(img, point_in_rect(0.92, 0.96, 0.04, 0.96), (0,0,0))
             return
 
-        r.drawPolygon([
-            (0          , TILE_PIXELS),
-            (TILE_PIXELS, TILE_PIXELS),
-            (TILE_PIXELS,           0),
-            (0          ,           0)
-        ])
-        r.drawPolygon([
-            (2            , TILE_PIXELS-2),
-            (TILE_PIXELS-2, TILE_PIXELS-2),
-            (TILE_PIXELS-2,           2),
-            (2            ,           2)
-        ])
+        # Door frame and door
+        inner_color = 0.45 * np.array(c) if self.is_locked else c
+        fill_color = inner_color if self.is_locked else (0,0,0)
+        fill_coords(img, point_in_rect(0.00, 1.00, 0.00, 1.00), c)
+        fill_coords(img, point_in_rect(0.04, 0.96, 0.04, 0.96), (0,0,0))
+        fill_coords(img, point_in_rect(0.08, 0.92, 0.08, 0.92), inner_color)
+        fill_coords(img, point_in_rect(0.12, 0.88, 0.12, 0.88), fill_color)
+
+        #r.setLineColor(c[0], c[1], c[2])
+        #r.setColor(c[0], c[1], c[2], 50 if self.is_locked else 0)
 
         if self.is_locked:
             # Draw key slot
-            r.drawLine(
-                TILE_PIXELS * 0.55,
-                TILE_PIXELS * 0.5,
-                TILE_PIXELS * 0.75,
-                TILE_PIXELS * 0.5
-            )
+            fill_coords(img, point_in_rect(0.52, 0.75, 0.50, 0.56), c)
         else:
             # Draw door handle
-            r.drawCircle(TILE_PIXELS * 0.75, TILE_PIXELS * 0.5, 2)
+            fill_coords(img, point_in_circle(cx=0.75, cy=0.50, r=0.08), c)
 
 class Key(WorldObj):
     def __init__(self, color='blue'):
@@ -322,9 +309,10 @@ class Key(WorldObj):
     def can_pickup(self):
         return True
 
-    def render(self, r):
-        self._set_color(r)
+    def render(self, img):
+        pass
 
+        """
         # Vertical quad
         r.drawPolygon([
             (16, 10),
@@ -351,6 +339,7 @@ class Key(WorldObj):
         r.setLineColor(0, 0, 0)
         r.setColor(0, 0, 0)
         r.drawCircle(18, 9, 2)
+        """
 
 class Ball(WorldObj):
     def __init__(self, color='blue'):
@@ -547,7 +536,7 @@ class Grid:
 
         # Highlight the cell if needed
         if highlight:
-            img = highlight_img(img)
+            highlight_img(img)
 
         # Cache the rendered tile
         cls.tile_cache[key] = img

+ 5 - 5
gym_minigrid/rendering.py

@@ -9,8 +9,8 @@ def fill_coords(img, fn, color):
 
     for y in range(img.shape[0]):
         for x in range(img.shape[1]):
-            yf = y / img.shape[0]
-            xf = x / img.shape[1]
+            yf = (y + 0.5) / img.shape[0]
+            xf = (x + 0.5) / img.shape[1]
             if fn(xf, yf):
                 img[y, x] = color
 
@@ -70,6 +70,6 @@ def highlight_img(img, color=(255, 255, 255), alpha=0.30):
     Add highlighting to an image
     """
 
-    img = img + alpha * (np.array(color) - img)
-    img = img.clip(0, 255)
-    return img
+    blend_img = img + alpha * (np.array(color, dtype=np.uint8) - img)
+    blend_img = blend_img.clip(0, 255).astype(np.uint8)
+    img[:, :, :] = blend_img

+ 1 - 1
manual_control.py

@@ -73,7 +73,7 @@ parser.add_argument(
     dest="env_name",
     help="gym environment to load",
     #default='MiniGrid-MultiRoom-N6-v0'
-    default='MiniGrid-Empty-8x8-v0'
+    default='MiniGrid-GoToDoor-5x5-v0'
 )
 args = parser.parse_args()