open .fs {
"DESCRIPTION" : "Liquid chrome swells with thin-film interference — hue rides the reflection phase, not density. Seamless 8s loop." ,
"INPUTS" : [
{ "NAME" : "speed" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.25 , "MAX" : 3.0 } ,
{ "NAME" : "film" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.3 , "MAX" : 2.5 }
]
}
#define PERIOD 8.0
#define TAU 6.28318530718
vec3 field (vec2 p, float ph){
vec3 h = vec3 (0.0 );
vec2 d1 = normalize (vec2 ( 0.83 , 0.55 ));
vec2 d2 = normalize (vec2 (-0.42 , 0.91 ));
vec2 d3 = normalize (vec2 ( 0.31 , -0.95 ));
float s;
s = 2.1 *dot (d1,p) - TAU*1.0 *ph + 0.0 ; h.x += 0.55 *sin (s); h.yz += 0.55 *2.1 *cos (s)*d1;
s = 3.4 *dot (d2,p) + TAU*2.0 *ph + 1.7 ; h.x += 0.34 *sin (s); h.yz += 0.34 *3.4 *cos (s)*d2;
s = 5.9 *dot (d3,p) - TAU*3.0 *ph + 4.1 ; h.x += 0.16 *sin (s); h.yz += 0.16 *5.9 *cos (s)*d3;
return h;
}
vec3 env (vec3 rd){
float up = clamp (rd.y*0.5 +0.5 , 0.0 , 1.0 );
vec3 sky = mix (vec3 (0.004 ,0.005 ,0.010 ), vec3 (0.035 ,0.05 ,0.09 ), pow (up,1.8 ));
float az = atan (rd.z, rd.x);
float el = rd.y;
vec3 band = vec3 (0.0 );
band += vec3 (2.6 , 0.60 , 0.10 ) * smoothstep (0.14 ,0.015 ,abs (el-0.34 )) * pow (0.5 +0.5 *sin (az*2.0 +0.4 ), 3.0 );
band += vec3 (0.10 , 0.95 , 2.8 ) * smoothstep (0.12 ,0.012 ,abs (el+0.02 )) * pow (0.5 +0.5 *sin (az*3.0 -1.2 ), 3.0 );
band += vec3 (1.2 , 1.15 , 1.4 ) * smoothstep (0.06 ,0.008 ,abs (el-0.64 ));
band += vec3 (1.8 , 0.2 , 2.4 ) * smoothstep (0.11 ,0.012 ,abs (el+0.42 )) * pow (0.5 +0.5 *sin (az+2.6 ), 3.0 );
return sky + band;
}
vec3 filmColor (float opd){
vec3 phase = TAU * opd * vec3 (1.0 , 1.22 , 1.46 );
return 0.5 + 0.5 *cos (phase + vec3 (0.0 , 2.1 , 4.2 ));
}
void main (){
vec2 uv = (gl_FragCoord .xy - 0.5 *RENDERSIZE .xy) / RENDERSIZE .y;
float ph = fract (TIME * speed / PERIOD);
vec2 orb = 0.35 *vec2 (cos (TAU*ph), sin (TAU*ph));
vec2 p = uv*2.0 + orb;
vec3 H = field (p, ph);
vec3 n = normalize (vec3 (-H.y, 1.35 , -H.z));
vec3 vd = normalize (vec3 (uv.x*0.55 , -0.85 , uv.y*0.55 + 0.55 ));
vec3 rd = reflect (vd, n);
float cosT = clamp (abs (dot (vd, n)), 0.0 , 1.0 );
float fres = pow (1.0 - cosT, 2.0 );
vec3 reflection = env (rd);
float opd = film * (1.9 *cosT + 0.35 *H.x);
vec3 irid = filmColor (opd);
float slope = length (H.yz);
float crest = smoothstep (0.25 , 1.0 , H.x);
float flow = clamp (0.7 *crest + 0.6 *smoothstep (1.0 , 2.4 , slope), 0.0 , 1.0 );
vec3 col = reflection * mix (vec3 (1.0 ), irid*1.9 , flow);
col += irid * fres * (0.25 + 0.75 *flow) * 0.9 ;
col += vec3 (0.9 ,0.95 ,1.0 ) * pow (max (rd.y,0.0 ), 24.0 ) * 0.8 ;
float valley = smoothstep (0.5 , -1.0 , H.x);
col *= mix (1.0 , 0.10 , valley*0.85 );
col *= 1.0 - 0.35 *dot (uv,uv);
vec3 hot = max (col - 1.0 , 0.0 );
col = min (col, 1.0 ) + hot/(1.0 +hot);
gl_FragColor = vec4 (col, 1.0 );
}