/*********************************************************************//**
*	System ulomku.
*	System pro vypocet pohybu, animaci a vykreslovani ulomku. Kazdy ulomek
*	je model, ktery ma nejakou pcoatecni rychlost a jakmile do neceho narazi,
*	tak se zastavi a postupne zmizi.
*
*	author: Michal Jirous
*	date: 09.04.2009
*	file: gibs_system.cpp
**********************************************************************/

#include "gibs_system.h"
#include "graphics.h"
using namespace std;
using namespace modelLib;
GibsSystem gibsSystem;

Gib_elem::Gib_elem()
{
	m_pModel = NULL;
	restart();
}


void Gib_elem::restart()
{
	alpha = ALPHA_OPAQUE;
	m_Position = m_Store_Position;
	m_Velocity = m_Store_StartVelocity;
	m_uiFadeStartTime = -1;
	m_bOnGround = false;
	m_fAngleZ = (float)(rand() % 360);
}

void Gib_elem::create( modelLib::ModelElement *pModel, Point position, Vector startVelocity)
{
	m_pModel = pModel;
	if( m_pModel )
	{
		m_Store_Position = position;
		m_Store_StartVelocity = startVelocity;
		restart();
	}
}

Gib_elem::~Gib_elem()
{
	if( m_pModel )
	{
		modelLib::modelLibrary.unloadAndFreeModelElement( m_pModel );
	
	
	}

}

void Gib_elem::draw()
{
	if( m_pModel )
	{
		glPushMatrix();
		glTranslatef( m_Position.x, m_Position.y, m_Position.z );
		glRotatef( m_fAngleZ, 0, 0, 1.0f );
		glPushAttrib( GL_ENABLE_BIT | GL_CURRENT_BIT );
		if( alpha < ALPHA_OPAQUE )
			glEnable( GL_BLEND );

		glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
		glColor4f( m_Color.x, m_Color.y, m_Color.z, alpha );
		
		m_pModel->draw();
		glPopAttrib();
		glPopMatrix();
	}

}







GibsSystem::GibsSystem()
{
	restart();
}

#include "ctrl_gamevars.h"
#include "ctrl_var_definition.h"
#include "level_collision.h"
#include "game.h"
void GibsSystem::processGibs()
{
	Vector gravity( 0, 0, -gamevarsLibrary::getfData( vardef::GRAVITY_NAME ) * MINIMUM_UPDATE_TIME );	//A ted je z toho rychlost

	for( list<Gib_elem*>::iterator iter = m_Gibs.begin(); iter != m_Gibs.end(); ++iter )
	{
		if( (*iter)->m_bOnGround )
		{
			if( game.getGameTime() > (*iter)->m_uiFadeStartTime )
				(*iter)->alpha = 1.0f - (float)(game.getGameTime() - (*iter)->m_uiFadeStartTime) / GIB_FADE_TIME;
			if( (*iter)->alpha < 0.0001f )
			{
				iter = m_Gibs.erase( iter );
				if( iter == m_Gibs.end() )
					break;
			}
		}
		else
		{
			(*iter)->m_Velocity += gravity;
			
			Point nextPosition = (*iter)->m_Position + (*iter)->m_Velocity;

			if( collisionSystem.clippingHullCollision( nextPosition ) == CONTENTS_EMPTY )
				(*iter)->m_Position = nextPosition;
			else
			{
				(*iter)->m_bOnGround = true;	
				(*iter)->m_uiFadeStartTime = game.getGameTime();
			}
		}
	}
}

void GibsSystem::render( float elapset_seconds )
{
	m_fTimeCount+=elapset_seconds;
	while( m_fTimeCount > MINIMUM_UPDATE_TIME )
	{
		m_fTimeCount-=MINIMUM_UPDATE_TIME;
		processGibs();
	}

	for( list<Gib_elem*>::iterator iter = m_Gibs.begin(); iter != m_Gibs.end(); ++iter )
		(*iter)->draw();
}
void GibsSystem::restart()
{
	m_fTimeCount = 0;
	m_Gibs.clear();
}

void GibsSystem::addGib( Gib_elem *gib )
{
	if( gib )
		m_Gibs.push_back( gib );
}
