aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/hl2/c_script_intro.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/hl2/c_script_intro.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/hl2/c_script_intro.cpp')
-rw-r--r--mp/src/game/client/hl2/c_script_intro.cpp327
1 files changed, 327 insertions, 0 deletions
diff --git a/mp/src/game/client/hl2/c_script_intro.cpp b/mp/src/game/client/hl2/c_script_intro.cpp
new file mode 100644
index 00000000..de82e70b
--- /dev/null
+++ b/mp/src/game/client/hl2/c_script_intro.cpp
@@ -0,0 +1,327 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+#include "cbase.h"
+#include "shareddefs.h"
+#include "materialsystem/imesh.h"
+#include "view.h"
+#include "iviewrender.h"
+#include "view_shared.h"
+#include "viewrender.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+extern IntroData_t *g_pIntroData;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class C_ScriptIntro : public C_BaseEntity
+{
+ DECLARE_CLASS( C_ScriptIntro, C_BaseEntity );
+public:
+ DECLARE_CLIENTCLASS();
+
+ C_ScriptIntro( void );
+ ~C_ScriptIntro( void );
+ void PostDataUpdate( DataUpdateType_t updateType );
+ void ClientThink( void );
+ void CalculateFOV( void );
+ void CalculateAlpha( void );
+
+public:
+ int m_iNextFOV;
+ int m_iFOV;
+ int m_iPrevFOV;
+ int m_iStartFOV;
+ float m_flNextFOVBlendTime;
+ float m_flFOVBlendStartTime;
+ bool m_bAlternateFOV;
+
+ // Our intro data block
+ IntroData_t m_IntroData;
+
+private:
+ Vector m_vecCameraView;
+ QAngle m_vecCameraViewAngles;
+ int m_iBlendMode;
+ int m_iNextBlendMode;
+ float m_flNextBlendTime;
+ float m_flBlendStartTime;
+ bool m_bActive;
+ EHANDLE m_hCameraEntity;
+
+ // Fades
+ float m_flFadeColor[3]; // Server's desired fade color
+ float m_flFadeAlpha; // Server's desired fade alpha
+ float m_flPrevServerFadeAlpha; // Previous server's desired fade alpha
+ float m_flFadeDuration; // Time it should take to reach the server's new fade alpha
+ float m_flFadeTimeStartedAt; // Time at which we last recieved a new desired fade alpha
+ float m_flFadeAlphaStartedAt; // Alpha at which we last received a new desired fade alpha
+};
+
+IMPLEMENT_CLIENTCLASS_DT( C_ScriptIntro, DT_ScriptIntro, CScriptIntro )
+ RecvPropVector( RECVINFO( m_vecCameraView ) ),
+ RecvPropVector( RECVINFO( m_vecCameraViewAngles ) ),
+ RecvPropInt( RECVINFO( m_iBlendMode ) ),
+ RecvPropInt( RECVINFO( m_iNextBlendMode ) ),
+ RecvPropFloat( RECVINFO( m_flNextBlendTime ) ),
+ RecvPropFloat( RECVINFO( m_flBlendStartTime ) ),
+ RecvPropBool( RECVINFO( m_bActive ) ),
+
+ // Fov & fov blends
+ RecvPropInt( RECVINFO( m_iFOV ) ),
+ RecvPropInt( RECVINFO( m_iNextFOV ) ),
+ RecvPropInt( RECVINFO( m_iStartFOV ) ),
+ RecvPropFloat( RECVINFO( m_flNextFOVBlendTime ) ),
+ RecvPropFloat( RECVINFO( m_flFOVBlendStartTime ) ),
+ RecvPropBool( RECVINFO( m_bAlternateFOV ) ),
+
+ // Fades
+ RecvPropFloat( RECVINFO( m_flFadeAlpha ) ),
+ RecvPropArray( RecvPropFloat( RECVINFO( m_flFadeColor[0] ) ), m_flFadeColor ),
+ RecvPropFloat( RECVINFO( m_flFadeDuration ) ),
+ RecvPropEHandle(RECVINFO(m_hCameraEntity)),
+END_RECV_TABLE()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_ScriptIntro::C_ScriptIntro( void )
+{
+ m_bActive = false;
+ m_vecCameraView = vec3_origin;
+ m_vecCameraViewAngles = vec3_angle;
+ m_iBlendMode = 0;
+ m_iNextBlendMode = 0;
+ m_flNextBlendTime = 0;
+ m_flBlendStartTime = 0;
+ m_IntroData.m_playerViewFOV = 0;
+ m_flFadeAlpha = 0;
+ m_flPrevServerFadeAlpha = 0;
+ m_flFadeDuration = 0;
+ m_flFadeTimeStartedAt = 0;
+ m_flFadeAlphaStartedAt = 0;
+ m_hCameraEntity = NULL;
+ m_iPrevFOV = 0;
+ m_iStartFOV = 0;
+
+ g_pIntroData = NULL;
+
+ // Setup fade colors
+ m_IntroData.m_flCurrentFadeColor[0] = m_flFadeColor[0];
+ m_IntroData.m_flCurrentFadeColor[1] = m_flFadeColor[1];
+ m_IntroData.m_flCurrentFadeColor[2] = m_flFadeColor[2];
+ m_IntroData.m_flCurrentFadeColor[3] = m_flFadeAlpha;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_ScriptIntro::~C_ScriptIntro( void )
+{
+ g_pIntroData = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_ScriptIntro::PostDataUpdate( DataUpdateType_t updateType )
+{
+ BaseClass::PostDataUpdate( updateType );
+
+ SetNextClientThink( CLIENT_THINK_ALWAYS );
+
+ // Fill out the intro data
+ m_IntroData.m_vecCameraView = m_vecCameraView;
+ m_IntroData.m_vecCameraViewAngles = m_vecCameraViewAngles;
+ m_IntroData.m_Passes.SetCount( 0 );
+
+ // Find/Create our first pass
+ IntroDataBlendPass_t *pass1;
+ if ( m_IntroData.m_Passes.Count() == 0 )
+ {
+ pass1 = &m_IntroData.m_Passes[m_IntroData.m_Passes.AddToTail()];
+ }
+ else
+ {
+ pass1 = &m_IntroData.m_Passes[0];
+ }
+ Assert(pass1);
+ pass1->m_BlendMode = m_iBlendMode;
+ pass1->m_Alpha = 1.0f;
+
+ if ( m_vecCameraView == vec3_origin )
+ {
+ m_IntroData.m_bDrawPrimary = false;
+ }
+ else
+ {
+ m_IntroData.m_bDrawPrimary = true;
+ }
+
+ // If we're currently blending to a new mode, set the second pass
+ if ( m_flNextBlendTime > gpGlobals->curtime )
+ {
+ IntroDataBlendPass_t *pass2;
+ if ( m_IntroData.m_Passes.Count() < 2 )
+ {
+ pass2 = &m_IntroData.m_Passes[m_IntroData.m_Passes.AddToTail()];
+
+ //Msg("STARTED BLEND: Mode %d to %d.\n", m_IntroData.m_Passes[0].m_BlendMode, m_iNextBlendMode );
+ }
+ else
+ {
+ pass2 = &m_IntroData.m_Passes[1];
+
+ Assert( pass2->m_BlendMode == m_iNextBlendMode );
+ }
+ Assert(pass2);
+ pass2->m_BlendMode = m_iNextBlendMode;
+ pass2->m_Alpha = 0.0f;
+ }
+ else if ( m_IntroData.m_Passes.Count() == 2 )
+ {
+ C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
+ if ( !player )
+ return;
+
+ //Msg("FINISHED BLEND.\n");
+ m_IntroData.m_Passes.Remove(1);
+ }
+
+ // Set the introdata our data chunk
+ if ( m_bActive )
+ {
+ g_pIntroData = &m_IntroData;
+ }
+ else if ( g_pIntroData == &m_IntroData )
+ {
+ g_pIntroData = NULL;
+ }
+
+ // Update the fade color
+ m_IntroData.m_flCurrentFadeColor[0] = m_flFadeColor[0];
+ m_IntroData.m_flCurrentFadeColor[1] = m_flFadeColor[1];
+ m_IntroData.m_flCurrentFadeColor[2] = m_flFadeColor[2];
+
+ // Started fading?
+ if ( m_flFadeAlpha != m_flPrevServerFadeAlpha )
+ {
+ m_flFadeTimeStartedAt = gpGlobals->curtime;
+ m_flFadeAlphaStartedAt = m_IntroData.m_flCurrentFadeColor[3];
+ m_flPrevServerFadeAlpha = m_flFadeAlpha;
+
+ if ( !m_flFadeDuration )
+ {
+ m_flFadeDuration = 0.01;
+ }
+
+ //Msg("STARTING NEW FADE: alpha %.2f, duration %.2f.\n", m_flFadeAlpha, m_flFadeDuration );
+ }
+
+ if ( m_iPrevFOV != m_iFOV )
+ {
+ m_IntroData.m_playerViewFOV = m_iFOV;
+ m_iPrevFOV = m_iFOV;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_ScriptIntro::ClientThink( void )
+{
+ Assert( m_IntroData.m_Passes.Count() <= 2 );
+
+ if ( m_hCameraEntity )
+ {
+ m_IntroData.m_vecCameraView = m_hCameraEntity->GetAbsOrigin();
+ m_IntroData.m_vecCameraViewAngles = m_hCameraEntity->GetAbsAngles();
+ }
+
+ CalculateFOV();
+ CalculateAlpha();
+
+ // Calculate the blend levels of each pass
+ float flPerc = 1.0;
+ if ( (m_flNextBlendTime - m_flBlendStartTime) != 0 )
+ {
+ flPerc = clamp( (gpGlobals->curtime - m_flBlendStartTime) / (m_flNextBlendTime - m_flBlendStartTime), 0, 1 );
+ }
+
+ // Detect when we're finished blending
+ if ( flPerc >= 1.0 )
+ {
+ if ( m_IntroData.m_Passes.Count() == 2 )
+ {
+ // We're done blending
+ m_IntroData.m_Passes[0].m_BlendMode = m_IntroData.m_Passes[1].m_BlendMode;
+ m_IntroData.m_Passes[0].m_Alpha = 1.0;
+ m_IntroData.m_Passes.Remove(1);
+
+ //Msg("FINISHED BLEND.\n");
+ }
+ else
+ {
+ m_IntroData.m_Passes[0].m_Alpha = 1.0f;
+ }
+ return;
+ }
+
+ /*
+ if ( m_flNextBlendTime >= gpGlobals->curtime )
+ {
+ Msg("INTRO BLENDING: Blending from mode %d to %d.\n", m_IntroData.m_Passes[0].m_BlendMode, m_IntroData.m_Passes[1].m_BlendMode );
+ Msg(" curtime %.2f StartedAt %.2f FinishAt: %.2f\n", gpGlobals->curtime, m_flBlendStartTime, m_flNextBlendTime );
+ Msg(" Perc: %.2f\n", flPerc );
+ }
+ */
+
+ if ( m_IntroData.m_Passes.Count() == 2 )
+ {
+ m_IntroData.m_Passes[0].m_Alpha = 1.0 - flPerc;
+ m_IntroData.m_Passes[1].m_Alpha = flPerc;
+ }
+ else
+ {
+ m_IntroData.m_Passes[0].m_Alpha = 1.0 - flPerc;
+ }
+}
+
+extern float ScriptInfo_CalculateFOV( float flFOVBlendStartTime, float flNextFOVBlendTime, int nFOV, int nNextFOV, bool bSplineRamp );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_ScriptIntro::CalculateFOV( void )
+{
+ // We're past our blending time so we're at our target
+ if ( m_flNextFOVBlendTime >= gpGlobals->curtime )
+ {
+ // Calculate where we're at
+ m_IntroData.m_playerViewFOV = ScriptInfo_CalculateFOV( m_flFOVBlendStartTime, m_flNextFOVBlendTime, m_iStartFOV, m_iNextFOV, m_bAlternateFOV );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_ScriptIntro::CalculateAlpha( void )
+{
+ // Fill out the fade alpha
+ float flNewAlpha = RemapValClamped( gpGlobals->curtime, m_flFadeTimeStartedAt, m_flFadeTimeStartedAt + m_flFadeDuration, m_flFadeAlphaStartedAt, m_flFadeAlpha );
+ /*
+ if ( m_IntroData.m_flCurrentFadeColor[3] != flNewAlpha )
+ {
+ Msg("INTRO FADING: curtime %.2f StartedAt %.2f Duration: %.2f\n", gpGlobals->curtime, m_flFadeTimeStartedAt, m_flFadeDuration );
+ Msg(" TimePassed %.2f Alpha: %.2f\n", RemapValClamped( gpGlobals->curtime, m_flFadeTimeStartedAt, m_flFadeTimeStartedAt + m_flFadeDuration, 0.0, 1.0 ), m_IntroData.m_flCurrentFadeColor[3] );
+ }
+ */
+
+ m_IntroData.m_flCurrentFadeColor[3] = flNewAlpha;
+}
+