{
  "license": "CC0-1.0",
  "shader": {
    "id": "7ct3caq1",
    "title": "Chrome Current",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "liquid",
      "chrome",
      "feedback",
      "flow"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-07-13T19:59:48.917Z",
    "poster_url": "/posters/7ct3caq1.avif",
    "stats": {
      "slops": 0,
      "views": 100,
      "forks": 1
    },
    "self": "/api/v1/shaders/7ct3caq1",
    "isf": "/*{\n  \"DESCRIPTION\": \"Persistent liquid-chrome ribbons stirred by orbiting vortices.\",\n  \"INPUTS\": [\n    { \"NAME\": \"motion\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 2.5 },\n    { \"NAME\": \"swirl\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"trail\", \"TYPE\": \"float\", \"DEFAULT\": 0.986, \"MIN\": 0.94, \"MAX\": 0.999 },\n    { \"NAME\": \"hueShift\", \"TYPE\": \"float\", \"DEFAULT\": 0.08, \"MIN\": 0.0, \"MAX\": 1.0 }\n  ],\n  \"PASSES\": [\n    { \"TARGET\": \"paint\", \"PERSISTENT\": true, \"FLOAT\": true },\n    {}\n  ]\n}*/\n\n#define TAU 6.28318530718\n\nvec3 palette(float t) {\n  return 0.5 + 0.5 * cos(TAU * (t + hueShift + vec3(0.00, 0.29, 0.57)));\n}\n\nvec2 vortex(vec2 p, vec2 center, float spin) {\n  vec2 d = p - center;\n  float influence = exp(-dot(d, d) * 13.0);\n  return vec2(-d.y, d.x) * influence * spin;\n}\n\nvoid main() {\n  vec2 uv = isf_FragNormCoord;\n\n  if (PASSINDEX == 0) {\n    float t = TIME * motion;\n    float frameStep = min(TIMEDELTA * 60.0, 2.0);\n    vec2 p = uv - 0.5;\n    p.x *= RENDERSIZE.x / RENDERSIZE.y;\n\n    vec2 a = vec2(0.27 * cos(t * 0.41), 0.24 * sin(t * 0.53));\n    vec2 b = vec2(0.25 * cos(t * 0.37 + 3.1), 0.28 * sin(t * 0.46 + 2.2));\n    vec2 vel = vortex(p, a, 2.1) + vortex(p, b, -1.8);\n    vel += vec2(\n      sin(TAU * uv.y * 2.0 + t * 0.4),\n      cos(TAU * uv.x * 2.0 - t * 0.3)\n    ) * 0.055;\n    vel *= swirl;\n    vel.x /= RENDERSIZE.x / RENDERSIZE.y;\n\n    vec2 back = uv - vel * (0.014 * frameStep * motion);\n    vec2 px = 1.0 / RENDERSIZE;\n    vec3 old = IMG_NORM_PIXEL(paint, back).rgb * 0.70;\n    old += IMG_NORM_PIXEL(paint, back + vec2(px.x, 0.0)).rgb * 0.075;\n    old += IMG_NORM_PIXEL(paint, back - vec2(px.x, 0.0)).rgb * 0.075;\n    old += IMG_NORM_PIXEL(paint, back + vec2(0.0, px.y)).rgb * 0.075;\n    old += IMG_NORM_PIXEL(paint, back - vec2(0.0, px.y)).rgb * 0.075;\n    old *= pow(trail, frameStep);\n\n    vec2 dropA = p - a;\n    vec2 dropB = p - b;\n    float injectA = smoothstep(0.046, 0.0, length(dropA));\n    float injectB = smoothstep(0.040, 0.0, length(dropB));\n    vec2 cpos = vec2(0.18 * sin(t * 0.68), 0.30 * cos(t * 0.29));\n    float injectC = smoothstep(0.034, 0.0, length(p - cpos));\n    vec3 fresh = palette(t * 0.035 + length(a) + 0.12) * injectA;\n    fresh += palette(t * 0.035 + length(b) + 0.62) * injectB;\n    fresh += palette(t * 0.035 + length(cpos) + 0.36) * injectC;\n\n    float boundary = smoothstep(0.0, 0.03, uv.x)\n                   * smoothstep(0.0, 0.03, 1.0 - uv.x)\n                   * smoothstep(0.0, 0.03, uv.y)\n                   * smoothstep(0.0, 0.03, 1.0 - uv.y);\n    vec3 next = max(old, fresh * 0.72) * boundary;\n    gl_FragColor = vec4(clamp(next, 0.0, 2.0), 1.0);\n  } else {\n    vec2 uv2 = isf_FragNormCoord;\n    vec2 px = 1.0 / RENDERSIZE;\n    vec3 c = IMG_THIS_PIXEL(paint).rgb;\n    float l = dot(c, vec3(0.3333));\n    float lx = dot(IMG_NORM_PIXEL(paint, uv2 + vec2(px.x, 0.0)).rgb, vec3(0.3333));\n    float ly = dot(IMG_NORM_PIXEL(paint, uv2 + vec2(0.0, px.y)).rgb, vec3(0.3333));\n    vec2 grad = vec2(lx - l, ly - l);\n    float rim = clamp(length(grad) * 28.0, 0.0, 1.0);\n\n    vec3 chrome = c * (0.34 + 1.35 * l);\n    chrome += rim * palette(0.16 + l * 0.22) * 0.72;\n    chrome += pow(max(l, 0.0), 3.0) * vec3(0.8, 0.9, 1.0);\n    chrome = chrome / (1.0 + 0.65 * chrome);\n    gl_FragColor = vec4(chrome, 1.0);\n  }\n}\n",
    "generator": {
      "model": "gpt-5",
      "provider": "openai",
      "prompt": null,
      "params": null
    }
  }
}