X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=tabakrolletjie%2Flights.py;h=b2e081201ae27bf9113146ba4a3106389a4bda44;hb=5cbe7a3f0a931b8feeb1e6e72b7a4f1c985a434e;hp=119a13a3c46c545512499f87807d7feda2dc70e0;hpb=9fcb41e6949ccb27107eb1a40d16c7d7722f8207;p=tabakrolletjie.git diff --git a/tabakrolletjie/lights.py b/tabakrolletjie/lights.py index 119a13a..b2e0812 100644 --- a/tabakrolletjie/lights.py +++ b/tabakrolletjie/lights.py @@ -12,7 +12,7 @@ from .constants import LIGHT_CATEGORY, FITTINGS_CATEGORY, COLOURS from .rays import RayPolyManager from .utils import DetailedTimer from .loader import loader -from .transforms import Multiply +from .transforms import Multiply, MultiplyImage LIGHT_FILTER = pymunk.ShapeFilter( mask=pymunk.ShapeFilter.ALL_MASKS ^ ( @@ -108,20 +108,23 @@ class BaseLight(object): _surface_cache = {} def __init__( - self, colour, position, intensity=1.0, radius_limits=None, - angle_limits=None): - self.colour = colour + self, colours, position, intensity=1.0, radius_limits=None, + direction=None, spread=None): + self.colour_cycle = colours + self.colour_pos = 0 + self.colour = colours[0] self.on = True self.intensity = intensity self.body = pymunk.Body(0, 0, pymunk.body.Body.STATIC) self.body.light = self self.ray_manager = self.RAY_MANAGER( self.body, position, ray_filter=LIGHT_FILTER, - radius_limits=radius_limits, angle_limits=angle_limits) + radius_limits=radius_limits, direction=direction, spread=spread) self.fitting = pymunk.Circle( self.body, self.FITTING_RADIUS, self.ray_manager.position) self.fitting.filter = FITTINGS_FILTER self._fitting_image = None + self._colour_mult_image = None @property def position(self): @@ -143,9 +146,6 @@ class BaseLight(object): self.ray_manager.set_space(space) self.ray_manager.update_shapes() - def toggle(self): - self.on = not self.on - def _cached_surface(self, name, surface): surf = self._surface_cache.get(name) if surf is None: @@ -201,10 +201,30 @@ class BaseLight(object): def fitting_image(self): if self._fitting_image is None: - fitting_colour = COLOURS[self.colour] - self._fitting_image = loader.load_image( + fitting_colours = [COLOURS[c] for c in self.colour_cycle] + ncolour = len(fitting_colours) + if ncolour > 3: + print "Multicoloured light should not have more than 3 colours" + ncolour = 3 + + if ncolour == 1: + self._fitting_image = loader.load_image( "48", self.FITTING_IMG, - transform=Multiply(colour=fitting_colour)) + transform=Multiply(colour=fitting_colours[0])) + else: + if self._colour_mult_image is None: + self._colour_mult_image = pygame.surface.Surface((48, 48)) + + for i in range(ncolour): + sector = loader.load_image( + "48", "light_mask_%d_%d.png" % (ncolour, i + 1), + transform=Multiply(colour=fitting_colours[i])) + self._colour_mult_image.blit(sector, (0,0), None, 0) + + self._fitting_image = loader.load_image( + "48", self.FITTING_IMG, + transform=MultiplyImage(image=self._colour_mult_image)) + return self._fitting_image def invalidate_fitting_image(self): @@ -214,26 +234,6 @@ class BaseLight(object): rx, ry = self.ray_manager.pygame_position(surface) surface.blit(self.fitting_image(), (rx - 24, ry - 24), None, 0) - def tick(self): - pass - - -class Lamp(BaseLight): - - FITTING_IMG = "lamp.png" - - -class MultiColourLamp(BaseLight): - - FITTING_IMG = "lamp.png" - DEFAULT_COLOURS = sorted(COLOURS.keys()) - - def __init__(self, **kw): - self.colour_cycle = kw.pop("colours", None) - self.colour_pos = 0 - kw["colour"] = self.colour_cycle[0] - super(MultiColourLamp, self).__init__(**kw) - def toggle(self): self.colour_pos += 1 if self.colour_pos >= len(self.colour_cycle): @@ -245,6 +245,14 @@ class MultiColourLamp(BaseLight): self.on = True self.invalidate_fitting_image() + def tick(self): + pass + + +class Lamp(BaseLight): + + FITTING_IMG = "lamp.png" + class PulsatingLamp(BaseLight): @@ -291,5 +299,5 @@ class SpotLight(BaseLight): def tick(self): if self.angular_velocity: - self.ray_manager.rotate_degrees(self.angular_velocity) + self.ray_manager.direction -= self.angular_velocity self.ray_manager.update_shapes()