aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/c_env_screenoverlay.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/c_env_screenoverlay.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/c_env_screenoverlay.cpp')
-rw-r--r--mp/src/game/client/c_env_screenoverlay.cpp327
1 files changed, 327 insertions, 0 deletions
diff --git a/mp/src/game/client/c_env_screenoverlay.cpp b/mp/src/game/client/c_env_screenoverlay.cpp
new file mode 100644
index 00000000..8768c852
--- /dev/null
+++ b/mp/src/game/client/c_env_screenoverlay.cpp
@@ -0,0 +1,327 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "shareddefs.h"
+#include "materialsystem/imesh.h"
+#include "materialsystem/imaterial.h"
+#include "view.h"
+#include "iviewrender.h"
+#include "view_shared.h"
+#include "texture_group_names.h"
+#include "tier0/icommandline.h"
+#include "KeyValues.h"
+#include "ScreenSpaceEffects.h"
+#include "materialsystem/imaterialsystemhardwareconfig.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class C_EnvScreenOverlay : public C_BaseEntity
+{
+ DECLARE_CLASS( C_EnvScreenOverlay, C_BaseEntity );
+public:
+ DECLARE_CLIENTCLASS();
+
+ void PreDataUpdate( DataUpdateType_t updateType );
+ void PostDataUpdate( DataUpdateType_t updateType );
+
+ void HandleOverlaySwitch( void );
+ void StartOverlays( void );
+ void StopOverlays( void );
+ void StartCurrentOverlay( void );
+ void ClientThink( void );
+
+protected:
+ char m_iszOverlayNames[ MAX_SCREEN_OVERLAYS ][255];
+ float m_flOverlayTimes[ MAX_SCREEN_OVERLAYS ];
+ float m_flStartTime;
+ int m_iDesiredOverlay;
+ bool m_bIsActive;
+ bool m_bWasActive;
+ int m_iCachedDesiredOverlay;
+ int m_iCurrentOverlay;
+ float m_flCurrentOverlayTime;
+};
+
+IMPLEMENT_CLIENTCLASS_DT( C_EnvScreenOverlay, DT_EnvScreenOverlay, CEnvScreenOverlay )
+ RecvPropArray( RecvPropString( RECVINFO( m_iszOverlayNames[0]) ), m_iszOverlayNames ),
+ RecvPropArray( RecvPropFloat( RECVINFO( m_flOverlayTimes[0] ) ), m_flOverlayTimes ),
+ RecvPropFloat( RECVINFO( m_flStartTime ) ),
+ RecvPropInt( RECVINFO( m_iDesiredOverlay ) ),
+ RecvPropBool( RECVINFO( m_bIsActive ) ),
+END_RECV_TABLE()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : updateType -
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::PreDataUpdate( DataUpdateType_t updateType )
+{
+ BaseClass::PreDataUpdate( updateType );
+
+ m_bWasActive = m_bIsActive;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::PostDataUpdate( DataUpdateType_t updateType )
+{
+ BaseClass::PostDataUpdate( updateType );
+
+ // If we have a start time now, start the overlays going
+ if ( m_bIsActive && m_flStartTime > 0 && view->GetScreenOverlayMaterial() == NULL )
+ {
+ StartOverlays();
+ }
+
+ if ( m_flStartTime == -1 )
+ {
+ StopOverlays();
+ }
+
+ HandleOverlaySwitch();
+
+ if ( updateType == DATA_UPDATE_CREATED &&
+ CommandLine()->FindParm( "-makereslists" ) )
+ {
+ for ( int i = 0; i < MAX_SCREEN_OVERLAYS; ++i )
+ {
+ if ( m_iszOverlayNames[ i ] && m_iszOverlayNames[ i ][ 0 ] )
+ {
+ materials->FindMaterial( m_iszOverlayNames[ i ], TEXTURE_GROUP_CLIENT_EFFECTS, false );
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::StopOverlays( void )
+{
+ SetNextClientThink( CLIENT_THINK_NEVER );
+
+ if ( m_bWasActive && !m_bIsActive )
+ {
+ view->SetScreenOverlayMaterial( NULL );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::StartOverlays( void )
+{
+ m_iCurrentOverlay = 0;
+ m_flCurrentOverlayTime = 0;
+ m_iCachedDesiredOverlay = 0;
+ SetNextClientThink( CLIENT_THINK_ALWAYS );
+
+ StartCurrentOverlay();
+ HandleOverlaySwitch();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::HandleOverlaySwitch( void )
+{
+ if( m_iCachedDesiredOverlay != m_iDesiredOverlay )
+ {
+ m_iCurrentOverlay = m_iDesiredOverlay;
+ m_iCachedDesiredOverlay = m_iDesiredOverlay;
+ StartCurrentOverlay();
+ }
+}
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::StartCurrentOverlay( void )
+{
+ if ( m_iCurrentOverlay == MAX_SCREEN_OVERLAYS || !m_iszOverlayNames[m_iCurrentOverlay] || !m_iszOverlayNames[m_iCurrentOverlay][0] )
+ {
+ // Hit the end of our overlays, so stop.
+ m_flStartTime = 0;
+ StopOverlays();
+ return;
+ }
+
+ if ( m_flOverlayTimes[m_iCurrentOverlay] == -1 )
+ m_flCurrentOverlayTime = -1;
+ else
+ m_flCurrentOverlayTime = gpGlobals->curtime + m_flOverlayTimes[m_iCurrentOverlay];
+
+ // Bring up the current overlay
+ IMaterial *pMaterial = materials->FindMaterial( m_iszOverlayNames[m_iCurrentOverlay], TEXTURE_GROUP_CLIENT_EFFECTS, false );
+ if ( !IsErrorMaterial( pMaterial ) )
+ {
+ view->SetScreenOverlayMaterial( pMaterial );
+ }
+ else
+ {
+ Warning("env_screenoverlay couldn't find overlay %s.\n", m_iszOverlayNames[m_iCurrentOverlay] );
+ StopOverlays();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_EnvScreenOverlay::ClientThink( void )
+{
+ // If the current overlay's run out, go to the next one
+ if ( m_flCurrentOverlayTime != -1 && m_flCurrentOverlayTime < gpGlobals->curtime )
+ {
+ m_iCurrentOverlay++;
+ StartCurrentOverlay();
+ }
+}
+
+// Effect types
+enum
+{
+ SCREENEFFECT_EP2_ADVISOR_STUN,
+ SCREENEFFECT_EP1_INTRO,
+ SCREENEFFECT_EP2_GROGGY,
+};
+
+// ============================================================================
+// Screenspace effect
+// ============================================================================
+
+class C_EnvScreenEffect : public C_BaseEntity
+{
+ DECLARE_CLASS( C_EnvScreenEffect, C_BaseEntity );
+public:
+ DECLARE_CLIENTCLASS();
+
+ virtual void ReceiveMessage( int classID, bf_read &msg );
+
+private:
+ float m_flDuration;
+ int m_nType;
+};
+
+IMPLEMENT_CLIENTCLASS_DT( C_EnvScreenEffect, DT_EnvScreenEffect, CEnvScreenEffect )
+ RecvPropFloat( RECVINFO( m_flDuration ) ),
+ RecvPropInt( RECVINFO( m_nType ) ),
+END_RECV_TABLE()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : classID -
+// &msg -
+//-----------------------------------------------------------------------------
+void C_EnvScreenEffect::ReceiveMessage( int classID, bf_read &msg )
+{
+ // Make sure our IDs match
+ if ( classID != GetClientClass()->m_ClassID )
+ {
+ // Message is for subclass
+ BaseClass::ReceiveMessage( classID, msg );
+ return;
+ }
+
+ int messageType = msg.ReadByte();
+ switch( messageType )
+ {
+ // Effect turning on
+ case 0: // FIXME: Declare
+ {
+ // Create a keyvalue block to set these params
+ KeyValues *pKeys = new KeyValues( "keys" );
+ if ( pKeys == NULL )
+ return;
+
+ if ( m_nType == SCREENEFFECT_EP1_INTRO )
+ {
+ if( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() < 80 )
+ {
+ return;
+ }
+
+ // Set our keys
+ pKeys->SetFloat( "duration", m_flDuration );
+ pKeys->SetInt( "fadeout", 0 );
+
+ g_pScreenSpaceEffects->SetScreenSpaceEffectParams( "episodic_intro", pKeys );
+ g_pScreenSpaceEffects->EnableScreenSpaceEffect( "episodic_intro" );
+ }
+ else if ( m_nType == SCREENEFFECT_EP2_ADVISOR_STUN )
+ {
+ // Set our keys
+ pKeys->SetFloat( "duration", m_flDuration );
+
+ g_pScreenSpaceEffects->SetScreenSpaceEffectParams( "episodic_stun", pKeys );
+ g_pScreenSpaceEffects->EnableScreenSpaceEffect( "episodic_stun" );
+ }
+ else if ( m_nType == SCREENEFFECT_EP2_GROGGY )
+ {
+ if( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() < 80 )
+ return;
+
+ // Set our keys
+ pKeys->SetFloat( "duration", m_flDuration );
+ pKeys->SetInt( "fadeout", 0 );
+
+ g_pScreenSpaceEffects->SetScreenSpaceEffectParams( "ep2_groggy", pKeys );
+ g_pScreenSpaceEffects->EnableScreenSpaceEffect( "ep2_groggy" );
+ }
+
+ pKeys->deleteThis();
+ }
+ break;
+
+ // Effect turning off
+ case 1: // FIXME: Declare
+
+ if ( m_nType == SCREENEFFECT_EP1_INTRO )
+ {
+ if( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() < 80 )
+ {
+ return;
+ }
+ // Create a keyvalue block to set these params
+ KeyValues *pKeys = new KeyValues( "keys" );
+ if ( pKeys == NULL )
+ return;
+
+ // Set our keys
+ pKeys->SetFloat( "duration", m_flDuration );
+ pKeys->SetInt( "fadeout", 1 );
+
+ g_pScreenSpaceEffects->SetScreenSpaceEffectParams( "episodic_intro", pKeys );
+ }
+ else if ( m_nType == SCREENEFFECT_EP2_ADVISOR_STUN )
+ {
+ g_pScreenSpaceEffects->DisableScreenSpaceEffect( "episodic_stun" );
+ }
+ else if ( m_nType == SCREENEFFECT_EP2_GROGGY )
+ {
+ if( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() < 80 )
+ {
+ return;
+ }
+ // Create a keyvalue block to set these params
+ KeyValues *pKeys = new KeyValues( "keys" );
+ if ( pKeys == NULL )
+ return;
+
+ // Set our keys
+ pKeys->SetFloat( "duration", m_flDuration );
+ pKeys->SetInt( "fadeout", 1 );
+
+ g_pScreenSpaceEffects->SetScreenSpaceEffectParams( "ep2_groggy", pKeys );
+ }
+
+ break;
+ }
+}