This is not 3d only 2d. Plays a FMV using a 256 costume quantised 4x4 tile atlas for edges and then pen lines for fill, based my old dithered Suzanne project. It give reasonable good brightness details for the drawcount with some speckles on the pensize 4 rounded caps on fill/edge joints. I'm surprised how well 256 costumes can be equivalent/quantised over all 4x4 edges in 114 frames of this animation. I used goboscript with deepseek v4.1 flash high which only cost $0.23 in credits
**The quantised tile atlas is not my invention.** 1992 Cinepak was the original 256 tile atlas for fmv but I first saw from the **Red Eyes** which is a Mega Drive demo scene project (Remute; code by Kabuto): - production page: <https://demozoo.org/productions/200769/> - technical write-up: *"Red Eyes gory technical details"*, **pages 13-15** Their scheme, as described: 1. Palettize the video to respect the hardware (16 colours total, 8 brightness levels per RGB component). Luma is rated **much higher than chroma** "for a better and distinct overall look". Dithering was considered and skipped under time pressure. 2. Slice the palettised video into **8x8 tiles** and treat each tile-sized video stream separately. 3. For each tile, choose a **small set of representative tile instances** that are "similar enough" to all instances of that tile — between **1 and 64** per tile. The similarity threshold is a single global parameter, tuned until the videos fit the remaining 1.2 MB of ROM. 4. Replace every original tile instance with one from its set. 5. Encode the reduced sets, then encode **only the tiles that changed** from the previous frame. Tiles mostly do not change, so omitting unchanged ones saves ROM and speeds up VRAM updates. Decoded at 30 fps for that reason. FMV was only added because ~1.2 MB of ROM was left after the music tracks and the vector graphics animation, and the footage could be deshaken first — low residual motion is what made the encoding tractable. ### What this project took, changed, and added **Taken:** the whole core idea — fixed palette, slice into tiles, replace each tile with a member of a small set, decode by writing tiles. Also the palette judgement: luma weighted far above chroma, no dithering. **Changed:** | | Red Eyes | here | |---|---|---| | dictionary | **per tile position**, 1-64 instances each | **one global** dictionary, 256 entries | | tile size | 8x8 | 4x4 | | frame coding | only changed tiles | every run, absolute, every frame | | palette | 16 colours, 8 levels/component | 16 greys | The per-position dictionary is the more sophisticated choice and would likely beat a global dictionary here too: it spends capacity where a region needs it instead of 256 entries everywhere. Fixing this means one dictionary per tile position, sized by observed variety — very close to what Red Eyes does. **Added, because Scratch's pen makes it possible:** the **flat-run / edge split**. Red Eyes is tile-only; every tile is a stamp. Here a flat block needs no costume at all — one pen line covers a whole run of identical flat blocks however long it is, which is how ~60% of the drawn area costs almost nothing.