/*********************************************************************//**
*	Lano.
*	S vyuzitim spring systemu vytvori ve scene lano
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_env_rope.cpp
**********************************************************************/

#include "ent_env_rope.h"

EnvRope::EnvRope()
{
	m_sClassName = "env_rope";
	m_iProperties = ENT_PARM_RENDER | ENT_PARM_RUNNABLE;
	m_fConsistency = 10000;
	m_fFriction = 30;
	m_fDefaultPointDistance = 3;
	m_fLength_balance_add = 0.2f;
	m_fTimeValue = 0;
}


void EnvRope::render( RenderData &renderData )
{
	m_fTimeValue += renderData.frameTimes.elapsed_seconds;

	while( m_fTimeValue > DEFAULT_UPDATE_TIME )
	{	
		m_fTimeValue -= DEFAULT_UPDATE_TIME;
		m_Rope.update( DEFAULT_UPDATE_TIME );
	}

		
	//if( renderData.frameTimes.elapsed_seconds > 0 )
	//m_Rope.update( renderData.frameTimes.elapsed_seconds );
	glPushClientAttrib( GL_CLIENT_ALL_ATTRIB_BITS );
	m_Rope.draw();
	glPopClientAttrib();
}
	

#include "ctrl_gamevars.h"
#include "ctrl_var_definition.h"
void EnvRope::update( float seconds )
{
	CBaseEnvironment::update( seconds );

	Vector windForce;
	for( std::list<EnvWind*>::iterator iter = m_Winds.begin(); iter != m_Winds.end(); ++iter )
	{
		windForce += (*iter)->getWindForce();
	}
	
	m_Rope.setOutsideForce( windForce );
	m_Rope.setGravity( gamevarsLibrary::getfData( vardef::GRAVITY_NAME ) );


}

void EnvRope::setParameters( parameters_t &parametersMap )
{
	CBaseEnvironment::setParameters( parametersMap );
	
	m_sStartNode = getParameterValue( parametersMap, "startnode" );
	m_sWinds = getParameterValue( parametersMap, "winds" );


	std::string value = getParameterValue( parametersMap, "consistency" );
	if( !value.empty() )
		m_fConsistency = (float)atof( value.c_str() );

	value = getParameterValue( parametersMap, "friction" );
	if( !value.empty() )
		m_fFriction = (float)atof( value.c_str() );

	value = getParameterValue( parametersMap, "pointdistance" );
	if( !value.empty() )
		m_fDefaultPointDistance = (float)atof( value.c_str() );

	value = getParameterValue( parametersMap, "lengthadd" );
	if( !value.empty() )
		m_fLength_balance_add = (float)atof( value.c_str() );
}


#include "parsing.h"
#include "level_loader.h"
void EnvRope::compile()
{
	CBaseEnvironment::compile();

	//nejprve najdeme vsechny vetry
	std::istringstream in( m_sWinds );
	std::string neightbourName;
	while( !(neightbourName = parsing::readField( in, ';' )).empty() )
	{
		entityList_t *wind = levelLoader.m_Entities.getEntitiesByName( neightbourName );
		if( wind )
		{
			for( entityList_t::iterator iter = wind->begin(); iter != wind->end(); ++iter )
			{
				if( (*iter)->getClassName() == "env_wind" )
				{
					m_Winds.push_back( reinterpret_cast<EnvWind*>( (*iter) ) );
				}
			}
		}
	}

	//ted najdeme prvni node
	entityList_t *node = levelLoader.m_Entities.getEntitiesByName( m_sStartNode );
	ropenode_t *start = NULL;
	if( node && node->front()->getClassName() == "info_rope_node")
	{
		node->front()->compile();
		start = reinterpret_cast<RopeNode*>(node->front())->getRopeNode();
	}


	if( start )
	{
		m_Rope.setWeight( 0.5f );
		m_Rope.create( 10000, 20.5, 20, start, 0.00 );
	}

}
