open .fs {
"DESCRIPTION" : "Folded jewel fractal — emerald/sapphire/amethyst facets with gold ignition, rotating as a seamless 8s loop on a void-black field." ,
"INPUTS" : [
{ "NAME" : "hueShift" , "TYPE" : "float" , "DEFAULT" : 0.0 , "MIN" : 0.0 , "MAX" : 1.0 } ,
{ "NAME" : "glowAmt" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.0 , "MAX" : 2.0 }
]
}
#define PI 3.14159265359
#define PERIOD 8.0
mat2 rot (float a){ float c = cos (a), s = sin (a); return mat2 (c, -s, s, c); }
float gTrap;
float gFold;
float de (vec3 p){
vec3 p0 = p;
float dr = 1.0 ;
float trap = 1e9 ;
float fold = 0.0 ;
for (int i = 0 ; i < 9 ; i++){
p = clamp (p, -1.0 , 1.0 ) * 2.0 - p;
float r2 = dot (p, p);
if (r2 < 0.25 ){ p *= 4.0 ; dr *= 4.0 ; }
else if (r2 < 1.0 ){ p /= r2; dr /= r2; }
p = p * (-1.75 ) + p0;
dr = dr * 1.75 + 1.0 ;
if (r2 < trap){ trap = r2; fold = float (i); }
}
gTrap = trap;
gFold = fold;
return (length (p) - 2.0 ) / abs (dr);
}
float map (vec3 p){
float ph = fract (TIME / PERIOD);
float th = 2.0 * PI * ph;
p.xz *= rot (th);
p.xy *= rot (0.6 );
return de (p * 3.9 ) / 3.9 ;
}
vec3 jewel (float t){
t = fract (t);
vec3 sap = vec3 (0.05 , 0.18 , 0.75 );
vec3 eme = vec3 (0.04 , 0.75 , 0.38 );
vec3 ame = vec3 (0.55 , 0.15 , 0.85 );
vec3 gld = vec3 (1.00 , 0.72 , 0.15 );
float k = t * 4.0 ;
if (k < 1.0 ) return mix (sap, eme, k);
if (k < 2.0 ) return mix (eme, ame, k - 1.0 );
if (k < 3.0 ) return mix (ame, gld, k - 2.0 );
return mix (gld, sap, k - 3.0 );
}
void main (){
vec2 uv = (gl_FragCoord .xy - 0.5 * RENDERSIZE .xy) / RENDERSIZE .y;
vec3 ro = vec3 (0.0 , 0.0 , 3.4 );
vec3 rd = normalize (vec3 (uv, -1.45 ));
float t = 0.0 ;
float hit = -1.0 ;
float nearGlow = 0.0 ;
for (int i = 0 ; i < 100 ; i++){
vec3 pos = ro + rd * t;
float d = map (pos);
nearGlow += exp (-d * 22.0 ) * 0.012 ;
if (d < 0.0006 * t){ hit = t; break ; }
t += d * 0.6 ;
if (t > 12.0 ) break ;
}
vec3 void_col = vec3 (0.008 , 0.016 , 0.04 );
vec3 col = void_col;
if (hit > 0.0 ){
vec3 p = ro + rd * hit;
float trap = gTrap;
float fold = gFold;
vec2 e = vec2 (0.0012 , -0.0012 );
vec3 n = normalize (
e.xyy * map (p + e.xyy) + e.yyx * map (p + e.yyx) +
e.yxy * map (p + e.yxy) + e.xxx * map (p + e.xxx));
float hueArg = 0.52 + fold * 0.085 + trap * 0.6 + hueShift;
vec3 base = jewel (hueArg);
vec3 L = normalize (vec3 (0.6 , 0.8 , 0.5 ));
float dif = max (dot (n, L), 0.0 );
float rim = pow (1.0 - max (dot (n, -rd), 0.0 ), 3.0 );
float spec = pow (max (dot (reflect (-L, n), -rd), 0.0 ), 32.0 );
float emis = smoothstep (0.15 , 0.0 , trap);
col = base * (0.10 + 0.75 * dif);
col += base * emis * 3.0 * glowAmt;
col += vec3 (1.0 , 0.85 , 0.55 ) * spec * 0.6 ;
col += base * rim * 0.35 ;
col *= exp (-0.22 * hit);
}
col += jewel (0.05 + hueShift) * nearGlow * glowAmt * 0.35 ;
col = col / (1.0 + 0.35 * col);
gl_FragColor = vec4 (col, 1.0 );
}