/*********************************************************************//**
*	3D model.
*	Entita pouzije 3D model a umisti ho do sceny
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_env_model.cpp
**********************************************************************/

#include "ent_env_model.h"

EnvModel::EnvModel() : CBaseDetail()
{
	m_pModel = NULL;
	m_sClassName = "env_model";
	m_iProperties = ENT_PARM_RENDER | ENT_PARM_RUNNABLE;
	m_bCollide = false;
	m_bIsDetail = false;
	m_Alpha = 255;
	m_pSortBoundingBox = &m_Bounds;
}

void EnvModel::setParameters( parameters_t &parametersMap )
{
	CBaseDetail::setParameters( parametersMap );
	m_sModelName = getParameterValue( parametersMap, "model" );
}

void EnvModel::passFlags( int flags )
{
	if( flags & COLLIDE )
	{
		m_bCollide = true;
		m_iProperties |= ENT_PARM_COLLIDING;
	}
	if( flags & IS_DETAIL )
	{
		m_bIsDetail = true;
		m_iProperties |= ENT_PARM_BLENDING_CARE;
	}
}

#include "level_collision.h"

void EnvModel::compile()
{
	CBaseDetail::compile();
	m_pModel = modelLib::modelLibrary.applyStaticMS3DModel( m_sModelName );	//TODO
	if( m_pModel )
	{
		m_pModel->getBoundingBox( (float*)m_Bounds.m_fBounds, (float*)&m_Bounds.m_fBounds[3] );
		
		if( angles != Point(0,0,0) )
		{
			Quaternion q,b;
			q.create( angles[0], 1,0,0 );
			b.create( angles[2]+90.0f, 0,0,1 );
			b = b * q;
			Point A = b.rotateVector( *((Vector*)&m_Bounds) );
			Point B = b.rotateVector( *((Vector*)&m_Bounds.m_fBounds[3]) );
			m_Bounds.setBasicValues( A );
			m_Bounds.updateData( B );
		}
		m_Bounds.translate( origin );
		m_Bounds.setRange( 10.0f );
		float distance = 100.0f;
		m_pNearestFace = collisionSystem.findNearestFace( m_Bounds, distance );
		m_Bounds.setRange( -10.0f );
	}
}



void EnvModel::decompile()
{
	if( m_pModel )
	{
		modelLib::modelLibrary.unloadModel( m_sModelName );
		modelLib::modelLibrary.freeModelElement( m_pModel );
	}
}

bool EnvModel::renderCullTest( RenderData &renderData )
{
	if( renderData.frustum->isBoundsInsideFrustum( m_Bounds ) )
	{
		if( m_bIsDetail )
		{
			if( !CBaseDetail::renderCullTest( renderData ) )
				return false;
		}

		return true;
	}
	return false;
}


void EnvModel::render( RenderData &renderData )
{
	glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT);
	
	glDisable(GL_LIGHTING);
	glFrontFace(GL_CCW);
	
	
	if( m_Alpha < 255 )
	{
		glEnable( GL_BLEND );
		glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
	}

	glPushMatrix();

	glTranslatef(origin[0],origin[1],origin[2]);
	
	glRotatef( angles[2]+90, 0, 0,1 );
	glRotatef( angles[0], 1,0,0);
	
	if( m_pNearestFace )
		glColor4f( rendercolor[0], rendercolor[1], rendercolor[2], m_Alpha / 255.0f );

	if(m_pModel)
	{
		m_pModel->update( renderData.frameTimes.elapsed_seconds );
		m_pModel->draw();
	}

	glPopMatrix();
	
	glFrontFace(GL_CW);
	glPopAttrib();
}

void EnvModel::update( float seconds )
{
	//aktualizujeme barvu dle svetla
	if( m_pNearestFace )
		m_pNearestFace->getLightColor( (GLfloat*)&rendercolor );
}


bool EnvModel::collisionDetection( CollisionData &collData )
{
	if( !m_bCollide )
		return false;
	return boundingBoxCollisionDetection( m_Bounds, collData);
}
//#include "env_model.h"
//
//
//CEnvModel::CEnvModel( )
//{
//	init();
//	m_pModel = NULL;
//	m_sClassName = "env_model";
//}
//
//void CEnvModel::compile()
//{
//	if( !m_pModel )
//	{
//		m_pModel = modelLib::modelLibrary.applyStaticMS3DModel( m_sFilename );
//	}
//	/*if(m_mlkModel != NULL)
//		delete m_mlkModel;
//
//	m_mlkModel = new MilkshapeModel();
//	if(!modelName.empty())
//		m_mlkModel->loadModelData( modelName.c_str() );*/
//
//}
//
//void CEnvModel::decompile()
//{
//	/*if(firstBrush != NULL)
//	{
//		delete firstBrush;	//meli by se sami smazat polygony i pointy
//		firstBrush = NULL;
//	}	*/
//	if(pTarget != NULL)
//	{
//		delete pTarget;
//		pTarget = NULL;
//	}
//	if(m_pModel)
//	{
//		modelLib::modelLibrary.unloadModel( m_sFilename );
//		delete m_pModel;
//		m_pModel = NULL;
//	}
//}
//
//void CEnvModel::draw()
//{
//	glPushMatrix();
//	glPushAttrib(GL_ENABLE_BIT);
//	
//	glTranslatef(origin[0], origin[1], origin[2]);
//	
//	glRotatef(angle[0], 1.0f,0.0f,0.0f);
//	glRotatef(angle[2]-90.0f, 0.0f,0.0f,1.0f);
//	glRotatef(-angle[1], 0.0f,1.0f,0.0f);
//	glRotatef(90.0f, 1.0f,0.0f,0.0f);
//	
//	glDisable(GL_LIGHTING);
//	
//	glColor3f(1.0f,1.0f,1.0f);
//
//	glFrontFace(GL_CCW);
//
//	if(m_pModel)
//		m_pModel->draw();
//	glFrontFace(GL_CW);
//
//	glPopAttrib();
//	glPopMatrix();
//
//}
