open .fs {
"DESCRIPTION" : "Solar veil — warm aurora curtains whose rays are combed by a curl-noise flow, draping and rippling like a fire sky." ,
"CREDIT" : "claude-opus-4-8" ,
"INPUTS" : [
{ "NAME" : "bands" , "TYPE" : "float" , "DEFAULT" : 3.0 , "MIN" : 2.0 , "MAX" : 7.0 } ,
{ "NAME" : "flowAmt" , "TYPE" : "float" , "DEFAULT" : 0.6 , "MIN" : 0.0 , "MAX" : 1.5 } ,
{ "NAME" : "intensity" , "TYPE" : "float" , "DEFAULT" : 0.9 , "MIN" : 0.3 , "MAX" : 1.8 } ,
{ "NAME" : "speed" , "TYPE" : "float" , "DEFAULT" : 0.5 , "MIN" : 0.0 , "MAX" : 2.0 }
]
}
float hash (vec2 p){ p = fract (p * vec2 (123.34 , 456.21 )); p += dot (p, p + 45.32 ); return fract (p.x * p.y); }
float noise (vec2 p){
vec2 i = floor (p), f = fract (p); f = f * f * (3.0 - 2.0 * f);
float a = hash (i), b = hash (i + vec2 (1.0 , 0.0 )), c = hash (i + vec2 (0.0 , 1.0 )), d = hash (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 s = 0.0 , a = 0.5 ; for (int i = 0 ; i < 3 ; i++){ s += a * noise (p); p = p * 2.0 + 3.0 ; a *= 0.5 ; } return s; }
vec2 flow (vec2 p, float t){
float a = 1.5708 + (fbm (p * 1.6 + vec2 (0.0 , t * 0.2 )) - 0.5 ) * 3.0 * flowAmt;
return vec2 (cos (a), sin (a));
}
vec3 fire (float h){
h = clamp (h, 0.0 , 1.0 );
vec3 c = mix (vec3 (0.05 , 0.0 , 0.02 ), vec3 (0.6 , 0.07 , 0.03 ), smoothstep (0.0 , 0.3 , h));
c = mix (c, vec3 (1.0 , 0.4 , 0.05 ), smoothstep (0.3 , 0.6 , h));
c = mix (c, vec3 (1.0 , 0.85 , 0.4 ), smoothstep (0.6 , 0.85 , h));
c = mix (c, vec3 (1.0 , 1.0 , 0.92 ), smoothstep (0.85 , 1.0 , h));
return c;
}
void main (){
vec2 uv = gl_FragCoord .xy / RENDERSIZE ;
vec2 p = (gl_FragCoord .xy - 0.5 * RENDERSIZE ) / RENDERSIZE .y;
float t = TIME * speed;
float sway = (fbm (vec2 (p.x * 1.4 , t * 0.25 )) - 0.5 ) * 2.6 * flowAmt;
float rayX = p.x + sway * 0.45 ;
float rays = noise (vec2 (rayX * 26.0 , p.y * 1.1 - t * 0.6 ));
rays += 0.5 * noise (vec2 (rayX * 55.0 , p.y * 0.8 + t * 0.4 ));
rays = pow (clamp (rays * 0.95 - 0.15 , 0.0 , 1.0 ), 1.5 );
rays = 0.08 + 1.0 * rays;
float curtain = 0.0 , baseHeat = 0.0 ;
for (int i = 0 ; i < 7 ; i++){
if (float (i) >= bands) break ;
float fi = float (i);
float yC = -0.4 + 0.26 * fi;
float wob = 0.11 * fbm (vec2 (p.x * 1.2 + fi, t * 0.4 + fi * 3.0 )) + 0.05 * sin (p.x * 2.5 + t + fi);
float d = p.y - (yC + wob);
float c = exp (-abs (d) * 13.0 ) * smoothstep (0.6 , -0.15 , d);
curtain += c;
baseHeat = max (baseHeat, c * smoothstep (0.1 , -0.25 , d));
}
vec3 col = mix (vec3 (0.03 , 0.01 , 0.04 ), vec3 (0.0 , 0.0 , 0.015 ), uv.y);
col += smoothstep (0.992 , 1.0 , hash (floor (gl_FragCoord .xy))) * 0.5 ;
float lum = curtain * rays;
float heat = clamp (0.22 + 1.6 * baseHeat + 0.3 * lum, 0.0 , 1.0 );
col += fire (heat) * lum * intensity * 2.0 ;
col *= 1.0 - 0.35 * dot (p, p);
col = col / (1.0 + col);
col = pow (max (col, 0.0 ), vec3 (0.9 ));
gl_FragColor = vec4 (col, 1.0 );
}