{
  "license": "CC0-1.0",
  "shader": {
    "id": "d4xde501",
    "title": "Reagent",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "belousov-zhabotinsky",
      "reaction-diffusion",
      "chemical",
      "waves",
      "spiral",
      "organic"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T07:19:55.760Z",
    "poster_url": "/posters/d4xde501.avif",
    "stats": {
      "slops": 0,
      "views": 156,
      "forks": 0
    },
    "self": "/api/v1/shaders/d4xde501",
    "isf": "/*{\n  \"DESCRIPTION\": \"Chemical clock — Belousov-Zhabotinsky spiral and target waves spreading from pacemakers and annihilating where they collide.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"freq\",  \"TYPE\": \"float\", \"DEFAULT\": 26.0, \"MIN\": 6.0, \"MAX\": 44.0 },\n    { \"NAME\": \"speed\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"scale\", \"TYPE\": \"float\", \"DEFAULT\": 0.85, \"MIN\": 0.4, \"MAX\": 2.5 },\n    { \"NAME\": \"tox\",   \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.0 }\n  ]\n}*/\n\nvec2 src(int i, float t){\n  float fi = float(i);\n  return vec2(sin(t * 0.13 + fi * 1.7) * 0.7, cos(t * 0.11 + fi * 2.3) * 0.7);\n}\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n  vec2 p = uv * scale;\n  float t = TIME * speed;\n\n  // assign each pixel to its NEAREST pacemaker (Voronoi domain), render that source's spiral wave\n  float r1 = 1e9, r2 = 1e9, wave1 = 0.0, rNear = 0.0;\n  for (int i = 0; i < 6; i++){\n    float fi = float(i);\n    vec2 d = p - src(i, t);\n    float r = length(d);\n    if (r < r1){\n      r2 = r1; r1 = r;\n      float a = atan(d.y, d.x);\n      float arm = (mod(fi, 2.0) < 0.5 ? 1.0 : -1.0) * mod(fi, 3.0);   // mix of targets (0) + spirals (±1,±2)\n      wave1 = 0.5 + 0.5 * sin(r * freq - t * (3.0 + 0.25 * fi) + arm * a + fi * 1.3);\n      rNear = r;\n    } else if (r < r2){ r2 = r; }\n  }\n\n  float wall = smoothstep(0.0, 0.05, r2 - r1);     // Voronoi collision fronts\n  float bands = wave1;\n  float closest = rNear;\n\n  vec3 dark  = vec3(0.02, 0.06, 0.0);\n  vec3 green = mix(vec3(0.12, 0.55, 0.03), vec3(0.06, 0.45, 0.3), tox);\n  vec3 acid  = mix(vec3(0.85, 1.0, 0.2), vec3(0.5, 1.0, 0.55), tox);\n  // crisp concentric wave bands\n  vec3 col = mix(dark, green, smoothstep(0.32, 0.55, bands));\n  col = mix(col, acid, smoothstep(0.62, 0.88, bands));\n  col += acid * pow(max(0.0, bands), 8.0) * 0.5;   // bright leading wavefronts\n  col *= 0.22 + 0.78 * wall;                       // dark annihilation lines\n  col += acid * 0.5 * exp(-closest * closest * 30.0);   // glowing pacemaker cores\n\n  col *= 1.0 - 0.3 * dot(uv, uv);\n  col = pow(max(col, 0.0), vec3(0.9));\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": "anthropic",
      "prompt": null,
      "params": null
    }
  }
}