/*********************************************************************
*	HUD Messages
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 31.7.2008
*	Soubor: HUD_messages.cpp
*	Popis: Modul umoznuje zobrazovat texty v prubehu hry. Kazdy text
*			muze mit jiny font, barvu, zarovnani, umisteni na obrazovce
*			a dobu existence. Po uplynuti teto doby se provadi jednoducha
*			animace zmizeni a nasledne vymazani textu ze seznamu. 
**********************************************************************/

#include "HUD_messages.h"
#include "globaltime.h"
#include "mathematic.h"

using namespace std;
using namespace fontLibrary;
using namespace HUDMessages;

HUDMessages::CHUDMessages HUDMessages::HUD_messages;	//verejne dostupny objekt CHUDMessages

CHUDMessages::CHUDMessages()
{
	g_uiTime = 0;
}

//funkce pro vkladani zprav s ruznymi parametry
void CHUDMessages::insertMessage( std::string sMessage, float x, float y, std::string sFont, int align, int iMaxWidth, Uint32 uiDuration, const Color4I color )
{
	DString dsMessage( sMessage, sFont, align, iMaxWidth );
	insertMessage( dsMessage, x, y, uiDuration, color );
}

void CHUDMessages::insertMessage( std::string sMessage, float x, float y, Font *pFont, int align , int iMaxWidth,  Uint32 uiDuration  , const Color4I color )
{
	DString dsMessage( sMessage, pFont, align, iMaxWidth );
	insertMessage( dsMessage, x, y, uiDuration, color );
}	

void CHUDMessages::insertMessage( std::string sMessage, float x, float y,  Uint32 uiDuration, const Color4I color )
{
	DString dsMessage( sMessage );
	insertMessage( dsMessage, x, y, uiDuration, color );
}

//koncova vkladajici funkce
void CHUDMessages::insertMessage( fontLibrary::DString dsMessage, float x, float y, Uint32 uiDuration, const Color4I color )
{
	//prirazeni parametru a vlozeni do seznamu
	Message message;
	message.m_dsMessage = dsMessage;
	message.m_uiDuration = uiDuration;
	message.m_Color = color;
	message.x = x;
	message.y = y;
	sortedInsert( message );
}

//polozky vkladame tak, aby se ten s nejkratsi dobou pusobnosti vykresloval jako posledni
//protoze se jako prvni stane pruhlednym
void CHUDMessages::sortedInsert( Message &message )
{
	list<Message>::iterator iter = g_listMessages.begin();
	for( ; iter != g_listMessages.end(); iter++ )
	{
		if( (*iter).m_uiDuration < message.m_uiDuration )
			break;
	}
	g_listMessages.insert( iter, message );
}

//funkce testuje parametry polozkam, po uplynuti jejich doby trvani jim snizuje alfa slozku barvy
//a tak se stavaji pruhlednymi. Jakmile jsou pruhledne na 100%, tak je odstrani ze seznamu
void CHUDMessages::run()
{
	if( true /*g_uiTime + HUDMESSAGES_UPDATE_TIME <= global_time::getGlobalTime()*/ )
	{
		for( list<Message>::iterator iter = g_listMessages.begin(); iter != g_listMessages.end();  )
		{


			if( (*iter).m_uiDuration == 0 )
			{
				if( compareFloats( (*iter).m_Color.values[3], 0.0f, FLOAT_COMPARE_ACCURACY_PRECISION) == 0 )
				{
					list<Message>::iterator removedItem = iter;

					iter = g_listMessages.erase( removedItem );	//tady se iter aktualizuje
					if( iter == g_listMessages.end() )
						break;
				}
				else
				{
					(*iter).m_Color.values[3] -= getFromRange( HUDMESSAGES_ALPHA_FADE_STEP, 0.0f, (*iter).m_Color.values[3] );
					++iter;	//kdyz se iter neaktualizuje, tak musime manualne
				}
			}
			else
			{
				(*iter).m_uiDuration -= getFromRange( HUDMESSAGES_UPDATE_TIME, 0u, (*iter).m_uiDuration );
				++iter;//kdyz se iter neaktualizuje, tak musime manualne
			}


		}

		g_uiTime = global_time::getGlobalTime();
	}
}

//smaze vsechny texty
void CHUDMessages::deleteAll()
{
	g_listMessages.clear();
}

//vykresli vsechny texty
void CHUDMessages::draw()
{
	glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT );

	glEnable( GL_BLEND );
	glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
	for( list<Message>::iterator iter = g_listMessages.begin(); iter != g_listMessages.end(); iter++ )
	{
		glColor4fv( (*iter).m_Color.values );
		(*iter).m_dsMessage.draw( (*iter).x,(*iter).y);
	}
	glPopAttrib();
}
