{
  "license": "CC0-1.0",
  "shader": {
    "id": "ay8z9jlq",
    "title": "Organ",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "render_hash": "00007c7e3e281800",
    "tags": [
      "generative",
      "simulation",
      "organic",
      "csg",
      "subsurface",
      "vasculature",
      "3d"
    ],
    "parents": [
      "y2o38gx3"
    ],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-08-23T18:58:49.374Z",
    "poster_url": "/posters/ay8z9jlq.avif",
    "stats": {
      "slops": 0,
      "views": 116,
      "forks": 0
    },
    "self": "/api/v1/shaders/ay8z9jlq",
    "isf": "/*{\n  \"DESCRIPTION\": \"Organ: a beating, three-lobed body of translucent flesh, lit from the inside by the vasculature growing through it. The shape is constructive solid geometry on spheres - three lobes fused with a smooth union and two spherical bites scooped out of the result - and turgor separates the lobes, so the silhouette runs from one round blob to a distinctly three-chambered mass. Three colonies drain the shell through a flow-accumulation network, and the light they make has to travel back out through skin: the vessels are read where the refracted ray reaches them rather than at the surface, so the network sits under the skin with real parallax, and the path through that layer goes as one over the cosine, so the limb is a warm scattered wash and a deep trunk arrives as dull red. A systolic front leaves each nucleus once a beat and runs out along the tree, dilating the vessels it passes and raising them out of the skin, while a chamber contracts on the same beat. Territory is a partition of the surface between three drifting nuclei, each carrying a vigour that tracks its share of the nutrients currently on the body. Forked from Vein Atlas.\",\n  \"CATEGORIES\": [\"generative\", \"simulation\", \"organic\"],\n  \"INPUTS\": [\n    { \"NAME\": \"tempo\", \"TYPE\": \"float\", \"DEFAULT\": 1.00, \"MIN\": 0.15, \"MAX\": 3.0 },\n    { \"NAME\": \"density\", \"TYPE\": \"float\", \"DEFAULT\": 0.72, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"wither\", \"TYPE\": \"float\", \"DEFAULT\": 1.20, \"MIN\": 0.05, \"MAX\": 2.0 },\n    { \"NAME\": \"nutrition\", \"TYPE\": \"float\", \"DEFAULT\": 1.00, \"MIN\": 0.0, \"MAX\": 2.5 },\n    { \"NAME\": \"meander\", \"TYPE\": \"float\", \"DEFAULT\": 0.62, \"MIN\": 0.0, \"MAX\": 2.4 },\n    { \"NAME\": \"swirl\", \"TYPE\": \"float\", \"DEFAULT\": 1.25, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"fibrosis\", \"TYPE\": \"float\", \"DEFAULT\": 0.45, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"turgor\", \"TYPE\": \"float\", \"DEFAULT\": 0.55, \"MIN\": 0.0, \"MAX\": 0.9 },\n    { \"NAME\": \"breath\", \"TYPE\": \"float\", \"DEFAULT\": 0.70, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"emissive\", \"TYPE\": \"float\", \"DEFAULT\": 1.00, \"MIN\": 0.0, \"MAX\": 2.5 },\n    { \"NAME\": \"pulse\", \"TYPE\": \"float\", \"DEFAULT\": 0.75, \"MIN\": 0.0, \"MAX\": 1.5 },\n    { \"NAME\": \"translucency\", \"TYPE\": \"float\", \"DEFAULT\": 0.85, \"MIN\": 0.10, \"MAX\": 2.2 },\n    { \"NAME\": \"flesh\", \"TYPE\": \"float\", \"DEFAULT\": 0.70, \"MIN\": 0.0, \"MAX\": 1.4 },\n    { \"NAME\": \"bloom\", \"TYPE\": \"float\", \"DEFAULT\": 0.95, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"seed\", \"TYPE\": \"float\", \"DEFAULT\": 7.0, \"MIN\": 0.0, \"MAX\": 30.0 }\n  ],\n  \"PASSES\": [\n    { \"TARGET\": \"acc1\", \"FLOAT\": true },\n    { \"TARGET\": \"acc\", \"PERSISTENT\": true, \"FLOAT\": true },\n    { \"TARGET\": \"net\", \"PERSISTENT\": true, \"FLOAT\": true },\n    { \"TARGET\": \"mem\", \"PERSISTENT\": true, \"FLOAT\": true },\n    { \"TARGET\": \"glow\", \"PERSISTENT\": true, \"FLOAT\": true },\n    { \"TARGET\": \"scene\", \"FLOAT\": true },\n    {}\n  ]\n}*/\n\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#endif\n\n#define PI  3.14159265359\n#define TAU 6.28318530718\n\n#define COLONIES 3\n#define NUTS 9\n\n#define CLOCK_UNIT 8.0\n#define CLOCK_WRAP 1024.0\n\n#define BODY_R 0.60\n\n#define RBOUND 1.17\n\n#define PROGRESS_W 0.28\n\n#define JITTER 0.55\n\n#define SKIN_H 0.052\n#define SKIN_IOR 1.42\n\n#define NUT_R 0.20\n#define WARM_BOOST 16.0\n#define WARM_RATE 0.25\n\nfloat hash11(float p){ return fract(sin(p*127.1 + seed*19.73)*43758.5453); }\nfloat hash12(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7)) + seed*3.17)*43758.5453); }\nfloat hash13(vec3 p){ return fract(sin(dot(p, vec3(127.1, 311.7, 74.7)) + seed*3.17)*43758.5453); }\n\nfloat vnoise3(vec3 p){\n  vec3 i = floor(p), f = fract(p);\n  f = f*f*(3.0 - 2.0*f);\n  float a = hash13(i + vec3(0.0, 0.0, 0.0));\n  float b = hash13(i + vec3(1.0, 0.0, 0.0));\n  float c = hash13(i + vec3(0.0, 1.0, 0.0));\n  float d = hash13(i + vec3(1.0, 1.0, 0.0));\n  float e = hash13(i + vec3(0.0, 0.0, 1.0));\n  float g = hash13(i + vec3(1.0, 0.0, 1.0));\n  float h = hash13(i + vec3(0.0, 1.0, 1.0));\n  float k = hash13(i + vec3(1.0, 1.0, 1.0));\n  return mix(mix(mix(a, b, f.x), mix(c, d, f.x), f.y),\n             mix(mix(e, g, f.x), mix(h, k, f.x), f.y), f.z);\n}\n\n#define ASPECT 3.0\nfloat simEdge(){\n  float w = min(576.0, floor(RENDERSIZE.x) - 2.0);\n  float h = min(192.0, floor(RENDERSIZE.y) - 2.0);\n  return floor(min(w, h*ASPECT));\n}\nfloat simRows(float N){ return floor(N/ASPECT); }\nvec2 simGrid(float N){ return vec2(N, simRows(N)); }\n\nvec4 fetchTexel(sampler2D tex, vec2 texel){\n  return texture2D(tex, (texel + 0.5)/RENDERSIZE);\n}\n\nvec3 uvToDir(vec2 uv){\n  float phi = (uv.x - 0.5)*TAU;\n  float sy = clamp(uv.y*2.0 - 1.0, -1.0, 1.0);\n  float cy = sqrt(max(1.0 - sy*sy, 0.0));\n  return vec3(cy*cos(phi), sy, cy*sin(phi));\n}\n\nvec2 dirToUV(vec3 d){\n  return vec2(atan(d.z, d.x)/TAU + 0.5, d.y*0.5 + 0.5);\n}\n\nvec4 shellFetch(sampler2D tex, vec2 texel, float N){\n  return fetchTexel(tex, vec2(mod(texel.x, N), clamp(texel.y, 0.0, simRows(N) - 1.0)));\n}\n\nvec4 shellBilerp(sampler2D tex, vec2 grid, float N){\n  vec2 g = grid - 0.5;\n  vec2 i = floor(g);\n  vec2 f = g - i;\n  vec4 a = shellFetch(tex, i, N);\n  vec4 b = shellFetch(tex, i + vec2(1.0, 0.0), N);\n  vec4 c = shellFetch(tex, i + vec2(0.0, 1.0), N);\n  vec4 d = shellFetch(tex, i + vec2(1.0, 1.0), N);\n  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nvec2 dirVec(float d){\n  if(d < 0.5) return vec2( 1.0,  0.0);\n  if(d < 1.5) return vec2( 1.0,  1.0);\n  if(d < 2.5) return vec2( 0.0,  1.0);\n  if(d < 3.5) return vec2(-1.0,  1.0);\n  if(d < 4.5) return vec2(-1.0,  0.0);\n  if(d < 5.5) return vec2(-1.0, -1.0);\n  if(d < 6.5) return vec2( 0.0, -1.0);\n  return vec2( 1.0, -1.0);\n}\n\nfloat packDirs(float a, float b){ return a + 9.0*b; }\nfloat unpackDir(float p, int c){\n  if(c == 0) return mod(p, 9.0);\n  return floor(p/9.0);\n}\n\nfloat polarMask(float sy){ return 1.0 - smoothstep(0.600, 0.780, abs(sy)); }\n\nvec4 clockCell(){ return fetchTexel(net, vec2(0.0, simRows(simEdge()))); }\n\nvec4 vigourCell(){ return fetchTexel(net, vec2(1.0, simRows(simEdge()))); }\n\nvec3 colonyVigour(){\n  vec4 v = vigourCell();\n  if(v.a < 0.5) return vec3(1.0);\n  return clamp(v.rgb, 0.35, 2.6);\n}\n\nfloat simClock(){\n  vec4 c = clockCell();\n  return (c.g + c.r)*CLOCK_UNIT;\n}\n\nfloat simDelta(){\n  vec4 c = clockCell();\n  float dtr = clamp(TIMEDELTA, 0.0, 1.0/24.0);\n  return dtr*(1.0 + WARM_BOOST*c.a)*tempo;\n}\n\nfloat terrain3(vec3 d, float t){\n  float s = 0.0, amp = 0.5, f = 2.00;\n  vec3 dr = vec3(0.013, -0.009, 0.006);\n  for(int o = 0; o < 3; o++){\n    s += amp*vnoise3(d*f + dr*t*f);\n    f *= 2.05;\n    amp *= 0.44;\n    dr = vec3(-dr.y, dr.z, dr.x)*1.31;\n  }\n  return s;\n}\n\nfloat swirlPot(vec3 d, float t){\n  vec3 dr = vec3(0.0, t*0.008, t*0.005);\n\n  return vnoise3(d*2.40 + dr) + 0.5*vnoise3(d*5.40 + dr*1.7)\n       + 0.55*vnoise3(d*30.0 + dr*2.3);\n}\n\nvec3 curlTangent(vec3 d, float t){\n\n  float e = 0.006;\n  float p0 = swirlPot(d, t);\n  vec3 g = vec3(swirlPot(d + vec3(e, 0.0, 0.0), t),\n                swirlPot(d + vec3(0.0, e, 0.0), t),\n                swirlPot(d + vec3(0.0, 0.0, e), t)) - vec3(p0);\n  g -= d*dot(g, d);\n  vec3 c = cross(d, g);\n  return c/max(length(c), 1e-6);\n}\n\nvec2 warpUV(vec2 uv, float N){\n  vec3 d = uvToDir(uv);\n  vec2 a = vec2(vnoise3(d*3.80 + 3.1) - 0.5, vnoise3(d*3.80 + 19.7) - 0.5);\n  vec2 b = vec2(vnoise3(d*8.50 + 7.7) - 0.5, vnoise3(d*8.50 + 31.3) - 0.5);\n\n  vec2 c = vec2(vnoise3(d*17.0 + 5.3) - 0.5, vnoise3(d*17.0 + 41.9) - 0.5);\n\n  return uv + (a*1.40 + b*0.50 + c*0.42)/simGrid(N);\n}\n\nvec3 heartDir(int c, float t){\n  float fc = float(c);\n  float a = TAU*fc/3.0 + t*0.019 + hash11(3.0)*TAU;\n  float lat = (hash11(fc*5.1 + 1.0) - 0.5)*1.05;\n  vec3 d = vec3(cos(lat)*cos(a), sin(lat), cos(lat)*sin(a));\n\n  d += vec3(vnoise3(vec3(t*0.021, fc*7.3 + 2.0, 3.0)) - 0.5,\n            vnoise3(vec3(fc*3.1 + 5.0, t*0.021 + 11.0, 8.0)) - 0.5,\n            vnoise3(vec3(fc*1.7 + 9.0, 5.0, t*0.021 + 2.0)) - 0.5)*0.55;\n  return normalize(d);\n}\n\nvec3 heartCore(int c, float t){ return heartDir(c, t)*BODY_R*0.30; }\n\nvec4 nutrient(int k, float t){\n  float fk = float(k);\n  float period = 24.0 + 14.0*hash11(fk*3.7 + 2.0);\n  float u = (t + hash11(fk*9.1 + 5.0)*period)/period;\n  float e = mod(floor(u), 64.0);\n  float ph = fract(u);\n  float a = hash11(e*13.1 + fk*57.3)*TAU;\n  float sy = hash11(e*29.7 + fk*17.9)*1.70 - 0.85;\n  float cy = sqrt(max(1.0 - sy*sy, 0.0));\n  float amt = smoothstep(0.0, 0.13, ph)*(1.0 - smoothstep(0.52, 0.98, ph));\n  return vec4(cy*cos(a), sy, cy*sin(a), amt);\n}\n\nfloat nutCellRate(float N){\n  float cellChord = TAU/N;\n  float rCells = NUT_R/cellChord;\n  return 0.32/(PI*rCells*rCells);\n}\n\nvec4 heartShare(vec3 d, float t, vec3 vig){\n  vec3 s = pow(max(vig, vec3(0.05)), vec3(0.45));\n  vec3 dd;\n  dd.x = length(d - heartDir(0, t))/s.x;\n  dd.y = length(d - heartDir(1, t))/s.y;\n  dd.z = length(d - heartDir(2, t))/s.z;\n  float m = min(dd.x, min(dd.y, dd.z));\n\n  vec3 e = exp(-(dd - vec3(m))*22.0);\n  return vec4(e/max(e.x + e.y + e.z, 1e-5), m);\n}\n\n#define BEAT_RATE 0.62\n#define BEAT_LAG  0.44\n\nfloat beatPhase(float t){ return t*BEAT_RATE; }\n\nfloat beatEnv(float ph){\n  ph = fract(ph);\n  float lub = exp(-ph*ph*140.0);\n  float d = ph - 0.165;\n  float dub = exp(-d*d*330.0)*0.58;\n\n  float w = 1.0 - ph;\n  lub += exp(-w*w*140.0);\n\n  float tail = 0.34*exp(-ph*3.0);\n  return lub + dub + tail;\n}\n\nvec3 colonyColour(int c){\n  if(c == 0) return vec3(1.00, 0.30, 0.155);\n  if(c == 1) return vec3(0.24, 1.00, 0.60);\n  return vec3(0.50, 0.34, 1.00);\n}\n\nvoid mainAcc1(){\n  float N = simEdge();\n  vec2 tx = floor(gl_FragCoord.xy);\n  if(tx.x >= N || tx.y >= simRows(N)){ gl_FragColor = vec4(0.0); return; }\n\n  float t = simClock();\n  vec2 uv = (tx + 0.5)/simGrid(N);\n  vec3 d = uvToDir(uv);\n  float T = terrain3(d, t);\n\n  float A = 0.0;\n  for(int k = 0; k < NUTS; k++){\n    vec4 nk = nutrient(k, t);\n    float ch = length(d - nk.xyz);\n    A += nk.w*exp(-ch*ch/(NUT_R*NUT_R));\n  }\n\n  vec3 cT = curlTangent(d, t);\n  vec3 h0 = heartDir(0, t), h1 = heartDir(1, t), h2 = heartDir(2, t);\n  vec3 dSelf = vec3(length(d - h0), length(d - h1), length(d - h2));\n\n  vec3 best = vec3(-1e9);\n  float d0 = 8.0, d1 = 8.0, d2 = 8.0;\n\n  for(int k = 0; k < 8; k++){\n    float fk = float(k);\n    vec2 off = dirVec(fk);\n    float ny = tx.y + off.y;\n    if(ny >= 0.0 && ny < simRows(N)){\n      float nxx = mod(tx.x + off.x, N);\n      vec2 nuv = (vec2(nxx, ny) + 0.5)/simGrid(N);\n      vec3 ndir = uvToDir(nuv);\n      float nT = terrain3(ndir, t);\n      vec4 nn = shellFetch(net, vec2(nxx, ny), N);\n\n      vec3 stepV = ndir - d;\n      float stepW = max(length(stepV), 1e-5);\n\n      float bias = meander*2.76*(T - nT)/stepW\n                 - fibrosis*0.35*nn.a\n                 + swirl*3.60*dot(stepV/stepW, cT)\n                 + JITTER*(hash12(tx*3.1 + off*17.3) - 0.5);\n\n      vec3 prog = (dSelf - vec3(length(ndir - h0), length(ndir - h1), length(ndir - h2)))/stepW;\n\n      if(prog.x > 0.0){ float s = PROGRESS_W*prog.x + bias + 1.32*nn.r;\n                        if(s > best.x){ best.x = s; d0 = fk; } }\n      if(prog.y > 0.0){ float s = PROGRESS_W*prog.y + bias + 1.32*nn.g;\n                        if(s > best.y){ best.y = s; d1 = fk; } }\n      if(prog.z > 0.0){ float s = PROGRESS_W*prog.z + bias + 1.32*nn.b;\n                        if(s > best.z){ best.z = s; d2 = fk; } }\n    }\n  }\n\n  gl_FragColor = vec4(packDirs(d0, d1), d2, T, A);\n}\n\nvoid mainAcc(){\n  float N = simEdge();\n  vec2 tx = floor(gl_FragCoord.xy);\n  if(tx.x >= N || tx.y >= simRows(N)){ gl_FragColor = vec4(0.0); return; }\n\n  float t = simClock();\n  vec2 uv = (tx + 0.5)/simGrid(N);\n  vec3 d = uvToDir(uv);\n  float mask = polarMask(d.y);\n\n  vec3 vig = colonyVigour();\n  vec4 hsw = heartShare(d, t, vig);\n  vec3 share = hsw.xyz;\n\n  float reach = exp(-hsw.w*1.15);\n  vec3 rain = share*(2.6/(N*simRows(N)))*mask*(0.10 + 0.90*reach);\n\n  float nrate = nutCellRate(N);\n  for(int k = 0; k < NUTS; k++){\n    vec4 nk = nutrient(k, t);\n    float ch = length(d - nk.xyz);\n    float blob = nk.w*exp(-ch*ch/(NUT_R*NUT_R));\n    if(blob > 0.001){\n      vec4 nd = shellBilerp(net, dirToUV(nk.xyz)*simGrid(N), N);\n      vec3 hs = heartShare(nk.xyz, t, vig).xyz;\n\n      vec3 claim = hs*(0.35 + 2.4*vec3(nd.r, nd.g, nd.b));\n      claim /= max(claim.x + claim.y + claim.z, 1e-5);\n      rain += claim*blob*nutrition*nrate*mask;\n    }\n  }\n\n  vec3 R = rain;\n  for(int k = 0; k < 8; k++){\n    vec2 off = dirVec(float(k));\n    float ny = tx.y + off.y;\n    if(ny >= 0.0 && ny < simRows(N)){\n      float nxx = mod(tx.x + off.x, N);\n      vec4 a1 = shellFetch(acc1, vec2(nxx, ny), N);\n      vec4 rn = shellFetch(acc, vec2(nxx, ny), N);\n      for(int c = 0; c < COLONIES; c++){\n        float dd = c == 2 ? a1.g : unpackDir(a1.r, c);\n        if(dd < 7.5){\n          vec2 flow = dirVec(dd) + off;\n          if(dot(flow, flow) < 0.1){\n            if(c == 0) R.x += rn.x;\n            else if(c == 1) R.y += rn.y;\n            else R.z += rn.z;\n          }\n        }\n      }\n    }\n  }\n\n  gl_FragColor = vec4(min(R, vec3(8.0)), 1.0);\n}\n\nvoid mainNet(){\n  float N = simEdge();\n  vec2 tx = floor(gl_FragCoord.xy);\n\n  if(tx.x == 0.0 && tx.y == simRows(N)){\n    vec4 c = fetchTexel(net, vec2(0.0, simRows(N)));\n    if(c.b < 0.5){\n      gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);\n      return;\n    }\n    float dtr = clamp(TIMEDELTA, 0.0, 1.0/24.0);\n    float dts = dtr*(1.0 + WARM_BOOST*c.a)*tempo;\n    float frac = c.r + dts/CLOCK_UNIT;\n    float epoch = c.g + floor(frac);\n    gl_FragColor = vec4(fract(frac), mod(epoch, CLOCK_WRAP), 1.0, c.a*exp(-dts*WARM_RATE));\n    return;\n  }\n\n  if(tx.x == 1.0 && tx.y == simRows(N)){\n    vec4 v = fetchTexel(net, vec2(1.0, simRows(N)));\n    vec4 c0 = clockCell();\n    if(c0.b < 0.5 || v.a < 0.5){\n      gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n      return;\n    }\n    float t = simClock();\n    float dts = simDelta();\n    vec3 vig = clamp(v.rgb, 0.35, 2.6);\n\n    vec3 harvest = vec3(0.0);\n    for(int k = 0; k < NUTS; k++){\n      vec4 nk = nutrient(k, t);\n      if(nk.w > 0.02){\n        vec4 nd = shellBilerp(net, dirToUV(nk.xyz)*simGrid(N), N);\n\n        vec4 hs = heartShare(nk.xyz, t, vec3(1.0));\n        vec3 claim = hs.xyz*(0.45 + 1.2*vec3(nd.r, nd.g, nd.b));\n        claim /= max(claim.x + claim.y + claim.z, 1e-5);\n        harvest += claim*nk.w;\n      }\n    }\n\n    float tot = harvest.x + harvest.y + harvest.z;\n    vec3 frac2 = tot > 1e-4 ? harvest/tot : vec3(1.0/3.0);\n    vec3 targetV = vec3(1.0) + (frac2 - vec3(1.0/3.0))*1.55*nutrition;\n    vig += (targetV - vig)*(1.0 - exp(-dts*0.22));\n    gl_FragColor = vec4(clamp(vig, 0.35, 2.6), 1.0);\n    return;\n  }\n  if(tx.x >= N || tx.y >= simRows(N)){ gl_FragColor = vec4(0.0); return; }\n\n  vec4 c = clockCell();\n  vec2 uv = (tx + 0.5)/simGrid(N);\n  vec3 d = uvToDir(uv);\n  float t = simClock();\n  float dts = simDelta();\n  float mask = polarMask(d.y);\n\n  vec4 me = fetchTexel(net, tx);\n  vec3 D = vec3(me.r, me.g, me.b);\n  float scarTissue = me.a;\n\n  if(c.b < 0.5){\n\n    gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n    return;\n  }\n\n  vec3 R = fetchTexel(acc, tx).rgb;\n\n  vec3 q = vec3(2.40)*pow(max(R, vec3(0.0)) + 1e-6, vec3(0.385));\n\n  float cut = mix(0.55, 0.12, clamp(density, 0.0, 1.0));\n  vec3 target = smoothstep(vec3(cut), vec3(cut*1.55 + 0.05), q);\n  target *= mask;\n\n  float outletR = 3.2*TAU/N;\n  for(int k = 0; k < COLONIES; k++){\n    float dh = length(d - heartDir(k, t));\n\n    float blob = exp(-dh*dh/(outletR*outletR))*mask;\n    if(k == 0) target.x = max(target.x, blob*0.95);\n    else if(k == 1) target.y = max(target.y, blob*0.95);\n    else target.z = max(target.z, blob*0.95);\n  }\n\n  float up = 2.40;\n  vec3 rate3 = vec3(\n    target.x > D.x ? up : up*clamp(wither, 0.02, 2.0)/1.20,\n    target.y > D.y ? up : up*clamp(wither, 0.02, 2.0)/1.20,\n    target.z > D.z ? up : up*clamp(wither, 0.02, 2.0)/1.20);\n  D += (target - D)*(vec3(1.0) - exp(-rate3*dts));\n\n  float activity = max(D.x, max(D.y, D.z));\n  float open = smoothstep(0.04, 0.42, activity);\n\n  float ct = (1.0 - open)*clamp(fibrosis*0.72, 0.0, 1.15);\n  scarTissue += (ct - scarTissue)*(1.0 - exp(-(0.30 + open*1.6)*dts));\n\n  gl_FragColor = vec4(clamp(D, 0.0, 1.0), clamp(scarTissue, 0.0, 1.0));\n}\n\nvoid mainMem(){\n  float N = simEdge();\n  vec2 tx = floor(gl_FragCoord.xy);\n  if(tx.x >= N || tx.y >= simRows(N)){ gl_FragColor = vec4(0.0); return; }\n\n  float dts = simDelta();\n  vec2 uv = (tx + 0.5)/simGrid(N);\n  vec2 gq = warpUV(uv, N)*simGrid(N);\n  vec4 me = fetchTexel(mem, tx);\n  vec4 nt = shellBilerp(net, gq, N);\n\n  vec3 scar = me.rgb;\n  scar += (clamp(nt.rgb*1.25, 0.0, 1.0) - scar)*(1.0 - exp(-0.55*dts));\n  scar *= exp(-0.0090*dts);\n\n  float dcut = mix(0.55, 0.12, clamp(density, 0.0, 1.0));\n  float depth = 0.0;\n  for(int j = 0; j < 9; j++){\n    vec2 off = vec2(mod(float(j), 3.0) - 1.0, floor(float(j)/3.0) - 1.0);\n\n    vec3 R = shellFetch(acc, floor(gq) + off, N).rgb;\n    float q = 2.40*pow(max(max(R.x, max(R.y, R.z)), 0.0) + 1e-6, 0.385);\n    float wgt = exp(-dot(off, off)*0.30);\n    depth = max(depth, smoothstep(dcut*1.03, dcut*2.45, q)*wgt);\n  }\n\n  gl_FragColor = vec4(clamp(scar, 0.0, 1.0), depth);\n}\n\nvec3 emissionAt(vec2 uv, float N){\n  vec3 d = uvToDir(uv);\n  vec4 nt = shellBilerp(net, warpUV(uv, N)*simGrid(N), N);\n  vec3 D = nt.rgb;\n  vec3 e = colonyColour(0)*D.x + colonyColour(1)*D.y + colonyColour(2)*D.z;\n\n  return e*smoothstep(0.02, 0.30, max(D.x, max(D.y, D.z)))*polarMask(d.y);\n}\n\nvoid mainGlow(){\n  float N = simEdge();\n  vec2 tx = floor(gl_FragCoord.xy);\n  if(tx.x >= N || tx.y >= simRows(N)){ gl_FragColor = vec4(0.0); return; }\n\n  vec2 uv = (tx + 0.5)/simGrid(N);\n  vec3 blurC = vec3(0.0);\n  float blurD = 0.0;\n  float wsum = 0.0;\n  for(int j = 0; j < 9; j++){\n    vec2 off = vec2(mod(float(j), 3.0) - 1.0, floor(float(j)/3.0) - 1.0);\n    vec4 g = shellFetch(glow, tx + off, N);\n    float wgt = exp(-dot(off, off)*0.62);\n    blurC += g.rgb*wgt;\n    blurD += g.a*wgt;\n    wsum += wgt;\n  }\n  blurC /= wsum;\n  blurD /= wsum;\n\n  vec3 e = emissionAt(uv, N);\n  float ed = max(e.x, max(e.y, e.z));\n\n  gl_FragColor = vec4(mix(blurC, e, 0.17), mix(blurD, ed, 0.085));\n}\n\nvec3 gL0, gL1, gL2;\nfloat gK0, gK1, gK2;\nvec3 gB0, gB1;\nfloat gS0, gS1;\nfloat gFuse, gScale;\nvec3 gX0, gX1;\nfloat gA0, gA1, gPer, gPerT;\nfloat gRMax;\nfloat gRFit;\n\nfloat smin(float a, float b, float k){\n  float h = clamp(0.5 + 0.5*(b - a)/k, 0.0, 1.0);\n  return mix(b, a, h) - k*h*(1.0 - h);\n}\nfloat smax(float a, float b, float k){ return -smin(-a, -b, k); }\n\nfloat lobeR(vec3 d, vec3 c, float k2){\n  float b = dot(c, d);\n  return b + sqrt(max(k2 + b*b, 0.0));\n}\n\nfloat biteT(vec3 d, vec3 q, float sq){\n  float b = dot(q, d);\n  float disc = b*b - sq;\n\n  float away = step(disc, 0.0) + step(b, 0.0);\n  return b - sqrt(max(disc, 0.0)) + away*8.0;\n}\n\n#define GUARD 1.10\n\nvoid setBite(float a, float T, vec3 axis, out vec3 q, out float sq){\n  float sum = T*T/a;\n  float qm = 0.5*(sum + a);\n  float Rq = 0.5*(sum - a);\n  q = normalize(axis)*qm;\n  sq = qm*qm - Rq*Rq;\n}\n\nvoid setupBody(float t){\n  float w0 = t*0.037, w1 = t*0.029, w2 = t*0.043;\n\n  float sys = beatEnv(beatPhase(t));\n  float sq = clamp(pulse, 0.0, 1.5)*sys;\n\n  float sep = 0.18 + 0.62*turgor;\n\n  vec3 aL = normalize(vec3(cos(w0), 0.42, sin(w0)));\n  vec3 aM = normalize(vec3(cos(w2*1.3 + 3.9), -0.62, sin(w2*1.3 + 3.9)));\n\n  gL0 = vec3(0.03*sin(w1), 0.02, 0.03*cos(w1))*BODY_R;\n  float R0 = (0.90 + 0.03*sin(t*0.21))*BODY_R;\n  gK0 = R0*R0 - dot(gL0, gL0);\n\n  gL1 = aL*(sep*0.88*BODY_R)*(1.0 - 0.10*sq);\n  float R1 = (0.72 - 0.055*sq + 0.03*sin(t*0.17 + 1.7))*BODY_R;\n  gK1 = R1*R1 - dot(gL1, gL1);\n\n  gL2 = aM*(sep*1.02*BODY_R)*(1.0 - 0.05*sq);\n  float R2 = (0.58 + 0.025*sin(t*0.26 + 3.1))*BODY_R;\n  gK2 = R2*R2 - dot(gL2, gL2);\n\n  gFuse = (0.075 + 0.035*sin(t*0.13))*BODY_R;\n\n  setBite(0.445 + 0.022*sin(t*0.11 + 2.4), GUARD,\n          vec3(cos(w1*1.7 + 2.0), 0.55, sin(w0*0.8 + 1.0)), gB0, gS0);\n  setBite(0.560, GUARD,\n          vec3(sin(w1*1.3 + 0.4), -0.28, cos(w2*0.9 + 2.2)), gB1, gS1);\n\n  gX0 = normalize(vec3(cos(w0*1.4), 0.45, sin(w0*1.4)));\n  gX1 = normalize(vec3(0.30, cos(w1*1.6), sin(w1*1.6)));\n  gA0 = turgor*0.030;\n  gA1 = turgor*0.045;\n  gPer = breath*0.024;\n  gPerT = -t*0.183;\n\n  gScale = 1.0 + breath*(0.042*sin(t*0.95) + 0.015*sin(t*1.90 + 1.0)) - 0.026*sq;\n\n  float lobeMax = max(length(gL0) + sqrt(max(gK0 + dot(gL0, gL0), 0.0)),\n                  max(length(gL1) + sqrt(max(gK1 + dot(gL1, gL1), 0.0)),\n                      length(gL2) + sqrt(max(gK2 + dot(gL2, gL2), 0.0))));\n  gRMax = (lobeMax + 0.25*gFuse)*(1.0 + gA0 + 0.667*gA1 + gPer)*gScale*1.02;\n\n  float fitMax = (0.966 + 0.30*sep)*BODY_R;\n  gRFit = (fitMax + 0.25*gFuse)*(1.0 + gA0 + 0.667*gA1 + gPer)\n        *(1.0 + 0.057*breath)*1.02;\n}\n\nfloat bodyRadius(vec3 d, float t){\n  float r = lobeR(d, gL0, gK0);\n  r = smax(r, lobeR(d, gL1, gK1), gFuse);\n  r = smax(r, lobeR(d, gL2, gK2), gFuse);\n\n  float ph = fract(d.y*1.03 + gPerT)*2.0 - 1.0;\n  float ripple = ph*(1.0 - abs(ph))*4.0;\n  float q0 = dot(d, gX0), q1 = dot(d, gX1);\n  r *= 1.0 + gA0*q0 + gA1*(q1*q1 - 0.3333) + gPer*ripple;\n\n  r = smin(r, min(biteT(d, gB0, gS0), biteT(d, gB1, gS1)), 0.160*BODY_R);\n\n  return max(r*gScale, 0.10*BODY_R);\n}\n\nfloat bodyField(vec3 p, float t){\n  float r = length(p);\n  if(r < 1e-5) return -BODY_R;\n  return r - bodyRadius(p/r, t);\n}\n\nvec3 bodyNormal(vec3 p, float t){\n  vec3 d = normalize(p);\n  vec3 ax = abs(d.y) < 0.9 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\n  vec3 tu = normalize(cross(ax, d));\n  vec3 tv = cross(d, tu);\n  float e = 0.004;\n  float r0 = bodyRadius(d, t);\n  float ru = bodyRadius(normalize(d + tu*e), t);\n  float rv = bodyRadius(normalize(d + tv*e), t);\n  return normalize(d - (tu*(ru - r0) + tv*(rv - r0))/(e*max(r0, 1e-4)));\n}\n\nbool sphereSpan(vec3 ro, vec3 rd, float R, out float t0, out float t1){\n  float b = dot(ro, rd);\n  float c = dot(ro, ro) - R*R;\n  float h = b*b - c;\n  if(h < 0.0){ t0 = 0.0; t1 = -1.0; return false; }\n  h = sqrt(h);\n  t0 = max(-b - h, 0.0);\n  t1 = -b + h;\n  return t1 > t0;\n}\n\nvec3 shellEmission(vec3 d, float t, vec3 sig, float N, float graze, vec3 rd){\n  vec2 grid = dirToUV(d)*simGrid(N);\n\n  vec3 Tv = rd - d*dot(rd, d);\n  float tl = length(Tv);\n  vec2 gstep = vec2(0.0);\n  if(tl > 1e-4){\n    Tv /= tl;\n\n    float cl = max(sqrt(max(1.0 - d.y*d.y, 0.0)), 0.10);\n    vec3 east = normalize(vec3(-d.z, 0.0, d.x) + vec3(1e-6));\n    vec3 north = cross(d, east);\n    vec2 duv = vec2(dot(Tv, east)/(TAU*cl), dot(Tv, north)*cl*0.5);\n    vec2 gdir = duv*simGrid(N);\n    float gl2 = length(gdir);\n\n    if(gl2 > 1e-5) gstep = (gdir/gl2)*(graze*7.0*(N/288.0));\n  }\n  vec4 g = shellBilerp(glow, grid, N)*0.46\n         + shellBilerp(glow, grid + gstep, N)*0.27\n         + shellBilerp(glow, grid - gstep, N)*0.27;\n  float depth = shellBilerp(mem, grid, N).a;\n\n  float gm = max(g.x, max(g.y, g.z));\n  vec3 broad = (g.rgb/max(gm, 1e-4))*g.a;\n\n  float softD = clamp(depth, 0.0, 1.0);\n  float softG = clamp(graze, 0.0, 1.0);\n\n  float hd = min(length(d - heartDir(0, t)),\n             min(length(d - heartDir(1, t)), length(d - heartDir(2, t))));\n  float env = beatEnv(beatPhase(t) - hd*BEAT_LAG);\n  float pk = clamp(pulse, 0.0, 1.5);\n\n  float dilate = 0.75*env*pk*(1.0 - 0.60*softG);\n\n  vec3 gl = g.rgb*(1.0 - 0.30*softD)*(1.0 - 0.92*softG)\n          + broad*(0.26 + 0.85*softD + 0.70*softG + dilate);\n  float glLuma = clamp(max(gl.x, max(gl.y, gl.z)), 0.0, 1.0);\n\n  float pulseK = mix(1.0, 0.22 + 1.10*env, pk);\n\n  vec3 e = gl*(0.70 + 2.10*glLuma*glLuma)*pulseK*emissive*2.05;\n\n  e /= (1.0 + 0.55*max(e.x, max(e.y, e.z)));\n\n  return e*exp(-sig*(0.020 + depth*0.290))*polarMask(d.y);\n}\n\nvoid mainScene(){\n  float N = simEdge();\n  vec2 uv = (gl_FragCoord.xy - 0.5*RENDERSIZE)/min(RENDERSIZE.x, RENDERSIZE.y);\n  float t = simClock();\n  setupBody(t);\n\n  float ca = TIME*0.055 + 1.30;\n  float el = 0.30 + 0.16*sin(TIME*0.037);\n  float dist = gRFit/0.2895;\n  vec3 ro = vec3(cos(ca), 0.0, sin(ca))*dist + vec3(0.0, el, 0.0);\n  vec3 ta = vec3(0.0, 0.0, 0.0);\n  vec3 fw = normalize(ta - ro);\n  vec3 rt = normalize(cross(fw, vec3(0.0, 1.0, 0.0)));\n  vec3 up = cross(rt, fw);\n  vec3 rd = normalize(uv.x*rt + uv.y*up + 1.55*fw);\n\n  vec3 sig = mix(vec3(1.0), vec3(0.50, 1.30, 1.75), flesh)*(3.2/translucency);\n\n  vec3 col = vec3(0.0);\n  float t0, t1;\n  bool span = sphereSpan(ro, rd, gRMax, t0, t1);\n\n  float tFront = -1.0, tBack = -1.0, inside = 0.0;\n  float backLo = -1.0, backHi = -1.0;\n  if(span){\n\n    float stepT = (t1 - t0)/15.0;\n    float prevT = t0;\n    float prevS = bodyField(ro + rd*t0, t);\n    for(int i = 1; i <= 15; i++){\n      float tc = t0 + stepT*float(i);\n      float s = bodyField(ro + rd*tc, t);\n      if(s < 0.0) inside += stepT;\n      if(prevS >= 0.0 && s < 0.0 && tFront < 0.0){\n        float lo = prevT, hi = tc;\n        for(int j = 0; j < 5; j++){\n          float mid = 0.5*(lo + hi);\n          if(bodyField(ro + rd*mid, t) < 0.0) hi = mid; else lo = mid;\n        }\n        tFront = hi;\n      }\n      if(prevS < 0.0 && s >= 0.0){ backLo = prevT; backHi = tc; }\n      prevS = s;\n      prevT = tc;\n    }\n    if(backHi > 0.0){\n      float lo = backLo, hi = backHi;\n      for(int j = 0; j < 5; j++){\n        float mid = 0.5*(lo + hi);\n        if(bodyField(ro + rd*mid, t) > 0.0) hi = mid; else lo = mid;\n      }\n      tBack = hi;\n    } else if(tFront > 0.0){\n      tBack = t1;\n    }\n  }\n\n  float chord = max(inside, 0.0);\n\n  vec3 through = exp(-sig*chord);\n\n  if(tFront > 0.0){\n    vec3 pF = ro + rd*tFront;\n    vec3 dF = normalize(pF);\n    vec3 nGeo = bodyNormal(pF, t);\n    vec3 n = nGeo;\n    vec2 guv = dirToUV(dF);\n\n    float radial = clamp(dot(nGeo, dF), 0.0, 1.0);\n    float steep = 1.0 - radial*radial;\n\n    vec2 du = vec2(1.5)/simGrid(N);\n    float gC = shellFetch(glow, guv*simGrid(N), N).a;\n    float gU = shellFetch(glow, (guv + vec2(du.x, 0.0))*simGrid(N), N).a;\n    float gV = shellFetch(glow, (guv + vec2(0.0, du.y))*simGrid(N), N).a;\n    vec4 memF = shellBilerp(mem, guv*simGrid(N), N);\n    vec3 tanU = normalize(cross(vec3(0.0, 1.0, 0.0), dF) + vec3(1e-5));\n    vec3 tanV = cross(dF, tanU);\n\n    float relief = 38.0*(1.0 + 0.85*clamp(pulse, 0.0, 1.5)*beatEnv(beatPhase(t)))\n                 *(1.0 - 0.92*steep);\n    n = normalize(n - (tanU*(gU - gC) + tanV*(gV - gC))*relief*(1.0 - 0.65*memF.a));\n\n    float fres = pow(1.0 - clamp(dot(n, -rd), 0.0, 1.0), 3.4);\n\n    vec3 key = normalize(vec3(0.78, 0.40, -0.48));\n\n    float ndl = max(dot(n, key), 0.0);\n    float wrap = clamp((dot(n, key) + 0.62)/1.62, 0.0, 1.0);\n    vec4 ntF = shellBilerp(net, guv*simGrid(N), N);\n    float micro = vnoise3(dF*24.0)*0.6 + vnoise3(dF*53.0)*0.4;\n\n    float opaque = clamp(ntF.a, 0.0, 1.0);\n    vec3 skin = mix(vec3(0.030, 0.013, 0.012), vec3(0.190, 0.140, 0.130), opaque);\n    skin *= 0.90 + 0.20*micro;\n\n    col += skin*(0.021 + 0.34*ndl + 0.26*wrap*wrap);\n\n    col += vec3(0.62, 0.46, 0.40)*fres*0.055;\n\n    col += (colonyColour(0)*memF.r + colonyColour(1)*memF.g + colonyColour(2)*memF.b)*0.030;\n\n    vec3 windowT = exp(-sig*opaque*0.32);\n\n    float facing = clamp(dot(nGeo, -rd), 0.0, 1.0);\n    float graze = 1.0 - facing*facing;\n    float foot = clamp(max(graze*graze, steep), 0.0, 1.0);\n\n    float limbFade = smoothstep(0.05, 0.42, facing)*(1.0 - 0.80*steep);\n\n    vec3 rIn = refract(rd, nGeo, 1.0/SKIN_IOR);\n    if(dot(rIn, rIn) < 1e-6) rIn = rd;\n\n    vec4 gW = shellBilerp(glow, guv*simGrid(N), N);\n    vec3 dV = normalize(pF + rIn*(SKIN_H*(1.5 + 1.7*clamp(gW.a, 0.0, 1.0))));\n\n    float skinPath = min(1.0/max(facing, 0.09), 7.0)*SKIN_H;\n    vec3 skinAbs = exp(-sig*skinPath);\n\n    col += shellEmission(dV, t, sig, N, foot, rd)*windowT*limbFade*skinAbs;\n\n    float gWm = max(gW.r, max(gW.g, gW.b));\n    vec3 washHue = gW.rgb/max(gWm, 1e-4);\n    vec3 inScat = (vec3(1.0) - exp(-sig*0.60*skinPath))*exp(-sig*0.45*skinPath);\n    col += washHue*gW.a*inScat*1.55*windowT*polarMask(dF.y);\n\n    vec3 dB = normalize(ro + rd*max(tBack, tFront));\n    if(tBack > tFront){\n      col += shellEmission(dB, t, sig, N, max(foot, 0.55), rd)*through*windowT*limbFade;\n    }\n\n    vec4 gF = shellBilerp(glow, dirToUV(dF)*simGrid(N), N);\n    vec4 gB = shellBilerp(glow, dirToUV(dB)*simGrid(N), N);\n    float mF = max(gF.x, max(gF.y, gF.z));\n    float mB = max(gB.x, max(gB.y, gB.z));\n    vec3 medium = (gF.rgb/max(mF, 1e-4))*gF.a + (gB.rgb/max(mB, 1e-4))*gB.a;\n\n    float medBeat = mix(1.0, 0.36 + 0.95*beatEnv(beatPhase(t) - 0.33),\n                        clamp(pulse, 0.0, 1.5));\n    col += medium*((vec3(1.0) - through)/max(sig, vec3(1e-4)))*1.9*windowT*medBeat;\n\n    vec3 vg = colonyVigour();\n\n    float coreBeat = mix(1.0, 0.30 + 1.55*beatEnv(beatPhase(t)),\n                         clamp(pulse, 0.0, 1.5));\n    for(int k = 0; k < COLONIES; k++){\n      vec3 hp = heartCore(k, t);\n      float tc = clamp(dot(hp - ro, rd), tFront, max(tBack, tFront));\n      float dist = length(ro + rd*tc - hp);\n      float core = 1.0/(1.0 + dist*dist/0.0030);\n      float vk = k == 0 ? vg.x : (k == 1 ? vg.y : vg.z);\n      vec3 cc = colonyColour(k)*core*0.45*vk*emissive*coreBeat*exp(-sig*max(tc - tFront, 0.0));\n\n      col += cc/(1.0 + 0.60*max(cc.x, max(cc.y, cc.z)));\n    }\n  }\n\n  float lum = max(col.x, max(col.y, col.z));\n  gl_FragColor = vec4(col, smoothstep(0.55, 1.6, lum));\n}\n\nvec3 tonemap(vec3 x){\n\n  return clamp((x*(2.51*x + 0.03))/(x*(2.43*x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid mainComposite(){\n  vec2 uv = gl_FragCoord.xy/RENDERSIZE;\n  vec4 s = texture2D(scene, uv);\n  vec3 col = s.rgb;\n\n  float ba = hash12(gl_FragCoord.xy*0.731)*0.18;\n  vec2 rot = vec2(cos(ba), sin(ba));\n  vec3 b = vec3(0.0);\n  float wsum = 0.0;\n  for(int i = 0; i < 40; i++){\n    float fi = float(i) + 0.5;\n    float rr = sqrt(fi/40.0);\n    float a = fi*2.39996 + ba;\n    vec2 c0 = vec2(cos(a), sin(a));\n\n    vec2 off = vec2(c0.x*rot.x - c0.y*rot.y, c0.x*rot.y + c0.y*rot.x)*(rr*0.048);\n    off.x *= RENDERSIZE.y/RENDERSIZE.x;\n    vec4 sp = texture2D(scene, clamp(uv + off, vec2(0.001), vec2(0.999)));\n\n    float wgt = exp(-rr*rr*1.9);\n    b += sp.rgb*sp.a*wgt;\n    wsum += wgt;\n  }\n  col += (b/wsum)*bloom*1.5;\n\n  col = tonemap(col*1.04);\n\n  float vig = 1.0 - 0.42*dot(uv - 0.5, uv - 0.5)*2.2;\n  col *= clamp(vig, 0.0, 1.0);\n\n  col = pow(col, vec3(1.0/2.2));\n\n  float grain = hash12(gl_FragCoord.xy*1.7 + 0.5) - 0.5;\n  col += (grain/255.0)*smoothstep(0.0, 0.006, max(col.r, max(col.g, col.b)));\n\n  gl_FragColor = vec4(col, 1.0);\n}\n\nvoid main(){\n  if(PASSINDEX == 0) mainAcc1();\n  else if(PASSINDEX == 1) mainAcc();\n  else if(PASSINDEX == 2) mainNet();\n  else if(PASSINDEX == 3) mainMem();\n  else if(PASSINDEX == 4) mainGlow();\n  else if(PASSINDEX == 5) mainScene();\n  else mainComposite();\n}\n",
    "generator": {
      "model": "claude-opus-5",
      "provider": "anthropic",
      "prompt": "A translucent beating organ: three colonies drain the shell of a booleaned body through a flow-accumulation network, and the light they make travels back out through flesh.",
      "params": null
    }
  }
}