Godot Lab · 2D · Line-Art + Mocap Duel

Inkbout

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.

Play it now

←/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)

▶  Play

The concept is the contract

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.

AI concept painting
Concept key art — the contract the piece is audited against
Concept prompt

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.

Inkbout live in the engine
The same bout live in the engine — hero gloves up, crowd on its feet

Procedural ink, real punches

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.

the bruiser's hook frames beside their normal-map pass
The bruiser's five shipped hook frames (top) — procedural ink recomputed per frame — beside their camera-space normal passes (bottom)
Inkbout hero sprite sheet beside its normal-map pass
The hero's full line-art sheet + normal pass (Line Art modifier + CMU mocap)

A desk lamp that really lights the page

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.

the desk lamp pooling over the drawn ring, fighters casting paper shadows
Live frame: the lamp pool falls off across the paper and both fighters drag real occluder shadows over the drawn ring

Telegraphs, juice and the audit

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 eased FINAL ROUND card over the bout
Live frame: the eased round card — one of the juice checklist's animated transitions — sliding in over the bout

Measured, honestly

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.

MeasurementValueConditions
Game data (.pck)4.73 MBrelease export — image payload 5.76 MB source, 11 sampled audio files
Engine payload (.wasm)35.4 MBGodot 4.3 web runtime, fixed cost, browser-cached after first load
Verified full boutwin at ≈3580 game-units, 3 knockdownssignal-driven autopilot, consistent across confirming rounds (3580/3570/3580)
Line-art render cost~2–4 s / frameLine Art modifier + cel + normal pass, CPU Eevee on this host — the technique's real price
Audit roundsblockout 2 · art 5round 1 found the polling autopilot livelocked at 1 fps — replaced with a signal-driven one
Audit frame rate~1–2 fpsSwiftShader software GL — worst case; game time stays real via physics step catch-up

Real engine features, earned

Line-art + Light2D

The experiment's showcase: procedural ink sprites with geometry-true normal passes, shaded live by a desk-lamp PointLight2D.

Occluder paper shadows

Each fighter carries a LightOccluder2D, dragging a soft shadow across the drawn ring as they move.

Mocap boxing

CMU 14_01 mined numerically for punch windows — idle, one-two rush, lunge, hook — retargeted to rubber-hose rigs.

Ink-splat particles

GPUParticles2D splatter ink on every hit; halftone flash and a white pop mark clean counters.

Telegraph FSM

Three attacks with distinct shape+color+position windups, tightening over three rounds; counters open timed windows.

Camera sway + shake

Camera2D breathes with the fight, shakes on impact with decay, and punches in for the eraser finish.

windup 0.95 / 0.72 / 0.55 sstrike 0.18 s hit-stop 60 msinput buffer 120 ms counters per knockdown 3knockdowns to win 3 lamp height 96 pxarrows + WASD + touch pause + reduced motionlocalization-ready strings