open .fs {
"DESCRIPTION" : "Neon dot-lattice corridor: a tiled Menger tunnel flown through with wandering banking, depositing edge-hot neon dots along the invisible folds while surfaces glow with laser-line shading. Seamless 16s loop." ,
"CREDIT" : "glslop agent (Claude)" ,
"CATEGORIES" : [ "fractal" , "raymarch" , "neon" , "kifs" , "tunnel" ] ,
"INPUTS" : [
{ "NAME" : "speed" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.0 , "MAX" : 3.0 } ,
{ "NAME" : "glow" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.3 , "MAX" : 3.0 } ,
{ "NAME" : "hue" , "TYPE" : "float" , "DEFAULT" : 0.0 , "MIN" : 0.0 , "MAX" : 1.0 } ,
{ "NAME" : "sway" , "TYPE" : "float" , "DEFAULT" : 0.6 , "MIN" : 0.0 , "MAX" : 1.5 } ,
{ "NAME" : "zoom" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.5 , "MAX" : 2.0 } ,
{ "NAME" : "lens" , "TYPE" : "float" , "DEFAULT" : 0.55 , "MIN" : 0.3 , "MAX" : 1.0 } ,
{ "NAME" : "iterCount" , "TYPE" : "long" , "DEFAULT" : 4 , "MIN" : 2 , "MAX" : 8 }
]
}
#define PI 3.14159265359
#define TAU 6.28318530718
const float PERIOD = 16.0 ;
const int MAXI = 8 ;
const int STEPS = 140 ;
mat2 rot (float a){ float c = cos (a), s = sin (a); return mat2 (c, -s, s, c); }
vec3 pal (float t){
return 0.5 + 0.5 * cos (TAU * (t + vec3 (0.55 , 0.40 , 0.18 )));
}
float map (vec3 p, mat2 Rroll, out float trap, out float lineT2, out float edge){
vec3 z = p;
z.xy = Rroll * z.xy;
z.z = mod (z.z + 1.0 , 2.0 ) - 1.0 ;
float scale = 3.0 ;
trap = 1.0e9 ; lineT2 = 1.0e9 ; edge = 0.0 ;
for (int i = 0 ; i < MAXI; i++){
if (i >= iterCount) break ;
z = abs (z);
if (z.x < z.y) z.xy = z.yx;
if (z.x < z.z) z.xz = z.zx;
if (z.y < z.z) z.yz = z.zy;
z = z * scale - vec3 (2.0 );
if (z.z < -1.0 ) z.z += 2.0 ;
trap = min (trap, dot (z, z));
lineT2 = min (lineT2, min (min (dot (z.xy, z.xy), dot (z.yz, z.yz)), dot (z.xz, z.xz)));
}
vec3 q = abs (z);
float c1 = max (q.x, max (q.y, q.z));
float c3 = min (q.x, min (q.y, q.z));
float mid = q.x + q.y + q.z - c1 - c3;
edge = smoothstep (0.86 , 0.99 , mid);
return length (max (q - vec3 (1.0 ), 0.0 )) * pow (scale, -float (iterCount));
}
void main (){
vec2 uv = (gl_FragCoord .xy - 0.5 * RENDERSIZE .xy) / RENDERSIZE .y;
float ph = fract (TIME * speed / PERIOD);
float th = TAU * ph;
float flyZ = 2.0 * ph;
mat2 Rroll = rot (0.35 * sway * sin (th));
vec3 ro = vec3 (0.45 * sway * sin (th) + 0.18 * sway * sin (3.0 * th),
0.30 * sway * sin (2.0 * th),
flyZ);
vec3 ta = ro + vec3 (0.12 * sway * cos (th),
0.08 * sway * cos (2.0 * th),
1.0 );
vec3 fwd = normalize (ta - ro);
vec3 rgt = normalize (cross (vec3 (0.0 , 1.0 , 0.0 ), fwd));
vec3 upv = cross (fwd, rgt);
float roll = 0.22 * sway * sin (th);
float rr = length (uv);
float theta = rr * lens * PI ;
vec2 dir2 = rr > 1.0e-5 ? uv / rr : vec2 (0.0 , 1.0 );
vec3 baseRd = dir2.x * rgt + dir2.y * upv;
vec3 rd = normalize (cos (theta) * fwd + sin (theta) * (baseRd));
rd = normalize ((baseRd.x * cos (roll) - baseRd.y * sin (roll)) * rgt +
(baseRd.x * sin (roll) + baseRd.y * cos (roll)) * upv +
cos (theta) * fwd);
float t = 0.02 ;
float tcap = 14.0 ;
float trans = 1.0 ;
vec3 col = vec3 (0.0 );
float trap, lineT2, edge;
float prevD = 1.0e9 ;
float trapHit = 1.0e9 , lineHit2 = 1.0e9 , te = 0.0 ;
bool hit = false ;
for (int i = 0 ; i < STEPS; i++){
vec3 p = ro + rd * t;
float tr, l2, ed;
float d = map (p, Rroll, tr, l2, ed);
if (!hit && d < 0.0006 * t){ hit = true ; trapHit = tr; lineHit2 = l2; te = t; }
if (prevD < 0.0 && d >= 0.0 && trans > 0.001 ){
vec3 body = pal (hue + 0.6 * sqrt (tr) + 0.10 * (t + flyZ));
float dotGlow = pow (ed, 2.0 );
col += trans * body * dotGlow * glow * 1.4 ;
trans *= 1.0 - 0.7 * dotGlow;
}
if (!hit) t += max (d, 0.002 ) * 0.7 ; else t += 0.02 ;
prevD = d;
if (t > tcap) break ;
}
if (hit){
vec3 p = ro + rd * te;
vec2 k = vec2 (1.0 , -1.0 );
float e = 0.0014 , tr, l2, ed;
vec3 n = normalize (
k.xyy * map (p + k.xyy * e, Rroll, tr, l2, ed) +
k.yyx * map (p + k.yyx * e, Rroll, tr, l2, ed) +
k.yxy * map (p + k.yxy * e, Rroll, tr, l2, ed) +
k.xxx * map (p + k.xxx * e, Rroll, tr, l2, ed));
vec3 body = pal (hue + 0.6 * sqrt (trapHit) + 0.10 * (te + flyZ));
vec3 lig = normalize (vec3 (0.3 , 0.6 , 0.74 ));
float dif = max (dot (n, lig), 0.0 );
float fres = pow (1.0 - max (dot (n, -rd), 0.0 ), 2.0 );
float laser = 1.0 / (1.0 + 120.0 * lineHit2);
laser = pow (laser, 1.5 );
vec3 laserCol = mix (vec3 (0.85 , 0.96 , 1.0 ), body + 0.3 , 0.4 );
col += trans * (body * 0.05 + dif * body * 0.18 + fres * laserCol * glow * 0.6 + laser * laserCol * glow * 1.2 );
}
col = col / (1.0 + col);
col = pow (col, vec3 (0.85 ));
gl_FragColor = vec4 (col, 1.0 );
}