open .fs { "DESCRIPTION" : "Nested orbit reliquary wreathed in blue ember smoke — torus hierarchy meets buoyant velocity ribbons." , "CATEGORIES" : [ "generative" ] , "INPUTS" : [ { "NAME" : "speed" , "TYPE" : "float" , "DEFAULT" : 1.3 , "MIN" : 0.1 , "MAX" : 3.0 } , { "NAME" : "flowStrength" , "TYPE" : "float" , "DEFAULT" : 1.4 , "MIN" : 0.0 , "MAX" : 3.0 } , { "NAME" : "emberIntensity" , "TYPE" : "float" , "DEFAULT" : 1.2 , "MIN" : 0.0 , "MAX" : 2.5 } , { "NAME" : "smokeColor" , "TYPE" : "color" , "DEFAULT" : [ 0.18 , 0.42 , 0.68 , 1.0 ] } , { "NAME" : "orbitColor" , "TYPE" : "color" , "DEFAULT" : [ 0.85 , 0.22 , 0.08 , 1.0 ] } , { "NAME" : "accentColor" , "TYPE" : "color" , "DEFAULT" : [ 1.0 , 0.52 , 0.16 , 1.0 ] } , { "NAME" : "density" , "TYPE" : "float" , "DEFAULT" : 0.65 , "MIN" : 0.0 , "MAX" : 1.0 } ] }
#define PI 3.14159265359
#define TAU 6.28318530718
mat2 rot (float a){ float c=cos (a), s=sin (a); return mat2 (c,-s,s,c); }
float hash21 (vec2 p){
return fract (sin (dot (p, vec2 (127.1 , 311.7 ))) * 43758.5453123 );
}
float hash11 (float p){
return fract (sin (p * 78.233 ) * 43758.5453 );
}
float noise2 (vec2 p){
vec2 i = floor (p);
vec2 f = fract (p);
f = f*f*(3.0 -2.0 *f);
float a = hash21 (i);
float b = hash21 (i + vec2 (1.0 , 0.0 ));
float c = hash21 (i + vec2 (0.0 , 1.0 ));
float d = hash21 (i + vec2 (1.0 , 1.0 ));
return mix (mix (a,b,f.x), mix (c,d,f.x), f.y);
}
float fbm (vec2 p){
float v = 0.0 ;
float a = 0.5 ;
for (int i = 0 ; i < 5 ; i++){
v += a * noise2 (p);
p *= 2.0 ;
a *= 0.5 ;
}
return v;
}
vec2 velocityField (vec2 uv, float t){
vec2 p = uv - 0.5 ;
p.x *= RENDERSIZE .x / RENDERSIZE .y;
float r = length (p);
float angle = atan (p.y, p.x);
vec2 v = vec2 (sin (TAU * uv.x * 2.0 ), -cos (TAU * uv.y * 2.0 ));
v += 0.5 * vec2 (sin (TAU * (2.0 * uv.y + t * 0.08 )),
cos (TAU * (2.0 * uv.x - t * 0.10 )));
v += 0.35 * vec2 (cos (angle * 3.0 - t * 0.22 ), sin (angle * 2.0 + t * 0.28 ));
v += vec2 (0.0 , 0.6 + 0.4 * smoothstep (0.0 , 0.8 , r));
return v;
}
float harmonicShell (vec2 p, float ph, float major, float tube, float carriers, float rate){
float a = atan (p.y, p.x);
float wave = a * carriers - TAU * ph * rate;
float amp = 0.15 ;
float ridge = cos (wave);
float r = length (p.xy) - (major + amp * ridge);
float d = abs (r) - tube * (1.0 - 0.15 + 0.15 * cos (wave + 0.8 ));
return d;
}
void main (){
vec2 uv = isf_FragNormCoord ;
float t = TIME * speed;
vec2 aspect = vec2 (RENDERSIZE .x / RENDERSIZE .y, 1.0 );
vec2 p = (uv - 0.5 ) * aspect;
vec2 vel = velocityField (uv, t) * flowStrength;
float smoke = 0.0 ;
float glow = 0.0 ;
for (int i = 0 ; i < 4 ; i++){
float fi = float (i);
float scale = 1.0 + fi * 0.5 ;
vec2 wUV = uv - vel * (0.004 + fi * 0.002 ) * (1.0 + density);
wUV = (wUV - 0.5 ) * aspect * scale;
float rotAng = t * 0.15 + fi * 0.5 ;
wUV = rot (rotAng) * wUV;
float major = 0.18 + fi * 0.09 ;
float tube = 0.012 + fi * 0.006 ;
float carriers = 3.0 + fi * 3.0 ;
float rate = 0.3 + fi * 0.15 ;
float shell = harmonicShell (wUV, t, major, tube, carriers, rate);
float band = exp (-abs (shell) * 60.0 );
smoke += band * (0.8 - fi * 0.12 );
float a = atan (wUV.y, wUV.x);
float wave = a * carriers - TAU * t * rate;
float ign = pow (max (0.0 , cos (wave - 0.4 )), 16.0 );
glow += ign * band * 2.0 ;
}
vec2 turbUV = uv + vel * 0.01 ;
turbUV = (turbUV - 0.5 ) * aspect * 3.0 ;
float turb = fbm (turbUV + t * 0.1 );
turb += 0.5 * fbm (turbUV * 2.0 - t * 0.15 );
smoke *= 0.5 + 0.5 * turb;
float embers = 0.0 ;
for (int i = 0 ; i < 8 ; i++){
float fi = float (i);
vec2 ePos = vec2 (
0.5 + 0.3 * sin (t * 0.4 + fi * 1.7 ),
0.5 + 0.35 * cos (t * 0.3 + fi * 2.3 )
);
ePos += vel * 0.003 ;
vec2 ed = (uv - ePos) * aspect;
float ed_len = length (ed);
embers += exp (-ed_len * 80.0 ) * (0.5 + 0.5 * sin (t * 3.0 + fi));
}
smoke = clamp (smoke, 0.0 , 2.0 );
glow = clamp (glow, 0.0 , 3.0 );
embers *= emberIntensity;
vec3 smokeCol = smokeColor.rgb;
vec3 orbitCol = orbitColor.rgb;
vec3 accCol = accentColor.rgb;
vec3 col = vec3 (0.0 );
col += smokeCol * smoke * 0.7 ;
col += orbitCol * glow * 0.6 ;
col += accCol * embers * 1.5 ;
col = pow (col, vec3 (0.85 ));
col *= 1.3 ;
col = 1.0 - exp (-col * 1.8 );
float vig = smoothstep (1.2 , 0.3 , length (p));
col *= 0.5 + 0.5 * vig;
gl_FragColor = vec4 (col, 1.0 );
}