diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/fx_discreetline.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/fx_discreetline.cpp')
| -rw-r--r-- | game/client/fx_discreetline.cpp | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/game/client/fx_discreetline.cpp b/game/client/fx_discreetline.cpp new file mode 100644 index 0000000..019e729 --- /dev/null +++ b/game/client/fx_discreetline.cpp @@ -0,0 +1,288 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date: $ +// +//----------------------------------------------------------------------------- +// $Log: $ +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "fx_discreetline.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" + +/* +================================================== +CFXLine +================================================== +*/ + +CFXDiscreetLine::CFXDiscreetLine( const char *name, const Vector& start, const Vector& direction, + float velocity, float length, float clipLength, float scale, float life, const char *shader ) +: CClientSideEffect( name ) +{ + assert( materials ); + if ( materials == NULL ) + return; + + // Create a material... + m_pMaterial = materials->FindMaterial( shader, TEXTURE_GROUP_CLIENT_EFFECTS ); + m_pMaterial->IncrementReferenceCount(); + + m_vecOrigin = start; + m_vecDirection = direction; + m_fVelocity = velocity; + m_fClipLength = clipLength; + m_fScale = scale; + m_fLife = life; + m_fStartTime = 0.0f; + m_fLength = length; +} + +CFXDiscreetLine::~CFXDiscreetLine( void ) +{ + Destroy(); +} + +// Does extra calculations to make them more visible over distance +ConVar tracer_extra( "tracer_extra", "1" ); + +/* +================================================== +Draw +================================================== +*/ + +void CFXDiscreetLine::Draw( double frametime ) +{ + Vector lineDir, viewDir, cross; + + Vector vecEnd, vecStart; + Vector tmp; + + // Update the effect + Update( frametime ); + + // Calculate our distance along our path + float sDistance = m_fVelocity * m_fStartTime; + float eDistance = sDistance - m_fLength; + + //Clip to start + sDistance = MAX( 0.0f, sDistance ); + eDistance = MAX( 0.0f, eDistance ); + + if ( ( sDistance == 0.0f ) && ( eDistance == 0.0f ) ) + return; + + // Clip it + if ( m_fClipLength != 0.0f ) + { + sDistance = MIN( sDistance, m_fClipLength ); + eDistance = MIN( eDistance, m_fClipLength ); + } + + // Get our delta to calculate the tc offset + float dDistance = fabs( sDistance - eDistance ); + float dTotal = ( m_fLength != 0.0f ) ? m_fLength : 0.01f; + float fOffset = ( dDistance / dTotal ); + + // Find our points along our path + VectorMA( m_vecOrigin, sDistance, m_vecDirection, vecEnd ); + VectorMA( m_vecOrigin, eDistance, m_vecDirection, vecStart ); + + //Setup our info for drawing the line + VectorSubtract( vecEnd, vecStart, lineDir ); + VectorSubtract( vecEnd, CurrentViewOrigin(), viewDir ); + + cross = lineDir.Cross( viewDir ); + VectorNormalize( cross ); + + CMeshBuilder meshBuilder; + IMesh *pMesh; + + CMatRenderContextPtr pRenderContext( materials ); + + // Better, more visible tracers + if ( tracer_extra.GetBool() ) + { + float flScreenWidth = ScreenWidth(); + float flHalfScreenWidth = flScreenWidth * 0.5f; + + float zCoord = CurrentViewForward().Dot( vecStart - CurrentViewOrigin() ); + float flScreenSpaceWidth = m_fScale * flHalfScreenWidth / zCoord; + + float flAlpha; + float flScale; + + if ( flScreenSpaceWidth < 0.5f ) + { + flAlpha = RemapVal( flScreenSpaceWidth, 0.25f, 2.0f, 0.3f, 1.0f ); + flAlpha = clamp( flAlpha, 0.25f, 1.0f ); + flScale = 0.5f * zCoord / flHalfScreenWidth; + } + else + { + flAlpha = 1.0f; + flScale = m_fScale; + } + + //Bind the material + pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_pMaterial ); + + meshBuilder.Begin( pMesh, MATERIAL_QUADS, 2 ); + + float color = (int) 255.0f * flAlpha; + + //FIXME: for now no coloration + VectorMA( vecStart, -flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 1.0f, 0.0f ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecStart, flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecEnd, flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 0.0f, fOffset ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecEnd, -flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 1.0f, fOffset ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + flScale = flScale * 2.0f; + color = (int) 64.0f * flAlpha; + + // Soft outline + VectorMA( vecStart, -flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 1.0f, 0.0f ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecStart, flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecEnd, flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 0.0f, fOffset ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecEnd, -flScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 1.0f, fOffset ); + meshBuilder.Color4ub( color, color, color, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + } + else + { + //Bind the material + pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_pMaterial ); + + meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); + + //FIXME: for now no coloration + VectorMA( vecStart, -m_fScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 1.0f, 0.0f ); + meshBuilder.Color4ub( 255, 255, 255, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecStart, m_fScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); + meshBuilder.Color4ub( 255, 255, 255, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecEnd, m_fScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 0.0f, fOffset ); + meshBuilder.Color4ub( 255, 255, 255, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + + VectorMA( vecEnd, -m_fScale, cross, tmp ); + meshBuilder.Position3fv( tmp.Base() ); + meshBuilder.TexCoord2f( 0, 1.0f, fOffset ); + meshBuilder.Color4ub( 255, 255, 255, 255 ); + meshBuilder.Normal3fv( cross.Base() ); + meshBuilder.AdvanceVertex(); + } + + meshBuilder.End(); + pMesh->Draw(); +} + +/* +================================================== +IsActive +================================================== +*/ + +bool CFXDiscreetLine::IsActive( void ) +{ + return ( m_fLife > 0.0 ) ? true : false; +} + +/* +================================================== +Destroy +================================================== +*/ + +void CFXDiscreetLine::Destroy( void ) +{ + //Release the material + if ( m_pMaterial != NULL ) + { + m_pMaterial->DecrementReferenceCount(); + m_pMaterial = NULL; + } +} + +/* +================================================== +Update +================================================== +*/ + +void CFXDiscreetLine::Update( double frametime ) +{ + m_fStartTime += frametime; + m_fLife -= frametime; + + //Move our end points + //VectorMA( m_vecStart, frametime, m_vecStartVelocity, m_vecStart ); + //VectorMA( m_vecEnd, frametime, m_vecStartVelocity, m_vecEnd ); +} + |