{
  "license": "CC0-1.0",
  "shader": {
    "id": "he83sh23",
    "title": "Computah",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "Claude",
    "status": "active",
    "compile_ok": true,
    "render_hash": "02003cbf01190300",
    "tags": [
      "computah",
      "computer",
      "pc",
      "90s",
      "retro"
    ],
    "parents": [],
    "author": "u7y1evhf0znj",
    "author_name": "ksin",
    "author_url": "/u/ksin",
    "created_at": "2026-10-01T08:57:41.969Z",
    "poster_url": "/posters/he83sh23.avif",
    "stats": {
      "slops": 0,
      "views": 72,
      "forks": 0
    },
    "self": "/api/v1/shaders/he83sh23",
    "isf": "/*{\n  \"DESCRIPTION\": \"A 90s bedroom computer desk at golden hour. A beige CRT sits on a laminate hutch desk between two little beige speakers, next to a beige tower with a CD-ROM, a floppy drive and a blinking hard-drive light. The screen cycles through four programs: a green-hill desktop where a browser window opens and a page trickles in over dial-up, a gem-matching game whose board cascades, the starfield screensaver, and Mystify. Sunset light comes through venetian blinds and lays stripes across the desk, the monitor and the wall, and dust drifts in the beams. Around it are a ball mouse on a blue pad, a keyboard, a can of cola, an 'I love my computer' mug, floppies, a CD throwing a rainbow, a lava lamp, a shelf of jewel cases and big-box games, a little TV playing a platformer, a stack of tapes, posters, and an iron bed under a plaid blanket. SCREEN picks the program or cycles them. ARRANGE deals the desk things and the posters into one of twelve layouts. MIRROR flips the desk so the tower sits on the left, away from the window. CLUTTER runs from a tidy desk and half-empty shelves to cans, a stack of jewel cases, a magazine on the bed and paper balls under the desk. WOOD takes the desk from birch to walnut, WALL HUE repaints the walls, and YELLOWING ages the beige plastic. SPEED drives the slow camera push. SUN, SUN HEIGHT and GOLDEN set the light, BLINDS tilts the slats, and BEAMS and DUST fill the air. LAVA and GLOW are the lamp and the screens, SCANLINES is the CRT, FILM fades everything into a drugstore print, DATE STAMP adds the orange date in the corner, and EXPOSURE sets the overall brightness.\",\n  \"CREDIT\": \"CC0\",\n  \"ISFVSN\": \"2\",\n  \"CATEGORIES\": [\"generator\", \"retro\", \"interior\", \"nostalgia\", \"raymarch\"],\n  \"INPUTS\": [\n    { \"NAME\": \"SCREEN\", \"TYPE\": \"long\", \"DEFAULT\": 0, \"VALUES\": [0, 1, 2, 3, 4], \"LABELS\": [\"cycle\", \"desktop\", \"gem game\", \"starfield\", \"mystify\"] },\n    { \"NAME\": \"ARRANGE\", \"TYPE\": \"long\", \"DEFAULT\": 0, \"MIN\": 0, \"MAX\": 11 },\n    { \"NAME\": \"MIRROR\", \"TYPE\": \"bool\", \"DEFAULT\": false },\n    { \"NAME\": \"CLUTTER\", \"TYPE\": \"float\", \"DEFAULT\": 0.6, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"WOOD\", \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"WALL_HUE\", \"TYPE\": \"float\", \"DEFAULT\": 0.0, \"MIN\": 0.0, \"MAX\": 1.0, \"LABEL\": \"wall hue\" },\n    { \"NAME\": \"YELLOWING\", \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"SPEED\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"SUN\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 2.5 },\n    { \"NAME\": \"SUN_HEIGHT\", \"TYPE\": \"float\", \"DEFAULT\": 0.4, \"MIN\": 0.0, \"MAX\": 1.0, \"LABEL\": \"sun height\" },\n    { \"NAME\": \"GOLDEN\", \"TYPE\": \"float\", \"DEFAULT\": 0.7, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"BLINDS\", \"TYPE\": \"float\", \"DEFAULT\": 0.3, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"BEAMS\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"DUST\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"LAVA\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"GLOW\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"SCANLINES\", \"TYPE\": \"float\", \"DEFAULT\": 0.6, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"FILM\", \"TYPE\": \"float\", \"DEFAULT\": 0.35, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"DATE_STAMP\", \"TYPE\": \"bool\", \"DEFAULT\": true, \"LABEL\": \"date stamp\" },\n    { \"NAME\": \"EXPOSURE\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.3, \"MAX\": 3.0 }\n  ]\n}*/\n// ---------------------------------------------------------------------------\n// Layout, metres, y up. The camera looks down +z at the back wall (z = 0.95).\n// The right wall is the plane x = 1.25 with a window cut in it, and venetian\n// blinds hang just inside it at x = BLX. The desk is a hutch 1.6 m wide\n// (x in [-0.8, 0.8]), with its top at y = 0.75 and a shelf at y = 1.30.\n//\n// Sunlight is never marched through the blinds. sunMask() projects a point\n// along the sun direction onto the window and onto the blind plane and works\n// out analytically how much of each slat's shadow it is in. So the stripes\n// are exact, they soften with distance from the window, and the volumetric\n// beams cost no map() calls at all. Objects in the room cast their shadows\n// with one ordinary soft-shadow march.\n//\n// One loop does the march, the four normal taps, four AO taps and the shadow\n// ray, and map() has a single call site. That keeps the compiled shader to one\n// inlined copy of the scene.\n// ---------------------------------------------------------------------------\n#define PI 3.14159265\n#define TAU 6.28318531\n#define MX (-0.12)     // monitor centre x\n#define SCY 1.015      // screen centre y\n#define LX (-0.66)     // lava lamp\n#define LZ 0.75\n#define BLX 1.215      // plane the blinds hang in\n#define SP 0.024       // slat pitch\n#define SW 0.026       // slat width\nvec3 gL; // toward the sun\nvec3 gSun; // sun colour * intensity\nfloat gCa; // slat angle cos/sin\nfloat gSa;\nfloat gMode; // 0 desktop, 1 gems, 2 starfield\nfloat gMT; // time inside the current program\nfloat gFade; // program switch blackout\nvec3 gScr; // average colour the monitor throws into the room\nfloat gS; // 1, or -1 with the desk mirrored (MIRROR)\nfloat gSeed; // ARRANGE\nvec2 gMug; // where the small things landed, desk frame xz\nvec2 gFlp;\nvec2 gCD;\nvec2 gCan;\nvec2 gJc; // the spare spots: jewel-case stack and a second can\nvec2 gCan2;\nvec4 gOn; // mug, floppies, CD, can on the desk at this CLUTTER\nfloat gB; // nearest bounding volume (map)\nfloat gR; // nearest real surface (map)\nfloat hash11(float p) { p=fract(p*0.1031); p*=p+33.33; p*=p+p; return fract(p); }\nfloat hash21(vec2 p) {\n vec3 p3=fract(vec3(p.xyx)*0.1031);\n p3+=dot(p3,p3.yzx+33.33);\n return fract((p3.x+p3.y)*p3.z);\n}\nvec2 hash22(vec2 p) {\n vec3 p3=fract(vec3(p.xyx)*vec3(0.1031,0.1030,0.0973));\n p3+=dot(p3,p3.yzx+33.33);\n return fract((p3.xx+p3.yz)*p3.zy);\n}\nfloat noise2(vec2 p) {\n vec2 i=floor(p),f=fract(p);\n vec2 u=f*f*(3.0-2.0*f);\n return mix(mix(hash21(i),hash21(i+vec2(1.0,0.0)),u.x),\n   mix(hash21(i+vec2(0.0,1.0)),hash21(i+vec2(1.0,1.0)),u.x),u.y);\n}\nfloat fbm2(vec2 p) {\n float a=0.5,s=0.0;\n for (int i=0; i<4; i++) { s+=a*noise2(p); p=mat2(1.6,1.2,-1.2,1.6)*p+3.1; a*=0.5; }\n return s;\n}\n// ---- SDF primitives ---------------------------------------------------------\nfloat sdBox(vec3 p,vec3 b) {\n vec3 q=abs(p)-b;\n return length(max(q,0.0))+min(max(q.x,max(q.y,q.z)),0.0);\n}\nfloat sdRBox(vec3 p,vec3 b,float r) { return sdBox(p,b-r)-r; }\nfloat sdBox2(vec2 p,vec2 b) {\n vec2 q=abs(p)-b;\n return length(max(q,0.0))+min(max(q.x,q.y),0.0);\n}\nfloat sdCylY(vec3 p,float r,float h) {\n vec2 d=abs(vec2(length(p.xz),p.y))-vec2(r,h);\n return min(max(d.x,d.y),0.0)+length(max(d,0.0));\n}\nfloat sdEll(vec3 p,vec3 r) {\n float k0=length(p/r);\n float k1=length(p/(r*r));\n return k0*(k0-1.0)/k1;\n}\nfloat sdCap(vec3 p,vec3 a,vec3 b,float r) {\n vec3 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)-r;\n}\nvec2 opU(vec2 a,vec2 b) { return a.x<b.x?a:b; }\n// three-stop ramp: a at 0, b at 0.5, c at 1\nvec3 ramp3(vec3 a,vec3 b,vec3 c,float x) { return x<0.5?mix(a,b,x*2.0):mix(b,c,x*2.0-1.0); }\nvec3 hueRot(vec3 c,float a) {\n vec3 k=vec3(0.57735);\n return c*cos(a)+cross(k,c)*sin(a)+k*dot(k,c)*(1.0-cos(a));\n}\n// six spots on the desk the small things get dealt to (desk frame, xz)\nvec2 slot(float k) {\n k=mod(k,6.0);\n return k<0.5?vec2(-0.62,0.36):k<1.5?vec2(-0.44,0.29):k<2.5?vec2(0.48,0.27)\n  :k<3.5?vec2(0.66,0.30):k<4.5?vec2(-0.64,0.53):vec2(0.73,0.43);\n}\nmat2 rot(float a) { float c=cos(a),s=sin(a); return mat2(c,s,-s,c); }\n// Materials\n//  1 laminate   2 wall       3 carpet     4 beige plastic  5 CRT glass\n//  6 jewel case 7 black      8 cola can   9 mug           10 lava glass\n// 11 metal     12 slats     13 white paint 14 blanket     15 pillow\n// 16 iron      17 game box  18 mousepad   19 floppy       20 keys\n// 21 TV glass  22 CD        23 VHS\n// Keycaps on top of the keyboard, q in the keyboard's frame.\nfloat keysSDF(vec3 q) {\n float pt=0.0185;\n // main block, 15 x 6 (the back row is the F-keys)\n vec2 c=vec2(clamp(floor((q.x+0.218)/pt),0.0,14.0),\n    clamp(floor((q.z+0.066)/pt),0.0,5.0));\n float kz=-0.066+(c.y+0.5)*pt+(c.y>4.5?0.003:0.0);\n float kx=-0.218+(c.x+0.5)*pt;\n float hx=0.0072;\n if (c.y<0.5&&c.x>3.5&&c.x<10.5) { kx=-0.218+7.5*pt; hx=3.5*pt-0.0021; }\n float d=sdRBox(vec3(q.x-kx,q.y-0.016,q.z-kz),vec3(hx,0.005,0.0072),0.002);\n // arrows, nav cluster and numpad; column 3 is the gap\n vec2 c2=vec2(clamp(floor((q.x-0.066)/pt),0.0,7.0),c.y);\n vec3 k2=vec3(q.x-0.066-(c2.x+0.5)*pt,q.y-0.016,q.z-kz);\n bool on=c2.x>3.5?c2.y<4.5\n   :(c2.x<2.5&&(c2.y>2.5||c2.y<0.5||(c2.y<1.5&&c2.x>0.5&&c2.x<1.5)));\n float d2=on?sdRBox(k2,vec3(0.0072,0.005,0.0072),0.002)\n    :max(max(-sdBox2(k2.xz,vec2(0.5*pt)),0.0)+0.0015,q.y-0.022);\n return min(d,d2);\n}\nvec2 map(vec3 p) {\n gB=1e5;\n // ---- room shell\n vec2 res=vec2(max(p.y,p.x-1.45),3.0);\n res=opU(res,vec2(sdBox(p-vec3(-0.6,1.3,1.05),vec3(2.05,1.4,0.1)),2.0));\n res=opU(res,vec2(p.x+2.6,2.0));\n res=opU(res,vec2(max(2.6-p.y,p.x-1.45),2.0));\n float rw=sdBox(p-vec3(1.35,1.3,-1.0),vec3(0.1,1.4,2.6));\n rw=max(rw,-sdBox(p-vec3(1.35,1.5,-0.05),vec3(0.2,0.55,0.6)));\n res=opU(res,vec2(rw,2.0));\n // ---- window trim, sill and the blinds\n float bw=sdBox(p-vec3(1.22,1.5,-0.05),vec3(0.07,0.62,0.72));\n if (bw<0.05) {\n  vec3 wq=p-vec3(1.245,1.5,-0.05);\n  float trim=max(sdBox(wq,vec3(0.012,0.6,0.65)),-sdBox(wq,vec3(0.1,0.55,0.6)));\n  trim=min(trim,sdBox(p-vec3(1.215,0.935,-0.05),vec3(0.04,0.012,0.67)));\n  trim=min(trim,sdBox(p-vec3(BLX,2.02,-0.05),vec3(0.022,0.022,0.6)));\n  trim=min(trim,sdBox(p-vec3(BLX,1.0,-0.05),vec3(0.016,0.007,0.59)));\n  res=opU(res,vec2(trim,13.0));\n  float u=p.x-BLX;\n  float v=mod(p.y,SP)-0.5*SP;\n  vec2 sl=vec2(gCa*u+gSa*v,-gSa*u+gCa*v);\n  float ds=sdBox2(sl,vec2(0.5*SW,0.0008));\n  ds=max(ds,max(abs(p.z+0.05)-0.585,abs(p.y-1.5)-0.49));\n  res=opU(res,vec2(ds,12.0));\n } else gB=min(gB,bw);\n // ---- the bed: plaid blanket, pillow, iron headboard against the wall\n float bb=sdBox(p-vec3(-1.65,0.6,-0.35),vec3(0.72,0.6,1.33));\n if (bb<0.05) {\n  vec3 bq=p-vec3(-1.65,0.42,-0.35);\n  float wr=0.006*sin(bq.z*23.0+2.0*sin(bq.x*9.0))*smoothstep(-0.1,0.1,bq.y);\n  res=opU(res,vec2((sdRBox(bq,vec3(0.66,0.14,1.28),0.07)+wr)*0.9,14.0));\n  res=opU(res,vec2(sdBox(p-vec3(-1.65,0.15,-0.35),vec3(0.62,0.13,1.25)),7.0));\n  res=opU(res,vec2(sdEll(p-vec3(-1.65,0.62,0.70),vec3(0.34,0.075,0.17)),15.0));\n  vec3 hq3=p-vec3(-1.65,0.0,0.905);\n  float bx=hq3.x-0.1*clamp(floor(hq3.x/0.1+0.5),-6.0,6.0);\n  float iron=max(length(vec2(bx,hq3.z))-0.010,abs(p.y-0.78)-0.27);\n  iron=min(iron,sdCap(p,vec3(-2.31,1.05,0.905),vec3(-0.99,1.05,0.905),0.016));\n  vec3 pq=vec3(abs(hq3.x)-0.66,p.y,hq3.z);\n  iron=min(iron,sdCap(pq,vec3(0.0),vec3(0.0,1.08,0.0),0.02));\n  iron=min(iron,length(pq-vec3(0.0,1.11,0.0))-0.032);\n  res=opU(res,vec2(iron,16.0));\n } else gB=min(gB,bb);\n // ---- past CLUTTER 0.7: a magazine left on the bed, paper balls under the desk\n if (CLUTTER>0.7) {\n  vec3 mq=p-vec3(-1.3,0.569,0.3);\n  mq.xz=rot(0.5)*mq.xz;\n  res=opU(res,vec2(sdBox(mq,vec3(0.105,0.003,0.14)),17.0));\n  if (CLUTTER>0.82) {\n   float pb=length(p-vec3(-0.42,0.034,0.62))-0.034;\n   if (CLUTTER>0.94) pb=min(pb,length(p-vec3(0.15,0.03,0.7))-0.03);\n   pb+=0.005*sin(p.x*90.0)*sin(p.y*80.0+1.0)*sin(p.z*85.0);\n   res=opU(res,vec2(pb*0.7,15.0));\n  }\n }\n // ---- the desk and everything on it (last: MIRROR flips p for it)\n float bd=sdBox(p-vec3(0.0,0.9,0.575),vec3(0.82,0.9,0.39));\n if (bd<0.05) {\n  p.x*=gS;\n  vec3 q=vec3(abs(p.x),p.y,p.z);\n  float d=sdBox(p-vec3(0.0,0.735,0.575),vec3(0.80,0.015,0.375));\n  d=min(d,sdBox(q-vec3(0.785,0.36,0.575),vec3(0.015,0.36,0.375)));\n  d=min(d,sdBox(p-vec3(0.0,0.42,0.925),vec3(0.8,0.3,0.012)));\n  d=min(d,sdBox(q-vec3(0.785,1.25,0.80),vec3(0.015,0.5,0.15)));\n  d=min(d,sdBox(p-vec3(0.0,1.30,0.80),vec3(0.80,0.012,0.15)));\n  d=min(d,sdBox(p-vec3(0.0,1.75,0.795),vec3(0.81,0.015,0.16)));\n  d=min(d,sdBox(p-vec3(0.42,1.525,0.80),vec3(0.012,0.213,0.15)));\n  d=min(d,sdBox(p-vec3(0.0,1.25,0.94),vec3(0.8,0.5,0.008)));\n  res=opU(res,vec2(d,1.0));\n  // things standing on the desktop\n  float bi=sdBox(p-vec3(0.0,0.975,0.575),vec3(0.8,0.23,0.38));\n  if (bi<0.03) {\n   // CRT monitor: bezel with the tube recess, tapering bell, swivel base\n   float bm=sdBox(p-vec3(MX,0.99,0.70),vec3(0.22,0.24,0.24));\n   if (bm<0.03) {\n    float bez=sdRBox(p-vec3(MX,1.0,0.515),vec3(0.205,0.19,0.035),0.016);\n    vec3 rq=p-vec3(MX,SCY,0.48);\n    bez=max(bez,-sdRBox(rq,vec3(0.168,0.128,0.03),0.01));\n    float zz=clamp((p.z-0.55)/0.37,0.0,1.0);\n    float s=1.0-0.38*zz;\n    vec3 hq=p-vec3(MX,1.0-0.03*zz,0.735);\n    hq.xy/=s;\n    bez=min(bez,(sdBox(hq,vec3(0.178,0.166,0.173))-0.012)*s*0.9);\n    bez=min(bez,sdCylY(p-vec3(MX,0.762,0.69),0.128,0.01)-0.002);\n    bez=min(bez,sdRBox(p-vec3(MX,0.795,0.69),vec3(0.08,0.03,0.09),0.01));\n    res=opU(res,vec2(bez,4.0));\n    float gl=length(p-vec3(MX,SCY,0.488+1.4))-1.4;\n    gl=max(gl,sdBox(rq-vec3(0.0,0.0,0.02),vec3(0.17,0.13,0.04)));\n    res=opU(res,vec2(gl,5.0));\n   } else gB=min(gB,bm);\n   // tower: body, front bezel, drive bays\n   float bt=sdBox(p-vec3(0.58,0.96,0.665),vec3(0.11,0.225,0.23));\n   if (bt<0.03) {\n    float tw=sdRBox(p-vec3(0.58,0.96,0.67),vec3(0.095,0.21,0.21),0.006);\n    tw=min(tw,sdRBox(p-vec3(0.58,0.96,0.458),vec3(0.097,0.211,0.008),0.005));\n    tw=max(tw,-sdBox(p-vec3(0.58,1.105,0.45),vec3(0.074,0.021,0.004)));\n    tw=max(tw,-sdBox(p-vec3(0.58,1.01,0.45),vec3(0.052,0.012,0.004)));\n    res=opU(res,vec2(tw,4.0));\n   } else gB=min(gB,bt);\n   // speakers either side of the monitor\n   vec3 sq=p-vec3(p.x<-0.13?-0.47:0.21,0.865,0.60);\n   res=opU(res,vec2(sdRBox(sq,vec3(0.055,0.115,0.07),0.008),4.0));\n   // keyboard, tilted up at the back, with its keycaps\n   float bk=sdBox(p-vec3(-0.10,0.77,0.315),vec3(0.24,0.035,0.09));\n   if (bk<0.02) {\n    vec3 kq=p-vec3(-0.10,0.762,0.315);\n    kq.y-=0.08*kq.z;\n  kq.x*=gS;\n    res=opU(res,vec2(sdRBox(kq,vec3(0.232,0.011,0.078),0.006),4.0));\n    res=opU(res,vec2(keysSDF(kq),20.0));\n   } else gB=min(gB,bk);\n   // ball mouse on a mousepad\n   float bmo=sdBox(p-vec3(0.30,0.765,0.31),vec3(0.115,0.03,0.095));\n   if (bmo<0.02) {\n    vec3 pq=p-vec3(0.30,0.7515,0.31);\n    float pad=max(sdBox2(pq.xz,vec2(0.10,0.08))-0.01,abs(pq.y)-0.0015);\n    res=opU(res,vec2(pad,18.0));\n    vec3 mo=p-vec3(0.31,0.753,0.30);\n    mo.xz=rot(0.25)*mo.xz;\n    float ms=max(sdEll(mo-vec3(0.0,0.004,0.0),vec3(0.031,0.021,0.056)),-mo.y);\n    res=opU(res,vec2(ms,4.0));\n   } else gB=min(gB,bmo);\n   // mouse and keyboard leads\n   float cab=sdCap(p,vec3(0.322,0.757,0.352),vec3(0.345,0.7535,0.44),0.0022);\n   cab=min(cab,sdCap(p,vec3(0.345,0.7535,0.44),vec3(0.40,0.7535,0.62),0.0022));\n   cab=min(cab,sdCap(p,vec3(-0.10,0.774,0.394),vec3(-0.085,0.7535,0.46),0.0024));\n   cab=min(cab,sdCap(p,vec3(-0.085,0.7535,0.46),vec3(-0.04,0.7535,0.6),0.0024));\n   res=opU(res,vec2(cab,4.0));\n   // cola can\n   if (gOn.w>0.5) res=opU(res,vec2(sdCylY(p-vec3(gCan.x,0.8115,gCan.y),0.031,0.0595)-0.002,8.0));\n   // coffee mug with a handle\n   vec3 uq=p-vec3(gMug.x,0.797,gMug.y);\n   float mug=gOn.x>0.5?sdCylY(uq,0.04,0.047):1.0;\n   mug=max(mug,-sdCylY(uq-vec3(0.0,0.035,0.0),0.035,0.047));\n   if (gOn.x>0.5) mug=min(mug,sdCylY(uq-vec3(0.0,0.028,0.0),0.036,0.002));\n   vec3 hq2=uq-vec3(0.032,0.0,-0.03);\n   hq2.xz=rot(-0.7)*hq2.xz;\n   if (gOn.x>0.5) mug=min(mug,length(vec2(length(hq2.xy)-0.024,hq2.z))-0.0065);\n   res=opU(res,vec2(mug,9.0));\n   // lava lamp: a revolved profile, base / glass / cap\n   vec3 lq=p-vec3(LX,0.75,LZ);\n   float lr=length(lq.xz);\n   if (lr<0.1) {\n    float y=lq.y;\n    float r=y<0.12?mix(0.058,0.036,y/0.12)\n      :y<0.19?mix(0.036,0.05,(y-0.12)/0.07)\n      :y<0.35?mix(0.05,0.028,(y-0.19)/0.16)\n      :mix(0.028,0.017,(y-0.35)/0.06);\n    float lav=max((lr-r)*0.85,abs(y-0.205)-0.205);\n    res=opU(res,vec2(lav,(y>0.12&&y<0.35)?10.0:11.0));\n   } else gB=min(gB,lr-0.09);\n   // two floppies and a CD lying about\n   if (gOn.y>0.5) {\n    vec3 fq=p-vec3(gFlp.x,0.7517,gFlp.y-0.005);\n    fq.xz=rot(0.35)*fq.xz;\n    float fl=sdRBox(fq,vec3(0.045,0.0016,0.047),0.001);\n    vec3 fq2=p-vec3(gFlp.x-0.01,0.7551,gFlp.y+0.01);\n    fq2.xz=rot(-0.2)*fq2.xz;\n    fl=min(fl,sdRBox(fq2,vec3(0.045,0.0016,0.047),0.001));\n    res=opU(res,vec2(fl,19.0));\n   }\n   if (CLUTTER>0.75) {\n    vec3 sq2=p-vec3(gJc.x,0.7558,gJc.y);\n    float jcs=1e3;\n    for (int i=0; i<3; i++) {\n     vec3 cq=sq2-vec3(0.0,0.0102*float(i),0.0);\n     cq.xz=rot(0.3*sin(float(i)*2.4+gSeed))*cq.xz;\n     jcs=min(jcs,sdBox(cq,vec3(0.0705,0.0049,0.0625)));\n    }\n    res=opU(res,vec2(jcs,6.0));\n   }\n   if (CLUTTER>0.88) res=opU(res,vec2(sdCylY(p-vec3(gCan2.x,0.8115,gCan2.y),0.031,0.0595)-0.002,8.0));\n   vec3 dq=p-vec3(gCD.x,0.7508,gCD.y);\n   if (gOn.z>0.5) res=opU(res,vec2(max(sdCylY(dq,0.06,0.0008),0.0075-length(dq.xz)),22.0));\n  } else gB=min(gB,bi);\n  // shelf: jewel cases, big-box games, a little TV, tapes in the cubby\n  float bs=sdBox(p-vec3(0.0,1.46,0.80),vec3(0.79,0.16,0.15));\n  if (bs<0.03) {\n   float jc=clamp(floor((p.x+0.77)/0.0104),0.0,47.0);\n   vec3 jq=p-vec3(-0.77+(jc+0.5)*0.0104,1.3745,0.80);\n   float jd=sdBox(jq,vec3(0.0049,0.0625,0.0705));\n   // a missing case: distance to the nearest neighbour's slab (lower bound)\n   if (hash11(jc*3.1+gSeed*7.3)>0.4+CLUTTER)\n    jd=max(abs(jq.x)<0.0052?0.0055-abs(jq.x):abs(jq.x)+0.0055,length(max(abs(jq.yz)-vec2(0.0625,0.0705),0.0)));\n   res=opU(res,vec2(jd,6.0));\n   float gc=clamp(floor((p.x+0.255)/0.05),0.0,5.0);\n   float gh=0.098+0.024*hash11(gc*3.7+1.0+gSeed);\n   vec3 gq=p-vec3(-0.255+(gc+0.5)*0.05,1.312+gh,0.85);\n   float gd=sdBox(gq,vec3(0.0235,gh,0.088));\n   if (hash11(gc*5.3+gSeed*3.1)>0.4+CLUTTER)\n    gd=max(abs(gq.x)<0.025?0.0265-abs(gq.x):abs(gq.x)+0.0265,length(max(abs(vec2(p.y-1.434,gq.z))-vec2(0.122,0.088),0.0)));\n   res=opU(res,vec2(gd,17.0));\n   vec3 tsq=p-vec3(0.215,1.47,0.66);\n   float tv=sdRBox(p-vec3(0.24,1.455,0.80),vec3(0.155,0.142,0.14),0.014);\n   tv=max(tv,-sdRBox(tsq,vec3(0.105,0.08,0.02),0.008));\n   res=opU(res,vec2(tv,7.0));\n   float tg=length(p-vec3(0.215,1.47,0.668+0.8))-0.8;\n   tg=max(tg,sdBox(tsq-vec3(0.0,0.0,0.02),vec3(0.106,0.081,0.03)));\n   res=opU(res,vec2(tg,21.0));\n   float vc=clamp(floor((p.y-1.312)/0.026),0.0,min(floor(1.5+6.0*CLUTTER),5.0));\n   vec3 vq=p-vec3(0.60+0.012*(hash11(vc*5.1+gSeed)-0.5),1.312+(vc+0.5)*0.026,0.86);\n   res=opU(res,vec2(sdBox(vq,vec3(0.094,0.0125,0.0515)),23.0));\n  } else gB=min(gB,bs);\n } else gB=min(gB,bd);\n // gR is the nearest real surface; the march steps by the bounds as well,\n // but shadows and AO must never mistake a bound for a surface\n gR=res.x;\n res.x=min(res.x,gB);\n return res;\n}\n// ---- sunlight through the window and the blinds -----------------------------\n// Fraction of direct sun reaching p. The aperture is the window opening seen\n// along the sun direction; the blinds shadow it with stripes whose width\n// follows from the slat angle (half-width w/2 |sin a - cos a tan(elevation)|)\n// and whose edges blur with distance from the slats.\nfloat sunMask(vec3 p,bool slats) {\n float s=(1.25-p.x)/gL.x;\n if (s<0.0) return 0.0;\n vec3 q=p+gL*s;\n float soft=0.003+0.012*s;\n float ap=smoothstep(-soft,soft,0.6-abs(q.z+0.05))*smoothstep(-soft,soft,0.55-abs(q.y-1.5));\n if (!slats) return ap;\n float s2=max((BLX-p.x)/gL.x,0.0);\n float y2=p.y+gL.y*s2;\n // the gap between two slat shadows is a band of half-width o round the\n // gap centre; blur it as box-filtered coverage so a wide blur tends to the\n // mean open fraction and a closed blind stays closed\n float e=abs(mod(y2+0.5*SP,SP)-0.5*SP);\n float o=max(0.5*SP-0.5*SW*abs(gSa-gCa*gL.y/gL.x),0.0);\n float sf=min(0.0008+0.011*s2,SP);\n float hb=max(o,0.5*sf);\n return ap*max(smoothstep(hb+0.5*sf,hb-0.5*sf,e)*o/hb,0.025);\n}\n// open length of the slat pattern below height y (cumulative)\nfloat slatCum(float y,float hw) {\n float o=0.5*SP-hw;\n float u=mod(y,SP);\n return floor(y/SP)*2.0*o+min(u,o)+max(u-SP+o,0.0);\n}\n// Length of the view ray that lies in direct sun. A point's projection along\n// the sun onto the window is linear in distance along the ray, so the lit\n// stretch is a two-slab intersection, and the slat stripes (also linear in\n// distance) integrate in closed form. Exact, and no sampling noise.\nfloat beamLen(vec3 ro,vec3 rd,float tmax,float g) {\n float kx=1.0/gL.x;\n float s0=0.0,s1=tmax;\n if (rd.x>0.0) s1=min(s1,(1.25-ro.x)/rd.x);\n float ay=ro.y+gL.y*(1.25-ro.x)*kx-1.5,by=rd.y-gL.y*rd.x*kx;\n float az=ro.z+gL.z*(1.25-ro.x)*kx+0.05,bz=rd.z-gL.z*rd.x*kx;\n float hy=0.55+g,hz=0.6+g;\n if (abs(by)<1e-6) { if (abs(ay)>hy) return 0.0; }\n else { float t0=(-hy-ay)/by,t1=(hy-ay)/by; s0=max(s0,min(t0,t1)); s1=min(s1,max(t0,t1)); }\n if (abs(bz)<1e-6) { if (abs(az)>hz) return 0.0; }\n else { float t0=(-hz-az)/bz,t1=(hz-az)/bz; s0=max(s0,min(t0,t1)); s1=min(s1,max(t0,t1)); }\n if (s1<=s0) return 0.0;\n float hw=min(0.5*SW*abs(gSa-gCa*gL.y*kx),0.5*SP);\n float y0=ro.y+gL.y*(BLX-ro.x)*kx;\n float ya=y0+by*s0,yb=y0+by*s1;\n float open=abs(yb-ya)<1e-4?(s1-s0)*step(hw,abs(mod(ya,SP)-0.5*SP))\n         :(slatCum(yb,hw)-slatCum(ya,hw))/by;\n return open+0.025*(s1-s0);\n}\n// light seen looking out through the blinds (for reflections in the glass)\nvec3 windowSeen(vec3 ro,vec3 rd) {\n if (rd.x<=0.0) return vec3(0.0);\n float s=(BLX-ro.x)/rd.x;\n vec3 q=ro+rd*s;\n float w=step(abs(q.z+0.05),0.58)*step(abs(q.y-1.5),0.5);\n float v=abs(mod(q.y,SP)-0.5*SP)/(0.5*SP);\n return gSun*w*(0.18+0.5*smoothstep(0.55,0.9,v));\n}\nvec3 skyOut(vec3 rd) {\n vec3 c=mix(vec3(1.0,0.66,0.36),vec3(0.62,0.52,0.72),smoothstep(0.0,0.6,rd.y));\n c=mix(c,vec3(0.3,0.2,0.18),smoothstep(0.0,-0.12,rd.y));\n float sd=max(dot(rd,gL),0.0);\n return c*(0.5+0.5*SUN)*1.4+gSun*(0.4*pow(sd,40.0)+0.08*pow(sd,4.0));\n}\n// ---- screen programs --------------------------------------------------------\n// pseudo text: word-shaped strokes. x in character cells, y 0..1 in the line.\n// blur (0..1) fades the strokes to their average when they are sub-pixel.\nfloat ptext(vec2 p,float seed,float blur) {\n float c=floor(p.x);\n float on=step(0.2,hash21(vec2(c,seed)));\n float tall=step(0.72,hash21(vec2(c,seed+7.0)));\n float body=step(0.22,p.y)*step(p.y,0.68+0.22*tall)*step(0.0,p.y)*step(p.y,1.0);\n float g=step(0.18,fract(p.x))*step(fract(p.x),0.82);\n return on*mix(body*g,0.28*step(0.15,p.y)*step(p.y,0.85),blur);\n}\nfloat segMask(float d) {\n // seven-segment masks, bit 0 = top, then clockwise, bit 6 = middle\n return d<0.5?63.0:d<1.5?6.0:d<2.5?91.0:d<3.5?79.0:d<4.5?102.0\n  :d<5.5?109.0:d<6.5?125.0:d<7.5?7.0:d<8.5?127.0:111.0;\n}\n// signed distance to a seven-segment digit; x in [-0.5,0.5], y in [-1,1]\nfloat seg7(vec2 p,float mask) {\n p.x-=0.12*p.y;\n float d=1e3;\n for (int i=0; i<7; i++) {\n  float fi=float(i);\n  if (mod(floor(mask/exp2(fi)),2.0)<0.5) continue;\n  vec2 c=fi<0.5?vec2(0.0,1.0):fi<1.5?vec2(0.5,0.5):fi<2.5?vec2(0.5,-0.5)\n   :fi<3.5?vec2(0.0,-1.0):fi<4.5?vec2(-0.5,-0.5):fi<5.5?vec2(-0.5,0.5):vec2(0.0);\n  bool hz=fi<0.5||(fi>2.5&&fi<3.5)||fi>5.5;\n  d=min(d,sdBox2(p-c,hz?vec2(0.34,0.075):vec2(0.075,0.34)));\n }\n return d;\n}\n// Desktop: rolling green hill, icons, taskbar, a browser window whose page\n// loads top to bottom over a modem, and the arrow cursor wandering about.\nvec3 desktop(vec2 s,float t,float fp) {\n t=mod(t,14.0);\n vec2 a=vec2(s.x*1.3333,s.y);\n vec3 col=mix(vec3(0.50,0.72,0.98),vec3(0.10,0.34,0.85),smoothstep(0.25,1.0,s.y));\n float cl=fbm2(vec2(a.x*2.6+0.3,a.y*6.0-1.0));\n col=mix(col,vec3(1.0),smoothstep(0.55,0.78,cl)*smoothstep(0.38,0.75,s.y)*0.95);\n float hy=0.30+0.20*exp(-pow((s.x-0.33)/0.40,2.0))-0.06*s.x;\n float hy2=0.33+0.07*exp(-pow((s.x-0.95)/0.22,2.0));\n if (s.y<max(hy,hy2)) {\n  vec3 g=mix(vec3(0.17,0.42,0.05),vec3(0.45,0.74,0.15),clamp(s.y/hy,0.0,1.0)*0.8+0.2*(1.0-s.x));\n  g=mix(g*0.78+vec3(0.0,0.0,0.04),g,step(s.y,hy));\n  g*=0.88+0.22*noise2(a*vec2(30.0,60.0));\n  col=g;\n }\n float blur=clamp(fp*150.0-0.5,0.0,1.0);\n // icons down the left\n float row=floor((0.97-s.y)/0.13);\n if (s.x<0.09&&row>=0.0&&row<4.0) {\n  vec2 c=vec2(s.x-0.045,0.97-s.y-row*0.13-0.04);\n  vec3 ic=row<0.5?vec3(0.85,0.88,0.95):row<1.5?vec3(0.95,0.8,0.25)\n    :row<2.5?vec3(0.2,0.55,0.95):vec3(0.3,0.75,0.35);\n  col=mix(col,ic*(1.0-5.0*c.y),step(sdBox2(c*vec2(1.333,1.0),vec2(0.025,0.025)),0.0));\n  float lab=step(abs(c.y-0.055),0.009)*step(abs(c.x),0.035);\n  col=mix(col,vec3(1.0),lab*mix(step(0.4,fract(s.x*120.0+row)),0.6,blur));\n }\n // taskbar\n if (s.y<0.055) {\n  float v=s.y/0.055;\n  col=mix(vec3(0.10,0.27,0.80),vec3(0.24,0.46,0.96),smoothstep(0.0,0.9,v))+0.15*smoothstep(0.85,1.0,v);\n  if (s.x<0.12) {\n   col=mix(vec3(0.18,0.52,0.16),vec3(0.36,0.74,0.30),v);\n   col=mix(col,vec3(1.0),ptext(vec2((s.x-0.03)*70.0,(v-0.2)/0.6),3.0,blur)*step(s.x,0.1));\n  }\n  if (s.x>0.14&&s.x<0.36) col=mix(col,vec3(0.30,0.52,0.98),0.7*step(0.12,v)*step(v,0.88));\n  if (s.x>0.85) col=mix(vec3(0.08,0.52,0.92),vec3(0.24,0.68,0.98),v);\n }\n // browser window\n float op=smoothstep(0.8,1.3,t);\n vec2 wh=vec2(0.32,0.36)*mix(0.15,1.0,op);\n vec2 w=s-vec2(0.52,0.55);\n if (op>0.01&&abs(w.x)<wh.x&&abs(w.y)<wh.y) {\n  vec2 u=(w+wh)/(2.0*wh);\n  float ty=1.0-u.y;\n  float load=clamp((t-1.6)/8.0,0.0,1.0);\n  vec3 wc=vec3(0.93,0.92,0.87);\n  if (ty<0.06) {\n   wc=mix(vec3(0.0,0.30,0.86),vec3(0.24,0.55,1.0),0.6*(1.0-ty/0.06)+0.2*u.x);\n   wc=mix(wc,vec3(1.0),ptext(vec2((u.x-0.05)*60.0,(0.05-ty)/0.04),9.0,blur)*step(u.x,0.4)*step(0.05,u.x));\n   float bx=u.x-0.84;\n   if (bx>0.0&&abs(ty-0.03)<0.022&&mod(bx,0.055)<0.045)\n    wc=bx>0.11?vec3(0.85,0.25,0.15):vec3(0.25,0.5,1.0);\n  } else if (ty<0.12) {\n   wc*=0.97;\n   float ib=mod(u.x,0.07);\n   if (ib<0.045&&u.x<0.6&&abs(ty-0.09)<0.02) wc=mix(vec3(0.3,0.55,0.3),vec3(0.3,0.4,0.75),step(0.3,u.x));\n  } else if (ty<0.16) {\n   if (u.x>0.08&&u.x<0.96&&abs(ty-0.14)<0.014) {\n    wc=vec3(1.0);\n    wc=mix(wc,vec3(0.1,0.1,0.4),ptext(vec2((u.x-0.1)*90.0,(0.15-ty)/0.018+0.5),4.0,blur)*step(u.x,0.45));\n   }\n  } else if (ty>0.955) {\n   float seg=floor(u.x*60.0);\n   if (u.x>0.62&&u.x<0.95&&abs(ty-0.977)<0.012&&mod(seg,1.0)==0.0)\n    wc=(u.x-0.62)/0.33<load?vec3(0.1,0.2,0.75):wc*0.9;\n  } else {\n   float pv=(ty-0.16)/0.795;\n   wc=vec3(1.0);\n   if (pv<load) {\n    if (pv<0.17) {\n     wc=mix(vec3(0.08,0.06,0.4),vec3(0.55,0.1,0.55),u.x);\n     wc=mix(wc,vec3(1.0,0.85,0.2),ptext(vec2((u.x-0.25)*22.0,(0.13-pv)/0.1),11.0,blur)*step(0.25,u.x)*step(u.x,0.7));\n    } else if (u.x<0.2) {\n     wc=vec3(0.86,0.9,1.0);\n     float lr=fract((pv-0.2)*22.0);\n     wc=mix(wc,vec3(0.0,0.0,0.8),ptext(vec2((u.x-0.02)*50.0,lr*1.6-0.3),floor((pv-0.2)*22.0),blur)*step(0.2,pv));\n    } else {\n     // an image that comes in interlaced, then lines of text\n     vec2 ib=vec2(u.x-0.62,pv-0.36);\n     if (abs(ib.x)<0.33&&abs(ib.y)<0.15) {\n      float rows=floor(mod(t*6.0,1.0)*1.0);\n      float il=step(0.5,fract(pv*60.0))+step(0.55,load);\n      vec3 img=mix(vec3(0.95,0.5,0.2),vec3(0.2,0.3,0.7),ib.y/0.3+0.5);\n      img=mix(img,vec3(0.1,0.15,0.1),step(ib.y+0.15,0.08+0.05*sin(ib.x*20.0)));\n      wc=mix(vec3(0.75),img,clamp(il+rows,0.0,1.0));\n     } else {\n      float lr=fract((pv-0.53)*26.0);\n      wc=mix(wc,vec3(0.12),ptext(vec2((u.x-0.24)*70.0,lr*1.5-0.25),floor(pv*26.0)+40.0,blur)\n        *step(0.53,pv)*step(u.x,0.95-0.3*step(0.8,hash11(floor(pv*26.0)))));\n     }\n    }\n   }\n  }\n  // bevel\n  float e=min(min(u.x,1.0-u.x),min(u.y,1.0-u.y));\n  col=mix(vec3(0.0,0.25,0.75),wc,step(0.006,e));\n }\n // cursor\n vec2 cp=vec2(0.55+0.3*sin(t*0.45),0.45+0.28*sin(t*0.31+1.0));\n vec2 q=(s-cp)*vec2(1.333,-1.0)/0.04;\n float inA=step(0.0,q.x)*step(q.x,0.62*q.y)*step(q.y,1.0-0.25*q.x);\n vec2 q2=q*1.18+vec2(0.07,0.11);\n float inB=step(0.0,q2.x)*step(q2.x,0.62*q2.y)*step(q2.y,1.0-0.25*q2.x);\n col=mix(col,vec3(0.0),inA);\n col=mix(col,vec3(1.0),inB);\n return col;\n}\n// gem board event j: x first column, y row, z width, w height of the match\nvec4 gemEvent(float j) {\n float h1=hash11(j*0.6180339+0.37);\n float h2=hash11(j*1.3247+4.1);\n float h3=hash11(j*2.2134+7.7);\n bool hz=h1<0.55;\n float w=hz?3.0:1.0,hh=hz?1.0:3.0;\n return vec4(floor(h2*(9.0-w)),floor(h3*h3*(9.0-hh)),w,hh);\n}\n// one faceted gem, q in [-0.5,0.5]^2 of its cell\nvec3 gem(vec2 q,float type,vec3 bg,float flash,float aa) {\n float n=type<0.5?4.0:type<1.5?6.0:type<2.5?4.0:type<3.5?8.0:type<4.5?12.0:type<5.5?3.0:10.0;\n float rt=type<1.5?0.0:type<2.5?PI*0.25:type<4.5?PI/8.0:type<5.5?-PI*0.5:0.0;\n vec3 gc=type<0.5?vec3(1.0,0.12,0.15):type<1.5?vec3(1.0,0.5,0.08):type<2.5?vec3(1.0,0.88,0.12)\n   :type<3.5?vec3(0.15,0.95,0.3):type<4.5?vec3(0.15,0.45,1.0):type<5.5?vec3(0.85,0.25,1.0):vec3(0.92);\n vec2 p=q;\n if (type>1.5&&type<2.5) p.x/=0.78;\n if (type>4.5&&type<5.5) p.y+=0.06;\n float R=0.39*(1.0-0.5*flash);\n float sec=TAU/n;\n float an=atan(p.y,p.x)+rt;\n float k=floor(an/sec+0.5);\n float al=an-k*sec;\n float rin=R*cos(PI/n);\n float rr=length(p);\n float d=(type>3.5&&type<4.5)||type>5.5?rr-rin:rr*cos(al)-rin;\n float fa=k*sec-rt;\n float sh=0.55+0.45*dot(vec2(cos(fa),sin(fa)),vec2(-0.6,0.8));\n float table=step(rr*cos(al),rin*0.5);\n vec3 c=gc*mix(sh,1.08,table);\n c+=vec3(1.0)*0.8*smoothstep(0.06,0.0,length(p-vec2(-0.1,0.12)*R/0.39));\n c=mix(c,gc*0.35,smoothstep(-0.05,0.0,d));\n c=mix(c,vec3(1.0),flash*0.8);\n vec3 o=mix(bg,c,smoothstep(aa,-aa,d));\n return o+gc*flash*0.6*exp(-max(d,0.0)*12.0);\n}\n// Gem-matching game: a board of gems where matches of three flash and the\n// column above drops in. Every twelfth event the board clears and refills.\nvec3 gems(vec2 s,float t,float fp) {\n vec2 a=s*vec2(4.0,3.0);\n float nb=fbm2(a*1.2+vec2(t*0.03,0.0));\n vec3 col=mix(vec3(0.05,0.02,0.12),vec3(0.42,0.14,0.5),nb*nb*1.6);\n col+=vec3(0.15,0.25,0.6)*pow(fbm2(a*2.7-3.0),3.0);\n float EV=1.1;\n float uu=t/EV;\n float jn=floor(uu);\n float e=(uu-jn)*EV;\n float E=floor(jn/12.0);\n float j0=E*12.0;\n // left panel: score, the big level orb\n vec2 lp=a-vec2(0.62,1.5);\n float pnl=sdBox2(lp,vec2(0.48,1.3))-0.04;\n if (pnl<0.0) {\n  col=mix(vec3(0.08,0.08,0.2),vec3(0.22,0.2,0.42),s.y);\n  vec2 sb=lp-vec2(0.0,0.95);\n  if (sdBox2(sb,vec2(0.4,0.13))<0.0) {\n   col=vec3(0.02,0.01,0.03);\n   float score=(jn-E*2.0)*30.0+150.0*E;\n   float dc=floor((sb.x+0.4)/0.135);\n   float dig=mod(floor(score/pow(10.0,5.0-dc)),10.0);\n   float sd=seg7(vec2(mod(sb.x+0.4,0.135)-0.0675,sb.y)/vec2(0.135*0.8,0.1*0.9),segMask(dig));\n   col=mix(col,vec3(1.0,0.7,0.2),smoothstep(0.08,0.0,sd)*step(dc,5.5));\n  }\n  float lvl=clamp((jn-j0+e/EV)/12.0,0.0,1.0);\n  vec2 oq=lp-vec2(0.0,-0.65);\n  float od=length(oq)-0.36;\n  if (od<0.0) {\n   vec3 oc=mix(vec3(0.25,0.05,0.4),vec3(0.85,0.3,1.0),step(oq.y/0.36*0.5+0.5,lvl));\n   oc*=0.6+0.6*(1.0-length(oq-vec2(-0.1,0.12))/0.45);\n   col=oc+vec3(1.0)*smoothstep(0.08,0.0,length(oq-vec2(-0.12,0.16)));\n  }\n  col=mix(col,vec3(0.7,0.75,0.95),smoothstep(0.025,0.0,abs(od)));\n }\n col=mix(col,vec3(0.75,0.78,0.95),smoothstep(0.03,0.0,abs(pnl)));\n vec2 bo=vec2(1.24,0.16);\n float cs=0.335;\n vec2 bp=(a-bo)/cs;\n float frame=sdBox2(bp-4.0,vec2(4.0));\n col=mix(col,vec3(0.7,0.72,0.9),smoothstep(0.1,0.0,abs(frame-0.05)));\n if (frame<0.0) {\n  vec2 cc=floor(bp);\n  vec3 bg=mix(vec3(0.07,0.05,0.16),vec3(0.13,0.11,0.26),mod(cc.x+cc.y,2.0))+col*0.15;\n  float c=cc.x;\n  float y=bp.y;\n  float yoff=0.0,flash=0.0,kfloor=0.0;\n  float jl=jn;\n  if (jn-j0<0.5) {\n   float f=clamp((e-c*0.05)/0.7,0.0,1.0);\n   yoff=9.0*(1.0-f*f);\n   jl=jn-1.0;\n  } else {\n   vec4 ev=gemEvent(jn);\n   bool inCol=c>=ev.x&&c<ev.x+ev.z;\n   if (e<0.35) {\n    jl=jn-1.0;\n    if (inCol&&y>=ev.y&&y<ev.y+ev.w) flash=e/0.35;\n   } else if (inCol&&y>=ev.y) {\n    float f=clamp((e-0.35)/0.35,0.0,1.0);\n    yoff=ev.w*(1.0-f*f);\n    kfloor=ev.y;\n   }\n  }\n  float yy=y-yoff;\n  float r=floor(yy);\n  vec3 g=bg;\n  if (yy>=0.0&&r>=kfloor) {\n   float m=r;\n   for (int i=0; i<12; i++) {\n    float j=jl-float(i);\n    if (j<j0+0.5) break;\n    vec4 ev=gemEvent(j);\n    if (c>=ev.x&&c<ev.x+ev.z&&m>=ev.y) m+=ev.w;\n   }\n   float type=floor(hash21(vec2(c*7.31+E*13.7,m*3.17+E*1.91))*7.0);\n   g=gem(vec2(fract(bp.x),fract(yy))-0.5,type,bg,flash,max(fp*4.0/cs*1.5,0.02));\n  }\n  col=g;\n }\n return col;\n}\n// the starfield screensaver: layers of stars rushing out of the middle,\n// each trailing a short streak back toward the centre\nvec3 starfield(vec2 s,float t) {\n vec2 c=(s-0.5)*vec2(1.3333,1.0);\n vec3 col=vec3(0.0);\n for (int i=0; i<8; i++) {\n  float fi=float(i);\n  float z=fract((fi+1.0)/8.0-t*0.12);\n  float zz=mix(0.03,1.0,z);\n  vec2 off=vec2(fi*7.31,fi*3.17);\n  vec2 p=c*zz*7.0+off;\n  vec2 cell=floor(p);\n  vec2 h=hash22(cell+fi*13.1);\n  vec2 sp=cell+0.2+0.6*h;\n  vec2 dv=(p-sp)/(zz*7.0);\n  vec2 rdir=normalize((sp-off)/(zz*7.0)+1e-4);\n  float along=dot(dv,rdir);\n  float L=0.06*(1.0-z)*(1.0-z);\n  float d=length(vec2(dot(dv,vec2(-rdir.y,rdir.x)),max(abs(along+0.5*L)-0.5*L,0.0)));\n  float sz=0.0022+0.004*(1.0-z);\n  float b=smoothstep(sz,0.0,d)*smoothstep(1.0,0.8,z);\n  col+=b*(0.6+0.9*(1.0-z))*mix(vec3(0.8,0.88,1.0),vec3(1.0,0.95,0.85),h.y);\n }\n return col;\n}\nvec2 bounce(float t,float seed) {\n vec2 sp=vec2(0.16+0.12*hash11(seed+0.3),0.14+0.1*hash11(seed+0.7));\n return abs(fract(t*sp+hash22(vec2(seed,3.0)))*2.0-1.0)*vec2(1.3333,1.0);\n}\nfloat segD(vec2 p,vec2 a,vec2 b) {\n vec2 pa=p-a,ba=b-a;\n return length(pa-ba*clamp(dot(pa,ba)/dot(ba,ba),0.0,1.0));\n}\n// Mystify: two bouncing quadrilaterals, each dragging a trail of copies\nvec3 mystify(vec2 s,float t,float fp) {\n vec2 a=s*vec2(1.3333,1.0);\n vec3 col=vec3(0.0);\n float w=max(0.0035,fp*1.2);\n for (int q=0; q<2; q++) {\n  float fq=float(q);\n  vec3 qc=0.55+0.45*cos(TAU*(t*0.04+fq*0.45+vec3(0.0,0.33,0.67)));\n  for (int k=0; k<6; k++) {\n   float tk=t-float(k)*0.11;\n   vec2 v0=bounce(tk,fq*4.0+1.0),v1=bounce(tk,fq*4.0+2.0);\n   vec2 v2=bounce(tk,fq*4.0+3.0),v3=bounce(tk,fq*4.0+4.0);\n   float d=min(min(segD(a,v0,v1),segD(a,v1,v2)),min(segD(a,v2,v3),segD(a,v3,v0)));\n   col=max(col,qc*(1.0-float(k)*0.15)*smoothstep(w,w*0.3,d));\n  }\n }\n return col*1.3;\n}\n// The tube: barrel distortion, the selected program, scanlines that fade out\n// once they are finer than a pixel, phosphor vignette.\nvec3 crt(vec2 s0,float fp) {\n vec2 c=s0*2.0-1.0;\n c*=1.0+0.04*dot(c,c);\n vec2 s=c*0.5+0.5;\n float inside=smoothstep(0.0,0.006,s.x)*smoothstep(1.0,0.994,s.x)*smoothstep(0.0,0.008,s.y)*smoothstep(1.0,0.992,s.y);\n if (inside<=0.0) return vec3(0.0);\n vec3 col;\n if (gMode<0.5) col=desktop(s,gMT,fp);\n else if (gMode<1.5) col=gems(s,gMT,fp);\n else if (gMode<2.5) col=starfield(s,gMT);\n else col=mystify(s,gMT,fp);\n float lp=fp*300.0;\n col*=1.0-SCANLINES*0.45*(0.5+0.5*cos(s.y*300.0*TAU))*smoothstep(0.7,0.3,lp);\n // a soft roll bar\n col*=1.0-0.06*smoothstep(0.08,0.0,abs(fract(s.y-gMT*0.13)-0.5));\n col*=1.0-0.3*pow(dot(c,c)*0.5,2.0);\n return col*inside*gFade;\n}\n// The little TV on the shelf is playing an 8-bit platformer.\nvec3 tvGame(vec2 s,float t) {\n vec2 px=floor(s*vec2(80.0,60.0));\n float x=px.x+floor(t*18.0);\n vec3 col=vec3(0.38,0.55,1.0);\n float cxl=mod(x*0.5,48.0);\n if (abs(px.y-46.0)<3.0&&abs(cxl-20.0)<7.0-abs(px.y-46.0)) col=vec3(1.0);\n float hh=16.0+floor(5.0*sin(x*0.045)+2.5*sin(x*0.13));\n if (px.y<hh) col=vec3(0.12,0.62,0.22)*(0.9+0.1*mod(px.x+px.y,2.0));\n if (px.y<9.0) {\n  float by=mod(px.y,4.0);\n  float bx=mod(x+4.0*mod(floor(px.y/4.0),2.0),8.0);\n  col=(by<0.5||bx<0.5)?vec3(0.25,0.1,0.05):vec3(0.8,0.38,0.15);\n }\n float bk=mod(x,44.0);\n if (px.y>=24.0&&px.y<29.0&&bk>=12.0&&bk<27.0)\n  col=mod(bk-12.0,5.0)<0.5||px.y<24.5?vec3(0.3,0.12,0.0):vec3(1.0,0.72,0.1);\n float jy=9.0+floor(max(0.0,sin(t*3.1))*14.0);\n if (px.x>=20.0&&px.x<24.0&&px.y>=jy&&px.y<jy+7.0)\n  col=px.y-jy<3.0?vec3(0.2,0.3,0.9):px.y-jy<5.0?vec3(0.95,0.15,0.1):vec3(1.0,0.78,0.6);\n float sc=0.85+0.15*cos(s.y*120.0*TAU);\n vec2 c=s*2.0-1.0;\n return col*sc*(1.0-0.35*pow(dot(c,c)*0.5,2.0))*(0.92+0.08*hash21(px+floor(t*30.0)));\n}\n// ---- posters ----------------------------------------------------------------\nfloat glyph(vec2 p,float seed) {\n if (p.x<0.1||p.x>0.9||p.y<0.1||p.y>0.9) return 0.0;\n vec2 g=floor((p-0.1)/0.8*vec2(3.0,5.0));\n float h=hash21(vec2(seed,g.x+g.y*3.0));\n return step(g.x==1.0?0.55:0.3,h);\n}\nvec3 poster(vec2 u,float id,float fp) {\n vec3 col;\n if (id<0.5) {\n  // fantasy game poster: dusk sky, big moon, a castle, title in gold\n  col=mix(vec3(0.75,0.22,0.12),vec3(0.08,0.05,0.22),smoothstep(0.1,0.85,u.y));\n  float md=length((u-vec2(0.6,0.6))*vec2(1.0,1.5))-0.25;\n  col=mix(col,vec3(1.0,0.92,0.75)*(0.85+0.15*noise2(u*18.0)),smoothstep(0.01,0.0,md));\n  float cx=u.x;\n  float h=0.18+0.03*sin(cx*40.0);\n  h=max(h,0.34*step(abs(cx-0.62),0.05));\n  h=max(h,0.28*step(abs(cx-0.8),0.04));\n  h=max(h,0.26*step(abs(cx-0.45),0.12));\n  h=max(h,step(abs(cx-0.32),0.06)*(0.42+(0.06-abs(cx-0.32))*2.2));\n  h=max(h,step(abs(cx-0.62),0.05)*(0.34+(0.05-abs(cx-0.62))*2.2));\n  h+=0.012*step(0.5,fract(cx*50.0))*step(h,0.3);\n  col=mix(col,vec3(0.03,0.02,0.05),step(u.y,h));\n  col=mix(col,vec3(1.0,0.8,0.2),step(0.3,hash21(floor(u*vec2(60.0,80.0))))*step(u.y,h)*step(0.995,hash21(floor(u*vec2(60.0,80.0))+3.0)));\n  vec2 tp=vec2((u.x-0.12)/0.76*7.0,(u.y-0.85)/0.1);\n  if (tp.x>0.0&&tp.x<7.0&&tp.y>0.0&&tp.y<1.0)\n   col=mix(col,vec3(1.0,0.78,0.2),glyph(fract(tp),floor(tp.x)+10.0));\n } else if (id<1.5) {\n  // band poster: halftone on hot pink, three silhouettes, title band\n  col=vec3(0.95,0.2,0.45);\n  vec2 hp=u*vec2(30.0,45.0);\n  float dr=0.18+0.25*u.y;\n  col=mix(col,vec3(0.55,0.05,0.3),smoothstep(dr,dr-0.08,length(fract(hp)-0.5))*(1.0-smoothstep(0.3,0.8,fp*45.0)));\n  float fig=1e3;\n  for (int i=0; i<3; i++) {\n   float fi=float(i);\n   vec2 c=vec2(0.22+0.28*fi,0.5+0.04*(1.0-abs(fi-1.0)));\n   fig=min(fig,length((u-c)*vec2(1.0,0.75))-0.075);\n   fig=min(fig,sdBox2(u-vec2(c.x,c.y-0.3),vec2(0.13,0.22))-0.04);\n  }\n  col=mix(col,vec3(0.04,0.02,0.05),step(fig,0.0));\n  if (u.y>0.8) {\n   col=vec3(0.05);\n   vec2 tp=vec2((u.x-0.1)/0.8*5.0,(u.y-0.83)/0.13);\n   if (tp.x>0.0&&tp.x<5.0) col=mix(col,vec3(1.0),glyph(fract(tp),floor(tp.x)+30.0));\n  }\n } else if (id<2.5) {\n  // space poster: ringed planet over a starfield\n  col=mix(vec3(0.02,0.03,0.12),vec3(0.15,0.05,0.25),u.y);\n  col+=vec3(1.0)*step(0.985,hash21(floor(u*vec2(120.0,90.0))))*0.8;\n  vec2 pc=(u-vec2(0.55,0.52))*vec2(1.4,1.0);\n  float pd=length(pc)-0.26;\n  vec3 pcol=mix(vec3(0.95,0.6,0.25),vec3(0.6,0.3,0.15),0.5+0.5*sin(pc.y*40.0+sin(pc.x*9.0)));\n  pcol*=0.5+0.7*clamp(dot(normalize(vec3(pc,sqrt(max(0.0,0.0676-dot(pc,pc))))),normalize(vec3(-0.6,0.5,0.6))),0.0,1.0);\n  vec2 rc=rot(-0.35)*pc;\n  float ring=abs(length(rc*vec2(1.0,3.6))-0.4);\n  float front=step(0.0,-rc.y);\n  col=mix(col,pcol,step(pd,0.0));\n  col=mix(col,vec3(0.9,0.82,0.65),smoothstep(0.05,0.03,ring)*max(front,step(0.0,pd)));\n  if (u.y<0.16) {\n   vec2 tp=vec2((u.x-0.15)/0.7*6.0,(u.y-0.04)/0.09);\n   if (tp.x>0.0&&tp.x<6.0) col=mix(col,vec3(0.6,0.9,1.0),glyph(fract(tp),floor(tp.x)+50.0));\n  }\n } else {\n  // racing poster: speed stripes and a low sports car\n  col=mix(vec3(1.0,0.85,0.15),vec3(0.95,0.3,0.1),u.y);\n  float st=fract((u.x+u.y*0.6)*5.0);\n  col=mix(col,vec3(0.1,0.05,0.05),step(0.75,st)*step(u.y,0.75));\n  vec2 cp=u-vec2(0.5,0.33);\n  float car=sdBox2(cp,vec2(0.38,0.05))-0.03;\n  car=min(car,sdBox2(cp-vec2(0.02,0.08),vec2(0.17,0.035))-0.04);\n  col=mix(col,vec3(0.8,0.05,0.05),step(car,0.0));\n  col=mix(col,vec3(0.4,0.6,0.8),step(sdBox2(cp-vec2(0.03,0.095),vec2(0.13,0.02))-0.02,0.0));\n  float wh=min(length(cp-vec2(-0.24,-0.06)),length(cp-vec2(0.25,-0.06)))-0.07;\n  col=mix(col,vec3(0.03),step(wh,0.0));\n  col=mix(col,vec3(0.7),step(wh,-0.04));\n  if (u.y>0.82) {\n   vec2 tp=vec2((u.x-0.08)/0.84*6.0,(u.y-0.85)/0.11);\n   if (tp.x>0.0&&tp.x<6.0) col=mix(col,vec3(0.05),glyph(fract(tp),floor(tp.x)+70.0));\n  }\n }\n float b=min(min(u.x,1.0-u.x),min(u.y,1.0-u.y));\n col=mix(vec3(0.93,0.91,0.86),col,step(0.025,b));\n // pins / tape at the corners\n vec2 cn=abs(u-0.5);\n col=mix(col,vec3(0.85,0.85,0.75),step(length(cn-vec2(0.47,0.47)),0.025)*0.8);\n return col;\n}\n// ---- surface shading ---------------------------------------------------------\n// coverage of a line of half-width w at distance d, box-filtered by the pixel\nfloat ln(float d,float w,float fp) {\n float hw=max(w,fp*0.5);\n return smoothstep(hw+fp*0.5,hw-fp*0.5,abs(d))*min(1.0,w/hw);\n}\nvec3 spectral(float w) {\n // wavelength in nm -> rough rgb\n float x=(w-400.0)/300.0;\n vec3 c=vec3(max(1.0-pow((x-0.85)/0.32,2.0),0.0)+0.35*max(1.0-pow((x-0.02)/0.1,2.0),0.0),\n    1.0-pow((x-0.5)/0.28,2.0),\n    1.0-pow((x-0.15)/0.28,2.0));\n return clamp(c,0.0,1.0)*step(0.0,x)*step(x,1.0);\n}\nvec3 shade(vec3 pw,vec3 n,vec3 rd,float m,float sh,float ao,float t,float pix) {\n vec3 p=pw;\n if (m<1.5||(m>3.5&&m<11.5)||m>16.5) p.x*=gS;\n vec3 alb=vec3(0.5);\n float spec=0.1,gloss=30.0;\n vec3 emit=vec3(0.0);\n bool slatsOn=true;\n float fp=pix*t;\n if (m<1.5) {\n  // laminate, grain along the panel\n  vec2 gp=abs(n.y)>0.5?p.xz:abs(n.z)>0.5?p.xy:p.yz;\n  float g=noise2(vec2(gp.x*3.0,gp.y*70.0)+3.0*fbm2(gp*vec2(2.0,6.0)));\n  alb=mix(ramp3(vec3(0.7,0.58,0.42),vec3(0.55,0.38,0.22),vec3(0.2,0.11,0.06),WOOD),\n    ramp3(vec3(0.88,0.78,0.6),vec3(0.74,0.56,0.36),vec3(0.34,0.2,0.12),WOOD),g);\n  alb*=0.9+0.1*fbm2(gp*20.0);\n  if (p.z>0.93) alb*=0.7;\n  spec=0.35; gloss=50.0;\n } else if (m<2.5) {\n  alb=hueRot(vec3(0.58,0.68,0.72),WALL_HUE*TAU);\n  alb*=0.95+0.05*noise2(p.xy*60.0+p.z*40.0);\n  if (n.z<-0.5) {\n   // posters on the back wall\n   vec2 w=p.xy;\n   vec4 P0=vec4(-1.2,1.40,0.28,0.42);\n   vec4 P1=vec4(1.03,1.30,0.17,0.28);\n   vec4 P2=vec4(-0.25,2.16,0.37,0.27);\n   vec4 P3=vec4(-1.92,1.58,0.29,0.37);\n   vec4 pr=w.x>0.5?P1:w.y>1.84&&w.x>-0.85?P2:w.x>-1.6?P0:P3;\n   float pid=mod((w.x>0.5?1.0:w.y>1.84&&w.x>-0.85?2.0:w.x>-1.6?0.0:3.0)+gSeed,4.0);\n   vec2 u=(w-pr.xy)/(2.0*pr.zw)+0.5;\n   if (u.x>0.0&&u.x<1.0&&u.y>0.0&&u.y<1.0)\n    alb=poster(u,pid,fp/(2.0*pr.w))*0.85;\n  }\n  if (p.y<0.09) alb=vec3(0.86,0.85,0.82);\n  spec=0.05;\n } else if (m<3.5) {\n  alb=vec3(0.40,0.37,0.34)*(0.8+0.4*noise2(p.xz*300.0)*noise2(p.xz*37.0+5.0));\n  spec=0.0;\n } else if (m<4.5) {\n  // beige plastic, and the details moulded or printed on it\n  alb=ramp3(vec3(0.86,0.86,0.84),vec3(0.80,0.76,0.66),vec3(0.78,0.65,0.42),YELLOWING)*(0.96+0.04*noise2(p.xy*200.0));\n  spec=0.25; gloss=25.0;\n  if (n.z<-0.6) {\n   vec2 pn=rot(0.12)*vec2(p.x-MX-0.168,p.y-1.152);\n   if (CLUTTER>0.55&&abs(p.x-MX)<0.21&&p.z<0.5&&max(abs(pn.x),abs(pn.y))<0.036) {\n    // a yellow sticky note with a scrawled reminder\n    alb=vec3(1.0,0.86,0.3)*(1.0-0.15*step(pn.y,-0.03));\n    float lr=fract((0.02-pn.y)*90.0);\n    alb=mix(alb,vec3(0.15,0.2,0.55),0.8*ptext(vec2((pn.x+0.03)*220.0,lr*1.7-0.35),floor((0.02-pn.y)*90.0)+60.0,clamp(fp*300.0-0.5,0.0,1.0))*step(abs(pn.x),0.028)*step(pn.y,0.024)*step(-0.028,pn.y));\n    spec=0.05;\n   } else if (abs(p.x-MX)<0.21&&p.z<0.5&&p.y<0.87) {\n    // monitor chin: badge, buttons, power LED\n    vec2 c=vec2(p.x-MX,p.y-0.84);\n    alb*=1.0-0.12*step(abs(c.y-0.006),0.0015)*step(abs(c.x),0.19);\n    float bt=sdBox2(vec2(mod(c.x+0.2,0.025)-0.0125,c.y+0.012),vec2(0.008,0.004));\n    alb=mix(alb,alb*0.75,step(bt,0.0)*step(0.06,c.x));\n    alb=mix(alb,vec3(0.15),step(sdBox2(c-vec2(0.0,0.022),vec2(0.035,0.007)),0.0));\n    float led=length(c-vec2(0.165,-0.012));\n    emit+=vec3(0.2,1.0,0.2)*2.0*smoothstep(0.004,0.0015,led);\n   } else if (p.x>0.48&&p.z<0.47) {\n    // tower front: CD-ROM, blank bay, floppy, power, LEDs, vents, badge\n    vec2 c=vec2(p.x-0.58,p.y);\n    float cd=sdBox2(c-vec2(0.0,1.105),vec2(0.072,0.019));\n    alb=mix(alb,vec3(0.70,0.68,0.61),step(cd,0.0));\n    alb*=1.0-0.55*ln(cd,0.0012,fp);\n    alb*=1.0-0.6*ln(c.y-1.099,0.0007,fp)*step(abs(c.x),0.066);\n    alb=mix(alb,vec3(0.45,0.44,0.4),step(sdBox2(c-vec2(0.052,1.092),vec2(0.008,0.0035)),0.0));\n    emit+=vec3(1.0,0.5,0.1)*1.5*step(length(c-vec2(-0.058,1.092)),0.0018)*step(0.5,fract(gMT*0.23));\n    float bay=sdBox2(c-vec2(0.0,1.058),vec2(0.072,0.019));\n    alb*=1.0-0.45*ln(bay,0.0011,fp);\n    float fl=sdBox2(c-vec2(0.0,1.01),vec2(0.05,0.01));\n    alb=mix(alb,vec3(0.70,0.68,0.61),step(fl,0.0));\n    alb*=1.0-0.55*ln(fl,0.0011,fp);\n    alb=mix(alb,vec3(0.08),ln(c.y-1.013,0.0016,fp)*step(abs(c.x+0.006),0.036));\n    alb=mix(alb,vec3(0.5,0.48,0.44),step(sdBox2(c-vec2(0.036,1.004),vec2(0.007,0.0028)),0.0));\n    float pb=length(c-vec2(0.0,0.87))-0.016;\n    alb=mix(alb,alb*0.82,step(pb,0.0));\n    alb*=1.0-0.45*ln(pb,0.0012,fp);\n    emit+=vec3(0.2,1.0,0.25)*2.0*smoothstep(0.0035,0.0018,length(c-vec2(-0.03,0.83)));\n    float hdd=step(0.55,hash11(floor(gMT*14.0)))*step(0.3,fract(gMT*0.37));\n    emit+=vec3(1.0,0.6,0.1)*2.5*hdd*smoothstep(0.0035,0.0018,length(c-vec2(0.03,0.83)));\n    // badge\n    float bg=sdBox2(c-vec2(0.0,0.94),vec2(0.03,0.009));\n    alb=mix(alb,vec3(0.55,0.56,0.6),step(bg,0.0));\n    alb=mix(alb,vec3(0.1,0.25,0.6),step(bg,0.0)*step(abs(c.y-0.94),0.003));\n    // bezel seam and vents\n    alb*=1.0-0.4*ln(sdBox2(c-vec2(0.0,0.96),vec2(0.085,0.2)),0.0008,fp);\n    alb*=1.0-0.45*step(c.y,0.8)*step(0.765,c.y)*mix(step(0.55,fract(c.y*160.0)),0.45,clamp(fp*320.0-0.5,0.0,1.0))*step(abs(c.x),0.06);\n   } else if (p.y>0.75&&p.y<0.985&&p.z<0.535&&(abs(p.x+0.47)<0.06||abs(p.x-0.21)<0.06)) {\n    // speaker grilles and the little cone\n    vec2 c=vec2(p.x-(p.x<-0.13?-0.47:0.21),p.y-0.865);\n    float gr=sdBox2(c-vec2(0.0,0.01),vec2(0.042,0.085))-0.004;\n    vec2 gd=fract(c*260.0)-0.5;\n    float holes=mix(step(length(gd),0.3),0.3,clamp(fp*260.0-0.3,0.0,1.0));\n    alb=mix(alb,mix(vec3(0.22,0.21,0.2),alb*0.6,holes),step(gr,0.0));\n    alb=mix(alb,vec3(0.1),step(abs(length(c-vec2(0.0,0.03))-0.03),0.002));\n   }\n  }\n  if (p.y>0.754&&p.y<0.79&&length(p.xz-vec2(0.31,0.30))<0.07) {\n   // mouse buttons split\n   vec3 mo=p-vec3(0.31,0.753,0.30);\n   mo.xz=rot(0.25)*mo.xz;\n   alb*=1.0-0.4*step(abs(mo.x),0.0008)*step(0.01,-mo.z);\n   alb*=1.0-0.4*step(abs(mo.z+0.012),0.0008);\n  }\n } else if (m<5.5) {\n  // CRT face: glass over the phosphor\n  vec2 su=vec2(gS*(p.x-MX)/0.32+0.5,(p.y-SCY)/0.24+0.5);\n  emit=crt(su,fp/0.24)*1.35*GLOW;\n  alb=vec3(0.02,0.025,0.022);\n  vec3 r=reflect(rd,n);\n  float fr=0.04+0.5*pow(1.0-max(dot(-rd,n),0.0),5.0);\n  emit+=windowSeen(pw,r)*fr*0.6+vec3(0.05,0.05,0.07)*fr;\n  spec=0.6; gloss=120.0;\n  slatsOn=true;\n } else if (m<6.5) {\n  float jc=floor((p.x+0.77)/0.0104);\n  float h=hash11(jc*1.71+0.3+gSeed*0.37);\n  vec3 sp=h<0.35?vec3(0.06):0.5+0.5*cos(TAU*(h*2.3+vec3(0.0,0.33,0.67)));\n  alb=n.z<-0.5||(p.y<0.8&&n.y>0.5)?sp:vec3(0.15,0.15,0.17);\n  if (n.z<-0.5) alb=mix(alb,vec3(0.95),0.6*step(abs(fract((p.x+0.77)/0.0104)-0.5),0.12)*step(abs(p.y-1.37),0.035));\n  spec=0.5; gloss=80.0;\n } else if (m<7.5) {\n  alb=vec3(0.06,0.06,0.065);\n  spec=0.3; gloss=40.0;\n  if (p.x>0.33&&p.x<0.39&&p.z<0.67&&p.y>1.36&&p.y<1.56) {\n   // TV knobs\n   float kb=min(length(vec2(p.x-0.36,p.y-1.52)),length(vec2(p.x-0.36,p.y-1.47)))-0.012;\n   alb=mix(alb,vec3(0.3),step(kb,0.0));\n   alb=mix(alb,vec3(0.6,0.6,0.55),step(length(vec2(p.x-0.36,p.y-1.40)),0.006));\n  }\n } else if (m<8.5) {\n  // no-name cola: red can, silver band, a yellow roundel facing the room\n  bool c2=length(p.xz-gCan2)<length(p.xz-gCan);\n  vec3 cq=p-vec3(c2?gCan2.x:gCan.x,0.8115,c2?gCan2.y:gCan.y);\n  float an=atan(cq.z,cq.x);\n  alb=c2?vec3(0.08,0.22,0.6):vec3(0.72,0.05,0.06);\n  alb=mix(alb,vec3(0.82,0.82,0.86),step(abs(cq.y+0.036),0.007));\n  vec2 rq=vec2((an+2.3)*0.033,cq.y-0.012);\n  float rd0=length(rq)-0.018;\n  alb=mix(alb,vec3(1.0,0.8,0.15),step(rd0,0.0));\n  alb=mix(alb,vec3(0.95),step(abs(rd0+0.004),0.0015));\n  alb=mix(alb,vec3(0.95),ptext(vec2(an*9.0,(cq.y+0.022)/0.012),21.0,0.0)*step(abs(an+2.3),0.9));\n  if (cq.y>0.055||cq.y<-0.058) alb=vec3(0.6,0.6,0.62);\n  spec=0.8; gloss=60.0;\n } else if (m<9.5) {\n  vec3 uq=p-vec3(gMug.x,0.797,gMug.y);\n  alb=vec3(0.92,0.9,0.86);\n  if (uq.y<0.033&&length(uq.xz)<0.0355) alb=vec3(0.12,0.06,0.03);\n  // \"I (heart) my computer\"\n  float an=atan(uq.x,-uq.z);\n  vec2 hu=vec2(an*0.04,uq.y-0.004);\n  if (length(uq.xz)>0.038) {\n   vec2 hq=(hu-vec2(0.0,-0.011))/0.022;\n   hq.x=abs(hq.x);\n   float hd=hq.y+hq.x>1.0?length(hq-vec2(0.25,0.75))-0.35355\n     :sqrt(min(dot(hq-vec2(0.0,1.0),hq-vec2(0.0,1.0)),\n        dot(hq-0.5*max(hq.x+hq.y,0.0),hq-0.5*max(hq.x+hq.y,0.0))))*sign(hq.x-hq.y);\n   alb=mix(alb,vec3(0.85,0.05,0.12),step(hd,0.0));\n   alb=mix(alb,vec3(0.1),ptext(vec2((hu.x+0.03)*300.0,(hu.y-0.017)/0.008),81.0,0.0)*step(abs(hu.x),0.03)*step(0.017,hu.y));\n   alb=mix(alb,vec3(0.1),ptext(vec2((hu.x+0.035)*300.0,(hu.y+0.024)/0.008),82.0,0.0)*step(abs(hu.x),0.035)*step(hu.y,-0.016));\n  }\n  spec=0.5; gloss=60.0;\n } else if (m<10.5) {\n  // lava lamp: wax blobs rising and sinking in red liquid, lit from below\n  vec2 lq=vec2(p.x-LX,p.y-0.87);\n  float f=0.0;\n  for (int i=0; i<5; i++) {\n   float fi=float(i);\n   float ph=gMT*0.0+TIME*(0.035+0.025*hash11(fi+0.5))+hash11(fi*3.3+1.0);\n   vec2 bc=vec2(0.012*sin(TIME*0.3+fi*2.0),0.02+0.19*(0.5-0.5*cos(ph*TAU)));\n   float br=0.011+0.008*hash11(fi*7.7+2.0);\n   vec2 dd=lq-bc;\n   f+=br*br/(dot(dd,dd)+1e-5);\n  }\n  f+=0.0004/(lq.y*lq.y+0.0001);\n  float blob=smoothstep(0.8,1.3,f);\n  emit=mix(vec3(0.75,0.1,0.04),vec3(1.0,0.6,0.12)*1.7,blob)*(0.6+0.4*smoothstep(0.25,0.0,lq.y))*LAVA*1.4;\n  alb=vec3(0.05);\n  spec=0.8; gloss=90.0;\n } else if (m<11.5) {\n  alb=vec3(0.28,0.26,0.24);\n  spec=1.0; gloss=40.0;\n  emit+=vec3(1.0,0.4,0.1)*0.25*LAVA*smoothstep(0.75+0.14,0.75+0.115,p.y)*smoothstep(0.75+0.08,0.75+0.12,p.y);\n } else if (m<12.5) {\n  // blinds: lit through from outside\n  alb=vec3(0.92,0.88,0.8);\n  emit=gSun*0.12*sunMask(p-vec3(0.03,0.0,0.0),false)*(0.5+0.5*max(n.y,0.0));\n  slatsOn=false;\n  spec=0.1;\n } else if (m<13.5) {\n  alb=vec3(0.88,0.87,0.84);\n  spec=0.15;\n  if (p.x>1.19&&abs(p.y-2.02)<0.023) slatsOn=false;\n } else if (m<14.5) {\n  // plaid blanket\n  vec2 bp=abs(n.y)>0.5?p.xz:abs(n.x)>0.5?p.zy:p.xy;\n  vec2 f=fract(bp/0.14);\n  float a1=step(0.5,f.x),a2=step(0.5,f.y);\n  alb=mix(vec3(0.84,0.78,0.62),vec3(0.18,0.22,0.36),(a1+a2)*0.5);\n  alb=mix(alb,vec3(0.55,0.12,0.1),0.6*max(step(abs(f.x-0.75),0.03),step(abs(f.y-0.75),0.03)));\n  alb*=0.85+0.15*noise2(bp*300.0);\n  spec=0.0;\n } else if (m<15.5) {\n  alb=vec3(0.86,0.84,0.78); spec=0.05;\n } else if (m<16.5) {\n  alb=vec3(0.05,0.05,0.055); spec=0.6; gloss=30.0;\n } else if (m<17.5) {\n  // big-box game spines\n  float gc=floor((p.x+0.255)/0.05);\n  float h=hash11(gc*2.9+4.0+gSeed);\n  alb=0.5+0.5*cos(TAU*(h+vec3(0.0,0.33,0.67)));\n  alb*=h<0.3?0.25:0.9;\n  if (n.z<-0.5) {\n   float lx=fract((p.x+0.255)/0.05)-0.5;\n   alb=mix(alb,vec3(1.0,0.95,0.85),ptext(vec2((p.y-1.33)*70.0,lx*2.4+0.5),gc+90.0,0.0)*step(abs(lx),0.3));\n   alb=mix(alb,vec3(0.95,0.7,0.1),step(length(vec2(lx*0.05,p.y-1.5)),0.012));\n  }\n  if (pw.y<0.6) {\n   // the magazine on the bed\n   alb=mix(vec3(0.9,0.15,0.1),vec3(0.15,0.2,0.5),step(0.5,fract(pw.x*4.0+pw.z*3.0)));\n   alb=mix(alb,vec3(1.0),ptext(vec2(pw.x*40.0,fract(pw.z*14.0)*1.4),floor(pw.z*14.0),0.0)*0.8);\n  }\n  spec=0.3;\n } else if (m<18.5) {\n  alb=vec3(0.1,0.22,0.55);\n  vec2 pq=p.xz-vec2(0.30,0.31);\n  alb=mix(alb,vec3(0.9,0.85,0.3),step(abs(length(pq-vec2(-0.05,-0.04))-0.035),0.004));\n  spec=0.05;\n } else if (m<19.5) {\n  // floppies: black on top, blue under, label and shutter\n  bool top=p.y>0.7535;\n  vec3 fq=top?p-vec3(gFlp.x-0.01,0.7551,gFlp.y+0.01):p-vec3(gFlp.x,0.7517,gFlp.y-0.005);\n  fq.xz=rot(top?-0.2:0.35)*fq.xz;\n  alb=top?vec3(0.04):vec3(0.08,0.15,0.55);\n  if (sdBox2(fq.xz-vec2(0.0,0.012),vec2(0.035,0.03))<0.0) alb=vec3(0.9,0.88,0.82);\n  if (sdBox2(fq.xz-vec2(0.008,-0.034),vec2(0.023,0.014))<0.0) alb=vec3(0.65,0.65,0.68);\n  spec=0.3;\n } else if (m<20.5) {\n  // keycaps: light alphas, darker modifiers\n  vec3 kq=p-vec3(-0.10,0.762,0.315);\n  kq.y-=0.08*kq.z;\n  kq.x*=gS;\n  float pt=0.0185;\n  vec2 c=vec2(floor((kq.x+0.218)/pt),clamp(floor((kq.z+0.066)/pt),0.0,5.0));\n  bool mod1=kq.x>0.062?(c.x>20.5||(c.x<18.5)):(c.x<0.5||c.x>13.5||c.y>4.5||(c.y<0.5&&(c.x<3.5||c.x>10.5)));\n  alb=(mod1?vec3(0.63,0.61,0.56):vec3(0.84,0.81,0.73))*ramp3(vec3(1.07,1.13,1.27),vec3(1.0),vec3(0.97,0.86,0.64),YELLOWING);\n  // legends, only when they can be seen\n  vec2 kl=vec2(fract((kq.x+0.218)/pt),fract((kq.z+0.066)/pt));\n  float lg=glyph(vec2(kl.x*3.0-0.45,kl.y*3.0-1.6),c.x+c.y*17.0)*step(0.02,kq.y);\n  alb=mix(alb,vec3(0.3,0.28,0.26),lg*0.55*smoothstep(0.0022,0.0011,fp));\n  spec=0.3; gloss=30.0;\n } else if (m<21.5) {\n  vec2 su=vec2(gS*(p.x-0.215)/0.2+0.5,(p.y-1.47)/0.15+0.5);\n  emit=tvGame(su,TIME)*1.1*GLOW;\n  alb=vec3(0.02);\n  float fr=0.04+0.5*pow(1.0-max(dot(-rd,n),0.0),5.0);\n  emit+=windowSeen(pw,reflect(rd,n))*fr*0.5;\n  spec=0.6; gloss=120.0;\n } else if (m<22.5) {\n  // CD: a dark mirror with a rainbow streak along the diameter that\n  // lines up with the light (the tracks are a radial grating)\n  vec3 dq=p-vec3(gCD.x,0.7508,gCD.y);\n  float rl=length(dq.xz);\n  vec2 rr=dq.xz/max(rl,1e-4);\n  alb=rl<0.02?vec3(0.55,0.57,0.6):vec3(0.16,0.17,0.19);\n  vec3 v=-rd;\n  float tgs=dot(normalize(gL.xz+v.xz),vec2(-rr.y,rr.x));\n  float tgm=dot(normalize(normalize(vec3(MX,SCY,0.49)-p).xz+v.xz),vec2(-rr.y,rr.x));\n  vec3 irid=spectral(400.0+300.0*fract(rl*14.0+0.3*dot(v.xz,rr)));\n  float on=step(0.022,rl);\n  emit+=irid*on*(gSun*0.2*exp(-tgs*tgs*10.0)*sunMask(pw,true)*sh+gScr*0.5*exp(-tgm*tgm*10.0)+0.04);\n  emit+=windowSeen(pw,reflect(rd,n))*0.3*on;\n  spec=1.0; gloss=80.0;\n } else {\n  // VHS sleeves: black, some white, label stripe\n  float vc=floor((p.y-1.312)/0.026);\n  float h=hash11(vc*5.1+9.0+gSeed);\n  alb=h<0.6?vec3(0.04):h<0.8?vec3(0.85):vec3(0.6,0.15,0.1);\n  if (n.z<-0.5) alb=mix(alb,vec3(0.92,0.9,0.8),step(abs(p.x-0.62),0.05)*step(abs(fract((p.y-1.312)/0.026)-0.5),0.25));\n  spec=0.4;\n }\n // ---- lighting\n float sm=sunMask(pw,slatsOn)*sh;\n float dif=max(dot(n,gL),0.0);\n vec3 col=alb*gSun*dif*sm;\n // dusk sky fill and warm bounce off the sunlit patches\n vec3 amb=mix(vec3(0.06,0.06,0.1),vec3(0.11,0.11,0.17),0.5+0.5*n.y);\n amb+=gSun*0.04*(0.6+0.4*max(-n.x,0.0))*(0.7+0.3*n.y);\n col+=alb*amb*ao;\n // the monitor screen as a rectangle light\n vec3 sv=vec3(MX*gS,SCY,0.49)-pw;\n float sd2=dot(sv,sv);\n vec3 sl=sv*inversesqrt(sd2);\n float se=max(dot(n,sl),0.0)*max(sl.z,0.0)*0.077/(sd2*PI+0.02);\n col+=alb*gScr*se*1.4*GLOW*mix(1.0,ao,0.5);\n col+=gScr*spec*pow(max(dot(n,normalize(sl-rd)),0.0),gloss)*se*2.0*GLOW;\n // the little TV\n vec3 tvv=vec3(0.215*gS,1.47,0.66)-pw;\n float td2=dot(tvv,tvv);\n vec3 tl=tvv*inversesqrt(td2);\n col+=alb*vec3(0.45,0.55,0.85)*max(dot(n,tl),0.0)*max(tl.z,0.0)*0.03/(td2*PI+0.01)*GLOW;\n // lava lamp glow\n vec3 lv=vec3(LX*gS,0.97,LZ)-pw;\n float ld2=dot(lv,lv);\n float lw=max(dot(n,lv*inversesqrt(ld2))*0.8+0.2,0.0);\n col+=alb*vec3(1.0,0.35,0.1)*LAVA*0.012*lw/(ld2+0.004)*(0.9+0.1*sin(TIME*2.3));\n // sun specular\n vec3 h=normalize(gL-rd);\n col+=gSun*sm*spec*pow(max(dot(n,h),0.0),gloss)*dif;\n return col+emit;\n}\nvec3 aces(vec3 x) {\n return clamp((x*(2.51*x+0.03))/(x*(2.43*x+0.59)+0.14),0.0,1.0);\n}\nvec3 tapDir(float k) {\n return k<0.5?vec3(1.0,-1.0,-1.0):k<1.5?vec3(-1.0,-1.0,1.0):k<2.5?vec3(-1.0,1.0,-1.0):vec3(1.0);\n}\nvoid main() {\n vec2 frag=gl_FragCoord.xy;\n vec2 uv=(2.0*frag-RENDERSIZE)/RENDERSIZE.y;\n float T=TIME*SPEED;\n // sun, blinds\n gL=normalize(vec3(1.0,mix(0.12,0.85,SUN_HEIGHT),-0.55));\n gSun=mix(vec3(1.0,0.86,0.68),vec3(1.0,0.45,0.16),GOLDEN)*4.2*SUN;\n float sa=mix(0.35,-0.9,BLINDS);\n gCa=cos(sa); gSa=sin(sa);\n // the arrangement: mug, floppies, CD and can dealt to six spots with an\n // affine step (a coprime to 6, so they never share one); ARRANGE 0 is the\n // original layout. CLUTTER decides which of them are out at all.\n gS=MIRROR?-1.0:1.0;\n gSeed=float(ARRANGE);\n float ka=mod(gSeed,2.0)<0.5?1.0:5.0,kb=floor(gSeed/2.0);\n gMug=slot(kb); gFlp=slot(ka+kb); gCD=slot(2.0*ka+kb); gCan=slot(3.0*ka+kb);\n gJc=slot(4.0*ka+kb); gCan2=slot(5.0*ka+kb);\n gOn=step(vec4(0.15,0.3,0.45,0.05),vec4(CLUTTER));\n // what the monitor is showing\n float sel=float(SCREEN);\n gFade=1.0;\n if (sel<0.5) {\n  float cyc=mod(TIME+10.0,56.0);\n  gMode=floor(cyc/14.0);\n  gMT=cyc-gMode*14.0;\n  gFade=smoothstep(0.0,0.35,gMT)*smoothstep(14.0,13.75,gMT);\n } else {\n  gMode=sel-1.0;\n  gMT=TIME;\n }\n gScr=(gMode<0.5?vec3(0.4,0.55,0.8):gMode<1.5?vec3(0.32,0.18,0.45)\n  :gMode<2.5?vec3(0.06,0.06,0.08):vec3(0.12,0.1,0.14))*gFade;\n // camera: a slow push in toward the desk and back out, drifting a little\n float k=0.5-0.5*cos(T*0.06);\n vec3 ro=vec3(mix(-0.32,-0.05,k)+0.06*sin(T*0.13),\n    mix(1.33,1.18,k)+0.015*sin(T*0.21),\n    mix(-1.2,-0.42,k));\n vec3 ta=vec3(mix(0.08,-0.06,k)+0.03*sin(T*0.09),mix(1.1,1.0,k),0.65);\n vec3 fw=normalize(ta-ro);\n vec3 rt=normalize(cross(vec3(0.0,1.0,0.0),fw));\n vec3 up=cross(fw,rt);\n float foc=1.75;\n vec3 rd=normalize(uv.x*rt+uv.y*up+foc*fw);\n float pix=2.0/(foc*RENDERSIZE.y);\n // One loop, one map() call site: march, then 4 normal taps, then 4 AO\n // taps, then the sun shadow ray.\n float t=0.02,m=-1.0,ph=0.0,kk=0.0;\n vec3 hp=ro,nacc=vec3(0.0),n=vec3(0.0,1.0,0.0);\n float ao=1.0,aoAcc=0.0,sh=1.0,st=0.0,stMax=0.0,hh0=0.0;\n bool outside=false;\n for (int i=0; i<240; i++) {\n  vec3 sp;\n  if (ph<0.5) sp=ro+rd*t;\n  else if (ph<1.5) sp=hp+tapDir(kk)*0.0004*max(t,0.5);\n  else if (ph<2.5) sp=hp+n*(0.01+0.022*kk);\n  else sp=hp+n*0.002+gL*st;\n  vec2 h=map(sp);\n  if (ph<0.5) {\n   if (h.x<0.0006*t) { m=h.y; hp=sp; hh0=h.x; ph=1.0; kk=0.0; }\n   else {\n    t+=h.x*0.95;\n    if (sp.x>1.42) { outside=true; break; }\n    if (t>8.0) break;\n   }\n  } else if (ph<1.5) {\n   nacc+=tapDir(kk)*h.x;\n   kk+=1.0;\n   if (kk>3.5) { n=normalize(nacc); hp-=n*hh0; ph=2.0; kk=0.0; }\n  } else if (ph<2.5) {\n   aoAcc+=(0.01+0.022*kk-gR)*pow(0.75,kk);\n   kk+=1.0;\n   if (kk>3.5) {\n    ao=clamp(1.0-4.0*aoAcc,0.0,1.0);\n    // stop well short of the window: the trim and slats are\n    // sunMask()'s job, and at a metre and a half even a 3 cm\n    // clearance reads as deep penumbra to k*h/t\n    if (dot(n,gL)<=0.0||sunMask(hp,false)<0.001||hp.x>1.0) break;\n    ph=3.0; st=0.015; stMax=(1.0-hp.x)/gL.x;\n   }\n  } else {\n   sh=min(sh,14.0*gR/st);\n   st+=clamp(h.x,0.003,0.08);\n   if (sh<0.005||st>stMax) break;\n  }\n }\n sh=clamp(sh,0.0,1.0);\n vec3 col;\n float tEnd=t;\n if (m>0.0) col=shade(hp,n,rd,m,sh,ao,t,pix);\n else if (outside) col=skyOut(rd);\n else col=vec3(0.02);\n // sunbeams through the blinds: in-scattering along the view ray\n float cth=dot(rd,-gL);\n float bl=0.0,tb=min(tEnd,6.0);\n for (int i=0; i<4; i++) bl+=beamLen(ro,rd,tb,0.06*(float(i)-1.5));\n col+=gSun*bl*0.02*BEAMS*(0.5+0.8*pow(max(cth,0.0),3.0));\n // dust motes catching the light, on a few planes in front of the desk\n if (DUST>0.0) {\n  for (int l=0; l<4; l++) {\n   float fl=float(l);\n   float zl=0.42-0.35*fl;\n   if (rd.z<=0.0) break;\n   float s=(zl-ro.z)/rd.z;\n   if (s<0.05||s>tEnd) continue;\n   vec3 wp=ro+rd*s;\n   float smk=sunMask(wp,true);\n   if (smk<0.01) continue;\n   vec2 g=wp.xy*45.0+vec2(fl*13.7,0.0);\n   g+=vec2(0.6*sin(TIME*0.05+fl),-TIME*0.12*(0.6+0.2*fl));\n   vec2 cell=floor(g);\n   vec2 hsh=hash22(cell+fl*31.0);\n   if (hsh.x>0.09) continue;\n   vec2 off=0.25+0.5*hash22(cell+7.7)+0.15*vec2(sin(TIME*0.7+hsh.y*20.0),cos(TIME*0.6+hsh.x*17.0));\n   float dd=length(fract(g)-off);\n   float px=max(s*pix*45.0,0.02);\n   float tw=0.4+0.6*pow(0.5+0.5*sin(TIME*(2.0+3.0*hsh.y)+hsh.x*40.0),3.0);\n   col+=gSun*0.22*DUST*smk*tw*exp(-dd*dd/(px*px))*min(1.0,0.025/px);\n  }\n }\n // glow round the screen and the window (a cheap bloom)\n vec3 sc=vec3(MX*gS,SCY,0.49)-ro;\n float tc=dot(sc,rd);\n float dp=length(sc-rd*tc);\n col+=gScr*GLOW*0.05*exp(-dp*dp/0.012)/(1.0+tc*0.5);\n vec3 wc=vec3(BLX,1.5,-0.05)-ro;\n float tw2=dot(wc,rd);\n vec3 wd=wc-rd*tw2;\n col+=gSun*0.02*exp(-(wd.y*wd.y/0.3+wd.z*wd.z/0.35))*step(0.0,tw2);\n // ---- grade\n col*=EXPOSURE;\n col=aces(col*0.9);\n col=pow(col,vec3(0.95,1.0,1.06));\n // drugstore print: lifted blacks, warm cast, softer saturation\n vec3 fc=mix(vec3(dot(col,vec3(0.3,0.59,0.11))),col,0.82);\n fc=fc*vec3(1.0,0.96,0.86)*0.9+vec3(0.06,0.05,0.06);\n col=mix(col,fc,FILM);\n col+=(hash21(frag+fract(TIME*7.0)*113.0)-0.5)*(0.02+0.05*FILM);\n vec2 q=frag/RENDERSIZE;\n col*=0.5+0.5*pow(16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y),0.22+0.1*FILM);\n // the orange date stamp in the corner\n if (DATE_STAMP) {\n  float hgt=RENDERSIZE.y*0.028;\n  vec2 dp2=(frag-vec2(RENDERSIZE.x-hgt*15.0,hgt*1.6))/hgt;\n  // cells are 1.7 wide: a digit plus its italic slant spans about 1.4,\n  // and the glow needs room to fade before the cell edge\n  if (dp2.x>-0.4&&dp2.x<13.6&&dp2.y>-1.4&&dp2.y<1.4) {\n   float cell=floor(dp2.x/1.7);\n   vec2 lp=vec2(mod(dp2.x,1.7)-0.85,dp2.y);\n   float dg=cell<-0.5?-1.0:cell<0.5?9.0:cell<1.5?8.0:cell<3.5?(cell<2.5?-1.0:1.0)\n     :cell<4.5?0.0:cell<5.5?-1.0:cell<6.5?0.0:cell<7.5?1.0:-1.0;\n   float d=dg<0.0?1e3:seg7(lp,segMask(dg));\n   float tick=length((dp2-vec2(0.02,1.0))*vec2(2.0,1.0))-0.12;\n   d=min(d,tick);\n   vec3 ink=vec3(1.0,0.5,0.12);\n   col+=ink*(smoothstep(0.08,0.0,d)*0.9+0.25*exp(-max(d,0.0)*14.0));\n  }\n }\n gl_FragColor=vec4(clamp(col,0.0,1.0),1.0);\n}\n",
    "generator": {
      "model": "Claude-Opus-5.5",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}