#version 120

uniform sampler2D texture;
uniform sampler2D desktop;
uniform vec2 screenSize;
uniform vec2 mouse;

varying vec2 uvCoord;

void main()
{
    // adjustable parameters
    float circleSize = 28;
    float borderSize = 2;
    // The smaller this value is, the more intense the magnification!
    float magnifyNerf = 1.5;
    vec4 borderColor = vec4(0,0,0,1);
    bool crosshair = true;

    // actual code
    vec2 mUV = vec2(mouse.x, -mouse.y)/screenSize + vec2(0,1);
    float du = distance(mUV,uvCoord);
    float dr = distance(mUV*screenSize,uvCoord*screenSize);
    vec4 color = vec4(0);
    if ( dr > circleSize+borderSize ) {
        color = texture2D( texture, uvCoord );
    } else if ( dr < circleSize ) {
        if ( crosshair && (distance(mUV.x, uvCoord.x)<1/screenSize.x || distance(mUV.y,uvCoord.y)<1/screenSize.y) ) {
            color = borderColor;
        } else {
            float t = 1-du;
            vec2 b = uvCoord;
            vec2 c = (mUV-uvCoord);
            vec2 upsideDown = c/magnifyNerf*t*t+b;

            vec4 textureColor = texture2D( texture, upsideDown );
            color = mix( texture2D( desktop, vec2(upsideDown.x, -upsideDown.y) ), textureColor, textureColor.a );
        }
    } else if ( dr < circleSize+borderSize ) {
        color = borderColor;
    }
    gl_FragColor = color;
}