{"id":"charcoal-horse","version":"1.0.0","title":"The Drawing That Breathes","summary":"A horse gathers from graphite dust on rough ivory paper, breathes quietly, and lets its mane drift away as floating charcoal. A charcoal drawing that comes to life.","kind":"background","target":"three","collections":["impossible-worlds"],"tags":["charcoal","drawing","horse","sketch","graphite","animal","hand drawn","life drawing","breathing","dust","paper","portrait film"],"loopable":false,"motion":"procedural","durationSeconds":8,"status":"published","media":{"poster":"https://aipixelwizard.com/media/charcoal-horse/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/charcoal-horse/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/charcoal-horse/1.0.0/sample.mp4","sampleBytes":1244583,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/charcoal-horse","manifest":"https://aipixelwizard.com/api/v1/visuals/charcoal-horse/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/","demo":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/index.html"},"description":"A graceful horse assembles out of graphite dust on rough ivory paper. First there is a faint outline, then a cloud of smudged charcoal gathers into the body, and the head, legs and tail resolve. The chest rises and falls in a quiet breath while strands of mane and breath lift away as drifting charcoal. Smudged shading, eraser highlights, crosshatching and separate strands for the mane and tail are all drawn in the shader. The film has no settings.","role":"Shader film (three.js): Charcoal life drawing, a finished 8-second portrait film with no settings.","useCases":["An intro for a riding school, stable or heritage brand","A \"drawing comes to life\" reveal for an artist or illustrator","A quiet textured card behind credits or a quote"],"synonyms":["charcoal horse animation","pencil sketch horse","drawing comes to life","hand drawn animation","animated sketch","graphite drawing"],"digest":"64bc3653563ab4d4a785a34e3b4d66663162a4485cf4e848a3e82fe1bf185d32","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/charcoal-horse.js","exports":[{"name":"createCharcoalHorse","signature":"createCharcoalHorse() => { 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/charcoal-horse.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":"Soft, even paper light: graphite shading, eraser highlights and a faint smudge under the hooves.","timing":"An outline appears, charcoal dust gathers into the body, head, legs and tail, the chest breathes, and mane strands and breath lift away as dust.","compatibleWith":[],"notes":["The mane and tail are separate strands, animated independently.","The paper grain is fixed to the frame, so it does not swim.","Every pixel is a function of the time alone, so frames can be rendered in any order."]},"reuse":["Artist reel opener: the outline-to-horse build takes about the first three seconds.","Textured card: hold the finished horse and lay a title across the empty paper above it.","Pair it with the other hand-made Impossible Worlds for an \"art styles\" sequence."],"integration":{"newProject":"Create a WebGLRenderer on a canvas (no antialiasing), call createCharcoalHorse() once and film.setSize(width, height); then for each frame call film.update(timeInSeconds) and renderer.render(film.scene, film.camera).","existingProject":"Copy src/charcoal-horse.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 61 ms a frame at 1080 by 1350 on an integrated Intel GPU (Iris Xe), and about 3 to 5 s a frame with software WebGL.","limits":"Real-time playback at full size needs a discrete or recent integrated GPU; on weaker graphics use the rendered video, or draw into a smaller canvas."},"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 Drawing That Breathes”, 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":{"charcoal-horse@1.0.0":"64bc3653563ab4d4a785a34e3b4d66663162a4485cf4e848a3e82fe1bf185d32","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":1556.6,"loopCheck":{"checked":false,"seamless":null,"maxDifference":null,"note":"Asset does not claim a seamless loop."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/charcoal-horse/1.0.0/poster.webp","preview":"/media/charcoal-horse/1.0.0/preview.mp4","sample":"/media/charcoal-horse/1.0.0/sample.mp4","sampleBytes":1244583}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/LICENSE"},{"path":"asset.json","size":5948,"sha256":"a3674495b31b529735414b93aec543aeb3838fff7a5a7d51f5014959997a693b","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/asset.json"},{"path":"demo.js","size":685,"sha256":"2f0882d352388eb4f9e58857c9fd891ed6cb940266a146d47d910cca42c104ac","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/demo.js"},{"path":"index.html","size":539,"sha256":"916804edb923514edd24bea9f278a936a724c3ee001a8035e0cf3aa60ca498a5","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/index.html"},{"path":"src/charcoal-horse.js","size":10972,"sha256":"1d72cf60b6ed78459735c9f8cd6565daca1ec88330dddd6b4ec3442b12c5f9b6","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/charcoal-horse/1.0.0/src/charcoal-horse.js"}],"warnings":[]}