/*********************************************************************//**
*	HUD Fade efekt
*	Modul implementuje efekt prekryti obrazovky zadanou barvou. Soucasti
*	je animace postupneho znepruhlednovani a pote zpruhledneni tohoto
*	prekryvu.	
*
*	author: Michal Jirous
*	date: 24.11.2008
*	file: HUD_fade.cpp
**********************************************************************/

#include "HUD_fade.h"
#include <SDL/SDL_opengl.h>
#include "sys_config.h"

#include "game.h"

HUDFade fadeEffect;

HUDFade::HUDFade()
{
	reset();
}	

void HUDFade::reset()
{
	m_uiFadeInTimeEnd = m_uiFadeDurationTimeEnd = m_uiFadeOutTimeEnd = 0;
	m_fStartAlpha = m_fDurationAlpha = m_fEndAlpha = 0.0f;
	m_bStay = false;

	m_uiStartTime = 0;

	m_fCurrentAlpha = 0.0f;
}

/* Spusti novou fade a nastavuje jeji vlastnosti */
void HUDFade::startFade( alg::Color &rgb, Uint32 fadeInTime, Uint32 fadeDuration, Uint32 fadeOutTime, float startAlpha, float durationAlpha, float endAlpha, bool stay )
{
	m_uiStartTime = game.getGameTime();

	m_FadeColor = rgb;
	m_uiFadeInTimeEnd		 = m_uiStartTime + fadeInTime;
	m_uiFadeDurationTimeEnd	 = m_uiFadeInTimeEnd + fadeDuration;
	m_uiFadeOutTimeEnd		 = m_uiFadeDurationTimeEnd + fadeOutTime;

	m_fStartAlpha = startAlpha;
	m_fDurationAlpha = durationAlpha;
	m_fEndAlpha = endAlpha;
	m_bStay = stay;

	m_fCurrentAlpha = 0.0f;
}



/* Funkce volana za urcity cas provadi animaci */
void HUDFade::update( float seconds )
{
	const Uint32 currentTime = game.getGameTime();

	if( currentTime > m_uiFadeOutTimeEnd && m_bStay )
		m_fCurrentAlpha = m_fEndAlpha;

	if( currentTime < m_uiStartTime || currentTime > m_uiFadeOutTimeEnd )
		return;

	if( currentTime < m_uiFadeInTimeEnd )	//jsme v prvni fazi
	{
		float ratio = 1.0f - (float)(m_uiFadeInTimeEnd - currentTime) / (float)(m_uiFadeInTimeEnd-m_uiStartTime);

		m_fCurrentAlpha = (m_fDurationAlpha - m_fStartAlpha) * ratio + m_fStartAlpha;
	}
	else if( currentTime < m_uiFadeDurationTimeEnd )	//faze druha
	{
		m_fCurrentAlpha = m_fDurationAlpha;
	}
	else	//posledni faze
	{
		float ratio = 1.0f - (float)(m_uiFadeOutTimeEnd - currentTime) / (float)(m_uiFadeOutTimeEnd-m_uiFadeDurationTimeEnd);
		
		m_fCurrentAlpha = (m_fEndAlpha - m_fDurationAlpha) * ratio + m_fDurationAlpha;
	}
	

}

/* Vykreslovani */
void HUDFade::render()
{
	
	if( (game.getGameTime() < m_uiStartTime || (game.getGameTime() > m_uiFadeOutTimeEnd && !m_bStay)))
		return;

	glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);

	glDisable(GL_TEXTURE_2D); 
	
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

	//barva s alfa slozkou
	glColor4f(m_FadeColor[0], m_FadeColor[1], m_FadeColor[2], m_fCurrentAlpha );

	const unsigned int w = systemconf::getSystemInfo().m_iResolutionWidth, h = systemconf::getSystemInfo().m_iResolutionHeight;

	glBegin( GL_QUADS );
		glVertex2i(0,h);
		glVertex2i(0,0);
		glVertex2i(w,0);
		glVertex2i(w,h);
	glEnd();


	glPopAttrib();
}
