/*********************************************************************//**
*	\brief Modul pro detekci kolizi a provadeni pohybu entit, ktere koliduji se scenou.
*	V tomto modulu jsou implementovany vsechny potrebne funkce
*	pro vypocty pohybu entit. Pri takovemto pohybu je nutne spocitat,
*	jestli hrac nenarazil do zdi a take provadet detekci chuze do schodu
*	nebo po zebriku, vypocitat, jestli se hrac pohybuje po zebriku
*	a tento pohyb provest, vylezani z vody a nakonec vypocet reakce
*	na pohybujici se objekty. Dalsi funkci je ray tracing, kdy je nutne
*	napriklad pro strely vypocitat, kam dopadly.
*
*	\author Michal Jirous
*	\date 13.02.2009
*	\file level_collision.h
**********************************************************************/

#ifndef __LEVEL_COLLISION_H
#define __LEVEL_COLLISION_H

#include "level_structs.h"
#include "level_bspfile_def.h"
#include "level_data.h"

const float COLL_GROUND_DETECT_ANGLE = ALG_STAIRS_DETECT_ANGLE;	/*!< @brief Maximalni uhel natoceni polochy, po ktere lze chodit jako po zemi. */
const float COLL_LADDER_NORMAL_MAX_ANGLE = 30.0f;	/*!< @brief Maximalni uhel natoceni plochy zebriku, po ktere lze jeste lezt. */
const float COLL_STAIRS_ADDITIONAL_HEIGHT = 24.0f;	/*!< @brief Maximalni vyska pro chuzi do schodu. */
const float COLL_JUMP_OUT_OF_WATER_ADDITIONAL_HEIGHT = COLL_STAIRS_ADDITIONAL_HEIGHT;

#include "ent_func_ladder.h"

/** @brief Trida modulu pro detekci kolizi. */
class LevelCollision
{
	bool BSPLeafCollision( CollisionData &collData, BSPLeaf &leaf );
	bool BSPLeafRayTracing( BSPLeaf &leaf ) const;

	Vector resultsVectors( const Vector &move, CollisionData &collData, CBasePhysics *pPlayer );
	Vector resultsVectorsMove( Vector &move, Vector &normal, Vector &forceVector, CBasePhysics* creature );
	//bool BSPTreeRayTracing( BSPNode &currentNode ) const;
	
	bool RayTrace(int nodeIndex, float startRatio, float endRatio, Vector vStart, Vector vEnd);
	RayTraceData *tmpRayData;
	int myPos;
	void setLadderParameters( float fDistance, Vector &vecLadderNormal, FuncLadder *pLadder );
	bool collisionDetection( CollisionData &collData );

	Face* BSPTreeFindNearestBox( int node, const BoundingBox &box, float &dist ) const;
public:
	
	int clippingHullCollision( const Point &position, int hull_type = HULL_REALWORLD );	/*!< @brief Detekce kolizi pomoci HULL ploch (nepresne ale rychle vypocty). */
	int clippingHullCollision( const Point &position, const dmodel_t &model, int hull_type = HULL_REALWORLD );	/*!< @brief Detekce kolizi pomoci HULL ploch (nepresne ale rychle vypocty). */
	int clippingHullCollision( const Point &position, size_t model, int hull_type = HULL_REALWORLD );	/*!< @brief Detekce kolizi pomoci HULL ploch (nepresne ale rychle vypocty). */
	int findLeaf( const Point &position );	/*!< @brief Funkce nalezne list v modelu cislo 0, kde se prave nachazi zadany bod (vetsinou kamera). */
	
	
	bool rayTrace(  RayTraceData &rayData  );	/*!< @brief Funkce hleda prunik zadane poloprimky s modely sceny. */

	bool rayTrace( RayTraceData &rayData, int startNode );	/*!< @brief Funkce hleda prunik zadane poloprimky se zadanym modelem. */
	bool BSPTreeCollision( CollisionData &collData, BSPNode &currentNode );	/*!< @brief Funkce provadi detekci kolizi objektu se zadanym modelem. */



	void processMoving( std::list<CBasePhysics*> &entityList);					/*!< @brief Funkce provadi vypocet detekce kolizi pohybu entit. */
	void processPlayerUsage();		/*!< @brief Funkce provadi funkci interakce hrace se svetem. */
	void processPlayerPointing();	/*!< @brief Funkce provadi funkci ukazovani hrace se svetem. */
	bool processShooting( AttackInfo &attackInfo );	/*!< @brief Funkce provadi vypocet trajektorie strely. */

	Face *findNearestFace( const BoundingBox &box, float &dist ) const;	/*!< @brief Funkce nalezne nejblizsi face k bounding boxu v parametru. */
};

extern LevelCollision collisionSystem;	/*!< @brief Globalni definice modelu detekce kolizi. */





#endif /*__LEVEL_COLLISION_H*/
