Back to browse
GitHub Repository

A 3D raycasting engine running inside a TrueType font's hinting virtual machine

62 starsPython

TTF-DOOM – A raycaster running inside TrueType font hinting

by 4RH1T3CT0R·Apr 6, 2026·68 points·12 comments

AI Analysis

●●●●GemWizardryZero to OneRabbit Hole

Raycasting engine in 6.5KB of TrueType hinting bytecode—font VM as GPU.

Strengths
  • Custom DSL compiler outputs TrueType bytecode with function definitions and variable allocation
  • Solved F26Dot6 fixed-point math where MUL does (a*b)/64, not a*b
  • Works around FreeType's 64-frame call stack limit with recursive functions
Weaknesses
  • Font only renders walls—JS handles movement, enemies, and shooting
  • Chrome caches hinted glyphs requiring per-frame jitter to force re-hinting
Category
Target Audience

Programmers interested in constraints, demoscene enthusiasts

Post Description

TrueType fonts have a hinting VM that grid-fits glyphs. It has a stack, storage area, conditionals, function calls, and it turns out it's Turing-complete. So I built a raycasting engine in the hinting bytecode.

The glyph "A" in the font has 16 vertical bar contours. The hinting program reads player coordinates from font variation axes via GETVARIATION, does DDA ray marching against a tile map in the storage area, and repositions bar heights with SCFS. It ends up looking like a crude Wolfenstein-style view.

Small visuzlization: https://github.com/4RH1T3CT0R7/ttf-doom/blob/main/docs/media...

About 6.5 KB of bytecode total - 13 functions, 795 storage slots, sin/cos lookup tables.

JS handles movement, enemies, and shooting, then passes the coordinates to the font through CSS font-variation-settings. The font is basically a weird GPU.

The weirdest parts: - TrueType MUL does (ab)/64, not ab. So 1*4=0. The DIV instruction is equally cursed. - No WHILE loops. Everything compiles to recursive FDEFs. FreeType limits call depth to ~64 frames. - SVTCA[0] is Y, SVTCA[1] is X. Of course.

There's a small compiler behind this - lexer, parser, codegen - that turns a C-like DSL into TT assembly.

Demo GIF: https://github.com/4RH1T3CT0R7/ttf-doom/blob/main/docs/media...

Live demo: https://4rh1t3ct0r7.github.io/ttf-doom/ (Chrome/Edge, WASD+arrows, Space to shoot, Tab for debug overlay)

This is a DOOM-style raycaster, not a port of the original engine - similar to DOOMQL and the Excel DOOM. The wall rendering does happen in the font's hinting VM though. Press Tab in the demo to watch the font variation axes change as you move.

Similar Projects

Productivity●●Solid

Improved Finder / Spotlight search using Raycast extension

It tames Spotlight by scoping searches to user-configured folders and applying exclusion globs (node_modules, site-packages, .git), then re-ranks results by a 60% relevance / 40% recency mix so recent, relevant files bubble up. The pipeline is simple and practical — Raycast → Python → mdfind → filter+rank → JSON — which makes it a quick win for anyone annoyed by noisy Spotlight results, but it’s more pragmatic engineering than breakthrough research.

Niche GemSolve My ProblemShip It
atharva_n
103mo ago
Gaming●●●Banger

Doom Inside Claude Code

Four Claude Code surfaces coordinate to run real Doom with MCP letting the AI play itself.

WizardryRabbit Hole
redoh
121mo ago