#define NUM_LAYERS 8
float hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }
float noise(vec2 p){ vec2 i = floor(p); vec2 f = fract(p); f = ff(3.0-2.0*f); float a = hash(i + vec2(0.0,0.0)); float b = hash(i + vec2(1.0,0.0)); float c = hash(i + vec2(0.0,1.0)); float 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 v = 0.0; float a = 0.5; for(int i=0;i<6;i++){ v += a * noise(p); p = mat2(1.5,1.2,-1.2,1.5) * p; a *= 0.5; } return v; }
vec3 lavaPalette(float t){ vec3 darkRed = vec3(0.4,0.0,0.0); vec3 orange = vec3(1.0,0.3,0.0); vec3 bright = vec3(1.0,0.5,0.1); return mix(darkRed, orange, t0.8) + brightpow(t,1.5)*0.3; }
vec3 renderLayer(vec2 uv, float t, float seed){ uv += vec2(sin(t0.1 + seed3.0), cos(t0.08 + seed1.7)) * 0.02; float n = fbm(uv2.5 + seed2.0 + vec2(t*0.03)); n = smoothstep(0.25,0.8,n); return lavaPalette(n); }
void mainImage(out vec4 fragColor, in vec2 fragCoord){ vec2 uv = (fragCoord - 0.5iResolution.xy)/iResolution.y; float t = iTime0.1;
vec2 m = vec2(0.0);
if(iMouse.z>0.0) m = (iMouse.xy - 0.5*iResolution.xy)/iResolution.y;
float swirl = 0.15 + 0.3*length(m);
float angle = swirl * sin(t*0.2 + uv.x*2.0);
uv = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*uv;
vec3 color = vec3(0.0);
for(int i=0;i<NUM_LAYERS;i++){
float seed = float(i)*0.3 + 0.1;
vec2 uvLayer = uv * (1.0 + float(i)*0.02);
float layerAngle = sin(t*0.05 + seed*1.5)*0.2*float(i+1);
uvLayer = mat2(cos(layerAngle), -sin(layerAngle), sin(layerAngle), cos(layerAngle)) * uvLayer;
color = mix(color, renderLayer(uvLayer, t, seed), 0.6/(1.0 + float(i)*0.25));
}
float glow = fbm(uv*4.0 + t*0.05);
color += vec3(0.1,0.05,0.0)*glow;
fragColor = vec4(clamp(color,0.0,1.0),1.0);
}