source-engine/hammer/sprite.h

161 lines
3.7 KiB
C
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $Workfile: $
// $Date: $
// $NoKeywords: $
//===========================================================================//
#ifndef SPRITE_H
#define SPRITE_H
#pragma once
#include "mathlib/mathlib.h"
#include "materialsystem/imaterialsystem.h"
class CTexture;
class CMaterial;
class IMaterialVar;
class CRender;
class CRender3D;
// must match definition in modelgen.h
enum synctype_t
{
ST_SYNC=0,
ST_RAND
};
#define SPR_VP_PARALLEL_UPRIGHT 0
#define SPR_FACING_UPRIGHT 1
#define SPR_VP_PARALLEL 2
#define SPR_ORIENTED 3
#define SPR_VP_PARALLEL_ORIENTED 4
#define SPR_NORMAL 0
#define SPR_ADDITIVE 1
#define SPR_INDEXALPHA 2
#define SPR_ALPHATEST 3
//-----------------------------------------------------------------------------
// From engine\GL_MODEL.H:
//-----------------------------------------------------------------------------
class CSpriteModel
{
public:
CSpriteModel(void);
~CSpriteModel(void);
bool LoadSprite(const char *pszSpritePath);
int GetFrameCount(void);
int GetWidth() const;
int GetHeight() const;
int GetType() const;
void Bind( CRender* pRender, int frame );
void GetRect( float& left, float& up, float& right, float& down ) const;
void SetRenderMode( const int mode );
void SetMaterialPrimitiveType( const MaterialPrimitiveType_t type );
void SetOrigin( const Vector &v );
void GetOrigin( Vector &v );
void SetAngles( const QAngle& pfAngles );
void SetScale( const float fScale );
void SetInvert( const bool b );
inline void SetTextureExtent( Vector2D TexUL, Vector2D TexLR ) { m_TexUL = TexUL; m_TexLR = TexLR; }
inline void SetExtent( Vector2D UL, Vector2D LR ) { m_UL = UL; m_LR = LR; }
void DrawSprite3D( CRender3D *pRender, unsigned char color[3] );
protected:
void GetSpriteAxes(QAngle& Angles, int type, Vector& forward, Vector& right, Vector& up, Vector& ViewUp, Vector& ViewRight, Vector& ViewForward);
Vector m_Origin;
QAngle m_Angles;
float m_fScale;
MaterialPrimitiveType_t m_MaterialPrimitiveType;
CMaterial* m_pMaterial;
IMaterialVar* m_pFrameVar;
IMaterialVar* m_pRenderModeVar;
int m_NumFrames;
int m_Type;
int m_Width;
int m_Height;
bool m_bInvert;
Vector2D m_TexUL, m_TexLR;
Vector2D m_UL, m_LR;
};
//-----------------------------------------------------------------------------
// inline methods
//-----------------------------------------------------------------------------
inline int CSpriteModel::GetWidth() const
{
return m_Width;
}
inline int CSpriteModel::GetHeight() const
{
return m_Height;
}
inline int CSpriteModel::GetType() const
{
return m_Type;
}
inline void CSpriteModel::GetRect( float& left, float& up, float& right, float& down ) const
{
left = m_UL.x;
right = m_LR.x;
up = m_UL.y;
down = m_LR.y;
}
//-----------------------------------------------------------------------------
// Sprite cache
//-----------------------------------------------------------------------------
struct SpriteCache_t
{
CSpriteModel *pSprite;
char *pszPath;
int nRefCount;
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
#define SPRITE_CACHE_SIZE 1024
class CSpriteCache
{
public:
static CSpriteModel *CreateSprite(const char *pszSpritePath);
static void AddRef(CSpriteModel *pSprite);
static void Release(CSpriteModel *pSprite);
protected:
static bool AddSprite(CSpriteModel *pSprite, const char *pszSpritePath);
static void RemoveSprite(CSpriteModel *pSprite);
static SpriteCache_t m_Cache[SPRITE_CACHE_SIZE];
static int m_nItems;
};
#endif // SPRITE_H