Skip to content

TimWillebrands/bresenham-lighting-engine

Repository files navigation

bresenham-lighting-engine

Live Demo NPM Version

What is this madness?

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

Features that might possibly slap

  • 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

Basic Web Usage

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);

Development

Install wasm-pack:

cargo install wasm-pack

Build the WASM module:

wasm-pack build --target bundler

Roadmap (aka "Things I'll Probably Never Do")

  • 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

About

This is an experimental lighting engine that said "nah fam" to GPU shaders and decided to use **Bresenham line** for ray casting instead.

Resources

Stars

Watchers

Forks

Packages

No packages published