//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef SPRITETRAIL_H #define SPRITETRAIL_H #ifdef _WIN32 #pragma once #endif #include "Sprite.h" #if defined( CLIENT_DLL ) #define CSpriteTrail C_SpriteTrail #endif //----------------------------------------------------------------------------- // Sprite trail //----------------------------------------------------------------------------- struct TrailPoint_t { DECLARE_SIMPLE_DATADESC(); Vector m_vecScreenPos; float m_flDieTime; float m_flTexCoord; float m_flWidthVariance; }; class CSpriteTrail : public CSprite { DECLARE_CLASS( CSpriteTrail, CSprite ); DECLARE_DATADESC(); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); public: CSpriteTrail( void ); // Sets parameters of the sprite trail void SetLifeTime( float time ); void SetStartWidth( float flStartWidth ); void SetEndWidth( float flEndWidth ); void SetStartWidthVariance( float flStartWidthVariance ); void SetTextureResolution( float flTexelsPerInch ); void SetMinFadeLength( float flMinFadeLength ); void SetSkybox( const Vector &vecSkyboxOrigin, float flSkyboxScale ); // Is the trail in the skybox? bool IsInSkybox() const; void Spawn( void ); void Precache( void ); void SetTransmit( bool bTransmit = true ) { m_bDrawForMoveParent = bTransmit; } #if defined( CLIENT_DLL ) // Client only code virtual int DrawModel( int flags ); virtual const Vector &GetRenderOrigin( void ); virtual const QAngle &GetRenderAngles( void ); // On data update virtual void OnPreDataChanged( DataUpdateType_t updateType ); virtual void OnDataChanged( DataUpdateType_t updateType ); virtual void GetRenderBounds( Vector& mins, Vector& maxs ); virtual void ClientThink(); virtual bool ValidateEntityAttachedToPlayer( bool &bShouldRetry ); #else // Server only code virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo ); static CSpriteTrail *SpriteTrailCreate( const char *pSpriteName, const Vector &origin, bool animate ); #endif private: #if defined( CLIENT_DLL ) enum { // NOTE: # of points max must be a power of two! MAX_SPRITE_TRAIL_POINTS = 256, MAX_SPRITE_TRAIL_MASK = MAX_SPRITE_TRAIL_POINTS - 1, }; TrailPoint_t *GetTrailPoint( int n ); void UpdateTrail( void ); void ComputeScreenPosition( Vector *pScreenPos ); void ConvertSkybox(); void UpdateBoundingBox( void ); TrailPoint_t m_vecSteps[MAX_SPRITE_TRAIL_POINTS]; int m_nFirstStep; int m_nStepCount; float m_flUpdateTime; Vector m_vecPrevSkyboxOrigin; float m_flPrevSkyboxScale; Vector m_vecRenderMins; Vector m_vecRenderMaxs; #endif CNetworkVar( float, m_flLifeTime ); // Amount of time before a new trail segment fades away CNetworkVar( float, m_flStartWidth ); // The starting scale CNetworkVar( float, m_flEndWidth ); // The ending scale CNetworkVar( float, m_flStartWidthVariance ); // The starting scale CNetworkVar( float, m_flTextureRes ); // Texture resolution along the trail CNetworkVar( float, m_flMinFadeLength ); // The end of the trail must fade out for this many units CNetworkVector( m_vecSkyboxOrigin ); // What's our skybox origin? CNetworkVar( float, m_flSkyboxScale ); // What's our skybox scale? string_t m_iszSpriteName; bool m_bAnimate; bool m_bDrawForMoveParent; #if defined( CLIENT_DLL ) public: void SetUpdateTime(float setTo){ m_flUpdateTime = setTo; } #endif }; #endif // SPRITETRAIL_H