UserInterface::UserInterface(float inRange) : mRange(inRange), mRatio(0.0f),
        mMouseX(0.0f), mMouseY(0.0f), mMouseOverWidget(NULL),
        mClickCandidate(NULL), mModelViewProjection(mMatrix)
    {
        if (mRange < 1.0f) mRange = 1.0f;

        VertexShader vs;

        const char* vertexShader =
            "#version 120\n"
            "uniform mat4 uMVPM;\n"
            "attribute vec2 iPosition;\n"
            "attribute vec2 iTexture;\n"
            "varying vec2 vTexture;\n"
            "void main(void)\n"
            "{\n"
            "    vTexture = iTexture;\n"
            "    vec4 p = vec4(iPosition, 0.0, 1.0);\n"
            "    gl_Position = uMVPM * p;\n"
            "}\n"
            ;

        vs.loadFromBuffer(vertexShader);

        FragmentShader fs;

        const char* fragmentShader =
            "#version 120\n"
            "uniform sampler2D uTexture;\n"
            "varying vec2 vTexture;\n"
            "void main(void)\n"
            "{\n"
            "    gl_FragColor = texture2D(uTexture, vTexture);\n"
            "}\n"
            ;

        fs.loadFromBuffer(fragmentShader);

        mProgram.attachShader(vs);
        mProgram.attachShader(fs);
        mProgram.bindAttribLocation(0, "iVertex");
        mProgram.bindAttribLocation(1, "iTexture");
        mProgram.link();
        mUniMVPM = mProgram.getUniformLocation("uMVPM");
        mUniTexture = mProgram.getUniformLocation("uTexture");

        glUniform1i(mUniTexture, 0);
    }