/*********************************************************************//**
*	\brief BaseMoveable
*	Abstraktni trida definuje specialni typ funkci, ktere se mohou
*	pohybovat po predem dane draze.
*	
*	\author Michal Jirous
*	\date 23.04.2009
*	\file ent_basemoveable.h
**********************************************************************/

#ifndef __BASE_MOVEABLE_H__
#define __BASE_MOVEABLE_H__

#include "ent_basefunction.h"
#include "interpolation.h"
enum
{
	STATUS_STOPPED = 0,
	STATUS_MOVING
};



class CBaseMoveable : public CBaseFunction
{
protected:
	BoundingBox m_RenderBounds;		//vzdy definuje provedeny pohyb
	BoundingBox m_CollisionBounds;	//vzdy o vektor pohybu dopredu
	Vector m_NextMovement;
	float m_fVelocityScalar;
	Interpolation m_Interpolation;	//m_Interpolation.target = origin

	Point m_Target;

	Point m_Store_Target;
	Point m_Store_StartOrigin;
	Point m_Store_ModelOrigin;
	int m_iStatus;
	
	bool m_bCollisionBlocked;

	virtual void onReachTarget(){}
	virtual void onStartMoving(){}
	bool collDet(  CollisionData &collData );
public:
	CBaseMoveable();


	virtual void setParameters( parameters_t &parametersMap );

	//virtual void setParameters( parameters_t &parametersMap );
	virtual void render( RenderData &renderData );	//
	virtual bool renderCullTest(  RenderData &renderData );	//
	virtual void update( float seconds );

	virtual bool forceCollisionDetection( CollisionData &collData );
	virtual bool collisionDetection( CollisionData &collData );	//
	virtual bool rayTrace( RayTraceData &rayData );	//

	virtual void compile();	/*!< @brief Nastavime pocatecni vektor pohybu jestli nejaky je. */
	//virtual void decompile();

	virtual void goBackInTime();
	virtual void updateBackTime();

	virtual void restart();


	void setVelocity( float vel )	{ m_fVelocityScalar = vel; }
	Vector &getNextMovement()	{ return m_NextMovement; }
	void setTarget( const Point &p ) { m_Target = p; }

	void blockCollisionDetection() { m_bCollisionBlocked = true; }
	void unblockCollisionDetection() { m_bCollisionBlocked = false; }

	BoundingBox &getCollisionMovedBox()	{ return m_CollisionBounds; }

	virtual void blockMovement( CollisionData &collData ){}
};








#endif /*__BASE_MOVEABLE_H__*/
