void mainImage( out vec4 O, in vec2 U )
{
    vec2 p = U / iResolution.y;
    p += vec2(-0.9, -0.5);
    p *= (1.5 + 0.1 * (cos(3. * iTime) + sin(2. * iTime)));

    float cosTime = cos(iTime);

    vec3 col = vec3 (1., 1., 1.);

    const int n = 7;
    const float pi = 4. * atan(1.);

    vec2 q[n];

    for (int i=0; i < n; i++) {
        q[i] = 0.4 * vec2(cos(iTime / 5. + 2. * float(i) * pi / float(n)),
                          sin(iTime / 5. + 2. * float(i) * pi / float(n)));
    }

    float r[n];

    for (int i=0; i < n; i++) {
        r[i] = 0.05 + 0.05 * sin(iTime / 2.) +
        0.05 * cos((float (i) + 2. + 3. * cosTime) * atan(p.y - q[i].y, p.x - q[i].x) + 4. * iTime);
    }

    for (int i = 0; i < n; i++) {
    	col *= smoothstep (r[i], r[i] + 0.01, length (p - q[i]));
    }

    vec3 bGround = vec3 (0.3 + 0.2 * cosTime,
                            0.4 + 0.2 * cosTime,
                            0.9 + 0.2 * cosTime);

    vec3 fGround = vec3 (2. * p.x, 2. * p.y, 0.5 + p.x * p.y);

    vec3 invCol = 1. - col;

    O = vec4(bGround * col + fGround * invCol,1.0);
}
