You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.9 KiB

7 years ago
#!/usr/bin/env python3
import sys
import random
import argparse
import blup.frame
import blup.output
import blup.animation
import blup.writebml
import colorsys
WIDTH = 22
HEIGHT = 16
DEPTH = 256
def convert_color(c):
return list(map(lambda x: int(round(x*(DEPTH-1))), c))
def get_random_color():
if random.random() < 0.5:
s = 1
v = random.random()
else:
s = random.random()
v = 1
return colorsys.hsv_to_rgb(random.random(), s, v)
def cap(x):
return min(1, max(0, x))
def cyc(x):
while x < 0:
x += 1
while x > 1:
x -= 1
return x
class Unrath:
def __init__(self):
self.shape = set([(0, 0)])
shapesize = random.randint(2, 5)
while len(self.shape) < shapesize:
p = random.sample(self.shape, 1)[0]
self.shape.add((p[0]+random.randint(0, 1), p[1]+random.randint(0, 1)))
self.shapewidth = max(map(lambda p: p[0], self.shape))
shapeheight = max(map(lambda p: p[1], self.shape))
y = random.randint(0, HEIGHT-shapeheight)
if random.random() > 0.5:
d = 1
x = -self.shapewidth
else:
d = -1
x = WIDTH + self.shapewidth
self.pos = (x, y)
self.finished = False
self.speed = d * random.randint(2, WIDTH/2)
self.color = get_random_color()
def update(self, dt):
if (self.pos[0] + self.shapewidth < 0 and self.speed < 0) or \
(self.pos[0] > WIDTH and self.speed > 0):
self.finished = True
else:
self.pos = (self.pos[0] + dt*self.speed, self.pos[1])
def draw(self, frame):
for p in self.shape:
try:
frame.setPixel(
int(self.pos[0] + p[0]),
int(self.pos[1] + p[1]),
convert_color(self.color)
)
except ValueError:
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Generate Unrath animations')
parser.add_argument('-d', '--delay', type=int, default=50)
parser.add_argument('-t', '--time', type=int, default=15)
parser.add_argument('-n', '--num-unraethe', type=int, default=5)
parser.add_argument('output_file')
args = parser.parse_args()
dim = blup.frame.FrameDimension(WIDTH, HEIGHT, DEPTH, 3)
anim = blup.animation.Animation(dim)
anim.tags['description'] = ' '.join(sys.argv)
t = 0
unraethe = []
while t < args.time:
t += args.delay / 1000
frame = blup.animation.AnimationFrame(dim, args.delay)
unraethe = list(filter(lambda u: not u.finished, unraethe))
if len(unraethe) < args.num_unraethe:
unraethe.append(Unrath())
for u in unraethe:
u.update(args.delay / 1000)
u.draw(frame)
anim.addFrame(frame)
blup.writebml.writeBml(anim, args.output_file)