import pygame.locals as pgl
from .constants import LIGHT_CATEGORY, FITTINGS_CATEGORY
-from .rays import calculate_ray_polys
+from .rays import RayPolyManager
LIGHT_FILTER = pymunk.ShapeFilter(
mask=pymunk.ShapeFilter.ALL_MASKS ^ (
self.angle_limits = angle_limits
self.body = pymunk.Body(0, 0, pymunk.body.Body.STATIC)
self.fitting = pymunk.Circle(self.body, 10.0, self.position)
+ self.fitting.filter = FITTINGS_FILTER
self.body.light = self
+ self.ray_manager = RayPolyManager(self.body, LIGHT_FILTER)
@classmethod
def load(cls, config):
def add(self, space):
if self.body.space is not None:
space.remove(self.body, *self.body.shapes)
- shapes = self.shapes_for_ray_polys(
- calculate_ray_polys(space, self.body, self.position, LIGHT_FILTER))
- for shape in shapes:
- shape.filter = LIGHT_FILTER
- self.fitting.filter = FITTINGS_FILTER
- space.add(self.body, self.fitting, *shapes)
+ self.ray_manager.generate_rays(space, self.position)
+ ray_shapes = self.ray_manager.polys()
+ space.add(self.body, self.fitting, *ray_shapes)
def shapes_for_ray_polys(self, ray_polys):
return ray_polys
white, black = (255, 255, 255), (0, 0, 0)
ray_mask.fill(black)
- for shape in self.body.shapes:
- if shape is self.fitting:
- continue
- pygame_poly = [
- pymunk.pygame_util.to_pygame(v, surface) for v in
- shape.get_vertices()]
+ for pygame_poly in self.ray_manager.pygame_polys(surface):
pygame.draw.polygon(ray_mask, white, pygame_poly, 0)
pygame.draw.aalines(ray_mask, white, True, pygame_poly, 1)