Night at the animator's desk, and the drawings won't stay still: a scrappy red-gloved underdog squares up against a heavyweight bruiser in a ring inked onto the paper. Read his windup — sway back from the high hook, duck the belly lunge — and counter in the opening. Three clean counters put him down; three knockdowns and the eraser finishes the argument. Every hit splatters ink, the desk lamp is a real dynamic light pooling across the page, and the whole cast is drawn by Blender's Line Art modifier — procedural ink, no hand drawing.
←/A sway · ↓/S duck · Space/E punch · P pause · M reduced motion · touch buttons on mobile · tap once for sound · game data 4.7 MB (+ engine wasm, cached after first load)
Made by AI, exported by the real Godot 4 engine — and the lab's Grease Pencil Line-Art experiment. The bout was concepted first; every audit round judged the live build against the painting.

An animator's wooden drafting table at night: a boxing ring drawn in ink on a cream paper sheet, two lively 1930s rubber-hose cartoon boxers sparring inside the drawn ring, pencil-sketched crowd around it, a brass desk lamp casting a warm pool over the paper, vintage cel animation style with bold clean ink linework.

Both boxers are 3D rubber-hose rigs whose ink outlines are generated procedurally by Blender's Line Art modifier — silhouette, crease and material-boundary strokes recomputed for every frame, no hand drawing anywhere. Their punches are real motion capture: segments mined from CMU clip 14_01 (47 seconds of boxing) retargeted onto the rigs, with hand-keyed cartoon exaggeration for the staggers, knockdowns and the final melt-into-a-puddle.
Each frame renders twice — flat cel fills plus a camera-space normal pass from the same geometry — so the toon sprites still react to the desk lamp, a true PointLight2D whose pool the fighters shadow with real occluders.
Wind-up telegraphs are shape-and-color coded (accessibility rule: never color alone), the juice checklist ships in full (60ms hit-stop, decaying shake, ink-splat particles, halftone flash, eased round cards), telemetry streams to the console for the audit's softlock probe, and every string lives in a localization table. Ambience and stings are sampled audio from the platform stack.
The lab audits with Playwright on this host's software renderer (no GPU), so the frame-rate row below is a worst case — real hardware runs the compatibility renderer far faster. One number to own: line-art costs ~2–4 s per rendered frame on this host's CPU.
| Measurement | Value | Conditions |
|---|---|---|
| Game data (.pck) | 4.73 MB | release export — image payload 5.76 MB source, 11 sampled audio files |
| Engine payload (.wasm) | 35.4 MB | Godot 4.3 web runtime, fixed cost, browser-cached after first load |
| Verified full bout | win at ≈3580 game-units, 3 knockdowns | signal-driven autopilot, consistent across confirming rounds (3580/3570/3580) |
| Line-art render cost | ~2–4 s / frame | Line Art modifier + cel + normal pass, CPU Eevee on this host — the technique's real price |
| Audit rounds | blockout 2 · art 5 | round 1 found the polling autopilot livelocked at 1 fps — replaced with a signal-driven one |
| Audit frame rate | ~1–2 fps | SwiftShader software GL — worst case; game time stays real via physics step catch-up |
The experiment's showcase: procedural ink sprites with geometry-true normal passes, shaded live by a desk-lamp PointLight2D.
Each fighter carries a LightOccluder2D, dragging a soft shadow across the drawn ring as they move.
CMU 14_01 mined numerically for punch windows — idle, one-two rush, lunge, hook — retargeted to rubber-hose rigs.
GPUParticles2D splatter ink on every hit; halftone flash and a white pop mark clean counters.
Three attacks with distinct shape+color+position windups, tightening over three rounds; counters open timed windows.
Camera2D breathes with the fight, shakes on impact with decay, and punches in for the eraser finish.