{
  "license": "CC0-1.0",
  "shader": {
    "id": "rfzir1qa",
    "title": "Catalyst Tide",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "reaction-diffusion",
      "liquid",
      "feedback",
      "generative"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-07-13T19:59:31.768Z",
    "poster_url": "/posters/rfzir1qa.avif",
    "stats": {
      "slops": 0,
      "views": 120,
      "forks": 1
    },
    "self": "/api/v1/shaders/rfzir1qa",
    "isf": "/*{\n  \"DESCRIPTION\": \"Gray-Scott reaction-diffusion that grows liquid coral and ink-like cells.\",\n  \"INPUTS\": [\n    { \"NAME\": \"feed\", \"TYPE\": \"float\", \"DEFAULT\": 0.055, \"MIN\": 0.010, \"MAX\": 0.080 },\n    { \"NAME\": \"kill\", \"TYPE\": \"float\", \"DEFAULT\": 0.062, \"MIN\": 0.030, \"MAX\": 0.075 },\n    { \"NAME\": \"simSpeed\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.1, \"MAX\": 2.0 },\n    { \"NAME\": \"seedRate\", \"TYPE\": \"float\", \"DEFAULT\": 0.62, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"colorPhase\", \"TYPE\": \"float\", \"DEFAULT\": 0.56, \"MIN\": 0.0, \"MAX\": 1.0 }\n  ],\n  \"PASSES\": [\n    { \"TARGET\": \"chem\", \"PERSISTENT\": true, \"FLOAT\": true },\n    {}\n  ]\n}*/\n\n#define TAU 6.28318530718\n\nvec3 palette(float t) {\n  return 0.52 + 0.48 * cos(TAU * (t + colorPhase + vec3(0.00, 0.18, 0.42)));\n}\n\nvec2 chemistry(vec2 uv) {\n  return IMG_NORM_PIXEL(chem, uv).rg;\n}\n\nvoid main() {\n  vec2 uv = isf_FragNormCoord;\n\n  if (PASSINDEX == 0) {\n    vec2 px = 1.0 / RENDERSIZE;\n    vec2 c = chemistry(uv);\n\n    if (FRAMEINDEX < 2 || dot(c, c) < 0.000001) {\n      vec2 p = uv - 0.5;\n      p.x *= RENDERSIZE.x / RENDERSIZE.y;\n      float organic = sin(p.x * 31.0) + sin(p.y * 27.0)\n                    + sin((p.x + p.y) * 19.0) + sin(length(p) * 43.0);\n      float seed = smoothstep(1.65, 2.75, organic)\n                 * smoothstep(0.58, 0.12, length(p));\n      seed += smoothstep(0.155, 0.115, length(p));\n      seed += smoothstep(0.052, 0.028, length(p - vec2(0.23, 0.02)));\n      seed += smoothstep(0.052, 0.028, length(p + vec2(0.23, -0.02)));\n      seed += smoothstep(0.040, 0.020, length(p - vec2(0.0, 0.25)));\n      seed += smoothstep(0.040, 0.020, length(p + vec2(0.0, 0.25)));\n      seed = clamp(seed, 0.0, 1.0);\n      c = mix(vec2(1.0, 0.0), vec2(0.52, 0.28), seed);\n    }\n\n    vec2 lap = -c;\n    lap += 0.20 * chemistry(uv + vec2(px.x, 0.0));\n    lap += 0.20 * chemistry(uv - vec2(px.x, 0.0));\n    lap += 0.20 * chemistry(uv + vec2(0.0, px.y));\n    lap += 0.20 * chemistry(uv - vec2(0.0, px.y));\n    lap += 0.05 * chemistry(uv + px);\n    lap += 0.05 * chemistry(uv - px);\n    lap += 0.05 * chemistry(uv + vec2(px.x, -px.y));\n    lap += 0.05 * chemistry(uv + vec2(-px.x, px.y));\n\n    float u = c.r;\n    float v = c.g;\n    float reaction = u * v * v;\n    float stepSize = min(TIMEDELTA * 60.0, 1.35) * simSpeed;\n    u += (0.16 * lap.r - reaction + feed * (1.0 - u)) * stepSize;\n    v += (0.08 * lap.g + reaction - (kill + feed) * v) * stepSize;\n\n    vec2 orbit = vec2(\n      0.5 + 0.29 * cos(TIME * 0.31),\n      0.5 + 0.21 * sin(TIME * 0.47)\n    );\n    vec2 od = uv - orbit;\n    od.x *= RENDERSIZE.x / RENDERSIZE.y;\n    vec2 orbit2 = vec2(\n      0.5 + 0.24 * cos(TIME * 0.23 + 3.14159),\n      0.5 + 0.31 * sin(TIME * 0.39 + 1.4)\n    );\n    vec2 od2 = uv - orbit2;\n    od2.x *= RENDERSIZE.x / RENDERSIZE.y;\n    float freshSeed = smoothstep(0.026, 0.0, length(od));\n    freshSeed += 0.8 * smoothstep(0.022, 0.0, length(od2));\n    freshSeed = clamp(freshSeed * seedRate, 0.0, 1.0);\n    v = max(v, freshSeed * 0.38);\n    u = mix(u, 0.52, freshSeed);\n\n    gl_FragColor = vec4(clamp(u, 0.0, 1.0), clamp(v, 0.0, 1.0), 0.0, 1.0);\n  } else {\n    vec2 c = IMG_THIS_PIXEL(chem).rg;\n    float ink = smoothstep(0.012, 0.24, c.g);\n    float membrane = smoothstep(0.030, 0.0, abs(c.g - 0.075));\n    vec3 col = palette(c.g * 3.4 + c.r * 0.18);\n    col *= 0.035 + 1.52 * ink;\n    col += membrane * palette(c.r + 0.17) * 0.92;\n    col += vec3(0.003, 0.006, 0.014);\n    col = col / (1.0 + 0.45 * col);\n    gl_FragColor = vec4(col, 1.0);\n  }\n}\n",
    "generator": {
      "model": "gpt-5",
      "provider": "openai",
      "prompt": null,
      "params": null
    }
  }
}