{
  "license": "CC0-1.0",
  "shader": {
    "id": "ss9fq5hc",
    "title": "Caldera",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "lava",
      "voronoi",
      "crust",
      "magma",
      "ember",
      "volcanic"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T08:18:26.191Z",
    "poster_url": "/posters/ss9fq5hc.avif",
    "stats": {
      "slops": 0,
      "views": 145,
      "forks": 0
    },
    "self": "/api/v1/shaders/ss9fq5hc",
    "isf": "/*{\n  \"DESCRIPTION\": \"Cooling crust — dark basalt plates drifting apart over molten cracks that glow from within, like a lava lake skinning over.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"scale\", \"TYPE\": \"float\", \"DEFAULT\": 5.0, \"MIN\": 2.0, \"MAX\": 11.0 },\n    { \"NAME\": \"heat\",  \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.3, \"MAX\": 2.0 },\n    { \"NAME\": \"crack\", \"TYPE\": \"float\", \"DEFAULT\": 0.09, \"MIN\": 0.03, \"MAX\": 0.2 },\n    { \"NAME\": \"drift\", \"TYPE\": \"float\", \"DEFAULT\": 0.4, \"MIN\": 0.0, \"MAX\": 1.5 }\n  ]\n}*/\n\nvec2 hash2(vec2 p){ p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3))); return fract(sin(p) * 43758.5453); }\nfloat hash(vec2 p){ p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); }\nfloat noise(vec2 p){\n  vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n  float a = hash(i), b = hash(i + vec2(1.0, 0.0)), c = hash(i + vec2(0.0, 1.0)), d = hash(i + vec2(1.0, 1.0));\n  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\nvec3 fire(float h){\n  h = clamp(h, 0.0, 1.0);\n  vec3 c = mix(vec3(0.4, 0.02, 0.0), vec3(1.0, 0.3, 0.0), smoothstep(0.0, 0.45, h));\n  c = mix(c, vec3(1.0, 0.78, 0.2), smoothstep(0.45, 0.8, h));\n  c = mix(c, vec3(1.0, 1.0, 0.9), smoothstep(0.8, 1.0, h));\n  return c;\n}\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n  vec2 p = uv * scale;\n  vec2 ip = floor(p), fp = fract(p);\n  float t = TIME * drift;\n\n  float f1 = 9.0, f2 = 9.0;\n  vec2 nearId = vec2(0.0);\n  for (int y = -1; y <= 1; y++){\n    for (int x = -1; x <= 1; x++){\n      vec2 g = vec2(float(x), float(y));\n      vec2 o = hash2(ip + g);\n      o = 0.5 + 0.35 * sin(t * 0.7 + 6.2831 * o);     // plates drift slowly\n      vec2 r = g + o - fp;\n      float d = dot(r, r);\n      if (d < f1){ f2 = f1; f1 = d; nearId = ip + g; }\n      else if (d < f2){ f2 = d; }\n    }\n  }\n  f1 = sqrt(f1); f2 = sqrt(f2);\n  float border = f2 - f1;                              // distance to the crack between plates\n\n  float crackMask = smoothstep(crack, 0.0, border);    // 1 inside the molten crack\n  float rnd = hash(nearId);\n\n  // dark basalt plate, domed (darker toward the cracked edges = cooled rim)\n  vec3 plate = mix(vec3(0.05, 0.025, 0.018), vec3(0.13, 0.06, 0.035), rnd);\n  plate *= 0.55 + 0.5 * noise(p * 6.0 + rnd * 10.0);   // crust texture\n  plate *= 0.4 + 0.6 * smoothstep(0.0, 0.45, f1);      // darker (cooler) near the rim\n\n  // molten crack glow — hotter (whiter) at the very centre of the crack, pulsing\n  float hot = smoothstep(crack, 0.0, border) * (0.6 + 0.4 * sin(t * 2.0 + rnd * 20.0));\n  hot = pow(hot, 0.7);\n  vec3 lava = fire(hot) * heat;\n\n  vec3 col = mix(plate, lava, crackMask);\n  col += lava * crackMask * 0.5;                        // bloom from the cracks\n  col += fire(0.9) * heat * 0.25 * pow(crackMask, 3.0); // hottest seams\n\n  // heat bleeds from the cracks into the surrounding crust (embers under the skin)\n  float bleed = exp(-max(0.0, border - crack) * 9.0) * (1.0 - crackMask);\n  col += fire(0.3) * heat * bleed * 0.45;\n\n  col *= 1.0 - 0.3 * dot(uv, uv);\n  col = col / (1.0 + 0.4 * col);\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
    }
  }
}