← All field notes

art pipeline

Texture budget as art direction

How a 4 KiB TMEM ceiling turned an abandoned theatre into readable N64 horror instead of muddy miniature realism.

Filed August 20, 2026

Gate 2,497 visible theatre triangles

Gate 27 material textures

Blender overview of the original Orpheus Theatre map

The Orpheus Theatre is not a reduced copy of Kino der Toten. It is an original map built from the architectural grammar of late-1920s picture houses: a balcony, plaster relief, ticket lobby, auditorium risers, and a framed proscenium.

That distinction is legal, but it also improved the art. Designing for the N64 from the first polygon gave every shape a reason to survive conversion.

September 8 source update: the theatre has been completely rebuilt in Blender around stepped ivory plaster, petrol-teal panels, ochre brass, oxblood velvet and cream floor inlay. The model and all material pixels are original; architectural references guide scale, rhythm and ornament. Packed Blender files preserve the meshes, UVs, textures and preview staging for continued editing.

Start with silhouettes

At 320×240, a shallow bevel can cost triangles without ever producing a stable pixel. The theatre therefore spends geometry on navigational silhouettes: the proscenium frame, balcony edge, lobby mouth, seat banks, and the gate that changes the route through the room.

The redesigned theatre source exports 2,614 triangles, of which 2,497 are visible. The remaining 108 collision triangles and nine portal/spawn marker triangles are explicit semantic meshes. That lets the source exporter, Tiny3D converter, game, and tests agree on what a wall or portal means. These are asset counts; the 30 FPS goal still requires a measured runtime scene.

The Orpheus lobby with ticket area, carpet, plaster, and brass details
September 8 Blender source preview: the lobby carries stepped trim, ticket kiosks and cream inlay into a second navigable space.

Paint for the target

The new textures use authored pixel motifs rather than downsampled photographs: broad plaster wear, geometric panels, directional brass highlights, worn floor inlay, seat piping and shaped velvet folds. Damage collects at thresholds and edges instead of covering every surface with equal noise. The goal is a readable material at gameplay distance.

The theatre maps fit 32×32 or 64×32 pixels. Each Tiny3D material binds one texture at a time, so a 64×32 RGBA16 upload occupies 4 KiB. Export validates each packed image against that ceiling and checks that the PNG inside the GLB exactly matches the external PNG used by the N64 converter. Individual texture fit does not establish total frame time, texture traffic or RDRAM residency.

The camera and lights saved in each Blender scene help review form and surface choices. That studio lighting is not exported to the cartridge and cannot certify how the console renders the scene.

The earlier atlas experiment

The August art pass used a project-generated 3×3 Orpheus atlas for nine visible theatre materials. OpenAI image generation made that source from a checked text prompt; the repository retained its prompt, hashes and generation record. Blender cropped cells, averaged source texels in linear colour space, applied bounded detail and tint adjustments, and reduced channels for RGBA16. The Deco mosaic and tooling marker were procedural maps. That recipe and its 2,186-total/2,069-visible theatre belong to the earlier pass; the September sources replace its geometry and pixels.

Optimization needs a visible win

The August 20 pre-revision models were also passed through gltfpack 1.2.0 with node names, material metadata, and unquantized coordinates preserved. Lossless processing took that theatre GLB from 208,232 bytes to 204,524 bytes, but Tiny3D produced the same 94,224-byte result.

A second experiment simplified that baseline theatre to 75 percent and cut the Tiny3D model by 8.4 percent, but damaged useful silhouettes. That trade was rejected. These are historical optimization measurements, not the current model’s counts. Tiny3D already optimizes the vertex cache and emits strips, so a permanent mesh dependency needed to earn its place in cartridge memory or frame time. It did neither for this scene.

The art pipeline records the editable-source workflow, provenance receipts and static budget contracts. make art exports the saved Blender files without changing them. make art-check repeats exports after reopening the sources and checks production parity; make assets converts and hashes the cartridge outputs. Rebuilding source scenes is a separate explicit authoring command, so a routine build preserves manual edits.