{"id":"riso-train","version":"1.0.0","title":"The Sun Missed Its Train","summary":"A coral sun falls from a grainy printed sky and becomes the missing wheel of a teal steam train, which carries it away through layered hills. Risograph poster in motion.","kind":"background","target":"three","collections":["impossible-worlds"],"tags":["risograph","riso","train","steam train","sun","print","retro","poster","motion poster","grain","misregistration","flat illustration","travel","portrait film"],"loopable":false,"motion":"procedural","durationSeconds":8,"status":"published","media":{"poster":"https://aipixelwizard.com/media/riso-train/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/riso-train/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/riso-train/1.0.0/sample.mp4","sampleBytes":1580310,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/riso-train","manifest":"https://aipixelwizard.com/api/v1/visuals/riso-train/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/riso-train/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/riso-train/1.0.0/","demo":"https://aipixelwizard.com/registry/riso-train/1.0.0/index.html"},"description":"A motion poster printed in four inks, cream paper, coral, teal and navy, with grain, ink dropout, slight misregistration and overprint. A teal steam train rolls in across layered hills and a railway line, past a clock on a post and a clump of reeds, with an empty front axle. A coral sun drops out of the sky into it, the new wheel turns, and the train pulls out again in the last seconds. The film has no settings.","role":"Shader film (three.js): Risograph motion poster, a finished 8-second portrait film with no settings.","useCases":["A travel, rail or holiday promo","A children's story opener","A retro-print title backdrop"],"synonyms":["riso print animation","steam train animation","sun becomes a wheel","retro train poster","flat illustration train","overprint animation"],"digest":"df32ebe10499369e3f3ed9d11bb320f6b5bff62f723fccaa68a8eef486a8c002","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/riso-train.js","exports":[{"name":"createRisoTrain","signature":"createRisoTrain() => { scene, camera, setSize(width, height), update(time), dispose() }","description":"The film as one full-screen shader; render its scene with its camera straight to the canvas."}],"reusable":["src/riso-train.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"three","version":"0.185.1","scope":"source","reason":"Renderer and a full-screen shader material."},{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness."}],"uses":[],"usedBy":[],"params":[],"presets":[],"output":{"width":1080,"height":1350,"fps":30,"durationSeconds":8,"posterSeconds":5.5,"alpha":false,"motion":"procedural","loop":{"seamless":false,"method":"A one-shot film: it builds to a finished picture that holds to the last frame, so the end does not return to the start."},"seed":null},"composition":{"inputs":"The time in seconds, 0 to 8. The film has no other settings.","outputs":"An opaque full-frame picture, already in display colours: render it straight to the canvas.","coordinates":"Composed for a 4:5 portrait frame and measured by the frame height: in a wider frame the picture stays centred at full height and its background fills the sides; in a narrower one, such as 9:16, the sides are cropped.","lighting":"None: flat printed inks overprinting one another, with paper grain.","timing":"The train rolls in, the sun falls into its empty axle, the wheel turns and the train pulls out in the last seconds.","compatibleWith":[],"notes":["The misregistration and ink dropout are fixed to the frame, so the print texture does not swim.","Played on repeat it cuts from the departing train back to the sun in the empty sky.","Every pixel is a function of the time alone, so frames can be rendered in any order."]},"reuse":["Travel promo: the train pulls out in the last seconds, a ready-made \"off we go\".","Story opener: the sun falling into the wheel is a one-line story that needs no narration.","Print-style card: the opening frame, before the train arrives, is a clean poster for a title."],"integration":{"newProject":"Create a WebGLRenderer on a canvas (no antialiasing), call createRisoTrain() once and film.setSize(width, height); then for each frame call film.update(timeInSeconds) and renderer.render(film.scene, film.camera).","existingProject":"Copy src/riso-train.js, which needs only three. Render film.scene with film.camera into your own canvas or render target; the output is opaque and already in display colours, so use no tone mapping or colour conversion."},"performance":{"notes":"One full-screen fragment shader. About 8 ms a frame at 1080 by 1350 on an integrated Intel GPU (Iris Xe), and about 1 to 2 s a frame with software WebGL.","limits":"Plays at 30 frames a second at full size on an integrated GPU."},"limitations":["The film is finished: it has no settings. To change colours or timing, edit the shader.","It is composed for a 4:5 portrait frame.","The end does not return to the start, so repeating it is a hard cut."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[]},"rights":{"approvedForPublicRelease":true},"provenance":"From the owner's collection Twenty Impossible Worlds: the original GLSL ES 3.00 shader of the film “The Sun Missed Its Train”, created with ChatGPT / Codex and used as published, wrapped for AI Pixel Wizard as a three.js full-screen shader in October 2026. The collection's synthesised soundtrack is not part of this ingredient.","changelog":[{"version":"1.0.0","date":"2026-10-10","notes":"Initial release."}],"verification":{"testedOn":"2026-10-10","inputs":{"riso-train@1.0.0":"df32ebe10499369e3f3ed9d11bb320f6b5bff62f723fccaa68a8eef486a8c002","three@0.185.1":"664ca387e5fab46ff2daaa6895e1d015426850891af5ea5082cbbcc3985b068c","apw-runtime@1.0.0":"5be859cdac74823ba0bcc32c6daf06688a871104d24db5d4ceaffffd84d7c40d"},"environment":"Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0","renderer":"WebGL 2 via SwiftShader (software)","width":1080,"height":1350,"fps":30,"frames":240,"renderSeconds":306,"loopCheck":{"checked":false,"seamless":null,"maxDifference":null,"note":"Asset does not claim a seamless loop."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/riso-train/1.0.0/poster.webp","preview":"/media/riso-train/1.0.0/preview.mp4","sample":"/media/riso-train/1.0.0/sample.mp4","sampleBytes":1580310}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/riso-train/1.0.0/LICENSE"},{"path":"asset.json","size":5777,"sha256":"c170a5b6301421559ee71d38c4844c9f4a7fac724b8fa0802c9387e8a10abb69","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/riso-train/1.0.0/asset.json"},{"path":"demo.js","size":668,"sha256":"d3af63ae85619d43e82dbdfe772cdf5bc31a4674d8ef5b32f98bce220d5d5cdf","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/riso-train/1.0.0/demo.js"},{"path":"index.html","size":538,"sha256":"43e2980dabd3971ef87d6e154957b09f8f717359332730e3559e21e6fea0d849","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/riso-train/1.0.0/index.html"},{"path":"src/riso-train.js","size":9658,"sha256":"f7860d263c0c7526a2a02ec48dfc8043eabd403ab4892ee21c8b620159c1f4d5","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/riso-train/1.0.0/src/riso-train.js"}],"warnings":[]}