{
  "format": "field",
  "version": 1,
  "meta": {
    "name": "Holographic Iridescent Thin Film",
    "author": "Infinite",
    "description": "Optical thin-film interference shader with refractive spectral dispersion, pearlescent fluid ripples, and dynamic chromatic caustic sheen.",
    "domain": "pixel"
  },
  "device": {
    "code": "param float filmDepth = 1.2 [0.2, 3.0]\nparam float waveSpeed = 0.55 [0.1, 2.0]\nparam float dispersion = 1.4 [0.2, 3.0]\nparam float sheen = 0.7 [0.1, 1.5]\nparam float contrast = 1.2 [0.5, 2.5]\n\np = vec2((uv.x - 0.5) * aspect, uv.y - 0.5) * 2.6\nr = length(p)\nang = atan2(p.y, p.x)\ntime = t * waveSpeed\n\nw1 = sin(p.x * 4.2 + time * 1.5 + sin(p.y * 3.2))\nw2 = cos(p.y * 3.8 - time * 1.3 + cos(p.x * 2.8))\nw3 = sin(r * 7.5 - time * 2.2 + ang * 2.0)\nwave = (w1 * 0.35 + w2 * 0.35 + w3 * 0.3)\n\nphase = r * 5.0 + wave * filmDepth - time * 1.2\n\nf1 = clamp(sin(phase * dispersion + 0.0) * 0.5 + 0.5, 0.0, 1.0)\nf2 = clamp(sin(phase * dispersion + 2.094) * 0.5 + 0.5, 0.0, 1.0)\nf3 = clamp(sin(phase * dispersion + 4.188) * 0.5 + 0.5, 0.0, 1.0)\n\ncDeep = vec3(0.06, 0.04, 0.12)\ncCyan = vec3(0.663, 0.941, 1.0)\ncPink = vec3(1.0, 0.702, 0.961)\ncLime = vec3(0.839, 1.0, 0.620)\ncWhite = vec3(1.0, 1.0, 1.0)\n\nbase = mix(cDeep, cCyan, f1)\nbase = mix(base, cPink, f2 * 0.7)\nbase = mix(base, cLime, f3 * 0.5)\n\nspec = pow(max(0.0, sin(wave * 5.0 + time * 2.5)), 8.0) * sheen\ncol = mix(base, cWhite, spec)\nalpha = 1.0\n",
    "params": {
      "filmDepth": 1.2,
      "waveSpeed": 0.55,
      "dispersion": 1.4,
      "sheen": 0.7,
      "contrast": 1.2
    },
    "nodeSettings": {
      "width": 1080.0,
      "height": 1080.0,
      "animate": 1.0
    }
  }
}