From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/server/point_camera.cpp | 253 ++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 mp/src/game/server/point_camera.cpp (limited to 'mp/src/game/server/point_camera.cpp') diff --git a/mp/src/game/server/point_camera.cpp b/mp/src/game/server/point_camera.cpp new file mode 100644 index 00000000..bd517196 --- /dev/null +++ b/mp/src/game/server/point_camera.cpp @@ -0,0 +1,253 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "igamesystem.h" +#include "point_camera.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +#define CAM_THINK_INTERVAL 0.05 + +// Spawnflags +#define SF_CAMERA_START_OFF 0x01 + +// UNDONE: Share properly with the client code!!! +#define POINT_CAMERA_MSG_SETACTIVE 1 + +CEntityClassList g_PointCameraList; +template <> CPointCamera *CEntityClassList::m_pClassList = NULL; + +CPointCamera* GetPointCameraList() +{ + return g_PointCameraList.m_pClassList; +} + +// These are already built into CBaseEntity +// DEFINE_KEYFIELD( m_iName, FIELD_STRING, "targetname" ), +// DEFINE_KEYFIELD( m_iParent, FIELD_STRING, "parentname" ), +// DEFINE_KEYFIELD( m_target, FIELD_STRING, "target" ), + +LINK_ENTITY_TO_CLASS( point_camera, CPointCamera ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CPointCamera::~CPointCamera() +{ + g_PointCameraList.Remove( this ); +} + +CPointCamera::CPointCamera() +{ + // Set these to opposites so that it'll be sent the first time around. + m_bActive = false; + m_bIsOn = false; + + m_bFogEnable = false; + + g_PointCameraList.Insert( this ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPointCamera::Spawn( void ) +{ + BaseClass::Spawn(); + + if ( m_spawnflags & SF_CAMERA_START_OFF ) + { + m_bIsOn = false; + } + else + { + m_bIsOn = true; + } +} + +//----------------------------------------------------------------------------- +// Purpose: Override ShouldTransmit since we want to be sent even though we don't have a model, etc. +// All that matters is if we are in the pvs. +//----------------------------------------------------------------------------- +int CPointCamera::UpdateTransmitState() +{ + if ( m_bActive ) + { + return SetTransmitState( FL_EDICT_ALWAYS ); + } + else + { + return SetTransmitState( FL_EDICT_DONTSEND ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPointCamera::SetActive( bool bActive ) +{ + // If the mapmaker's told the camera it's off, it enforces inactive state + if ( !m_bIsOn ) + { + bActive = false; + } + + if ( m_bActive != bActive ) + { + m_bActive = bActive; + DispatchUpdateTransmitState(); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPointCamera::InputChangeFOV( inputdata_t &inputdata ) +{ + // Parse the keyvalue data + char parseString[255]; + + Q_strncpy(parseString, inputdata.value.String(), sizeof(parseString)); + + // Get FOV + char *pszParam = strtok(parseString," "); + if(pszParam) + { + m_TargetFOV = atof( pszParam ); + } + else + { + // Assume no change + m_TargetFOV = m_FOV; + } + + // Get Time + float flChangeTime; + pszParam = strtok(NULL," "); + if(pszParam) + { + flChangeTime = atof( pszParam ); + } + else + { + // Assume 1 second. + flChangeTime = 1.0; + } + + m_DegreesPerSecond = ( m_TargetFOV - m_FOV ) / flChangeTime; + + SetThink( &CPointCamera::ChangeFOVThink ); + SetNextThink( gpGlobals->curtime ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPointCamera::ChangeFOVThink( void ) +{ + SetNextThink( gpGlobals->curtime + CAM_THINK_INTERVAL ); + + float newFOV = m_FOV; + + newFOV += m_DegreesPerSecond * CAM_THINK_INTERVAL; + + if( m_DegreesPerSecond < 0 ) + { + if( newFOV <= m_TargetFOV ) + { + newFOV = m_TargetFOV; + SetThink( NULL ); + } + } + else + { + if( newFOV >= m_TargetFOV ) + { + newFOV = m_TargetFOV; + SetThink( NULL ); + } + } + + m_FOV = newFOV; +} + +//----------------------------------------------------------------------------- +// Purpose: Turn this camera on, and turn all other cameras off +//----------------------------------------------------------------------------- +void CPointCamera::InputSetOnAndTurnOthersOff( inputdata_t &inputdata ) +{ + CBaseEntity *pEntity = NULL; + while ((pEntity = gEntList.FindEntityByClassname( pEntity, "point_camera" )) != NULL) + { + CPointCamera *pCamera = (CPointCamera*)pEntity; + pCamera->InputSetOff( inputdata ); + } + + // Now turn myself on + InputSetOn( inputdata ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPointCamera::InputSetOn( inputdata_t &inputdata ) +{ + m_bIsOn = true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPointCamera::InputSetOff( inputdata_t &inputdata ) +{ + m_bIsOn = false; + SetActive( false ); +} + +BEGIN_DATADESC( CPointCamera ) + + // Save/restore Keyvalue fields + DEFINE_KEYFIELD( m_FOV, FIELD_FLOAT, "FOV" ), + DEFINE_KEYFIELD( m_Resolution, FIELD_FLOAT, "resolution" ), + DEFINE_KEYFIELD( m_bFogEnable, FIELD_BOOLEAN, "fogEnable" ), + DEFINE_KEYFIELD( m_FogColor, FIELD_COLOR32, "fogColor" ), + DEFINE_KEYFIELD( m_flFogStart, FIELD_FLOAT, "fogStart" ), + DEFINE_KEYFIELD( m_flFogEnd, FIELD_FLOAT, "fogEnd" ), + DEFINE_KEYFIELD( m_flFogMaxDensity, FIELD_FLOAT, "fogMaxDensity" ), + DEFINE_KEYFIELD( m_bUseScreenAspectRatio, FIELD_BOOLEAN, "UseScreenAspectRatio" ), + DEFINE_FIELD( m_bActive, FIELD_BOOLEAN ), + DEFINE_FIELD( m_bIsOn, FIELD_BOOLEAN ), + + DEFINE_FIELD( m_TargetFOV, FIELD_FLOAT ), + DEFINE_FIELD( m_DegreesPerSecond, FIELD_FLOAT ), + // This is re-set up in the constructor + //DEFINE_FIELD( m_pNext, FIELD_CLASSPTR ), + + DEFINE_FUNCTION( ChangeFOVThink ), + + // Input + DEFINE_INPUTFUNC( FIELD_STRING, "ChangeFOV", InputChangeFOV ), + DEFINE_INPUTFUNC( FIELD_VOID, "SetOnAndTurnOthersOff", InputSetOnAndTurnOthersOff ), + DEFINE_INPUTFUNC( FIELD_VOID, "SetOn", InputSetOn ), + DEFINE_INPUTFUNC( FIELD_VOID, "SetOff", InputSetOff ), + +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST( CPointCamera, DT_PointCamera ) + SendPropFloat( SENDINFO( m_FOV ), 0, SPROP_NOSCALE ), + SendPropFloat( SENDINFO( m_Resolution ), 0, SPROP_NOSCALE ), + SendPropInt( SENDINFO( m_bFogEnable ), 1, SPROP_UNSIGNED ), + SendPropInt( SENDINFO_STRUCTELEM( m_FogColor ), 32, SPROP_UNSIGNED ), + SendPropFloat( SENDINFO( m_flFogStart ), 0, SPROP_NOSCALE ), + SendPropFloat( SENDINFO( m_flFogEnd ), 0, SPROP_NOSCALE ), + SendPropFloat( SENDINFO( m_flFogMaxDensity ), 0, SPROP_NOSCALE ), + SendPropInt( SENDINFO( m_bActive ), 1, SPROP_UNSIGNED ), + SendPropInt( SENDINFO( m_bUseScreenAspectRatio ), 1, SPROP_UNSIGNED ), +END_SEND_TABLE() -- cgit v1.2.3