uniform sampler2D sceneTex;
uniform float textureWidth;
uniform float textureHeight;
uniform float cursorX;
uniform float cursorY;
uniform float zoom;
uniform float radius;

#define PI 3.14159

// Converts pixel coordinates to texture coordinates
vec2 pix2tex(vec2 pix)
{
    return vec2(pix.x / textureWidth, 1.0 - pix.y / textureHeight);
}

void main()
{
    vec2 texcoord = gl_TexCoord[0].xy;

    float dx = cursorX - texcoord.x;
    float dy = cursorY - texcoord.y;
    float dist = sqrt(dx*dx + dy*dy);
    if(dist < radius)
    {
        float disp = sin(dist / radius * PI) * (zoom - 1.0) * 20.0;
        texcoord.x += dx / dist * disp;
        texcoord.y += dy / dist * disp;
    }

    gl_FragColor = texture2D(sceneTex, pix2tex(texcoord));
}