/*********************************************************************//**
*	\brief Bodove entity
*	Soubor implementuje abstraktni tridu BaseEnvironment, ktery je jejich
*	nadtridou. Dale jsou zde nektere ze zakladnich entit, ktere sem patri.
*	
*	\author Michal Jirous
*	\date 23.04.2009
*	\file ent_environments.h
**********************************************************************/

#ifndef __ENVIRONMENTS_H__
#define __ENVIRONMENTS_H__

#include "ent_baseentity.h"


class CBaseEnvironment : public CBaseEntity
{
public:
	CBaseEnvironment();
	virtual bool collisionDetection( CollisionData &collData ){return false;}
	virtual bool rayTrace( RayTraceData &rayData ){return false;}
};

#define PLAY_ONCE	1





class InfoTarget : public CBaseEnvironment
{
public:
	InfoTarget() : CBaseEnvironment() {}
};

LINK_ENTITY_TO_CLASS( info_target, InfoTarget );



#define ENV_MESSAGE_FONT  "SERIF16"

#include "fonts.h"
#include "colors.h"
class EnvMessage : public CBaseEnvironment
{
	float x, y;
	Color4I m_Color;
	Uint32 m_uiDuration;
	fontLibrary::DString m_dsMessage;
	bool m_bPlayOnce, m_bIsOn;
	void createMessage( std::string str, int maxWidth );
public:
	EnvMessage();
	virtual void passFlags( int flags );
	virtual void onTarget( int target_type );
	virtual void setParameters( parameters_t &parametersMap );
};

LINK_ENTITY_TO_CLASS( env_message, EnvMessage );








#define FADE_STAY 1;

class EnvFade : public CBaseEnvironment
{
	Uint32 m_uiFadeInDuration, m_uiFadeDuration, m_uiFadeOutDuration;
	float m_fStartAlpha, m_fDurationAlpha, m_fEndAlpha;
	bool m_bStay;
	virtual void passFlags( int flags );
public:
	EnvFade();
	virtual void onTarget( int target_type );
	virtual void setParameters( parameters_t &parametersMap );
};

LINK_ENTITY_TO_CLASS( env_fade, EnvFade );




class InfoExit : public CBaseEnvironment
{
public:
	InfoExit();
	virtual void onTarget( int target_type );
};

LINK_ENTITY_TO_CLASS( info_exit, InfoExit );


#define REMOTE_USAGE	1
class EnvText : public CBaseEnvironment
{
	int m_iWidth;
	bool m_bRemoteUsage;
	std::string m_sMessage;
	Font *m_pFont;
	float m_fSize;
	fontLibrary::DString m_dsMessage;
	GLuint m_uiDlist;
	virtual void passFlags( int flags );
	BoundingBox m_Bounds;
public:
	EnvText();
	void setText( std::string text );
	virtual void compile();
	virtual void decompile();
	virtual void setParameters( parameters_t &parametersMap );
	virtual void render( RenderData &renderData );
	virtual bool renderCullTest( RenderData &renderData );
};


LINK_ENTITY_TO_CLASS( env_text, EnvText );






#define SHOW_REMAINING	1

class InfoCounter : public CBaseEnvironment
{
	std::string m_sTargetTexts;
	int m_uiCounter;
	int m_uiThreshold;
	bool m_bShowRemaining;
	virtual void passFlags( int flags );
	void setText();
	std::list<EnvText*> m_TargetTexts;
public:
	InfoCounter();
	virtual void setParameters( parameters_t &parametersMap );
	virtual void onTarget( int target_type );
	virtual void goBackInTime();
	virtual void restart();
	virtual void compile();
};

LINK_ENTITY_TO_CLASS( info_counter, InfoCounter );



class InfoCommand : public CBaseEnvironment
{
	std::string m_sCommand;
public:
	InfoCommand();
	virtual void setParameters( parameters_t &parametersMap );
	virtual void onTarget( int target_type );
};

LINK_ENTITY_TO_CLASS( info_command, InfoCommand );


class EnvSnow : public CBaseEnvironment
{
	
public:
	EnvSnow();
	virtual void setParameters( parameters_t &parametersMap );
};

LINK_ENTITY_TO_CLASS( env_snow, EnvSnow );

class EnvSnowGlobal : public CBaseEnvironment
{
	std::string m_sWinds;
	int m_iDensity;
public:
	EnvSnowGlobal();
	virtual void setParameters( parameters_t &parametersMap );
	virtual void compile();
};

LINK_ENTITY_TO_CLASS( env_snow_global, EnvSnowGlobal );





#endif /*__ENVIRONMENTS_H__*/

