{
  "license": "CC0-1.0",
  "shader": {
    "id": "wr1hpyqx",
    "title": "Solar Veil",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "aurora",
      "flow",
      "fire",
      "curtains",
      "ember",
      "sky"
    ],
    "parents": [
      "rdvqa721",
      "8dmk070r"
    ],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T07:38:15.995Z",
    "poster_url": "/posters/wr1hpyqx.avif",
    "stats": {
      "slops": 0,
      "views": 117,
      "forks": 0
    },
    "self": "/api/v1/shaders/wr1hpyqx",
    "isf": "/*{\n  \"DESCRIPTION\": \"Solar veil — warm aurora curtains whose rays are combed by a curl-noise flow, draping and rippling like a fire sky.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"bands\",     \"TYPE\": \"float\", \"DEFAULT\": 3.0, \"MIN\": 2.0, \"MAX\": 7.0 },\n    { \"NAME\": \"flowAmt\",   \"TYPE\": \"float\", \"DEFAULT\": 0.6, \"MIN\": 0.0, \"MAX\": 1.5 },\n    { \"NAME\": \"intensity\", \"TYPE\": \"float\", \"DEFAULT\": 0.9, \"MIN\": 0.3, \"MAX\": 1.8 },\n    { \"NAME\": \"speed\",     \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 2.0 }\n  ]\n}*/\n\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}\nfloat fbm(vec2 p){ float s = 0.0, a = 0.5; for (int i = 0; i < 3; i++){ s += a * noise(p); p = p * 2.0 + 3.0; a *= 0.5; } return s; }\n\n// flow: mostly vertical (curtain rays) with curl-noise sway\nvec2 flow(vec2 p, float t){\n  float a = 1.5708 + (fbm(p * 1.6 + vec2(0.0, t * 0.2)) - 0.5) * 3.0 * flowAmt;\n  return vec2(cos(a), sin(a));\n}\n\nvec3 fire(float h){\n  h = clamp(h, 0.0, 1.0);\n  vec3 c = mix(vec3(0.05, 0.0, 0.02), vec3(0.6, 0.07, 0.03), smoothstep(0.0, 0.3, h));\n  c = mix(c, vec3(1.0, 0.4, 0.05), smoothstep(0.3, 0.6, h));\n  c = mix(c, vec3(1.0, 0.85, 0.4), smoothstep(0.6, 0.85, h));\n  c = mix(c, vec3(1.0, 1.0, 0.92), smoothstep(0.85, 1.0, h));\n  return c;\n}\n\nvoid main(){\n  vec2 uv = gl_FragCoord.xy / RENDERSIZE;\n  vec2 p = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n  float t = TIME * speed;\n\n  // curtain RAYS: anisotropic vertical streaks (high-x / low-y freq) warped by the flow sway\n  float sway = (fbm(vec2(p.x * 1.4, t * 0.25)) - 0.5) * 2.6 * flowAmt;\n  float rayX = p.x + sway * 0.45;\n  float rays = noise(vec2(rayX * 26.0, p.y * 1.1 - t * 0.6));\n  rays += 0.5 * noise(vec2(rayX * 55.0, p.y * 0.8 + t * 0.4));   // finer rays\n  rays = pow(clamp(rays * 0.95 - 0.15, 0.0, 1.0), 1.5);\n  rays = 0.08 + 1.0 * rays;                         // darker valleys -> rays read as distinct\n\n  // aurora curtains: a few wavy horizontal bands, taller/brighter at the base\n  float curtain = 0.0, baseHeat = 0.0;\n  for (int i = 0; i < 7; i++){\n    if (float(i) >= bands) break;\n    float fi = float(i);\n    float yC = -0.4 + 0.26 * fi;\n    float wob = 0.11 * fbm(vec2(p.x * 1.2 + fi, t * 0.4 + fi * 3.0)) + 0.05 * sin(p.x * 2.5 + t + fi);\n    float d = p.y - (yC + wob);\n    float c = exp(-abs(d) * 13.0) * smoothstep(0.6, -0.15, d);\n    curtain += c;\n    baseHeat = max(baseHeat, c * smoothstep(0.1, -0.25, d));   // hottest at the curtain foot\n  }\n\n  // night sky + stars\n  vec3 col = mix(vec3(0.03, 0.01, 0.04), vec3(0.0, 0.0, 0.015), uv.y);\n  col += smoothstep(0.992, 1.0, hash(floor(gl_FragCoord.xy))) * 0.5;\n\n  // warm flowing curtains — hue runs hot (white/yellow) at the base to red at the tips\n  float lum = curtain * rays;\n  float heat = clamp(0.22 + 1.6 * baseHeat + 0.3 * lum, 0.0, 1.0);\n  col += fire(heat) * lum * intensity * 2.0;\n\n  col *= 1.0 - 0.35 * dot(p, p);                    // vignette -> focal curtains\n  col = col / (1.0 + 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
    }
  }
}