def _setup_colors(self): self._up_target_rgb = float_to_uint8( colorsys.hsv_to_rgb(*self.parameter('on-color').get())) self._down_target_rgb = float_to_uint8( colorsys.hsv_to_rgb(*self.parameter('off-color').get())) self._fader = ColorFade('hsv', [ self.parameter('off-color').get(), self.parameter('on-color').get() ])
def _setup_colors(self): self._alive_color_rgb = float_to_uint8( colorsys.hsv_to_rgb(*self.parameter('alive-color').get())) self._dead_color_rgb = float_to_uint8( colorsys.hsv_to_rgb(*self.parameter('dead-color').get())) fade_colors = [(0., 0., 0.), self.parameter('alive-color').get(), self.parameter('dead-color').get(), (0., 0., 0.)] self._fader = ColorFade('hsv', fade_colors, tick_rate=self._mixer.get_tick_rate())
def _setup_colors(self): self._alive_color_rgb = float_to_uint8(colorsys.hsv_to_rgb(*self.parameter('alive-color').get())) self._dead_color_rgb = float_to_uint8(colorsys.hsv_to_rgb(*self.parameter('dead-color').get())) fade_colors = [(0., 0., 0.), self.parameter('alive-color').get(), self.parameter('dead-color').get(), (0., 0., 0.)] self._fader = ColorFade('hsv', fade_colors, tick_rate=self._mixer.get_tick_rate())
class Dragons(RawPreset): """ Dragons spawn randomly and travel. At vertices, dragons can reproduce. If two dragons collide, both die. """ # Configurable parameters _alive_color = (0.5, 0.0, 1.0) # HSV _tail_color = (0.0, 1.0, 1.0) _dead_color = (1.0, 1.0, 0.0) # HSV _spontaneous_birth_probability = 0.0001 # Internal parameters class Dragon: def __init__(self, loc, dir, lifetime): self.loc = loc self.dir = dir self.lifetime = lifetime self.growing = True self.alive = False self.moving = False def __repr__(self): ds = 'Fwd' if self.dir == 1 else 'Rev' return "Dragon (%d, %d, %d) %s: %0.2f" % ( self.loc[0], self.loc[1], self.loc[2], ds, self.lifetime) _dragons = [] _tails = [] _alive_color_rgb = float_to_uint8(colorsys.hsv_to_rgb(*_alive_color)) _tail_color_rgb = float_to_uint8(colorsys.hsv_to_rgb(*_tail_color)) _dead_color_rgb = float_to_uint8(colorsys.hsv_to_rgb(*_dead_color)) _pop = 0 def setup(self): random.seed() self.add_parameter(FloatParameter('growth-time', 2.0)) self.add_parameter(FloatParameter('birth-rate', 0.4)) self.add_parameter(FloatParameter('tail-persist', 0.5)) self.add_parameter(IntParameter('pop-limit', 20)) self.add_parameter(HSVParameter('alive-color', self._alive_color)) self.add_parameter(HSVParameter('dead-color', self._dead_color)) self.add_parameter(HSVParameter('tail-color', self._tail_color)) self._setup_colors() def _setup_colors(self): self._alive_color = self.parameter('alive-color').get() self._dead_color = self.parameter('dead-color').get() self._tail_color = self.parameter('tail-color').get() fade_colors = [(0., 0., 0.), self.parameter('alive-color').get(), self.parameter('dead-color').get(), (0., 0., 0.)] self._growth_fader = ColorFade('hsv', [(0., 0., 0.), self._alive_color], tick_rate=self._mixer.get_tick_rate()) self._tail_fader = ColorFade( 'hsv', [self._alive_color, self._tail_color, (0., 0., 0.)], tick_rate=self._mixer.get_tick_rate()) def parameter_changed(self, parameter): self._setup_colors() def draw(self, dt): # Ensure that empty displays start up with some dragons p_birth = ( 1.0 - self._spontaneous_birth_probability) if self._pop > 2 else 0.5 # Spontaneous birth: Rare after startup if (self._pop < self.parameter('pop-limit').get() ) and random.random() > p_birth: address = (random.randint(0, self._max_strand - 1), random.randint(0, self._max_fixture - 1), 0) if address not in [d.loc for d in self._dragons]: self._dragons.append(self.Dragon(address, 1, dt)) self._pop += 1 # Dragon life cycle for dragon in self._dragons: # Fade in if dragon.growing: p = (dt - dragon.lifetime) / self.parameter('growth-time').get() if (p > 1): p = 1.0 color = self._growth_fader.get_color(p) if p >= 1.0: dragon.growing = False dragon.alive = True dragon.lifetime = dt self.setp(dragon.loc, color) # Alive - can move or die if dragon.alive: s, f, p = dragon.loc self.setp(dragon.loc, (0, 0, 0)) # At a vertex: optionally spawn new dragons if dragon.moving and (p == 0 or p == (self.scene().fixture(s, f).pixels - 1)): if (self._pop < self.parameter('pop-limit').get()): neighbors = self.scene().get_pixel_neighbors( dragon.loc) random.shuffle(neighbors) # Iterate over candidate pixels that aren't on the current fixture num_children = 0 for candidate in [n for n in neighbors if n[1] != f]: if num_children == 0: # Spawn at least one new dragon to replace the old one. This first one skips the growth. dir = 1 if candidate[2] == 0 else -1 child = self.Dragon(candidate, dir, dt) child.growing = False child.alive = True child.moving = False self._dragons.append(child) self._pop += 1 num_children += 1 else: # Randomly spawn new dragons if random.random() > ( 1.0 - self.parameter('birth-rate').get()): dir = 1 if candidate[2] == 0 else -1 child = self.Dragon(candidate, dir, dt) child.moving = False self._dragons.append(child) self._pop += 1 num_children += 1 # Kill dragons that reach the end of a fixture dragon.moving = False self._dragons.remove(dragon) self._pop -= 1 else: # Move dragons along the fixture self._tails.append((dragon.loc, dt)) new_address = (s, f, p + dragon.dir) if new_address[2] < 0 or new_address[2] > 31: print dragon, "new_address", new_address assert (False) dragon.loc = new_address dragon.moving = True self.setp(new_address, self._alive_color_rgb) # Kill dragons that run into each other if dragon in self._dragons: colliding = [ d for d in self._dragons if d != dragon and d.loc == dragon.loc ] if len(colliding) > 0: #print "collision between", dragon, "and", colliding[0] self.setp(dragon.loc, (0, 0, 0)) self._dragons.remove(dragon) self._dragons.remove(colliding[0]) self.setp(dragon.loc, (0, 0, 0)) self._pop -= 2 # Draw tails for loc, time in self._tails: if (dt - time) > self.parameter('tail-persist').get(): self._tails.remove((loc, time)) self.setp(loc, (0, 0, 0)) else: progress = (dt - time) / self.parameter('tail-persist').get() self.setp(loc, self._tail_fader.get_color(progress))
def _setup_colors(self): self._up_target_rgb = float_to_uint8(colorsys.hsv_to_rgb(*self.parameter('on-color').get())) self._down_target_rgb = float_to_uint8(colorsys.hsv_to_rgb(*self.parameter('off-color').get())) self._fader = ColorFade('hsv', [self.parameter('off-color').get(), self.parameter('on-color').get()])