/*********************************************************************//**
*	Zebrik.
*	
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_func_ladder.cpp
**********************************************************************/

#include "ent_func_ladder.h"
#include "mathematic.h"
#include "algebraic_ext.h"

Vector transformLadderMovement( Vector &movement, Vector &ladderNormal )	//movement je real vektor
{
	Vector newMovement = movement;
	/*if( newMovement.z < 0 )
		newMovement.z = 0;*/
	//nejprve zjistime jestli smeruje smerem k zebriku
	Vector ladder_axis = Vector( 0,0,1) * ladderNormal;

	Vector horizontal = ladderNormal;
	horizontal.z = 0;
	float angle = get360VectorsAngle( horizontal, ladderNormal );
	angle;

	Vector movementNormal = movement * ladder_axis;
	Vector onNormal = ladder_axis * movementNormal;
	//float currentAngle = onNormal.scalarMultiply( ladderNormal );
	float currentAngle = get360VectorsAngle( ladderNormal, onNormal );

	if( currentAngle > 90.0f && currentAngle < 180.0f )
	{
		angle -= (currentAngle - 135);
	}
	else if( currentAngle > 270.0f && currentAngle < 360.0f )
	{
		angle -= (currentAngle -315);
	}
	else
		angle -= 45;


	newMovement = rotateVector( ladder_axis, angle, newMovement );	//TODO - co takhle s kvaternionem?

	
	if( newMovement.scalarMultiply( horizontal ) < 90.0f )
	{
		//pokud sviraji uhel mensi nez 90 stupnu, tak je pohyb smerem od zebriku a my ho musime prevratit
		newMovement = mirrorVectorByPlane( newMovement, ladderNormal );
	}

	return newMovement;
}

FuncLadder::FuncLadder()
{
	m_sClassName = "func_ladder";
	m_iProperties = ENT_PARM_RENDER | ENT_PARM_COLLIDING | ENT_PARM_SHOOTABLE;
}
