void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    uv.x *= iResolution.x/iResolution.y;
    
    uv *= 20.0;
    
    //change this values to change the pattern, 
    //changing this values may require color adjustments
    float ampX = 50.0;
    float ampY = 40.0;
    
    float freqX = 0.3553359;
    float freqY = 0.421234;
    
    float timeOff = 3.5;
    
    float cX = 0.0;
    float cY = 0.0;

    //you can play with the timeOff increment values to change the animation.
    for(int i = 0; i < 9; i++)
    {
        cX += ampX * (sin( ( (uv.x) + iTime * timeOff) * freqX));
        
        timeOff *= -1.0632;
        
        cX += ampY * (sin((uv.y + iTime * timeOff) * freqY));
        
        timeOff *= -1.015;
        
        cY += ampX * (sin((uv.x + iTime * timeOff) * freqX));
        
        timeOff *= 0.2421;
        
        cY += ampY * sin(sin((uv.y + iTime * timeOff) * freqY));
        
        timeOff *= -0.591;
        
        
        //change this values to change the pattern
        ampX *= 0.32;
        ampY *= 0.63;
        freqX *= 2.325;
        freqY *= 1.49;
    }
        
    
    fragColor.r = (0.9 - 0.0219 * abs( (cX * cY)) );
    fragColor.g =  max(1.0 - 0.002311 * abs( (cX) ), 0.89);
    fragColor.b = (1.9);
    
    fragColor.a = 1.0;
}
