void Scene::renderGameStatistics()
{
	// Show intro
	if( m_fTimer < 3.0f )
	{
		scene->renderFont( 255, 0, 255, 0, 3.0f, GAME_WIDTH / 2.0f, 30.0f, HGETEXT_CENTER, "-=SURVIVAL=-" ); 
	}

	// Show statistics
	std::string atp( "attempts: " );
	atp += std::to_string( attempts ); 
	renderFont( 255, 128, 128, 128, 1.0f, GAME_WIDTH - 140.0f, 10.0f, HGETEXT_LEFT, atp );

	std::string str( "health: ");
	int health = static_cast<int>( objects->getTank( )->getHealth( ) * 100 );
	str += std::to_string( health ); 
	renderFont( 255, 128, 128, 128, 1.0f, GAME_WIDTH - 140.0f, 40.0f, HGETEXT_LEFT, str );

	std::string timer( "timer: "); 
	timer += std::to_string( static_cast<int>(SURVIVAL_TIME) - static_cast<int>(m_fTimer) );
	timer += "s";
	renderFont( 255, 128, 128, 128, 1.0f, GAME_WIDTH - 140.0f, 70.0f, HGETEXT_LEFT, timer );

	std::string bst( "beasts: ") ;
	bst += std::to_string( objects->getDeadBeastQuantity( ) ); 
	renderFont( 255, 128, 128, 128, 1.0f, 10.0f, 10.0f, HGETEXT_LEFT, bst );

	std::string dmn( "daemons: ");
	dmn += std::to_string( objects->getDeadDaemonQuantity( ) ); 
	renderFont( 255, 128, 128, 128, 1.0f, 10.0f, 40.0f, HGETEXT_LEFT, dmn );

	std::string rpt( "reptiles: "); 
	rpt += std::to_string( objects->getDeadReptileQuantity( ) );
	renderFont( 255, 128, 128, 128, 1.0f, 10.0f, 70.0f, HGETEXT_LEFT, rpt );

	std::string blt( "bullets: ");
	blt += std::to_string( Weapon::getBulletsQuantity( ) );
	renderFont( 255, 128, 128, 128, 1.0f, 10.0f, GAME_HEIGHT - 90.0f, HGETEXT_LEFT, blt );

	std::string shl( "shells: ");
	shl += std::to_string( Weapon::getShellsQuantity( ) );
	renderFont( 255, 128, 128, 128, 1.0f, 10.0f, GAME_HEIGHT - 60.0f, HGETEXT_LEFT, shl );

	std::string rct( "rockets: ");
	rct += std::to_string( Weapon::getRocketsQuantity( ) );
	renderFont( 255, 128, 128, 128, 1.0f, 10.0f, GAME_HEIGHT - 30.0f, HGETEXT_LEFT, rct );
}
//Renders to the device.
bool AlwynD3DInterfaceImpl::render()
{
	//Update the fps counter.
	fpsCounter->render();

	//Set the gammecorrection.
	gammaCorrectionVar->SetFloat(gammaCorrection);

	//Construct the viewing frustum, used for draw predicated (occlusion logic).
	viewingFrustum->constructFrustum(depth, mvpMatrix, camera);

	device->device->ClearRenderTargetView(device->renderTView, bgColor);

	//poll all input devices.
	device->getInput(input);

	D3DXMatrixIdentity(&tmp);
	D3DXMatrixIdentity(&tmp2);

	/**
	//translate camera position according to user input.	
	D3DXMatrixTranslation(&tmp, side, down, fwd);
	device->multiplyMatrix(&tmp2, camera->viewMatrix, &tmp);

	//rotate camera y axis according to user input.	
	D3DXMatrixRotationY(&tmp, rotY);
	device->multiplyMatrix(&tmp2, camera->viewMatrix, &tmp);

	//rotate camera x axis according to user input.	
	D3DXMatrixRotationX(&tmp, rotX);
	device->multiplyMatrix(&tmp2, camera->viewMatrix, &tmp);
	*/
		
	//Set the world matrix effect variable on the shader effect.
	mvpMatrix->setWorldMatrixEffVar();

	//Camera Movement
	//Change velocity according to user input.
	if (fwd != 0.0f)
		camera->moveForward(fwd);
	if (side != 0.0f)
		camera->strafe(side);

	//Calculate where the camera would be if current velocity applied (for collision detection)
	camera->precalculations();

	//Have to apply the collision detection before moving the camera.
	applyFPSGravity(device);
	applyWallCollision(device);

	//Move the camera, Pitch and Yaw as well.
	camera->render();

	//Set the view matrix effect variable on the shader effect.
	mvpMatrix->setViewMatrixEffVar(camera->viewMatrix);

	//Combine matrices to save calculation time
	device->copyMatrix(&wvp, mvpMatrix->world);
	device->multiplyMatrix(&tmp2, &wvp, camera->viewMatrix);
	device->multiplyMatrix(&tmp2, &wvp, mvpMatrix->proj);
	wvpMatrixVar->SetMatrix((float *) &wvp);


	renderFont(device);
	renderFontFramework(device);

	if (device->filtering)
	{
		filterTypeVar->SetInt(0);
	} else
	{
		filterTypeVar->SetInt(1);
	}


	clipCheck(device);

	//RENDER HERE
	frameworkRender(device);
	pointerInstancedClipMeshArrayUpdateMatrixData(pointerArrayInstancedClipMesh, pointerArrayInstancedClipMeshCount);
	pointerInstancedLightMeshArrayUpdateMatrixData(pointerArrayInstancedLightClipMesh, pointerArrayInstancedLightClipMeshCount);

	renderPointerInstancedClipMeshArray(pointerArrayInstancedClipMesh, pointerArrayInstancedClipMeshCount);
	renderPointerInstancedLightMeshArray(pointerArrayInstancedLightClipMesh, pointerArrayInstancedLightClipMeshCount);

	//if (fwd > 0)
	//	fwd = speed();
	//if (fwd < 0)
	//	fwd = -speed();


	return true;
}
void ButtonOverlayProcessor::renderOverlayImage() {

    regenerateOverlay_ = false;

    tgt::Texture* pickingTex = pickingPort_.getColorTexture();
    if(pickingTex->getPixelData())
        pickingTex->destroy();

    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);

    overlayPort_.activateTarget();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();

    glClearDepth(1.0);
    glDisable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    pickingPort_.activateTarget();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearDepth(1.0);
    glDisable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    TextureUnit overlayUnit;
    tgt::ivec2 groupCoords = inport_.getSize() - tgt::ivec2(horzBorder_.get(), vertBorder_.get());

    int count = 0;

    for(size_t i = 0; i < buttonProps_.size(); i++) {

        if(!isVisibleProps_.at(i)->get())
            continue;

        overlayPort_.activateTarget();
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);

        // add support for transparent buttons in combination with user controlled transparency, otherwise
        // the texture transparency always has priority
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

        overlayUnit.activate();
        if(buttonProps_.at(i)->get()) {
            //buttonTexturesPressed_.at(i)->bind();
            //buttonTexturesPressed_.at(i)->enable();
            buttonTexturePressed_->bind();
            buttonTexturePressed_->enable();
        } else {
            //buttonTexturesNonPressed_.at(i)->bind();
            //buttonTexturesNonPressed_.at(i)->enable();
            buttonTextureReleased_->bind();
            buttonTextureReleased_->enable();
        }
        LGL_ERROR;

        tgt::ivec2 radius = tgt::ivec2(buttonRadiusX_.get(), buttonRadiusY_.get());
        tgt::ivec2 centerCoords = groupCoords - tgt::ivec2(0, count*(groupBorder_.get() + 2*radius.y)) - radius;

        //radius.x = (float(buttonTexturePressed_->getWidth()) / float(buttonTexturePressed_->getHeight())) * radius.y;

        glColor4f(1.0f, 1.0f, 1.0f, opacity_.get());
        glBegin(GL_QUADS);

        tgt::vec2 ll = tgt::vec2(float(centerCoords.x - radius.x) / inport_.getSize().x, float(centerCoords.y - radius.y) / inport_.getSize().y);
        tgt::vec2 ur = tgt::vec2(float(centerCoords.x + radius.x) / inport_.getSize().x, float(centerCoords.y + radius.y) / inport_.getSize().y);
        ll = 2.0f * ll - 1.0f;
        ur = 2.0f * ur - 1.0f;

        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(ll.x, ll.y);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(ur.x, ll.y);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(ur.x, ur.y);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(ll.x, ur.y);

        glEnd();

        if(buttonProps_.at(i)->get())
            buttonTexturePressed_->disable();
        else
            buttonTextureReleased_->disable();

        renderFont(static_cast<int>(i), centerCoords);

        overlayPort_.deactivateTarget();
        glBlendFunc(GL_ONE, GL_ZERO);
        glDisable(GL_BLEND);

        pickingPort_.activateTarget();
        float col = float(i+1) / 255.f;
        glColor4f(col, col, col, 1.f);

        glRectf(ll.x, ll.y, ur.x, ur.y);
        pickingPort_.deactivateTarget();

        count++;
    }

    // download the picking texture to a buffer so we can perform picking on the cpu
    pickingPort_.getColorTexture()->downloadTexture();
    TextureUnit::setZeroUnit();
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
}
void ClientWidget::paintGL()
{
    frames+=1;
    qDebug()<<ENCAPS(tr("gl paint start"));
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear The Screen And The Depth Buffer
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90,(float)width()/(float)height(),0.1,1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
//**************************************************************************************************SCENE
    float l[]={-2,0,1,1};
    glLightfv(GL_LIGHT0,GL_POSITION,l);
    l[0]=-l[0];
    glLightfv(GL_LIGHT1,GL_POSITION,l);
    lightingprogram.bind();
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glColor4f(0.8,0.8,0.8,1);
    glLoadIdentity();
    gluLookAt(me.position.x(), me.position.y(),      me.position.z(),
              me.position.x(), me.position.y(),      me.position.z()+1.0f,
              0, 1, 0);
    glTranslatef(-0.1,0.2,0.5);
    glRotated(180,0,1,0);
    glRotated(30,1,0,0);
    glRotated(5,0,0,1);
    GLfloat whiteSpecularMaterial[] = {1.0, 1.0, 1.0};
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whiteSpecularMaterial);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS,128);
    teapot.render();
    glLoadIdentity();
    gluLookAt(me.position.x(), me.position.y(),      me.position.z(),
              me.position.x(), me.position.y(),      me.position.z()+1.0f,
              0, 1, 0);
    glTranslatef(0.1,-0.2,1);
    glColor4f(0.8,0.8,0.8,1);
    glScaled(0.05,0.05,0.05);
    glRotated(90,1,0,0);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whiteSpecularMaterial);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS,128);
    bunny.render();
    lightingprogram.release();
//**************************************************************************************************HUD
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,width(),0, height(), -1, -1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();					// Reset The Current Modelview Matrix
    glDisable(GL_LIGHTING);
    glDisable(GL_DEPTH_TEST);
    glColor4f(1,1,1,1);
    if(hudtex){
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, hudtex );
        glBegin(GL_QUADS);
        glTexCoord2d(0.0,0.0); glVertex3d(-1.0,-1.0,-1);
        glTexCoord2d(1.0,0.0); glVertex3d( 1.0,-1.0,-1);
        glTexCoord2d(1.0,1.0); glVertex3d( 1.0, 1.0,-1);
        glTexCoord2d(0.0,1.0); glVertex3d(-1.0, 1.0,-1);
        glEnd();
        glDisable( GL_TEXTURE_2D );
    }
    renderFont(font,fps,10,10,CWRF_LEFT,CWRF_TOP);
    renderFont(font,clock,10,10,CWRF_RIGHT,CWRF_BOTTOM);
    qDebug()<<ENCAPS(tr("gl paint end"));
}