No triangles. No GPU. Every frame above is computed the way it was done when the display was the terminal: a cloud of points on a parametric surface, spun by rotation matrices, sorted by a z-buffer, and lit by a single dot product — then quantized into type. Brightness becomes ink density. That is the whole engine.
The torus is swept from two angles: θ walks the small cross-section circle, φ carries that circle around the axis of revolution. Each (θ, φ) pair yields a 3-D point and — crucially — its surface normal, which comes free from the same trigonometry.
x = (R₂ + R₁cosθ)·cosφ
y = R₁·sinθ
z = (R₂ + R₁cosθ)·sinφ
Three rotations — spin, tilt, precession — tumble the cloud each frame, the way a gyroscope wobbles on its bearing. Points project to the character grid through 1/z perspective. A z-buffer keeps, per cell, only the nearest point — so the far wall of the donut hides correctly behind the near one.
ooz = 1 / (K₂ + z)
col = cx + K₁·ooz·x
row = cy − ½K₁·ooz·y // cells are 2:1
Lambert's law, one multiply-add per point: λ = N̂ · L̂. The result indexes a ramp of glyphs ordered by how much ink they lay on the cell. Dense glyph, bright surface. The ramp is the palette.
The oldest trick in the demoscene: heat is just an integer. The bottom row of the buffer is pinned to maximum temperature; every frame, each cell steals heat from the cell below it, minus a small random loss, drifted one column left or right by the wind.
That single rule — copy up, cool down, jitter sideways — produces turbulence, licking tongues, and ember decay with no fluid dynamics at all. Here the temperature field is quantized twice: once into the glyph ramp, once into three phosphor intensities layered on the tube.
Cut the FUEL switch and watch it starve · GUST kicks the wind
Four rules, no exceptions: a live cell with two or three neighbours survives; a dead cell with exactly three is born; everything else returns to vacuum. From that austerity comes traffic — gliders, oscillators, and the gun below, discovered by Bill Gosper in 1970, firing a glider every thirty generations.
Dying cells leave a brief phosphor ghost — the same persistence a real P31 tube would give you, done here with a second, dimmer text layer one generation behind.
Click or drag on the tube to seed live cells