This is an experimental lighting engine that said "nah fam" to GPU shaders and decided to use Bresenham line algorithms for ray casting instead.
The core idea is simple:
- Cast rays using classic line-drawing algorithms
- Calculate shadows by checking when rays get yeeted by obstacles
- Apply light falloff based on distance
- Render everything with HSV color space because we're fancy like that
- ✨ Zero GPU dependency - Your integrated graphics can take a nap
- 🚀 WASM-ready - Runs in browsers without breaking a sweat
- 📦 Minimalistic AF - No bloated dependencies, just pure algorithmic goodness
- 🎯 Portable - Will perhaps work in native game engines
- ⚡ Performant - Surprisingly fast for CPU-based lighting
This requires a bundler like Vite to wire up the wasm and stuff. Package it with wasm-pack build --target web to get a version that doesn't need bundlers.
import { memory, put, set_collision_mode } from 'bresenham-lighting-engine';
// Initialize collision detection
set_collision_mode(1); // 0=tile-based, 1=pixel-based
// Create a light: id=0, radius=50, x=200, y=100
const lightPtr = put(0, 50, 200, 100);
// Extract pixel data from WASM memory
const lightSize = 50 * 2 + 1; // radius * 2 + 1
const pixelData = new Uint8ClampedArray(
memory.buffer,
lightPtr,
lightSize * lightSize * 4 // RGBA
);
// Render to canvas
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const imageData = new ImageData(pixelData, lightSize, lightSize);
ctx.putImageData(imageData, 0, 0);Install wasm-pack:
cargo install wasm-packBuild the WASM module:
wasm-pack build --target bundler- Basic WASM implementation that doesn't crash
- Ray casting with proper shadow calculation
- Native library bindings (C/C++/whatever)
- Godot plugin (because indie devs deserve nice things)
- Performance optimizations (SIMD goes brrr)
- Better color blending modes
- Multi-light support that doesn't melt your CPU