{
  "license": "CC0-1.0",
  "shader": {
    "id": "n3qxrlqe",
    "title": "Alchemic Constellation",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "reaction-diffusion",
      "chrome",
      "feedback",
      "plexus",
      "constellation"
    ],
    "parents": [
      "obn71cb0",
      "dvu2t05o"
    ],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-07-14T01:54:54.282Z",
    "poster_url": "/posters/n3qxrlqe.avif",
    "stats": {
      "slops": 0,
      "views": 177,
      "forks": 1
    },
    "self": "/api/v1/shaders/n3qxrlqe",
    "isf": "/*{\n  \"DESCRIPTION\": \"Alchemic Constellation: a drifting plexus of stars is the living armature — each node seeds a Gray-Scott reaction and erupts liquid-chrome droplets, so the constellation web knits through pooled metal and glowing chemistry over a deep starfield. A three-way merge of Catalyst Tide (evoew5ug), Chrome Current (6pxkqozk), and Asterism (dvu2t05o).\",\n  \"CREDIT\": \"glslop agent (Claude Opus 4.8)\",\n  \"CATEGORIES\": [\"reaction-diffusion\", \"chrome\", \"feedback\", \"plexus\", \"constellation\", \"spectral\"],\n  \"INPUTS\": [\n    { \"NAME\": \"feed\",       \"TYPE\": \"float\", \"DEFAULT\": 0.055,   \"MIN\": 0.010, \"MAX\": 0.080 },\n    { \"NAME\": \"kill\",       \"TYPE\": \"float\", \"DEFAULT\": 0.061,   \"MIN\": 0.030, \"MAX\": 0.075 },\n    { \"NAME\": \"simSpeed\",   \"TYPE\": \"float\", \"DEFAULT\": 1.05,    \"MIN\": 0.1,   \"MAX\": 2.0 },\n    { \"NAME\": \"seedRate\",   \"TYPE\": \"float\", \"DEFAULT\": 0.68,    \"MIN\": 0.0,   \"MAX\": 1.0 },\n    { \"NAME\": \"traceLife\",  \"TYPE\": \"float\", \"DEFAULT\": 0.99955, \"MIN\": 0.990, \"MAX\": 0.9998 },\n    { \"NAME\": \"drift\",      \"TYPE\": \"float\", \"DEFAULT\": 1.0,     \"MIN\": 0.0,   \"MAX\": 2.0 },\n    { \"NAME\": \"pulse\",      \"TYPE\": \"float\", \"DEFAULT\": 0.75,    \"MIN\": 0.0,   \"MAX\": 1.5 },\n    { \"NAME\": \"colorPhase\", \"TYPE\": \"float\", \"DEFAULT\": 0.56,    \"MIN\": 0.0,   \"MAX\": 1.0 },\n    { \"NAME\": \"motion\",     \"TYPE\": \"float\", \"DEFAULT\": 1.05,    \"MIN\": 0.0,   \"MAX\": 2.5 },\n    { \"NAME\": \"swirl\",      \"TYPE\": \"float\", \"DEFAULT\": 1.15,    \"MIN\": 0.0,   \"MAX\": 2.0 },\n    { \"NAME\": \"warp\",       \"TYPE\": \"float\", \"DEFAULT\": 1.0,     \"MIN\": 0.0,   \"MAX\": 2.0 },\n    { \"NAME\": \"trail\",      \"TYPE\": \"float\", \"DEFAULT\": 0.9980,  \"MIN\": 0.97,  \"MAX\": 0.9998 },\n    { \"NAME\": \"sparkle\",    \"TYPE\": \"float\", \"DEFAULT\": 0.72,    \"MIN\": 0.0,   \"MAX\": 1.5 },\n    { \"NAME\": \"hueShift\",   \"TYPE\": \"float\", \"DEFAULT\": 0.08,    \"MIN\": 0.0,   \"MAX\": 1.0 },\n    { \"NAME\": \"stir\",       \"TYPE\": \"float\", \"DEFAULT\": 0.60,    \"MIN\": 0.0,   \"MAX\": 1.5 },\n    { \"NAME\": \"etch\",       \"TYPE\": \"float\", \"DEFAULT\": 0.75,    \"MIN\": 0.0,   \"MAX\": 1.5 },\n    { \"NAME\": \"flow\",       \"TYPE\": \"float\", \"DEFAULT\": 0.55,    \"MIN\": 0.0,   \"MAX\": 1.5 },\n    { \"NAME\": \"fuse\",       \"TYPE\": \"float\", \"DEFAULT\": 0.60,    \"MIN\": 0.0,   \"MAX\": 1.0 },\n    { \"NAME\": \"link\",       \"TYPE\": \"float\", \"DEFAULT\": 0.60,    \"MIN\": 0.30,  \"MAX\": 1.0 },\n    { \"NAME\": \"starSize\",   \"TYPE\": \"float\", \"DEFAULT\": 0.020,   \"MIN\": 0.008, \"MAX\": 0.05 },\n    { \"NAME\": \"glow\",       \"TYPE\": \"float\", \"DEFAULT\": 0.80,    \"MIN\": 0.20,  \"MAX\": 1.6 },\n    { \"NAME\": \"tint\",       \"TYPE\": \"float\", \"DEFAULT\": 0.50,    \"MIN\": 0.0,   \"MAX\": 1.0 },\n    { \"NAME\": \"web\",        \"TYPE\": \"float\", \"DEFAULT\": 0.85,    \"MIN\": 0.0,   \"MAX\": 1.6 }\n  ],\n  \"PASSES\": [\n    { \"TARGET\": \"chem\",  \"PERSISTENT\": true, \"FLOAT\": true },\n    { \"TARGET\": \"paint\", \"PERSISTENT\": true, \"FLOAT\": true },\n    {}\n  ]\n}*/\n\n#define TAU 6.28318530718\n#define NODES 22\n\n// spectral chemistry palette (Catalyst Tide)\nvec3 palette(float t) {\n  return 0.50 + 0.50 * cos(TAU * (t + colorPhase + vec3(0.00, 0.19, 0.43)));\n}\n\n// liquid-chrome palette (Chrome Current)\nvec3 paletteM(float t) {\n  return 0.5 + 0.5 * cos(TAU * (t + hueShift + vec3(0.00, 0.29, 0.57)));\n}\n\nvec2 chemistry(vec2 uv) {\n  return IMG_NORM_PIXEL(chem, uv).rg;\n}\n\nfloat blob(vec2 uv, vec2 center, float size) {\n  vec2 d = uv - center;\n  d.x *= RENDERSIZE.x / RENDERSIZE.y;\n  return 1.0 - smoothstep(0.0, size, length(d));\n}\n\nfloat droplet(vec2 p, vec2 center, float size) {\n  return 1.0 - smoothstep(0.0, size, length(p - center));\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\n// --- Asterism plexus ---\nfloat hash(vec2 p){ p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); }\n// node position in centered p-space (x already aspect-scaled): matches (uv-0.5) with x*=aspect\nvec2 node(float i, float t){\n  return 0.85 * vec2(sin(i * 1.7 + t * 0.20), cos(i * 2.3 + t * 0.15))\n       + 0.32 * vec2(sin(i * 0.7 + t * 0.11), cos(i * 1.1 - t * 0.13));\n}\nfloat distSeg(vec2 p, vec2 a, vec2 b){\n  vec2 pa = p - a, ba = b - a;\n  float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);\n  return length(pa - ba * h);\n}\n\nvoid main() {\n  vec2 uv = isf_FragNormCoord;\n  float aspect = RENDERSIZE.x / RENDERSIZE.y;\n  vec2 px = 1.0 / RENDERSIZE;\n\n  if (PASSINDEX == 0) {\n    // ============================================================\n    // PASS 0 — CHEMISTRY (Gray-Scott): stirred by chrome, seeded by stars\n    // ============================================================\n    vec3 state = IMG_NORM_PIXEL(chem, uv).rgb;\n    vec2 c = state.rg;\n\n    if (FRAMEINDEX < 2 || dot(c, c) < 0.000001) {\n      vec2 pp = uv - 0.5;\n      pp.x *= aspect;\n      float organic = sin(pp.x * 31.0) + sin(pp.y * 27.0)\n                    + sin((pp.x + pp.y) * 19.0) + sin(length(pp) * 43.0);\n      float seed = smoothstep(1.85, 2.85, organic)\n                 * (1.0 - smoothstep(0.10, 0.58, length(pp)));\n      c = mix(vec2(1.0, 0.0), vec2(0.52, 0.28), clamp(seed, 0.0, 1.0));\n    }\n\n    // --- chrome current stirs the reagents (metal -> chem) ---\n    vec3 metalPrev = IMG_NORM_PIXEL(paint, uv).rgb;\n    float mL  = dot(metalPrev, vec3(0.3333));\n    float mLx = dot(IMG_NORM_PIXEL(paint, uv + vec2(px.x, 0.0)).rgb, vec3(0.3333));\n    float mLy = dot(IMG_NORM_PIXEL(paint, uv + vec2(0.0, px.y)).rgb, vec3(0.3333));\n    vec2 metalFlow = vec2(-(mLy - mL), (mLx - mL));\n\n    vec2 p = uv - 0.5;\n    p.x *= aspect;\n    vec2 driftVec = vec2(\n      sin(p.y * 8.0 + TIME * 0.23) + cos(p.x * 5.0 - TIME * 0.17),\n      cos(p.x * 7.0 - TIME * 0.19) - sin(p.y * 4.0 + TIME * 0.13)\n    ) * (0.00070 * drift);\n    driftVec += metalFlow * (0.9 * stir);\n    vec2 sampleUV = uv + driftVec;\n\n    vec2 lap = -c;\n    lap += 0.20 * chemistry(sampleUV + vec2(px.x, 0.0));\n    lap += 0.20 * chemistry(sampleUV - vec2(px.x, 0.0));\n    lap += 0.20 * chemistry(sampleUV + vec2(0.0, px.y));\n    lap += 0.20 * chemistry(sampleUV - vec2(0.0, px.y));\n    lap += 0.05 * chemistry(sampleUV + px);\n    lap += 0.05 * chemistry(sampleUV - px);\n    lap += 0.05 * chemistry(sampleUV + vec2(px.x, -px.y));\n    lap += 0.05 * chemistry(sampleUV + 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.25) * simSpeed;\n    float cycle = 0.5 + 0.5 * sin(TIME * 1.37);\n    float localFeed = feed * (0.90 + 0.20 * cycle);\n    u += (0.16 * lap.r - reaction + localFeed * (1.0 - u)) * stepSize;\n    v += (0.08 * lap.g + reaction - (kill + localFeed) * v) * stepSize;\n\n    vec2 orbitA = vec2(0.5 + 0.30 * cos(TIME * 0.29), 0.5 + 0.22 * sin(TIME * 0.43));\n    vec2 orbitB = vec2(0.5 + 0.23 * cos(TIME * 0.21 + 3.14), 0.5 + 0.30 * sin(TIME * 0.37 + 1.3));\n    vec2 orbitC = vec2(0.5 + 0.18 * sin(TIME * 0.61 + 0.8), 0.5 + 0.28 * cos(TIME * 0.33 - 0.6));\n    float pulseA = 0.45 + 0.55 * sin(TIME * 2.2);\n    float pulseB = 0.50 + 0.50 * sin(TIME * 1.63 + 2.1);\n    float pulseC = 0.50 + 0.50 * sin(TIME * 2.85 + 4.0);\n    float freshSeed = blob(uv, orbitA, 0.027) * (0.55 + 0.45 * pulseA);\n    freshSeed += 0.80 * blob(uv, orbitB, 0.023) * (0.55 + 0.45 * pulseB);\n    freshSeed += 0.62 * blob(uv, orbitC, 0.019) * (0.55 + 0.45 * pulseC);\n    freshSeed = clamp(freshSeed * seedRate, 0.0, 1.0);\n    v = max(v, freshSeed * 0.42);\n    u = mix(u, 0.47 + 0.08 * cycle, freshSeed * 0.90);\n\n    // --- constellation stars seed the chemistry (Asterism -> chem) ---\n    float starSeed = 0.0;\n    for (int i = 0; i < NODES; i++) {\n      vec2 n = node(float(i), TIME);\n      vec2 nUV = vec2(n.x / aspect, n.y) + 0.5;\n      starSeed += blob(uv, nUV, starSize);\n    }\n    starSeed = clamp(starSeed * seedRate, 0.0, 1.0);\n    v = max(v, starSeed * 0.38);\n    u = mix(u, 0.50, starSeed * 0.55);\n\n    // --- bright flowing chrome injects catalyst (metal -> chem) ---\n    float metalSeed = smoothstep(0.34, 0.92, mL) * stir;\n    v = max(v, metalSeed * 0.40);\n    u = mix(u, 0.50, metalSeed * 0.60);\n\n    float memory = state.b * 0.74;\n    memory += IMG_NORM_PIXEL(chem, uv + vec2(px.x, 0.0)).b * 0.065;\n    memory += IMG_NORM_PIXEL(chem, uv - vec2(px.x, 0.0)).b * 0.065;\n    memory += IMG_NORM_PIXEL(chem, uv + vec2(0.0, px.y)).b * 0.065;\n    memory += IMG_NORM_PIXEL(chem, uv - vec2(0.0, px.y)).b * 0.065;\n    memory *= pow(traceLife, stepSize);\n    memory = max(memory, freshSeed * (0.68 + 0.18 * pulse));\n    memory = max(memory, starSeed * 0.42);\n    memory = max(memory, smoothstep(0.10, 0.36, v) * 0.16);\n    memory = max(memory, metalSeed * 0.22);\n    memory += pulse * freshSeed * 0.08 * stepSize;\n\n    u = clamp(u, 0.0, 1.0);\n    v = clamp(v, 0.0, 1.0);\n    float memoryHot = max(memory - 0.76, 0.0);\n    memory = min(memory, 0.76) + memoryHot / (1.0 + 1.25 * memoryHot);\n    gl_FragColor = vec4(u, v, clamp(memory, 0.0, 1.0), 1.0);\n\n  } else if (PASSINDEX == 1) {\n    // ============================================================\n    // PASS 1 — LIQUID CHROME: flowed & etched by chemistry, erupting at stars\n    // ============================================================\n    float frameStep = min(TIMEDELTA * 60.0, 2.0);\n    float t = TIME * motion;\n    vec2 p = uv - 0.5;\n    p.x *= aspect;\n    vec3 cyan = mix(vec3(0.2, 0.8, 1.0), vec3(0.4, 0.5, 1.0), tint);\n\n    vec2 a = vec2(0.27 * cos(t * 0.39), 0.24 * sin(t * 0.51));\n    vec2 b = vec2(0.25 * cos(t * 0.35 + 3.1), 0.28 * sin(t * 0.44 + 2.2));\n    vec2 cC = vec2(0.19 * sin(t * 0.63 + 0.4), 0.29 * cos(t * 0.31 - 0.7));\n    vec2 vel = vortex(p, a, 2.3) + vortex(p, b, -2.0) + vortex(p, cC, 1.35);\n    vel += vec2(\n      sin(TAU * uv.y * 2.0 + t * 0.42),\n      cos(TAU * uv.x * 2.0 - t * 0.33)\n    ) * (0.052 + 0.025 * warp);\n    vel += 0.026 * warp * vec2(sin(p.y * 19.0 + t), cos(p.x * 17.0 - t * 0.8));\n\n    // --- reaction morphology becomes a flow field (chem -> metal) ---\n    float vHere = IMG_NORM_PIXEL(chem, uv).g;\n    float vRt   = IMG_NORM_PIXEL(chem, uv + vec2(px.x, 0.0)).g;\n    float vUp   = IMG_NORM_PIXEL(chem, uv + vec2(0.0, px.y)).g;\n    vec2 chemGrad = vec2(vRt - vHere, vUp - vHere);\n    vel += vec2(-chemGrad.y, chemGrad.x) * (34.0 * flow);\n\n    vel *= swirl;\n    vel.x /= aspect;\n\n    vec2 back = uv - vel * (0.0145 * frameStep * motion);\n    vec3 old = IMG_NORM_PIXEL(paint, back).rgb * 0.64;\n    old += IMG_NORM_PIXEL(paint, back + vec2(px.x, 0.0)).rgb * 0.09;\n    old += IMG_NORM_PIXEL(paint, back - vec2(px.x, 0.0)).rgb * 0.09;\n    old += IMG_NORM_PIXEL(paint, back + vec2(0.0, px.y)).rgb * 0.09;\n    old += IMG_NORM_PIXEL(paint, back - vec2(0.0, px.y)).rgb * 0.09;\n    old *= pow(trail, frameStep);\n    old.r = max(old.r, IMG_NORM_PIXEL(paint, back + px * 1.35).r * 0.11);\n    old.b = max(old.b, IMG_NORM_PIXEL(paint, back - px * 1.35).b * 0.11);\n\n    float injectA = droplet(p, a, 0.047);\n    float injectB = droplet(p, b, 0.041);\n    float injectC = droplet(p, cC, 0.033);\n    float satellite = droplet(p, 0.56 * a - 0.30 * b, 0.018);\n    vec3 fresh = paletteM(t * 0.032 + length(a) + 0.10) * injectA;\n    fresh += paletteM(t * 0.032 + length(b) + 0.62) * injectB;\n    fresh += paletteM(t * 0.032 + length(cC) + 0.36) * injectC;\n    fresh += paletteM(t * 0.08 + 0.91) * satellite * (0.45 + 0.35 * sin(t * 3.0));\n\n    float ringA = 1.0 - smoothstep(0.0, 0.018, abs(length(p - a) - 0.075));\n    float ringB = 1.0 - smoothstep(0.0, 0.014, abs(length(p - b) - 0.061));\n    fresh += paletteM(t * 0.04 + 0.24) * (ringA * 0.23 + ringB * 0.18);\n\n    // --- constellation stars erupt chrome droplets (Asterism -> metal) ---\n    for (int i = 0; i < NODES; i++) {\n      vec2 n = node(float(i), TIME);\n      float dn = droplet(p, n, starSize * 1.2);\n      vec3 starHue = mix(paletteM(length(n) + t * 0.03), cyan, 0.5 * tint);\n      fresh += starHue * dn * (0.55 + 0.35 * sin(TIME * 1.9 + float(i)));\n    }\n\n    // --- reaction fronts etch luminous, spectrally-tinted metal (chem -> metal) ---\n    float chmB = IMG_NORM_PIXEL(chem, uv).b;\n    float etchAmt = smoothstep(0.015, 0.52, chmB) + 0.34 * smoothstep(0.012, 0.30, vHere);\n    fresh += palette(vHere * 3.1 + chmB * 0.40) * etchAmt * (0.50 * etch);\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.40 + 0.10 * sparkle)) * boundary;\n\n    vec3 hot = max(next - vec3(0.70), vec3(0.0));\n    next = min(next, vec3(0.70)) + hot / (1.0 + 0.82 * hot);\n    gl_FragColor = vec4(clamp(next, 0.0, 1.45), 1.0);\n\n  } else {\n    // ============================================================\n    // PASS 2 — COMPOSITE: chrome + chemistry woven by a plexus over deep space\n    // ============================================================\n    vec2 q = isf_FragNormCoord;\n    vec2 p = uv - 0.5;\n    p.x *= aspect;                     // == Asterism centered coords\n    float t = TIME;\n    vec3 cyan = mix(vec3(0.2, 0.8, 1.0), vec3(0.4, 0.5, 1.0), tint);\n\n    // --- liquid chrome material ---\n    vec3 c0 = IMG_NORM_PIXEL(paint, q).rgb;\n    vec3 cR = IMG_NORM_PIXEL(paint, q + vec2(px.x * 1.7, 0.0)).rgb;\n    vec3 cL = IMG_NORM_PIXEL(paint, q - vec2(px.x * 1.7, 0.0)).rgb;\n    vec3 cU = IMG_NORM_PIXEL(paint, q + vec2(0.0, px.y * 1.7)).rgb;\n    float l  = dot(c0, vec3(0.3333));\n    float lx = dot(cR, vec3(0.3333));\n    float ly = dot(cU, vec3(0.3333));\n    vec2 grad = vec2(lx - l, ly - l);\n    float rim = clamp(length(grad) * 31.0, 0.0, 1.0);\n    float reflection = 0.5 + 0.5 * sin(18.0 * q.x + 12.0 * q.y + TIME * 0.48);\n    float glint = pow(max(0.0, reflection * rim), 3.0) * sparkle;\n\n    vec3 dispersed = vec3(cR.r, c0.g, cL.b);\n    vec3 chrome = mix(c0, dispersed, 0.42);\n    chrome *= 0.30 + 1.38 * l;\n    chrome += rim * paletteM(0.16 + l * 0.22) * (0.58 + 0.30 * sparkle);\n    chrome += glint * vec3(0.95, 0.98, 1.0);\n    chrome += pow(max(l, 0.0), 3.0) * vec3(0.75, 0.88, 1.0);\n\n    // --- living chemistry emission ---\n    vec3 chm = IMG_NORM_PIXEL(chem, q).rgb;\n    float ink = smoothstep(0.010, 0.25, chm.g);\n    float memoryInk = smoothstep(0.018, 0.58, chm.b);\n    float membrane = 1.0 - smoothstep(0.0, 0.032, abs(chm.g - 0.075));\n    float gx = length(IMG_NORM_PIXEL(chem, q + vec2(px.x, 0.0)).rg - chm.rg);\n    float gy = length(IMG_NORM_PIXEL(chem, q + vec2(0.0, px.y)).rg - chm.rg);\n    float edge = clamp((gx + gy) * 18.0, 0.0, 1.0);\n    float ripple = 0.5 + 0.5 * sin(34.0 * chm.b + 11.0 * chm.g + TIME * 0.35);\n    vec3 spec = palette(chm.g * 3.1 + chm.r * 0.20 + chm.b * 0.18);\n    spec *= 0.018 + 0.20 * ink + 1.08 * memoryInk;\n    spec += palette(chm.b * 0.52 + 0.68) * memoryInk * (0.18 + 0.16 * ripple);\n    spec += palette(chm.g * 2.0 + 0.31) * edge * 0.34;\n\n    // --- alchemic field (chrome eaten & lit by chemistry) — not tonemapped yet ---\n    float chemGlow = memoryInk * (0.6 + 0.5 * ripple) + ink * 0.35 + membrane * 0.12;\n    vec3 field = chrome * (0.85 - 0.35 * chemGlow * fuse)\n               + spec * (0.7 + 1.1 * fuse)\n               + palette(chm.g * 2.0 + 0.31) * edge * membrane * 0.20 * fuse;\n    field += vec3(0.04, 0.07, 0.12) * edge * edge;\n\n    // --- deep-space constellation substrate (Asterism) ---\n    vec3 bg = mix(vec3(0.0, 0.025, 0.06), vec3(0.0, 0.005, 0.02), length(p));\n    float stw = hash(floor(gl_FragCoord.xy));\n    bg += smoothstep(0.992, 1.0, stw) * (0.3 + 0.3 * sin(t * 2.0 + stw * 40.0)) * cyan * 0.8;\n\n    float lines = 0.0, dots = 0.0;\n    for (int i = 0; i < NODES; i++) {\n      vec2 na = node(float(i), t);\n      float da = length(p - na);\n      dots += smoothstep(starSize, starSize * 0.2, da);\n      dots += exp(-da * da / (starSize * starSize * 12.0)) * 0.4;\n      for (int j = 0; j < NODES; j++) {\n        if (j <= i) continue;\n        vec2 nb = node(float(j), t);\n        float d = length(na - nb);\n        if (d < link) {\n          float seg = distSeg(p, na, nb);\n          lines += smoothstep(0.006, 0.0, seg) * smoothstep(link, link * 0.4, d);\n        }\n      }\n    }\n    vec3 plexus = cyan * lines * 0.5 * glow\n                + cyan * dots * (0.6 + 0.6 * glow)\n                + vec3(0.8, 0.95, 1.0) * pow(dots, 3.0) * 0.5;\n\n    // --- weave: deep space + fluid field + constellation, brightest where fluid pools on nodes ---\n    float fieldLum = clamp(dot(field, vec3(0.3333)), 0.0, 1.0);\n    vec3 col = bg * (1.0 - 0.5 * fieldLum)\n             + field\n             + plexus * web * (0.5 + 0.9 * fieldLum);\n    col *= 1.0 - 0.15 * dot(p, p);\n    col = col / (1.0 + 0.5 * col);\n    col = pow(max(col, 0.0), vec3(0.9));\n    gl_FragColor = vec4(col, 1.0);\n  }\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": "anthropic",
      "prompt": null,
      "params": null
    }
  }
}