{"id":"paint-pour","version":"1.0.0","title":"Acrylic Paint Pour","summary":"Glossy acrylic pour painting that slowly swirls, with cells blooming and fine lacing. Loops perfectly.","kind":"background","target":"three","collections":["satisfying","backgrounds","hypnotic-loops"],"tags":["paint pour","acrylic pour","fluid art","cells","marble","resin art","satisfying","abstract","liquid","loop"],"loopable":true,"motion":"procedural","durationSeconds":8,"status":"published","media":{"poster":"https://aipixelwizard.com/media/paint-pour/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/paint-pour/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/paint-pour/1.0.0/sample.mp4","sampleBytes":6306450,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/paint-pour","manifest":"https://aipixelwizard.com/api/v1/visuals/paint-pour/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/paint-pour/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/paint-pour/1.0.0/","demo":"https://aipixelwizard.com/registry/paint-pour/1.0.0/index.html"},"description":"A wet acrylic pour seen from above: bands of paint folded by a slow swirl, round cells with pale rims opening inside them, fine lacing along the edges and glossy highlights where the paint's surface catches a window light. Choose five colours (one can be metallic gold or silver), how busy the pattern is, how many cells and how glossy it looks. It loops seamlessly and stays sharp at full size.","role":"Full-frame background (Three.js shader): a satisfying acrylic pour pattern.","useCases":["A satisfying background for reels and shorts","An abstract backdrop for titles and products","Brand-coloured texture for a loop"],"synonyms":["acrylic pouring","fluid painting","dirty pour","resin art","marbled paint","paint swirl","liquid marble","flow art","satisfying paint"],"digest":"44efb138a01336634aceaf4cf3950666a0bb2253ac106186397fa345d4bf61e1","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/paint-pour.js","exports":[{"name":"createPaintPour","signature":"createPaintPour({ colors?, metallic?, scale?, flow?, bands?, cells?, cellSize?, gloss?, relief?, motion?, seed?, aspect?, lightDir? }) => { mesh, material, update(progress), dispose() }","description":"The paint on a 2 × 2 plane that fills the screen under OrthographicCamera(-1, 1, 1, -1); update(progress 0…1) every frame."},{"name":"createPaintPourMaterial","signature":"createPaintPourMaterial(options) => THREE.ShaderMaterial","description":"The same paint as a material for your own plane (uses its UVs); set uniforms.uPhase.value to the loop progress."}],"reusable":["src/paint-pour.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"three","version":"0.185.1","scope":"source","reason":"Renderer and shader material."},{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness."}],"uses":[],"usedBy":[],"params":[{"key":"color1","label":"Colour 1","type":"color","default":"#0b2545"},{"key":"color2","label":"Colour 2","type":"color","default":"#13a89e"},{"key":"color3","label":"Colour 3","help":"The cells open mostly in this colour's bands.","type":"color","default":"#f4f1ea"},{"key":"color4","label":"Colour 4","help":"Can be metallic (see below).","type":"color","default":"#d4a24c"},{"key":"color5","label":"Colour 5","type":"color","default":"#1d4e89"},{"key":"metallic","label":"Colour 4 is metallic","type":"boolean","default":true},{"key":"scale","label":"Pattern size","help":"Higher is busier.","type":"number","min":0.8,"max":3,"step":0.05,"default":1.6},{"key":"flow","label":"Swirl","type":"number","min":0.4,"max":2.6,"step":0.05,"default":1.8},{"key":"bands","label":"Colour bands","type":"number","min":1,"max":5,"step":0.1,"default":2.4},{"key":"cells","label":"Cells","type":"number","min":0,"max":1,"step":0.05,"default":0.55},{"key":"cellSize","label":"Cell density","help":"Higher means more, smaller cells.","type":"number","min":3,"max":12,"step":0.5,"default":6},{"key":"gloss","label":"Gloss","type":"number","min":0,"max":1,"step":0.05,"default":0.8},{"key":"motion","label":"Movement","help":"How far the paint swirls during one loop.","type":"number","min":0.2,"max":1.6,"step":0.05,"default":0.5},{"key":"seed","label":"Variation","type":"integer","min":1,"max":9999,"step":1,"default":1}],"presets":[{"id":"default","label":"Ocean and gold","params":{}},{"id":"sunset","label":"Sunset pour","params":{"color1":"#4a1942","color2":"#c2185b","color3":"#fdf0d5","color4":"#ff7a3d","color5":"#ff4d6d","metallic":false,"seed":7}},{"id":"galaxy","label":"Galaxy with silver","params":{"color1":"#07070d","color2":"#4b2a7b","color3":"#ece9f5","color4":"#b8bcc8","color5":"#2d3a8c","cells":0.75,"cellSize":8,"seed":12}},{"id":"pastel","label":"Mint and blush","params":{"color1":"#6aa58e","color2":"#9ee6cf","color3":"#fff8f0","color4":"#c98f7a","color5":"#f7b2bd","scale":1.2,"bands":2,"seed":3}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":8,"posterSeconds":2,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":8,"method":"The swirl offsets travel once round closed circles in the noise domain per loop, and everything else is a pure function of them, so the last frame meets the first."},"seed":{"param":"seed","behavior":"Seed picks the noise and the cells: same seed, same painting."}},"composition":{"inputs":"Loop progress 0…1. Five colours and the style values at creation.","outputs":"A THREE.Mesh (2 × 2 plane) with a ShaderMaterial, or the material alone.","coordinates":"Fills clip space under OrthographicCamera(-1, 1, 1, -1); on your own plane it follows the UVs.","lighting":"Self-lit: the shader shades its own relief with a soft window light; scene lights do not affect it.","timing":"update(progress) is a pure function of progress; frames render in any order.","compatibleWith":["kinetic-title","rolling-counter","gradient-background"],"notes":["Pass the surface's aspect ratio (width / height) so cells stay round on non-square planes.","Put it on a plane in a 3D scene (a canvas on an easel, a phone screen) with createPaintPourMaterial."]},"reuse":["Satisfying background: render it full frame behind Kinetic Title Reveal for a reel opener.","Brand texture: set the five colours to a brand palette, one metallic accent, for a loop or a slide background.","Product scene: apply the material to a canvas, a phone screen or packaging in a Three.js scene."],"integration":{"newProject":"Create a WebGLRenderer, an OrthographicCamera(-1, 1, 1, -1) and add createPaintPour().mesh; call update(frame / totalFrames) and render each frame.","existingProject":"Copy src/paint-pour.js. Use createPaintPourMaterial() on any plane, or the full-screen mesh as a background pass, and set the loop progress every frame."},"performance":{"notes":"One fragment shader: about 30 noise evaluations and a 3 × 3 cell search per pixel. Smooth at 1080p on laptop GPUs.","limits":"Software WebGL (no GPU) renders slowly; lower the resolution for live previews there."},"limitations":["A painted look, not a fluid simulation: the paint swirls in place and does not spread from a pour point.","Seen from straight above; the relief is shading only, not geometry."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[{"name":"three.js","version":"0.185.1","license":"MIT","url":"https://github.com/mrdoob/three.js"}]},"rights":{"approvedForPublicRelease":true},"provenance":"Adapted from the owner's threejs-sketches/abstract-artistic/paint-pour (MIT), rebuilt for AI Pixel Wizard in October 2026: new pour pattern (folded bands, round cells, lacing) with antialiased edges, relief lighting, metallic paint, and the frame/time contract.","changelog":[{"version":"1.0.0","date":"2026-10-05","notes":"Initial release."}],"verification":{"testedOn":"2026-10-05","inputs":{"paint-pour@1.0.0":"44efb138a01336634aceaf4cf3950666a0bb2253ac106186397fa345d4bf61e1","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":1080,"fps":30,"frames":240,"renderSeconds":439.8,"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/paint-pour/1.0.0/poster.webp","preview":"/media/paint-pour/1.0.0/preview.mp4","sample":"/media/paint-pour/1.0.0/sample.mp4","sampleBytes":6306450}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/paint-pour/1.0.0/LICENSE"},{"path":"asset.json","size":9246,"sha256":"72a0f629c157346ba79a9062e6d96647c9fac84d0031039919317a177662ba31","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/paint-pour/1.0.0/asset.json"},{"path":"demo.js","size":1281,"sha256":"247c79c26cc2e1f55e16062966e738e5d180af43c882884cf1753732c7377898","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/paint-pour/1.0.0/demo.js"},{"path":"index.html","size":524,"sha256":"161e1b603f110a39517f5dd8e10753b3c99c97f78b327a16f26941ee74deb50d","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/paint-pour/1.0.0/index.html"},{"path":"src/paint-pour.js","size":10340,"sha256":"69843db64c3a2f4a563c81a5a2f5debe51851ecdbb6f4f0c19dab64a93a8ac94","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/paint-pour/1.0.0/src/paint-pour.js"}],"warnings":[]}