/*********************************************************************
*	Loading screen
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 18.7.2008
*	Soubor: game_loadingscreen.cpp
*	Popis: Modul zobrazuje plochu z indikatorem prubehu nacitani levelu
**********************************************************************/

#include "game_loadingscreen.h"
#include "sys_config.h"
#include "sys_controller.h"
using namespace loadingScreen;


loadingScreen::CLoadingScreen loadingScreen::loading_screen;

CLoadingScreen::CLoadingScreen() : CMainWindow()
{
	m_pProgressBar = NULL;
	m_fAlphaMultiplier = 0.0f;
}



CLoadingScreen::~CLoadingScreen()
{
	destroy();
}

void CLoadingScreen::destroy()
{
	glDeleteTextures( 1, &m_BackgroundTexture.texture_id );
	glDeleteTextures( 1, &m_LogoTexture.texture_id );
	deleteAll();
}

#include "sys_console.h"
using namespace systemConsole;

void CLoadingScreen::init( float width, float height )
{
	console << "Creating loading screen...";
	setSize( width, height );

	m_pProgressBar = new ProgressBar( PROGRESSBAR_WIDTH_PERCENT * m_fWidth, PROGRESSBAR_HEIGHT_PERCENT * m_fHeight );
	m_pProgressBar->setPosition( (m_fWidth / 2.0f) - (m_pProgressBar->getWidth() / 2.0f),
		m_fHeight / 6.0f );

	addComponent( m_pProgressBar );

	m_BackgroundTexture.image.setFilename( LOADING_SCREEN_TEXTURE_FILENAME );
	//m_BackgroundTexture = textureLibrary::addTex( "LOADING_SCREEN", "textures/loadingscreen/background10.tga", GL_NEAREST, GL_NEAREST );
	textureLibrary.applyTexture( &m_BackgroundTexture );
	m_fTexCoordW = m_fWidth / m_BackgroundTexture.image.width;
	m_fTexCoordH = m_fHeight / m_BackgroundTexture.image.height;
	
	m_LogoTexture.image.setFilename( LOADING_SCREEN_LOGO_FILENAME );
	//m_LogoTexture = textureLibrary::addTex( "LOADING_SCREEN", "textures/loadingscreen/logo.tga", GL_NEAREST, GL_NEAREST );
	textureLibrary.applyTexture( &m_LogoTexture );
	console << "done" << endline;
}




void CLoadingScreen::user_draw()
{
	glPushAttrib( GL_CURRENT_BIT );
	if( m_BackgroundTexture.texture_id )
	{
		glBindTexture( GL_TEXTURE_2D, m_BackgroundTexture.texture_id );
		
			glColor4f( 0.8f,0.8f,0.8f,m_fMyAlpha );
			glBegin( GL_QUADS );
				glTexCoord2f( 0,0);								glVertex2f( 0,0 );
				glTexCoord2f( m_fTexCoordW, 0 );				glVertex2f( m_fWidth, 0 );
				glTexCoord2f( m_fTexCoordW, m_fTexCoordH );		glVertex2f( m_fWidth, m_fHeight );
				glTexCoord2f( 0, m_fTexCoordH );				glVertex2f( 0, m_fHeight );
			glEnd();
	}

	if( m_LogoTexture.texture_id )
	{
		glBindTexture( GL_TEXTURE_2D, m_LogoTexture.texture_id );
		float w = m_fWidth * 0.8f;
		float h = w / m_LogoTexture.image.width *  m_LogoTexture.image.height;
		float x = m_fWidth / 2.0f - w / 2.0f;
		float y = m_fHeight / 2.0f - h / 2.0f;
		
		
		glColor4f( 1,1,1,m_fMyAlpha );
		glBegin( GL_QUADS );
			glTexCoord2i( 0,0);			glVertex2f( x,y );
			glTexCoord2i( 1, 0 );		glVertex2f( x + w , y );
			glTexCoord2i( 1, 1);		glVertex2f( x + w, y + h );
			glTexCoord2i( 0, 1 );		glVertex2f( x, y + h );
		glEnd();
	}
	glPopAttrib();

}

void CLoadingScreen::use_this_run()
{
	if(  m_fMyAlpha > 0.0f || m_fTargetAlpha > 0.0f  )
	{
		run();
	}
}


void CLoadingScreen::use_this_draw()
{
	if( m_fMyAlpha > 0.0f )
	{

		bool glFunc = systemController::getRunningLevel() == systemController::LOADMAP || 
			systemController::getRunningLevel() == systemController::LOADGAME;
		if( glFunc )
		{
			glClear( GL_COLOR_BUFFER_BIT );
		}
		glDisable(GL_DEPTH_TEST);
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho(0, m_fWidth, 0, m_fHeight, -1, 1);
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		
		glEnable( GL_TEXTURE_2D );

		draw();
		
		if( glFunc )
		{
			glFlush();
			SDL_GL_SwapBuffers();
		}
	}

}

void CLoadingScreen::setProgress( float value )
{
	if( m_pProgressBar )
		m_pProgressBar->setValue( value );
}

float CLoadingScreen::getProgress()
{
	if( m_pProgressBar )
		return m_pProgressBar->getValue();
	return 0;
}

void CLoadingScreen::loading_func()
{
	use_this_draw();
	run();
	SDL_Event event;
	while( SDL_PollEvent( &event ) );
}
