Created
February 11, 2019 19:52
-
-
Save gregtap/969b8eebada45ab210fbac1e38555cde to your computer and use it in GitHub Desktop.
Doom fire /rpi-rgb-led-matrix test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from rgbmatrix import RGBMatrix, RGBMatrixOptions, graphics | |
import itertools as it | |
from time import sleep | |
import random | |
import colorsys | |
from PIL import Image | |
from PIL import ImageDraw | |
mode = 0 | |
options = RGBMatrixOptions() | |
options.rows = 32 | |
options.chain_length = 6 | |
options.disable_hardware_pulsing = 0 | |
options.gpio_slowdown = 1 | |
options.brightness = 100 | |
options.pwm_bits = 11 | |
FIRE_WIDTH = 192 | |
FIRE_HEIGHT = 32 | |
COLORS = [ | |
{"r": 7, "g": 7, "b": 7}, | |
{"r": 31, "g": 7, "b": 7}, | |
{"r": 47, "g": 15, "b": 7}, | |
{"r": 71, "g": 15, "b": 7}, | |
{"r": 87, "g": 23, "b": 7}, | |
{"r": 103, "g": 31, "b": 7}, | |
{"r": 119, "g": 31, "b": 7}, | |
{"r": 143, "g": 39, "b": 7}, | |
{"r": 159, "g": 47, "b": 7}, | |
{"r": 175, "g": 63, "b": 7}, | |
{"r": 191, "g": 71, "b": 7}, | |
{"r": 199, "g": 71, "b": 7}, | |
{"r": 223, "g": 79, "b": 7}, | |
{"r": 223, "g": 87, "b": 7}, | |
{"r": 223, "g": 87, "b": 7}, | |
{"r": 215, "g": 95, "b": 7}, | |
{"r": 215, "g": 95, "b": 7}, | |
{"r": 215, "g": 103, "b": 15}, | |
{"r": 207, "g": 111, "b": 15}, | |
{"r": 207, "g": 119, "b": 15}, | |
{"r": 207, "g": 127, "b": 15}, | |
{"r": 207, "g": 135, "b": 23}, | |
{"r": 199, "g": 135, "b": 23}, | |
{"r": 199, "g": 143, "b": 23}, | |
{"r": 199, "g": 151, "b": 31}, | |
{"r": 191, "g": 159, "b": 31}, | |
{"r": 191, "g": 159, "b": 31}, | |
{"r": 191, "g": 167, "b": 39}, | |
{"r": 191, "g": 167, "b": 39}, | |
{"r": 191, "g": 175, "b": 47}, | |
{"r": 183, "g": 175, "b": 47}, | |
{"r": 183, "g": 183, "b": 47}, | |
{"r": 183, "g": 183, "b": 55}, | |
{"r": 207, "g": 207, "b": 111}, | |
{"r": 223, "g": 223, "b": 159}, | |
{"r": 239, "g": 239, "b": 199}, | |
{"r": 255, "g": 255, "b": 255}, | |
] | |
matrix = RGBMatrix(options=options) | |
print("Matrix initialized\n") | |
intensities = [] | |
offscreen_canvas = matrix.CreateFrameCanvas() | |
image = Image.new("RGB", (192, 32)) | |
# Fill up intensities | |
for i in range(0, FIRE_WIDTH * FIRE_HEIGHT): | |
intensities.append(0) | |
# Create fire source | |
for column in range(0, FIRE_WIDTH): | |
overflow_pixel_index = FIRE_WIDTH * FIRE_HEIGHT | |
index = (overflow_pixel_index - FIRE_WIDTH) + column | |
intensities[index] = 36 # max intensity | |
def update_pixel_intensity(pixel_index): | |
below_pixel_index = pixel_index + FIRE_WIDTH | |
# overflow ? | |
if below_pixel_index >= FIRE_WIDTH * FIRE_HEIGHT: | |
return | |
decay = random.randint(0, 2) | |
below_pixel_intensity = intensities[below_pixel_index] | |
new_intensity = ( | |
below_pixel_intensity - decay if (below_pixel_intensity - decay) >= 0 else 0 | |
) | |
intensities[pixel_index - decay] = new_intensity | |
def propagate(): | |
for column in range(0, FIRE_WIDTH): | |
for row in range(0, FIRE_HEIGHT): | |
index = column + (FIRE_WIDTH * row) | |
update_pixel_intensity(index) | |
def burn(): | |
propagate() | |
draw = ImageDraw.Draw(image) | |
for col in range(0, FIRE_WIDTH): | |
for row in range(0, FIRE_HEIGHT): | |
index = col + (FIRE_WIDTH * row) | |
color = COLORS[intensities[index]] | |
draw.point((col, row), (color["r"], color["g"], color["b"])) | |
matrix.Clear() | |
matrix.SetImage(image, 0, 0) | |
# diretly setting pixel is as slow | |
# matrix.SetPixel(i % FIRE_WIDTH, i / FIRE_WIDTH, color["r"], color["g"], color["b"]) | |
while True: | |
burn() | |
# sleep(.01) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment