//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //===========================================================================// #if !defined( BEAMDRAW_H ) #define BEAMDRAW_H #ifdef _WIN32 #pragma once #endif #include "materialsystem/imaterial.h" #include "materialsystem/imesh.h" #include "mathlib/vector.h" #include "tier2/beamsegdraw.h" #include "c_pixel_visibility.h" #define NOISE_DIVISIONS 128 //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- struct model_t; struct BeamTrail_t; //----------------------------------------------------------------------------- // Purpose: Beams fill out this data structure // This is also used for rendering //----------------------------------------------------------------------------- class Beam_t : public CDefaultClientRenderable { public: Beam_t(); // Methods of IClientRenderable virtual const Vector& GetRenderOrigin( void ); virtual const QAngle& GetRenderAngles( void ); virtual const matrix3x4_t &RenderableToWorldTransform(); virtual void GetRenderBounds( Vector& mins, Vector& maxs ); virtual bool ShouldDraw( void ); virtual bool IsTransparent( void ); virtual int DrawModel( int flags ); virtual void ComputeFxBlend( ); virtual int GetFxBlend( ); // Resets the beam state void Reset(); // Method to computing the bounding box void ComputeBounds(); // Bounding box... Vector m_Mins; Vector m_Maxs; pixelvis_handle_t *m_queryHandleHalo; float m_haloProxySize; // Data is below.. // Next beam in list Beam_t* next; // Type of beam int type; int flags; // Control points for the beam int numAttachments; Vector attachment[MAX_BEAM_ENTS]; Vector delta; // 0 .. 1 over lifetime of beam float t; float freq; // Time when beam should die float die; float width; float endWidth; float fadeLength; float amplitude; float life; // Color float r, g, b; float brightness; // Speed float speed; // Animation float frameRate; float frame; int segments; // Attachment entities for the beam EHANDLE entity[MAX_BEAM_ENTS]; int attachmentIndex[MAX_BEAM_ENTS]; // Model info int modelIndex; int haloIndex; float haloScale; int frameCount; float rgNoise[NOISE_DIVISIONS+1]; // Popcorn trail for beam follows to use BeamTrail_t* trail; // for TE_BEAMRINGPOINT float start_radius; float end_radius; // for FBEAM_ONLYNOISEONCE bool m_bCalculatedNoise; float m_flHDRColorScale; #ifdef PORTAL bool m_bDrawInMainRender; bool m_bDrawInPortalRender; #endif //#ifdef PORTAL }; int ScreenTransform( const Vector& point, Vector& screen ); void DrawSegs( int noise_divisions, float *prgNoise, const model_t* spritemodel, float frame, int rendermode, const Vector& source, const Vector& delta, float startWidth, float endWidth, float scale, float freq, float speed, int segments, int flags, float* color, float fadeLength, float flHDRColorScale = 1.0f ); void DrawTeslaSegs( int noise_divisions, float *prgNoise, const model_t* spritemodel, float frame, int rendermode, const Vector& source, const Vector& delta, float startWidth, float endWidth, float scale, float freq, float speed, int segments, int flags, float* color, float fadeLength, float flHDRColorScale = 1.0f ); void DrawSplineSegs( int noise_divisions, float *prgNoise, const model_t* beammodel, const model_t* halomodel, float flHaloScale, float frame, int rendermode, int numAttachments, Vector* attachment, float startWidth, float endWidth, float scale, float freq, float speed, int segments, int flags, float* color, float fadeLength, float flHDRColorScale = 1.0f ); void DrawHalo(IMaterial* pMaterial, const Vector& source, float scale, float const* color, float flHDRColorScale = 1.0f ); void BeamDrawHalo( const model_t* spritemodel, float frame, int rendermode, const Vector& source, float scale, float* color, float flHDRColorScale = 1.0f ); void DrawDisk( int noise_divisions, float *prgNoise, const model_t* spritemodel, float frame, int rendermode, const Vector& source, const Vector& delta, float width, float scale, float freq, float speed, int segments, float* color, float flHDRColorScale = 1.0f ); void DrawCylinder( int noise_divisions, float *prgNoise, const model_t* spritemodel, float frame, int rendermode, const Vector& source, const Vector& delta, float width, float scale, float freq, float speed, int segments, float* color, float flHDRColorScale = 1.0f ); void DrawRing( int noise_divisions, float *prgNoise, void (*pfnNoise)( float *noise, int divs, float scale ), const model_t* spritemodel, float frame, int rendermode, const Vector& source, const Vector& delta, float width, float amplitude, float freq, float speed, int segments, float* color, float flHDRColorScale = 1.0f ); void DrawBeamFollow( const model_t* spritemodel, BeamTrail_t* pHead, int frame, int rendermode, Vector& delta, Vector& screen, Vector& screenLast, float die, const Vector& source, int flags, float width, float amplitude, float freq, float* color, float flHDRColorScale = 1.0f ); void DrawBeamQuadratic( const Vector &start, const Vector &control, const Vector &end, float width, const Vector &color, float scrollOffset, float flHDRColorScale = 1.0f ); class CEngineSprite *Draw_SetSpriteTexture( const model_t *pSpriteModel, int frame, int rendermode ); //----------------------------------------------------------------------------- // Assumes the material has already been bound //----------------------------------------------------------------------------- void DrawSprite( const Vector &vecOrigin, float flWidth, float flHeight, color32 color ); #endif // BEAMDRAW_H