//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef MAPSPRITE_H
#define MAPSPRITE_H
#pragma once


#include "MapHelper.h"
#include "Sprite.h"


class CRender3D;
class CSpriteModel;


//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CMapSprite : public CMapHelper
{
	public:

		//
		// Factories.
		//
		static CMapClass *CreateMapSprite(CHelperInfo *pHelperInfo, CMapEntity *pParent);
		static CMapSprite *CreateMapSprite(const char *pszSpritePath);

		//
		// Construction/destruction:
		//
		CMapSprite(void);
		~CMapSprite(void);

		DECLARE_MAPCLASS(CMapSprite, CMapHelper)

		void CalcBounds(BOOL bFullUpdate = FALSE);

		virtual CMapClass *Copy(bool bUpdateDependencies);
		virtual CMapClass *CopyFrom(CMapClass *pFrom, bool bUpdateDependencies);

		void Initialize(void);
		void Render2D(CRender2D *pRender);
		void Render3D(CRender3D *pRender);

		// Called by entity code to render sprites
		void RenderLogicalAt(CRender2D *pRender, const Vector2D &vecMins, const Vector2D &vecMaxs );

		void GetAngles(QAngle &Angles);

		int SerializeRMF(std::fstream &File, BOOL bRMF);
		int SerializeMAP(std::fstream &File, BOOL bRMF);

		static void SetRenderDistance(float fRenderDistance);
		static void EnableAnimation(BOOL bEnable);

		bool ShouldRenderLast(void);

		bool IsVisualElement(void) { return(true); }
		
		const char* GetDescription() { return("Sprite"); }

		void OnParentKeyChanged(const char* szKey, const char* szValue);

	protected:

		//
		// Implements CMapAtom transformation functions.
		//
		void DoTransform(const VMatrix &matrix);
		
		int  GetNextSpriteFrame( CRender3D* pRender );
		void SetRenderMode( int mode );
		void SpriteColor(unsigned char *pColor, int eRenderMode, colorVec RenderColor, int alpha);

		QAngle m_Angles;

		CSpriteModel *m_pSpriteInfo;	// Pointer to a sprite model in the cache.
		int m_nCurrentFrame;			// Current sprite frame for rendering.
		float m_fSecondsPerFrame;		// How many seconds to render each frame before advancing.
		float m_fElapsedTimeThisFrame;	// How many seconds we have rendered this sprite frame so far.
		float m_fScale;					// Sprite scale along sprite axes.
		int m_eRenderMode;				// Our render mode (transparency, etc.).
		colorVec m_RenderColor;			// Our render color.
		bool m_bIsIcon;					// If true, this sprite is an iconic representation of an entity.
};

#endif // MAPSPRITE_H