/*********************************************************************//**
*	Hybatelna vec.
*	Tato entita dokaze aktivovat ostatni entity v urcity cas.
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_pushable.cpp
**********************************************************************/

#include "ent_pushable.h"

FuncPushable::FuncPushable()
{
	m_sClassName = "func_pushable";

}

void FuncPushable::compile()
{
	CBaseEntity::compile();	//preskocime CBasePhysics, protoze tady mame vlastni compile
	m_pModel = modelLib::modelLibrary.applyStaticMS3DModel( m_sModelName );	//TODO
	BoundingBox AABB;
	if( m_pModel )
	{
		m_pModel->getBoundingBox( (float*)AABB.m_fBounds, (float*)&AABB.m_fBounds[3] );
	}

	float height = (AABB.m_fBounds[MAX_Z] - AABB.m_fBounds[MIN_Z]);
	float width = std::max(AABB.m_fBounds[MAX_X]-AABB.m_fBounds[MIN_X], AABB.m_fBounds[MAX_Y] - AABB.m_fBounds[MIN_Y]);
	
	//origin je dole
	origin+=Point(0,0,height);
	m_Model.createLinkedBlock( origin, height, width/2.0f );
	m_InterpolatedPosition.reset( origin );	//nastavime aktualni origin za startovni
	m_Store_Position = origin;
	m_Store_Angles = angles;
}

 void FuncPushable::prepareForCollision()
 {

	 CBasePhysics::prepareForCollision();
	 
 }

void FuncPushable::setParameters( parameters_t &parametersMap )
{
	CBasePhysics::setParameters( parametersMap );
	m_sModelName = getParameterValue( parametersMap, "model" );
	std::string value = getParameterValue( parametersMap, "weight" );
	if( !value.empty() )
		m_Weight = (float)atof( value.c_str() );

}


void FuncPushable::render( RenderData &renderData )
{
	CBasePhysics::render( renderData );
	glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT);
	
	glDisable(GL_LIGHTING);
	glFrontFace(GL_CCW);
	
	
	glPushMatrix();

	glTranslatef(m_InterpolatedPosition.current[0],
		m_InterpolatedPosition.current[1],
		m_InterpolatedPosition.current[2] - (m_Model.m_StaticBounds.m_fBounds[MAX_Z] - m_Model.m_StaticBounds.m_fBounds[MIN_Z]));
	
	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();
}

bool FuncPushable::renderCullTest( RenderData &renderData )
{
	return renderData.frustum->isBoundsInsideFrustum( m_Model.m_StaticBounds );
}

void FuncPushable::onCollide( CollisionData &collData )
{
	
	addForce( ((CBasePhysics*)collData.initiator)->getForceOfMovement() );
}
