#version 300 es
precision highp float;
uniform vec2 resolution;
uniform float time;
out vec4 fragColor;
float TAU = 6.283185307179586;
float rand(vec2 co){
return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
}
float aaStep(float edge, float value) {
return smoothstep(edge, edge-fwidth(value), value);
}
vec2 clampUnderLine(vec2 p, vec2 nrm, vec2 origin) {
float dist = dot(p-origin, nrm);
return (dist<0.0)?p:p-nrm*dist;
}
void main()
{
fragColor = vec4(0.0,0.0,0.2,1.0);
// Normalized pixel coordinates (from -1 to 1)
vec2 uv = (gl_FragCoord.xy-resolution.xy/2.0)/min(resolution.x,resolution.y)*2.0;
uv*=6.0;
{
vec4 objFragColor = vec4(0.0);
vec3 col = vec3(
0.1 + 0.2 * cos(time+uv.y+1.0),
0.0,
0.6 + 0.3 * cos(time+uv.x));
objFragColor += vec4(col,1.0)*aaStep(0.3,length(uv));
float d = length(uv)+time*0.3;
float a = min(floor(d/0.2)-time*0.3/0.2, 3.1415);
objFragColor += vec4(0.5,0.6,1.0,1.0)*pow(abs(sin(a)),2.0)*aaStep(0.05,abs(mod(d,0.2)-0.1));
for(int i=0; i<12;i++) {
float offsetTime = time*4.0-float(i)*0.4;
float t = fract(offsetTime);
float angle = TAU*rand(vec2(float(i),floor(offsetTime)));
d = 0.8-t*0.7;
objFragColor += aaStep(0.04,distance(vec2(sin(angle),cos(angle))*d, normalize(uv)*pow(length(uv),0.8)));
}
fragColor = mix(fragColor, objFragColor, objFragColor.a);
}
vec2 cell = floor(uv+.5);
bool isRedSphere = (max(abs(cell.x), abs(cell.y))==5.0);
uv = mod(uv+.5, 1.0)-0.5;
{
vec3 col = vec3(
0.8 + 0.2 * cos(time+uv.x),
0.1 * cos(time+uv.y+1.0),
0.1 * cos(time+uv.y+1.0)
);
vec4 objFragColor = vec4(0.0);
objFragColor += vec4(col+pow(length(uv)/0.4,5.0),1.0)*aaStep(0.35, length(uv));
float d = length(uv)-time*0.3;
float a = min(floor(d/0.15)+time*0.3/0.15, 3.1415);
float alpha = pow(abs(sin(a)),2.0);
objFragColor += vec4(alpha)*aaStep(0.05,abs(mod(d,0.2)-0.1))*0.5;
fragColor = mix(fragColor, objFragColor, float(isRedSphere)*objFragColor.a);
}
}