{"id":"sand-hourglass","version":"1.0.0","title":"A Desert in an Hourglass","summary":"Falling grains build a miniature dune country inside a brass hourglass: a sun and three camels walk the ridge, then a warm wind unthreads the caravan back into sand. Loops.","kind":"background","target":"three","collections":["impossible-worlds","hypnotic-loops"],"tags":["hourglass","sand","desert","camels","dunes","time","caravan","sand art","brass","gold","timer","animal","loop","portrait film"],"loopable":true,"motion":"procedural","durationSeconds":8,"status":"published","media":{"poster":"https://aipixelwizard.com/media/sand-hourglass/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/sand-hourglass/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/sand-hourglass/1.0.0/sample.mp4","sampleBytes":942420,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/sand-hourglass","manifest":"https://aipixelwizard.com/api/v1/visuals/sand-hourglass/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/","demo":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/index.html"},"description":"A brass-framed hourglass on a black-and-gold sand table. As the grains fall they pile into dunes in the lower bulb and a sun rises above them; three camels walk the ridge in a caravan. Then a warm wind lifts the grains, the caravan unthreads back into sand, and the sand returns to the upper bulb, so the 8 seconds loop. Individual grains, dune hatching and the camel silhouettes are all drawn in the shader. The film has no settings.","role":"Shader film (three.js): Sand animation, a finished 8-second portrait film with no settings.","useCases":["A \"time\" or deadline theme for a countdown or a productivity video","A travel or Middle-East tourism promo","A looping sand-art backdrop for a title"],"synonyms":["sand art animation","desert in an hourglass","camel caravan","sand timer","sand clock","time passing","sand dunes loop"],"digest":"cc1db86cfa5976e1cf33aac3de41c5ee80a579463bc8034b41c58c94f28e86ce","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/sand-hourglass.js","exports":[{"name":"createSandHourglass","signature":"createSandHourglass() => { 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/sand-hourglass.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":true,"cycleSeconds":8,"method":"Every part of the film is a function of the time modulo its length, and every motion completes whole cycles, so the last frame meets the first."},"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":"A warm glow from the sun inside the glass, on a black sand-table ground.","timing":"Grains fall and pile into dunes, a sun rises and three camels walk the ridge, then a wind unthreads the caravan back into sand.","compatibleWith":[],"notes":["The hourglass is a true twin-bulb silhouette with a brass frame.","Grains falling and returning are individual points, not a texture.","Every pixel is a function of the time alone, so frames can be rendered in any order."]},"reuse":["Time-passing b-roll: the hourglass runs once per loop, which suits a \"time is running out\" beat.","Seamless loop: the sand returns to the top, so it repeats for any length.","Travel promo: the caravan on the dune ridge holds from about 3 s to 6 s."],"integration":{"newProject":"Create a WebGLRenderer on a canvas (no antialiasing), call createSandHourglass() once and film.setSize(width, height); then for each frame call film.update(timeInSeconds) and renderer.render(film.scene, film.camera).","existingProject":"Copy src/sand-hourglass.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 13 ms a frame at 1080 by 1350 on an integrated Intel GPU (Iris Xe), and about 3 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.","Its length is fixed at 8 seconds; repeat the loop to fill a longer clip."],"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 “A Desert in an Hourglass”, 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":{"sand-hourglass@1.0.0":"cc1db86cfa5976e1cf33aac3de41c5ee80a579463bc8034b41c58c94f28e86ce","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":689.1,"loopCheck":{"checked":true,"seamless":true,"maxDifference":0,"note":"Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/sand-hourglass/1.0.0/poster.webp","preview":"/media/sand-hourglass/1.0.0/preview.mp4","sample":"/media/sand-hourglass/1.0.0/sample.mp4","sampleBytes":942420}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/LICENSE"},{"path":"asset.json","size":5853,"sha256":"662ef4c5ed776bda66c845c0d04cb4b758a28ca193e532aa959c2ced5182b76a","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/asset.json"},{"path":"demo.js","size":684,"sha256":"042dc56899dffb4db8a43b1a1b346e1cbb38231508dd60d710dfb052adad5824","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/demo.js"},{"path":"index.html","size":538,"sha256":"fefe031c16c24ffa7e776ed21b2391b8b9d5676f4431172017e9ac248676b53a","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/index.html"},{"path":"src/sand-hourglass.js","size":8817,"sha256":"6e6d59e4caa8927065fa02cfc642b1522ea21cffab8d4d8f1d3e2275fc5ae9ad","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/sand-hourglass/1.0.0/src/sand-hourglass.js"}],"warnings":[]}