Add serialize methods to lights and rays
authorNeil <neil@dip.sun.ac.za>
Sat, 10 Sep 2016 19:46:44 +0000 (21:46 +0200)
committerNeil <neil@dip.sun.ac.za>
Sat, 10 Sep 2016 19:47:11 +0000 (21:47 +0200)
tabakrolletjie/lights.py
tabakrolletjie/rays.py

index 27365095fe1d745f0817f89406bc71f4f67bfc3e..498c0b09c644c5de9bda9a2be4a3dabfb7c7a7ef 100644 (file)
@@ -64,6 +64,12 @@ class LightManager(object):
         for light in self._lights:
             light.off()
 
+    def serialize_lights(self):
+        result = []
+        for light in self._lights:
+            result.append(light.serialize())
+        return result
+
     def toggle_nearest(self, *args, **kw):
         if self._battery_dead:
             return
@@ -140,11 +146,16 @@ class BaseLight(object):
 
     def __init__(
             self, colours, position, intensity=1.0, radius_limits=None,
-            direction=None, spread=None):
+            direction=None, spread=None, on=True, start_colour=None):
         self.colour_cycle = colours
         self.colour_pos = 0
         self.colour = colours[0]
-        self.on = True
+        if start_colour and start_colour in colours:
+            self.colour_pos = colours.index(start_colour)
+            self.colour = start_colour
+        self.on = on
+        if not on and len(colours) > 1:
+            self.colour_pos = -1
         self.intensity = intensity
         self.body = pymunk.Body(0, 0, pymunk.body.Body.STATIC)
         self.body.light = self
@@ -157,6 +168,18 @@ class BaseLight(object):
         self._fitting_image = None
         self._colour_mult_image = None
 
+    def serialize(self):
+        result = self.ray_manager.serialize()
+        result.update({
+            "type": self.__class__.__name__.lower(),
+            "colours": self.colour_cycle,
+            "position": self.position,
+            "intensity": self.intensity,
+            "on": self.on,
+            "start_colour": self.colour,
+        })
+        return result
+
     @property
     def position(self):
         return self.ray_manager.position
@@ -299,6 +322,13 @@ class PulsatingLamp(BaseLight):
             "intensity_velocity", self.DEFAULT_INTENSITY_VELOCITY)
         super(PulsatingLamp, self).__init__(**kw)
 
+    def serialize(self):
+        result = super(PulsatingLamp, self).serialize()
+        result["pulse_velocity"] = self.pulse_velocity
+        result["intensity_range"] = self.intensity_range
+        result["intensity_velocity"] = self.intensity_velocity
+        return result
+
     def _update_range(self, value, velocity, value_range):
         value += velocity
         if value < value_range[0]:
@@ -324,6 +354,11 @@ class SpotLight(BaseLight):
         self.angular_velocity = kw.pop("angular_velocity", None)
         super(SpotLight, self).__init__(**kw)
 
+    def serialize(self):
+        result = super(SpotLight, self).serialize()
+        result["angular_velocity"] = self.angular_velocity
+        return result
+
     def fitting_image(self):
         fitting_image = super(SpotLight, self).fitting_image()
         rot_fitting_image = pygame.transform.rotozoom(
index a475d8fb27bb6c680a90555cad7dc2a4f6043954..8b532784a46a80e97f354cb9686b6161fe2bbe8b 100644 (file)
@@ -129,6 +129,20 @@ class RayPolyManager(object):
     def min_radius(self, value):
         self._min_radius = value or 0.0
 
+    def serialize(self):
+        """ Return the required information from the ray_manager """
+        if self._direction is None:
+            direction = None
+            spread = None
+        else:
+            direction = self._direction.angle_degrees
+            spread = math.degrees(self.spread)
+        return {
+            "radius_limits": (self._min_radius, self._max_radius),
+            "direction": direction,
+            "spread": spread,
+        }
+
     def reaches(self, position):
         distance = self.position.get_distance(position)
         return (self._min_radius <= distance <= self._max_radius)