You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
6.9 KiB
198 lines
6.9 KiB
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//===========================================================================//
|
|
#if !defined( BEAMSEGDRAW_H )
|
|
#define BEAMSEGDRAW_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#define NOISE_DIVISIONS 128
|
|
|
|
|
|
#include "mathlib/vector.h"
|
|
#include "materialsystem/imesh.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
struct BeamTrail_t;
|
|
class IMaterial;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CBeamSegDraw is a simple interface to beam rendering.
|
|
//-----------------------------------------------------------------------------
|
|
struct BeamSeg_t
|
|
{
|
|
VectorAligned m_vPos;
|
|
color32 m_color;
|
|
float m_flTexCoord; // Y texture coordinate
|
|
float m_flWidth;
|
|
|
|
void SetColor( float r, float g, float b, float a )
|
|
{
|
|
// Specify the points.
|
|
Assert( IsFinite(r) && IsFinite(g) && IsFinite(b) && IsFinite(a) );
|
|
Assert( (r >= 0.0) && (g >= 0.0) && (b >= 0.0) && (a >= 0.0) );
|
|
Assert( (r <= 1.0) && (g <= 1.0) && (b <= 1.0) && (a <= 1.0) );
|
|
|
|
m_color.r = FastFToC( r );
|
|
m_color.g = FastFToC( g );
|
|
m_color.b = FastFToC( b );
|
|
m_color.a = FastFToC( a );
|
|
}
|
|
|
|
void SetColor( float r, float g, float b )
|
|
{
|
|
// Specify the points.
|
|
Assert( IsFinite(r) && IsFinite(g) && IsFinite(b) );
|
|
Assert( (r >= 0.0) && (g >= 0.0) && (b >= 0.0) );
|
|
Assert( (r <= 1.0) && (g <= 1.0) && (b <= 1.0) );
|
|
|
|
m_color.r = FastFToC( r );
|
|
m_color.g = FastFToC( g );
|
|
m_color.b = FastFToC( b );
|
|
}
|
|
|
|
void SetAlpha( float a )
|
|
{
|
|
// Specify the points.
|
|
Assert( IsFinite(a) );
|
|
Assert( (a >= 0.0) );
|
|
Assert( (a <= 1.0) );
|
|
|
|
m_color.a = FastFToC( a );
|
|
}
|
|
|
|
void SetColor( const Vector &vecColor, float a )
|
|
{
|
|
SetColor( vecColor.x, vecColor.y, vecColor.z, a );
|
|
}
|
|
|
|
void SetColor( const Vector4D &vecColor )
|
|
{
|
|
SetColor( vecColor.x, vecColor.y, vecColor.z, vecColor.w );
|
|
}
|
|
|
|
void SetColor( const Vector &vecColor )
|
|
{
|
|
SetColor( vecColor.x, vecColor.y, vecColor.z );
|
|
}
|
|
|
|
void GetColor( Vector4D *pColor )
|
|
{
|
|
pColor->x = m_color.r / 255.0f;
|
|
pColor->y = m_color.g / 255.0f;
|
|
pColor->z = m_color.b / 255.0f;
|
|
pColor->w = m_color.a / 255.0f;
|
|
}
|
|
|
|
void GetColor( Vector *pColor )
|
|
{
|
|
pColor->x = m_color.r / 255.0f;
|
|
pColor->y = m_color.g / 255.0f;
|
|
pColor->z = m_color.b / 255.0f;
|
|
}
|
|
};
|
|
|
|
struct BeamSegRenderInfo_t
|
|
{
|
|
Vector m_vecPoint1;
|
|
Vector m_vecPoint2;
|
|
Vector m_vecCenter;
|
|
Vector m_vecTangentS;
|
|
Vector m_vecTangentT;
|
|
float m_flTexCoord;
|
|
color32 m_color;
|
|
};
|
|
|
|
class CBeamSegDraw
|
|
{
|
|
public:
|
|
CBeamSegDraw() : m_pRenderContext( NULL ) {}
|
|
// Pass null for pMaterial if you have already set the material you want.
|
|
void Start( IMatRenderContext *pRenderContext, int nSegs, IMaterial *pMaterial=0, CMeshBuilder *pMeshBuilder = NULL, int nMeshVertCount = 0 );
|
|
|
|
void ComputeRenderInfo( BeamSegRenderInfo_t *pRenderInfo, const Vector &vecCameraPos, int nSegCount, const BeamSeg_t *pSegs ) RESTRICT;
|
|
virtual void NextSeg( BeamSeg_t *pSeg );
|
|
void End();
|
|
|
|
protected:
|
|
void SpecifySeg( const Vector &vecCameraPos, const Vector &vNextPos );
|
|
void ComputeNormal( const Vector &vecCameraPos, const Vector &vStartPos, const Vector &vNextPos, Vector *pNormal );
|
|
static void LoadSIMDData( FourVectors *pV4StartPos, FourVectors *pV4EndPos, FourVectors *pV4HalfWidth, int nSegCount, const BeamSeg_t *pSegs );
|
|
CMeshBuilder *m_pMeshBuilder;
|
|
int m_nMeshVertCount;
|
|
|
|
CMeshBuilder m_Mesh;
|
|
BeamSeg_t m_Seg;
|
|
|
|
int m_nTotalSegs;
|
|
int m_nSegsDrawn;
|
|
|
|
Vector m_vNormalLast;
|
|
IMatRenderContext *m_pRenderContext;
|
|
|
|
Vector m_vecCameraPos;
|
|
};
|
|
|
|
class CBeamSegDrawArbitrary : public CBeamSegDraw
|
|
{
|
|
public:
|
|
void SetNormal( const Vector &normal );
|
|
void NextSeg( BeamSeg_t *pSeg );
|
|
|
|
protected:
|
|
void SpecifySeg( const Vector &vNextPos );
|
|
|
|
BeamSeg_t m_PrevSeg;
|
|
};
|
|
|
|
#if 0
|
|
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 );
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Assumes the material has already been bound
|
|
//-----------------------------------------------------------------------------
|
|
void DrawSprite( const Vector &vecOrigin, float flWidth, float flHeight, color32 color );
|
|
|
|
#endif // BEAMDRAW_H
|