aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/fx_quad.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/client/fx_quad.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/client/fx_quad.cpp')
-rw-r--r--mp/src/game/client/fx_quad.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/mp/src/game/client/fx_quad.cpp b/mp/src/game/client/fx_quad.cpp
new file mode 100644
index 00000000..982cae7c
--- /dev/null
+++ b/mp/src/game/client/fx_quad.cpp
@@ -0,0 +1,170 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "view.h"
+#include "materialsystem/imesh.h"
+#include "fx_quad.h"
+#include "tier0/vprof.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+CFXQuad::CFXQuad( const FXQuadData_t &data )
+
+: CClientSideEffect( "Quad" )
+{
+ m_FXData = data;
+}
+
+CFXQuad::~CFXQuad( void )
+{
+ Destroy();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : frametime -
+//-----------------------------------------------------------------------------
+void CFXQuad::Draw( double frametime )
+{
+ VPROF_BUDGET( "FX_Quad::Draw", VPROF_BUDGETGROUP_PARTICLE_RENDERING );
+
+ // Update the effect
+ Update( frametime );
+
+ float scaleTimePerc, alphaTimePerc;
+
+ //Determine the scale
+ if ( m_FXData.m_uiFlags & FXQUAD_BIAS_SCALE )
+ {
+ scaleTimePerc = Bias( ( m_FXData.m_flLifeTime / m_FXData.m_flDieTime ), m_FXData.m_flScaleBias );
+ }
+ else
+ {
+ scaleTimePerc = ( m_FXData.m_flLifeTime / m_FXData.m_flDieTime );
+ }
+
+ float scale = m_FXData.m_flStartScale + ( ( m_FXData.m_flEndScale - m_FXData.m_flStartScale ) * scaleTimePerc );
+
+ //Determine the alpha
+ if ( m_FXData.m_uiFlags & FXQUAD_BIAS_ALPHA )
+ {
+ alphaTimePerc = Bias( ( m_FXData.m_flLifeTime / m_FXData.m_flDieTime ), m_FXData.m_flAlphaBias );
+ }
+ else
+ {
+ alphaTimePerc = ( m_FXData.m_flLifeTime / m_FXData.m_flDieTime );
+ }
+
+ float alpha = m_FXData.m_flStartAlpha + ( ( m_FXData.m_flEndAlpha - m_FXData.m_flStartAlpha ) * alphaTimePerc );
+ alpha = clamp( alpha, 0.0f, 1.0f );
+
+ CMatRenderContextPtr pRenderContext( materials );
+
+ //Bind the material
+ IMesh* pMesh = pRenderContext->GetDynamicMesh( true, NULL, NULL, m_FXData.m_pMaterial );
+ CMeshBuilder meshBuilder;
+
+ meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
+
+ //Update our roll
+ m_FXData.m_flYaw = anglemod( m_FXData.m_flYaw + ( m_FXData.m_flDeltaYaw * frametime ) );
+
+ Vector pos;
+ Vector vRight, vUp;
+
+ float color[4];
+
+ color[0] = m_FXData.m_Color[0];
+ color[1] = m_FXData.m_Color[1];
+ color[2] = m_FXData.m_Color[2];
+
+ if ( m_FXData.m_uiFlags & FXQUAD_COLOR_FADE )
+ {
+ color[0] *= alpha;
+ color[1] *= alpha;
+ color[2] *= alpha;
+ }
+
+ color[3] = alpha;
+
+ VectorVectors( m_FXData.m_vecNormal, vRight, vUp );
+
+ Vector rRight, rUp;
+
+ rRight = ( vRight * cos( DEG2RAD( m_FXData.m_flYaw ) ) ) - ( vUp * sin( DEG2RAD( m_FXData.m_flYaw ) ) );
+ rUp = ( vRight * cos( DEG2RAD( m_FXData.m_flYaw+90.0f ) ) ) - ( vUp * sin( DEG2RAD( m_FXData.m_flYaw+90.0f ) ) );
+
+ vRight = rRight * ( scale * 0.5f );
+ vUp = rUp * ( scale * 0.5f );
+
+ pos = m_FXData.m_vecOrigin + vRight - vUp;
+
+ meshBuilder.Position3fv( pos.Base() );
+ meshBuilder.Normal3fv( m_FXData.m_vecNormal.Base() );
+ meshBuilder.TexCoord2f( 0, 1.0f, 1.0f );
+ meshBuilder.Color4fv( color );
+ meshBuilder.AdvanceVertex();
+
+ pos = m_FXData.m_vecOrigin - vRight - vUp;
+
+ meshBuilder.Position3fv( pos.Base() );
+ meshBuilder.Normal3fv( m_FXData.m_vecNormal.Base() );
+ meshBuilder.TexCoord2f( 0, 0.0f, 1.0f );
+ meshBuilder.Color4fv( color );
+ meshBuilder.AdvanceVertex();
+
+ pos = m_FXData.m_vecOrigin - vRight + vUp;
+
+ meshBuilder.Position3fv( pos.Base() );
+ meshBuilder.Normal3fv( m_FXData.m_vecNormal.Base() );
+ meshBuilder.TexCoord2f( 0, 0.0f, 0.0f );
+ meshBuilder.Color4fv( color );
+ meshBuilder.AdvanceVertex();
+
+ pos = m_FXData.m_vecOrigin + vRight + vUp;
+
+ meshBuilder.Position3fv( pos.Base() );
+ meshBuilder.Normal3fv( m_FXData.m_vecNormal.Base() );
+ meshBuilder.TexCoord2f( 0, 1.0f, 0.0f );
+ meshBuilder.Color4fv( color );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CFXQuad::IsActive( void )
+{
+ return ( m_FXData.m_flLifeTime < m_FXData.m_flDieTime ) ? true : false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CFXQuad::Destroy( void )
+{
+ //Release the material
+ if ( m_FXData.m_pMaterial != NULL )
+ {
+ m_FXData.m_pMaterial->DecrementReferenceCount();
+ m_FXData.m_pMaterial = NULL;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : frametime -
+//-----------------------------------------------------------------------------
+void CFXQuad::Update( double frametime )
+{
+ m_FXData.m_flLifeTime += frametime;
+}