blob: 61580f066467260e9e4736c3f22a9fa71be76821 [file] [log] [blame]
import { animations } from "./animations.js";
class CanvasRenderer {
static WIDTH = 1024;
static HEIGHT = 1024;
constructor() {
const ledDiv = document.querySelector("#leds");
let canvas = document.createElement("canvas");
canvas.style.width = "100%";
canvas.style.height = "100%";
canvas.width = CanvasRenderer.WIDTH;
canvas.height = CanvasRenderer.HEIGHT;
ledDiv.appendChild(canvas);
ledDiv.style.backgroundColor = "#00000000";
let context = canvas.getContext('2d');
this.canvas = canvas;
this.context = context;
}
render(animation) {
const canvas = this.canvas;
const context = this.context;
const leds = animation.leds;
const nx = animation.nx;
const ny = animation.ny;
const xoff = CanvasRenderer.WIDTH / (nx + 1);
const yoff = CanvasRenderer.HEIGHT / (ny + 1);
const d = xoff * 0.7;
context.clearRect(0, 0, canvas.width, canvas.height);
for (let x = 0; x < nx; x++) {
for (let y = 0; y < ny; y++) {
const cx = (x + 1) * xoff
const cy = (y + 1) * yoff
const rgb = leds[x][y];
const r = Math.max(rgb[0] * 256, 0x1a);
const g = Math.max(rgb[1] * 256, 0x16);
const b = Math.max(rgb[2] * 256, 0x22);
const color = `rgba(${r}, ${g}, ${b})`;
context.beginPath();
context.arc(cx, cy, d/2, 0, 2 * Math.PI, false);
context.fillStyle = color;
context.fill();
}
}
}
}
window.addEventListener("load", () => {
const animationClass = animations[Math.floor(Math.random() * animations.length)];
console.log(`Picked LED animation: ${animationClass.name}`);
let renderer = new CanvasRenderer();
let animation = new animationClass(16, 16);
let step = (hrts) => {
// Run animation logic.
animation.draw(hrts / 1000);
// Draw LEDs.
renderer.render(animation);
// Schedule next frame.
window.requestAnimationFrame(step);
}
window.requestAnimationFrame(step);
});