diff --git a/overcooked_simulator/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py index c9eacf90cb78dcee2e8f0929851d5e0c435aceb5..88e809463635e48000123d1afc7a5a6cf88ad54a 100644 --- a/overcooked_simulator/gui_2d_vis/drawing.py +++ b/overcooked_simulator/gui_2d_vis/drawing.py @@ -149,92 +149,92 @@ class Visualizer: grid_size, ) + if "view_restrictions" in state and state["view_restrictions"]: + self.draw_lightcones(screen, grid_size, width, height, state) + + def draw_lightcones(self, screen, grid_size, width, height, state): + view_restrictions = state["view_restrictions"] mask = pygame.Surface(screen.get_size(), pygame.SRCALPHA) mask.fill((0, 0, 0, 0)) mask_color = (0, 0, 0, 0) - if "view_restrictions" in state and state["view_restrictions"]: - for idx, restriction in enumerate(state["view_restrictions"]): - # if idx != 0: - # break - # rotate direction vector in both direction with the angel - # draw 2 large rect which are rotated so that one edge is the viewing border - - direction = pygame.math.Vector2(restriction["direction"]) - pos = pygame.math.Vector2(restriction["position"]) - angle = restriction["angle"] / 2 - range = restriction["range"] - - angle = min(angle, 180) - - pos = pos * grid_size + pygame.math.Vector2( - [grid_size / 2, grid_size / 2] + for idx, restriction in enumerate(view_restrictions): + direction = pygame.math.Vector2(restriction["direction"]) + pos = pygame.math.Vector2(restriction["position"]) + angle = restriction["angle"] / 2 + view_range = restriction["range"] + + angle = min(angle, 180) + + pos = pos * grid_size + pygame.math.Vector2([grid_size / 2, grid_size / 2]) + + rect_scale = max(width, height) * 2 + # rect_scale = 2 * grid_size + + left_beam = pos + (direction.rotate(angle) * rect_scale * 2) + right_beam = pos + (direction.rotate(-angle) * rect_scale * 2) + + cone_mask = pygame.surface.Surface(screen.get_size(), pygame.SRCALPHA) + cone_mask.fill((255, 255, 255, 255)) + + offset_front = direction * grid_size * 0.7 + if angle != 180: + shadow_cone_points = [ + pos - offset_front, + left_beam - offset_front, + left_beam + (direction.rotate(90) * rect_scale), + pos + - (direction * rect_scale * 2) + + (direction.rotate(90) * rect_scale), + pos + - (direction * rect_scale * 2) + + (direction.rotate(-90) * rect_scale), + right_beam + (direction.rotate(-90) * rect_scale), + right_beam - offset_front, + ] + light_cone_points = [pos - offset_front, left_beam, right_beam] + pygame.draw.polygon( + cone_mask, + mask_color, + shadow_cone_points, ) - rect_scale = max(width, height) * 2 - # rect_scale = 2 * grid_size - - left_beam = pos + (direction.rotate(angle) * rect_scale * 2) - right_beam = pos + (direction.rotate(-angle) * rect_scale * 2) - - cone_mask = pygame.surface.Surface(screen.get_size(), pygame.SRCALPHA) - cone_mask.fill((255, 255, 255, 255)) - - offset_front = direction * grid_size * 0.7 - if angle != 180: - pygame.draw.polygon( - cone_mask, - mask_color, - ( - pos - offset_front, - left_beam - offset_front, - left_beam + (direction.rotate(90) * rect_scale), - pos - - (direction * rect_scale * 2) - + (direction.rotate(90) * rect_scale), - pos - - (direction * rect_scale * 2) - + (direction.rotate(-90) * rect_scale), - right_beam + (direction.rotate(-90) * rect_scale), - right_beam - offset_front, - ), - ) - if range: - n_circle_points = 40 - - start_vec = np.array(-direction * range) - points = ( - np.array(create_polygon(n_circle_points, start_vec)) * grid_size - ) + pos - - circle_closed = np.concatenate([points, points[0:1]], axis=0) - - corners = [ - pos - (direction * rect_scale), - *circle_closed, - pos - (direction * rect_scale), - pos - - (direction * rect_scale) - + (direction.rotate(90) * rect_scale), - pos - + (direction * rect_scale) - + (direction.rotate(90) * rect_scale), - pos - + (direction * rect_scale) - + (direction.rotate(-90) * rect_scale), - pos - - (direction * rect_scale) - + (direction.rotate(-90) * rect_scale), - ] - - pygame.draw.polygon(cone_mask, mask_color, [*corners]) - - mask.blit(cone_mask, (0, 0), special_flags=pygame.BLEND_MAX) - - screen.blit( - mask, - mask.get_rect(), - special_flags=pygame.BLEND_RGBA_MULT, - ) + if view_range: + n_circle_points = 40 + + start_vec = np.array(-direction * view_range) + points = ( + np.array(create_polygon(n_circle_points, start_vec)) * grid_size + ) + pos + + circle_closed = np.concatenate([points, points[0:1]], axis=0) + + corners = [ + pos - (direction * rect_scale), + *circle_closed, + pos - (direction * rect_scale), + pos + - (direction * rect_scale) + + (direction.rotate(90) * rect_scale), + pos + + (direction * rect_scale) + + (direction.rotate(90) * rect_scale), + pos + + (direction * rect_scale) + + (direction.rotate(-90) * rect_scale), + pos + - (direction * rect_scale) + + (direction.rotate(-90) * rect_scale), + ] + + pygame.draw.polygon(cone_mask, mask_color, corners) + + mask.blit(cone_mask, (0, 0), special_flags=pygame.BLEND_MAX) + + screen.blit( + mask, + mask.get_rect(), + special_flags=pygame.BLEND_RGBA_MULT, + ) def draw_background( self, surface: pygame.Surface, width: int, height: int, grid_size: int