hyperion.ng/effects/swirl.py

67 lines
1.8 KiB
Python

import hyperion, time, math, random
# set minimum image size - must be done asap
hyperion.imageMinSize(64,64)
iW = hyperion.imageWidth()
iH = hyperion.imageHeight()
# Get the parameters
rotationTime = float(hyperion.args.get('rotation-time', 8.0))
reverse = bool(hyperion.args.get('reverse', False))
centerX = float(hyperion.args.get('center_x', 0.5))
centerY = float(hyperion.args.get('center_y', 0.5))
randomCenter = bool(hyperion.args.get('random-center', False))
custColors = hyperion.args.get('custom-colors', ((255,0,0),(0,255,0),(0,0,255)))
if randomCenter:
centerX = random.uniform(0.0, 1.0)
centerY = random.uniform(0.0, 1.0)
minStepTime = float(hyperion.latchTime)/1000.0
sleepTime = max(0.1, rotationTime) / 360
angle = 0
centerX = int(round(float(iW)*centerX))
centerY = int(round(float(iH)*centerY))
increment = -1 if reverse else 1
# adapt sleeptime to hardware
if minStepTime > sleepTime:
increment *= int(math.ceil(minStepTime / sleepTime))
sleepTime = minStepTime
# table of stop colors for rainbow gradient, first is the position, next rgba, all values 0-255
rainbowColors = bytearray()
if len(custColors) > 1:
posfac = int(255/len(custColors))
pos = 0
for c in custColors:
pos += posfac
rainbowColors += bytearray([pos,c[0],c[1],c[2],255])
lC = custColors[-1]
rainbowColors += bytearray([0,lC[0],lC[1],lC[2],255])
else:
rainbowColors = bytearray([
0 ,255,0 ,0, 255,
25 ,255,230,0, 255,
63 ,255,255,0, 255,
100,0 ,255,0, 255,
127,0 ,255,200, 255,
159,0 ,255,255, 255,
191,0 ,0 ,255, 255,
224,255,0 ,255, 255,
255,255,0 ,127, 255,
])
# effect loop
while not hyperion.abort():
angle += increment
if angle > 360: angle=0
if angle < 0: angle=360
hyperion.imageCanonicalGradient(centerX, centerY, angle, rainbowColors)
hyperion.imageShow()
time.sleep(sleepTime)