167 lines
4.6 KiB
C++
167 lines
4.6 KiB
C++
|
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
|
|||
|
//
|
|||
|
// Purpose:
|
|||
|
//
|
|||
|
// $Workfile: $
|
|||
|
// $Date: $
|
|||
|
// $NoKeywords: $
|
|||
|
//=============================================================================//
|
|||
|
#include "cbase.h"
|
|||
|
#include "clientsideeffects.h"
|
|||
|
#include "FX_StaticLine.h"
|
|||
|
#include "materialsystem/IMaterial.h"
|
|||
|
#include "materialsystem/IMesh.h"
|
|||
|
#include "view.h"
|
|||
|
|
|||
|
// memdbgon must be the last include file in a .cpp file!!!
|
|||
|
#include "tier0/memdbgon.h"
|
|||
|
|
|||
|
/*
|
|||
|
==================================================
|
|||
|
CFXStaticLine
|
|||
|
==================================================
|
|||
|
*/
|
|||
|
|
|||
|
CFXStaticLine::CFXStaticLine( const char *name, const Vector& start, const Vector& end, float scale, float life, const char *shader, unsigned int flags )
|
|||
|
: CClientSideEffect( name )
|
|||
|
{
|
|||
|
assert( materials );
|
|||
|
if ( materials == NULL )
|
|||
|
return;
|
|||
|
|
|||
|
// Create a material...
|
|||
|
m_pMaterial = materials->FindMaterial( shader, TEXTURE_GROUP_CLIENT_EFFECTS );
|
|||
|
m_pMaterial->IncrementReferenceCount();
|
|||
|
|
|||
|
//Fill in the rest of the fields
|
|||
|
m_vecStart = start;
|
|||
|
m_vecEnd = end;
|
|||
|
m_uiFlags = flags;
|
|||
|
m_fLife = life;
|
|||
|
m_fScale = scale * 0.5f;
|
|||
|
}
|
|||
|
|
|||
|
CFXStaticLine::~CFXStaticLine( void )
|
|||
|
{
|
|||
|
Destroy();
|
|||
|
}
|
|||
|
|
|||
|
//==================================================
|
|||
|
// Purpose: Draw the primitive
|
|||
|
// Input: frametime - the time, this frame
|
|||
|
//==================================================
|
|||
|
|
|||
|
void CFXStaticLine::Draw( double frametime )
|
|||
|
{
|
|||
|
Vector lineDir, viewDir, cross;
|
|||
|
Vector tmp;
|
|||
|
|
|||
|
// Update the effect
|
|||
|
Update( frametime );
|
|||
|
|
|||
|
// Get the proper orientation for the line
|
|||
|
VectorSubtract( m_vecEnd, m_vecStart, lineDir );
|
|||
|
VectorSubtract( m_vecEnd, CurrentViewOrigin(), viewDir );
|
|||
|
|
|||
|
cross = lineDir.Cross( viewDir );
|
|||
|
|
|||
|
VectorNormalize( cross );
|
|||
|
|
|||
|
CMatRenderContextPtr pRenderContext( materials );
|
|||
|
|
|||
|
//Bind the material
|
|||
|
IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_pMaterial );
|
|||
|
CMeshBuilder meshBuilder;
|
|||
|
|
|||
|
meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
|
|||
|
|
|||
|
bool flipVertical = (m_uiFlags & FXSTATICLINE_FLIP_VERTICAL) != 0;
|
|||
|
bool flipHorizontal = (m_uiFlags & FXSTATICLINE_FLIP_HORIZONTAL ) != 0;
|
|||
|
|
|||
|
//Setup our points
|
|||
|
VectorMA( m_vecStart, -m_fScale, cross, tmp );
|
|||
|
meshBuilder.Position3fv( tmp.Base() );
|
|||
|
meshBuilder.Normal3fv( cross.Base() );
|
|||
|
if (flipHorizontal)
|
|||
|
meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
|
|||
|
else if (flipVertical)
|
|||
|
meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
|
|||
|
else
|
|||
|
meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
|
|||
|
meshBuilder.Color4ub( 255, 255, 255, 255 );
|
|||
|
meshBuilder.AdvanceVertex();
|
|||
|
|
|||
|
VectorMA( m_vecStart, m_fScale, cross, tmp );
|
|||
|
meshBuilder.Position3fv( tmp.Base() );
|
|||
|
meshBuilder.Normal3fv( cross.Base() );
|
|||
|
if (flipHorizontal)
|
|||
|
meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
|
|||
|
else if (flipVertical)
|
|||
|
meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
|
|||
|
else
|
|||
|
meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
|
|||
|
meshBuilder.Color4ub( 255, 255, 255, 255 );
|
|||
|
meshBuilder.AdvanceVertex();
|
|||
|
|
|||
|
VectorMA( m_vecEnd, m_fScale, cross, tmp );
|
|||
|
meshBuilder.Position3fv( tmp.Base() );
|
|||
|
meshBuilder.Normal3fv( cross.Base() );
|
|||
|
if (flipHorizontal)
|
|||
|
meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
|
|||
|
else if (flipVertical)
|
|||
|
meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
|
|||
|
else
|
|||
|
meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
|
|||
|
meshBuilder.Color4ub( 255, 255, 255, 255 );
|
|||
|
meshBuilder.AdvanceVertex();
|
|||
|
|
|||
|
VectorMA( m_vecEnd, -m_fScale, cross, tmp );
|
|||
|
meshBuilder.Position3fv( tmp.Base() );
|
|||
|
meshBuilder.Normal3fv( cross.Base() );
|
|||
|
if (flipHorizontal)
|
|||
|
meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
|
|||
|
else if (flipVertical)
|
|||
|
meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
|
|||
|
else
|
|||
|
meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
|
|||
|
meshBuilder.Color4ub( 255, 255, 255, 255 );
|
|||
|
meshBuilder.AdvanceVertex();
|
|||
|
|
|||
|
meshBuilder.End();
|
|||
|
pMesh->Draw();
|
|||
|
}
|
|||
|
|
|||
|
//==================================================
|
|||
|
// Purpose: Returns whether or not the effect is still active
|
|||
|
// Output: true if active
|
|||
|
//==================================================
|
|||
|
|
|||
|
bool CFXStaticLine::IsActive( void )
|
|||
|
{
|
|||
|
return ( m_fLife > 0.0 ) ? true : false;
|
|||
|
}
|
|||
|
|
|||
|
//==================================================
|
|||
|
// Purpose: Destroy the effect and its local resources
|
|||
|
//==================================================
|
|||
|
|
|||
|
void CFXStaticLine::Destroy( void )
|
|||
|
{
|
|||
|
//Release the material
|
|||
|
if ( m_pMaterial != NULL )
|
|||
|
{
|
|||
|
m_pMaterial->DecrementReferenceCount();
|
|||
|
m_pMaterial = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//==================================================
|
|||
|
// Purpose: Perform any necessary updates
|
|||
|
// Input: frametime - the time, this frame
|
|||
|
//==================================================
|
|||
|
|
|||
|
void CFXStaticLine::Update( double frametime )
|
|||
|
{
|
|||
|
m_fLife -= frametime;
|
|||
|
}
|