aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/shared/weapon_ifmbasecamera.cpp
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-02 19:31:46 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-02 19:46:31 -0800
commitf56bb35301836e56582a575a75864392a0177875 (patch)
treede61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/shared/weapon_ifmbasecamera.cpp
parentMark some more files as text. (diff)
downloadsource-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz
source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/shared/weapon_ifmbasecamera.cpp')
-rw-r--r--mp/src/game/shared/weapon_ifmbasecamera.cpp808
1 files changed, 404 insertions, 404 deletions
diff --git a/mp/src/game/shared/weapon_ifmbasecamera.cpp b/mp/src/game/shared/weapon_ifmbasecamera.cpp
index 5c130db1..3c196e6e 100644
--- a/mp/src/game/shared/weapon_ifmbasecamera.cpp
+++ b/mp/src/game/shared/weapon_ifmbasecamera.cpp
@@ -1,404 +1,404 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//===========================================================================//
-
-#include "cbase.h"
-#include "weapon_ifmbasecamera.h"
-
-#ifdef CLIENT_DLL
-#include "view_shared.h"
-#include "iviewrender.h"
-#include "vgui_controls/Controls.h"
-#include "vgui/ISurface.h"
-
-bool ToolFramework_SetupEngineView( Vector &origin, QAngle &angles, float &fov );
-
-#endif
-
-#define INSET_VIEW_FACTOR 0.3f
-
-//-----------------------------------------------------------------------------
-// CWeaponIFMBaseCamera tables.
-//-----------------------------------------------------------------------------
-IMPLEMENT_NETWORKCLASS_ALIASED( WeaponIFMBaseCamera, DT_WeaponIFMBaseCamera )
-LINK_ENTITY_TO_CLASS( weapon_ifm_base_camera, CWeaponIFMBaseCamera );
-
-BEGIN_NETWORK_TABLE( CWeaponIFMBaseCamera, DT_WeaponIFMBaseCamera )
-#if !defined( CLIENT_DLL )
- SendPropFloat( SENDINFO( m_flRenderAspectRatio ), 0, SPROP_NOSCALE ),
- SendPropFloat( SENDINFO( m_flRenderFOV ), 0, SPROP_NOSCALE ),
- SendPropFloat( SENDINFO( m_flRenderArmLength ), 0, SPROP_NOSCALE ),
- SendPropVector( SENDINFO( m_vecRenderPosition ), 0, SPROP_NOSCALE ),
- SendPropQAngles( SENDINFO( m_angRenderAngles ), 0, SPROP_NOSCALE ),
-#else
- RecvPropFloat( RECVINFO( m_flRenderAspectRatio ) ),
- RecvPropFloat( RECVINFO( m_flRenderFOV ) ),
- RecvPropFloat( RECVINFO( m_flRenderArmLength ) ),
- RecvPropVector( RECVINFO( m_vecRenderPosition ) ),
- RecvPropQAngles( RECVINFO( m_angRenderAngles ) ),
-#endif
-END_NETWORK_TABLE()
-
-#ifdef CLIENT_DLL
-
-BEGIN_PREDICTION_DATA( CWeaponIFMBaseCamera )
- DEFINE_PRED_FIELD( m_flFOV, FIELD_FLOAT, 0 ),
- DEFINE_PRED_FIELD( m_flArmLength, FIELD_FLOAT, 0 ),
- DEFINE_PRED_FIELD( m_vecRelativePosition, FIELD_VECTOR, 0 ),
- DEFINE_PRED_FIELD( m_angRelativeAngles, FIELD_VECTOR, 0 ),
- DEFINE_PRED_FIELD( m_bFullScreen, FIELD_BOOLEAN, 0 ),
-END_PREDICTION_DATA()
-
-#endif
-
-
-#ifdef GAME_DLL
-
-BEGIN_DATADESC( CWeaponIFMBaseCamera )
- DEFINE_FIELD( m_flRenderAspectRatio, FIELD_FLOAT ),
- DEFINE_FIELD( m_flRenderFOV, FIELD_FLOAT ),
- DEFINE_FIELD( m_flRenderArmLength, FIELD_FLOAT ),
- DEFINE_FIELD( m_vecRenderPosition, FIELD_VECTOR ),
- DEFINE_FIELD( m_angRenderAngles, FIELD_VECTOR ),
-END_DATADESC()
-
-#endif
-
-
-//-----------------------------------------------------------------------------
-// CWeaponIFMBaseCamera implementation.
-//-----------------------------------------------------------------------------
-CWeaponIFMBaseCamera::CWeaponIFMBaseCamera()
-{
-#ifdef CLIENT_DLL
- m_flFOV = 75.0f;
- m_flArmLength = 4;
- m_vecRelativePosition.Init();
- m_angRelativeAngles.Init();
- m_bFullScreen = false;
- m_nScreenWidth = 0;
- m_nScreenHeight = 0;
-#endif
-}
-
-
-//-----------------------------------------------------------------------------
-//
-// Specific methods on the server
-//
-//-----------------------------------------------------------------------------
-#ifdef GAME_DLL
-
-void CWeaponIFMBaseCamera::SetRenderInfo( float flAspectRatio, float flFOV, float flArmLength, const Vector &vecPosition, const QAngle &angles )
-{
- m_flRenderAspectRatio = flAspectRatio;
- m_flRenderFOV = flFOV;
- m_flRenderArmLength = flArmLength;
- m_vecRenderPosition = vecPosition;
- m_angRenderAngles = angles;
-}
-
-CON_COMMAND( ifm_basecamera_camerastate, "Set camera state" )
-{
- CBasePlayer *pPlayer = ToBasePlayer( UTIL_GetCommandClient() );
- if ( !pPlayer )
- return;
-
- if ( args.ArgC() != 10 )
- return;
-
- Vector vecPosition;
- QAngle angAngles;
- float flAspectRatio = atof( args[1] );
- float flFOV = atof( args[2] );
- float flArmLength = atof( args[3] );
- vecPosition.x = atof( args[4] );
- vecPosition.y = atof( args[5] );
- vecPosition.z = atof( args[6] );
- angAngles.x = atof( args[7] );
- angAngles.y = atof( args[8] );
- angAngles.z = atof( args[9] );
-
- int nCount = pPlayer->WeaponCount();
- for ( int i = 0; i < nCount; ++i )
- {
- CWeaponIFMBaseCamera *pCamera = dynamic_cast<CWeaponIFMBaseCamera*>( pPlayer->GetWeapon( i ) );
- if ( !pCamera )
- continue;
-
- pCamera->SetRenderInfo( flAspectRatio, flFOV, flArmLength, vecPosition, angAngles );
- }
-}
-
-#endif // GAME_DLL
-
-
-//-----------------------------------------------------------------------------
-//
-// Specific methods on the client
-//
-//-----------------------------------------------------------------------------
-#ifdef CLIENT_DLL
-
-
-//-----------------------------------------------------------------------------
-// Sets up the material to draw with
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::OnDataChanged( DataUpdateType_t updateType )
-{
- BaseClass::OnDataChanged( updateType );
- if (updateType == DATA_UPDATE_CREATED)
- {
- m_FrustumMaterial.Init( "effects/steadycamfrustum", TEXTURE_GROUP_OTHER );
- m_FrustumWireframeMaterial.Init( "shadertest/wireframevertexcolor", TEXTURE_GROUP_OTHER );
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// Transmits render information
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::TransmitRenderInfo()
-{
- float flAspectRatio = (m_nScreenHeight != 0) ? (float)m_nScreenWidth / (float)m_nScreenHeight : 1.0f;
- float flFOV = m_flFOV;
-
- Vector position;
- QAngle angles;
- ComputeAbsCameraTransform( position, angles );
-
- // give the toolsystem a chance to override the view
- ToolFramework_SetupEngineView( position, angles, flFOV );
-
- char pBuf[256];
- Q_snprintf( pBuf, sizeof(pBuf), "ifm_basecamera_camerastate %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f",
- flAspectRatio, flFOV, m_flArmLength, position.x, position.y, position.z,
- angles.x, angles.y, angles.z );
-
- engine->ClientCmd( pBuf );
-}
-
-
-//-----------------------------------------------------------------------------
-// Purpose: In 3rd person, draws the cone of the steadycam
-//-----------------------------------------------------------------------------
-#define FRUSTUM_SIZE 1000
-
-int CWeaponIFMBaseCamera::DrawModel( int flags )
-{
- int nRetVal = BaseClass::DrawModel( flags );
-
- CBasePlayer *pPlayer = GetPlayerOwner();
- if ( pPlayer && !pPlayer->IsLocalPlayer() )
- {
- // Compute endpoints
- float flMaxD = 1.0f / tan( M_PI * m_flFOV / 360.0f );
- float ex = flMaxD * FRUSTUM_SIZE;
- float ey = flMaxD * FRUSTUM_SIZE / m_flRenderAspectRatio;
-
- // Compute basis
- Vector vecForward, vecUp, vecRight;
- AngleVectors( m_angRenderAngles, &vecForward, &vecRight, &vecUp );
-
- Vector vecCenter;
- VectorMA( m_vecRenderPosition, FRUSTUM_SIZE, vecForward, vecCenter );
-
- Vector vecEndPoint[4];
- VectorMA( vecCenter, ex, vecRight, vecEndPoint[0] );
- VectorMA( vecEndPoint[0], ey, vecUp, vecEndPoint[0] );
- VectorMA( vecEndPoint[0], -2.0f * ex, vecRight, vecEndPoint[1] );
- VectorMA( vecEndPoint[1], -2.0f * ey, vecUp, vecEndPoint[2] );
- VectorMA( vecEndPoint[2], 2.0f * ex, vecRight, vecEndPoint[3] );
-
- CMatRenderContextPtr pRenderContext( materials );
- pRenderContext->Bind( m_FrustumMaterial );
- IMesh* pMesh = pRenderContext->GetDynamicMesh( true );
-
- CMeshBuilder meshBuilder;
- meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, 4 );
- for ( int i = 0; i < 4; ++i )
- {
- meshBuilder.Position3fv( m_vecRenderPosition.Get().Base() );
- meshBuilder.Color4ub( 128, 0, 0, 255 );
- meshBuilder.AdvanceVertex();
-
- meshBuilder.Position3fv( vecEndPoint[i].Base() );
- meshBuilder.Color4ub( 128, 0, 0, 255 );
- meshBuilder.AdvanceVertex();
-
- meshBuilder.Position3fv( vecEndPoint[(i+1)%4].Base() );
- meshBuilder.Color4ub( 128, 0, 0, 255 );
- meshBuilder.AdvanceVertex();
- }
-
- meshBuilder.End();
- pMesh->Draw();
-
- pRenderContext->Bind( m_FrustumWireframeMaterial );
- pMesh = pRenderContext->GetDynamicMesh( true );
- meshBuilder.Begin( pMesh, MATERIAL_LINES, 8 );
- for ( int i = 0; i < 4; ++i )
- {
- meshBuilder.Position3fv( m_vecRenderPosition.Get().Base() );
- meshBuilder.Color4ub( 255, 255, 255, 255 );
- meshBuilder.AdvanceVertex();
-
- meshBuilder.Position3fv( vecEndPoint[i].Base() );
- meshBuilder.Color4ub( 255, 255, 255, 255 );
- meshBuilder.AdvanceVertex();
-
- meshBuilder.Position3fv( vecEndPoint[i].Base() );
- meshBuilder.Color4ub( 255, 255, 255, 255 );
- meshBuilder.AdvanceVertex();
-
- meshBuilder.Position3fv( vecEndPoint[(i+1)%4].Base() );
- meshBuilder.Color4ub( 255, 255, 255, 255 );
- meshBuilder.AdvanceVertex();
- }
-
- meshBuilder.End();
- pMesh->Draw();
- }
-
- return nRetVal;
-}
-
-
-//-----------------------------------------------------------------------------
-// Gets the size of the overlay to draw
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::GetViewportSize( int &w, int &h )
-{
- if ( !m_bFullScreen )
- {
- w = m_nScreenWidth * INSET_VIEW_FACTOR;
- h = m_nScreenHeight * INSET_VIEW_FACTOR;
- }
- else
- {
- w = m_nScreenWidth;
- h = m_nScreenHeight;
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// Gets the abs orientation of the camera
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::ComputeAbsCameraTransform( Vector &vecAbsOrigin, QAngle &angAbsRotation )
-{
- CBasePlayer *pPlayer = GetPlayerOwner();
- if ( !pPlayer )
- {
- vecAbsOrigin.Init();
- angAbsRotation.Init();
- return;
- }
-
- float flFOV = m_flFOV;
-
- float flZNear = view->GetZNear();
- float flZFar = view->GetZFar();
- Vector viewOrigin;
- QAngle viewAngles;
- pPlayer->CalcView( viewOrigin, viewAngles, flZNear, flZFar, flFOV );
-
- // Offset the view along the forward direction vector by the arm length
- Vector vecForward;
- AngleVectors( viewAngles, &vecForward );
- VectorMA( viewOrigin, m_flArmLength, vecForward, viewOrigin );
-
- // Use player roll
- QAngle angles = m_angRelativeAngles;
- angles.z = viewAngles.z;
-
- // Compute the actual orientation of the view
- matrix3x4_t cameraToWorld, overlayToCamera, overlayToWorld;
- AngleMatrix( vec3_angle, viewOrigin, cameraToWorld );
- AngleMatrix( angles, m_vecRelativePosition, overlayToCamera );
- ConcatTransforms( cameraToWorld, overlayToCamera, overlayToWorld );
- MatrixAngles( overlayToWorld, angAbsRotation, vecAbsOrigin );
-
- // give the toolsystem a chance to override the view
- ToolFramework_SetupEngineView( vecAbsOrigin, angAbsRotation, flFOV );
-}
-
-
-//-----------------------------------------------------------------------------
-// Gets the bounds of the overlay to draw
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::GetOverlayBounds( int &x, int &y, int &w, int &h )
-{
- const CViewSetup *pViewSetup = view->GetViewSetup();
- if ( !m_bFullScreen )
- {
- w = pViewSetup->width * INSET_VIEW_FACTOR;
- h = pViewSetup->height * INSET_VIEW_FACTOR;
- x = pViewSetup->x + ( pViewSetup->width - w ) / 2;
- y = pViewSetup->height - h;
- }
- else
- {
- w = pViewSetup->width;
- h = pViewSetup->height;
- x = pViewSetup->x;
- y = pViewSetup->y;
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// When drawing the model, if drawing the viewmodel, draw an overlay of what's being rendered
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::ViewModelDrawn( CBaseViewModel *pBaseViewModel )
-{
- // NOTE: This is not recursively called because we do not draw viewmodels in the overlay
- CViewSetup overlayView = *view->GetViewSetup();
-
- m_nScreenWidth = overlayView.width;
- m_nScreenHeight = overlayView.height;
-
- GetOverlayBounds( overlayView.x, overlayView.y, overlayView.width, overlayView.height );
- overlayView.m_bRenderToSubrectOfLargerScreen = true;
- overlayView.fov = m_flFOV;
-
- // Compute the location of the camera
- ComputeAbsCameraTransform( overlayView.origin, overlayView.angles );
-
- // give the toolsystem a chance to override the view
- ToolFramework_SetupEngineView( overlayView.origin, overlayView.angles, overlayView.fov );
-
- view->QueueOverlayRenderView( overlayView, VIEW_CLEAR_COLOR | VIEW_CLEAR_DEPTH, RENDERVIEW_UNSPECIFIED );
-}
-
-
-//-----------------------------------------------------------------------------
-// Purpose: Draw the weapon's crosshair
-//-----------------------------------------------------------------------------
-void CWeaponIFMBaseCamera::DrawCrosshair( void )
-{
- BaseClass::DrawCrosshair();
-
- int x, y, w, h;
- GetOverlayBounds( x, y, w, h );
-
- // Draw the targeting zone around the crosshair
- int r, g, b, a;
- gHUD.m_clrYellowish.GetColor( r, g, b, a );
-
- Color light( r, g, b, 160 );
-
- int nBorderSize = 4;
- vgui::surface()->DrawSetColor( light );
- vgui::surface()->DrawFilledRect( x-nBorderSize, y-nBorderSize, x+w+nBorderSize, y );
- vgui::surface()->DrawFilledRect( x-nBorderSize, y+h, x+w+nBorderSize, y+h+nBorderSize );
- vgui::surface()->DrawFilledRect( x-nBorderSize, y, x, y+h );
- vgui::surface()->DrawFilledRect( x+w, y, x+w+nBorderSize, y+h );
-}
-
-#endif // CLIENT_DLL
-
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//===========================================================================//
+
+#include "cbase.h"
+#include "weapon_ifmbasecamera.h"
+
+#ifdef CLIENT_DLL
+#include "view_shared.h"
+#include "iviewrender.h"
+#include "vgui_controls/Controls.h"
+#include "vgui/ISurface.h"
+
+bool ToolFramework_SetupEngineView( Vector &origin, QAngle &angles, float &fov );
+
+#endif
+
+#define INSET_VIEW_FACTOR 0.3f
+
+//-----------------------------------------------------------------------------
+// CWeaponIFMBaseCamera tables.
+//-----------------------------------------------------------------------------
+IMPLEMENT_NETWORKCLASS_ALIASED( WeaponIFMBaseCamera, DT_WeaponIFMBaseCamera )
+LINK_ENTITY_TO_CLASS( weapon_ifm_base_camera, CWeaponIFMBaseCamera );
+
+BEGIN_NETWORK_TABLE( CWeaponIFMBaseCamera, DT_WeaponIFMBaseCamera )
+#if !defined( CLIENT_DLL )
+ SendPropFloat( SENDINFO( m_flRenderAspectRatio ), 0, SPROP_NOSCALE ),
+ SendPropFloat( SENDINFO( m_flRenderFOV ), 0, SPROP_NOSCALE ),
+ SendPropFloat( SENDINFO( m_flRenderArmLength ), 0, SPROP_NOSCALE ),
+ SendPropVector( SENDINFO( m_vecRenderPosition ), 0, SPROP_NOSCALE ),
+ SendPropQAngles( SENDINFO( m_angRenderAngles ), 0, SPROP_NOSCALE ),
+#else
+ RecvPropFloat( RECVINFO( m_flRenderAspectRatio ) ),
+ RecvPropFloat( RECVINFO( m_flRenderFOV ) ),
+ RecvPropFloat( RECVINFO( m_flRenderArmLength ) ),
+ RecvPropVector( RECVINFO( m_vecRenderPosition ) ),
+ RecvPropQAngles( RECVINFO( m_angRenderAngles ) ),
+#endif
+END_NETWORK_TABLE()
+
+#ifdef CLIENT_DLL
+
+BEGIN_PREDICTION_DATA( CWeaponIFMBaseCamera )
+ DEFINE_PRED_FIELD( m_flFOV, FIELD_FLOAT, 0 ),
+ DEFINE_PRED_FIELD( m_flArmLength, FIELD_FLOAT, 0 ),
+ DEFINE_PRED_FIELD( m_vecRelativePosition, FIELD_VECTOR, 0 ),
+ DEFINE_PRED_FIELD( m_angRelativeAngles, FIELD_VECTOR, 0 ),
+ DEFINE_PRED_FIELD( m_bFullScreen, FIELD_BOOLEAN, 0 ),
+END_PREDICTION_DATA()
+
+#endif
+
+
+#ifdef GAME_DLL
+
+BEGIN_DATADESC( CWeaponIFMBaseCamera )
+ DEFINE_FIELD( m_flRenderAspectRatio, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flRenderFOV, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flRenderArmLength, FIELD_FLOAT ),
+ DEFINE_FIELD( m_vecRenderPosition, FIELD_VECTOR ),
+ DEFINE_FIELD( m_angRenderAngles, FIELD_VECTOR ),
+END_DATADESC()
+
+#endif
+
+
+//-----------------------------------------------------------------------------
+// CWeaponIFMBaseCamera implementation.
+//-----------------------------------------------------------------------------
+CWeaponIFMBaseCamera::CWeaponIFMBaseCamera()
+{
+#ifdef CLIENT_DLL
+ m_flFOV = 75.0f;
+ m_flArmLength = 4;
+ m_vecRelativePosition.Init();
+ m_angRelativeAngles.Init();
+ m_bFullScreen = false;
+ m_nScreenWidth = 0;
+ m_nScreenHeight = 0;
+#endif
+}
+
+
+//-----------------------------------------------------------------------------
+//
+// Specific methods on the server
+//
+//-----------------------------------------------------------------------------
+#ifdef GAME_DLL
+
+void CWeaponIFMBaseCamera::SetRenderInfo( float flAspectRatio, float flFOV, float flArmLength, const Vector &vecPosition, const QAngle &angles )
+{
+ m_flRenderAspectRatio = flAspectRatio;
+ m_flRenderFOV = flFOV;
+ m_flRenderArmLength = flArmLength;
+ m_vecRenderPosition = vecPosition;
+ m_angRenderAngles = angles;
+}
+
+CON_COMMAND( ifm_basecamera_camerastate, "Set camera state" )
+{
+ CBasePlayer *pPlayer = ToBasePlayer( UTIL_GetCommandClient() );
+ if ( !pPlayer )
+ return;
+
+ if ( args.ArgC() != 10 )
+ return;
+
+ Vector vecPosition;
+ QAngle angAngles;
+ float flAspectRatio = atof( args[1] );
+ float flFOV = atof( args[2] );
+ float flArmLength = atof( args[3] );
+ vecPosition.x = atof( args[4] );
+ vecPosition.y = atof( args[5] );
+ vecPosition.z = atof( args[6] );
+ angAngles.x = atof( args[7] );
+ angAngles.y = atof( args[8] );
+ angAngles.z = atof( args[9] );
+
+ int nCount = pPlayer->WeaponCount();
+ for ( int i = 0; i < nCount; ++i )
+ {
+ CWeaponIFMBaseCamera *pCamera = dynamic_cast<CWeaponIFMBaseCamera*>( pPlayer->GetWeapon( i ) );
+ if ( !pCamera )
+ continue;
+
+ pCamera->SetRenderInfo( flAspectRatio, flFOV, flArmLength, vecPosition, angAngles );
+ }
+}
+
+#endif // GAME_DLL
+
+
+//-----------------------------------------------------------------------------
+//
+// Specific methods on the client
+//
+//-----------------------------------------------------------------------------
+#ifdef CLIENT_DLL
+
+
+//-----------------------------------------------------------------------------
+// Sets up the material to draw with
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+ if (updateType == DATA_UPDATE_CREATED)
+ {
+ m_FrustumMaterial.Init( "effects/steadycamfrustum", TEXTURE_GROUP_OTHER );
+ m_FrustumWireframeMaterial.Init( "shadertest/wireframevertexcolor", TEXTURE_GROUP_OTHER );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Transmits render information
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::TransmitRenderInfo()
+{
+ float flAspectRatio = (m_nScreenHeight != 0) ? (float)m_nScreenWidth / (float)m_nScreenHeight : 1.0f;
+ float flFOV = m_flFOV;
+
+ Vector position;
+ QAngle angles;
+ ComputeAbsCameraTransform( position, angles );
+
+ // give the toolsystem a chance to override the view
+ ToolFramework_SetupEngineView( position, angles, flFOV );
+
+ char pBuf[256];
+ Q_snprintf( pBuf, sizeof(pBuf), "ifm_basecamera_camerastate %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f",
+ flAspectRatio, flFOV, m_flArmLength, position.x, position.y, position.z,
+ angles.x, angles.y, angles.z );
+
+ engine->ClientCmd( pBuf );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: In 3rd person, draws the cone of the steadycam
+//-----------------------------------------------------------------------------
+#define FRUSTUM_SIZE 1000
+
+int CWeaponIFMBaseCamera::DrawModel( int flags )
+{
+ int nRetVal = BaseClass::DrawModel( flags );
+
+ CBasePlayer *pPlayer = GetPlayerOwner();
+ if ( pPlayer && !pPlayer->IsLocalPlayer() )
+ {
+ // Compute endpoints
+ float flMaxD = 1.0f / tan( M_PI * m_flFOV / 360.0f );
+ float ex = flMaxD * FRUSTUM_SIZE;
+ float ey = flMaxD * FRUSTUM_SIZE / m_flRenderAspectRatio;
+
+ // Compute basis
+ Vector vecForward, vecUp, vecRight;
+ AngleVectors( m_angRenderAngles, &vecForward, &vecRight, &vecUp );
+
+ Vector vecCenter;
+ VectorMA( m_vecRenderPosition, FRUSTUM_SIZE, vecForward, vecCenter );
+
+ Vector vecEndPoint[4];
+ VectorMA( vecCenter, ex, vecRight, vecEndPoint[0] );
+ VectorMA( vecEndPoint[0], ey, vecUp, vecEndPoint[0] );
+ VectorMA( vecEndPoint[0], -2.0f * ex, vecRight, vecEndPoint[1] );
+ VectorMA( vecEndPoint[1], -2.0f * ey, vecUp, vecEndPoint[2] );
+ VectorMA( vecEndPoint[2], 2.0f * ex, vecRight, vecEndPoint[3] );
+
+ CMatRenderContextPtr pRenderContext( materials );
+ pRenderContext->Bind( m_FrustumMaterial );
+ IMesh* pMesh = pRenderContext->GetDynamicMesh( true );
+
+ CMeshBuilder meshBuilder;
+ meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, 4 );
+ for ( int i = 0; i < 4; ++i )
+ {
+ meshBuilder.Position3fv( m_vecRenderPosition.Get().Base() );
+ meshBuilder.Color4ub( 128, 0, 0, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3fv( vecEndPoint[i].Base() );
+ meshBuilder.Color4ub( 128, 0, 0, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3fv( vecEndPoint[(i+1)%4].Base() );
+ meshBuilder.Color4ub( 128, 0, 0, 255 );
+ meshBuilder.AdvanceVertex();
+ }
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ pRenderContext->Bind( m_FrustumWireframeMaterial );
+ pMesh = pRenderContext->GetDynamicMesh( true );
+ meshBuilder.Begin( pMesh, MATERIAL_LINES, 8 );
+ for ( int i = 0; i < 4; ++i )
+ {
+ meshBuilder.Position3fv( m_vecRenderPosition.Get().Base() );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3fv( vecEndPoint[i].Base() );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3fv( vecEndPoint[i].Base() );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Position3fv( vecEndPoint[(i+1)%4].Base() );
+ meshBuilder.Color4ub( 255, 255, 255, 255 );
+ meshBuilder.AdvanceVertex();
+ }
+
+ meshBuilder.End();
+ pMesh->Draw();
+ }
+
+ return nRetVal;
+}
+
+
+//-----------------------------------------------------------------------------
+// Gets the size of the overlay to draw
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::GetViewportSize( int &w, int &h )
+{
+ if ( !m_bFullScreen )
+ {
+ w = m_nScreenWidth * INSET_VIEW_FACTOR;
+ h = m_nScreenHeight * INSET_VIEW_FACTOR;
+ }
+ else
+ {
+ w = m_nScreenWidth;
+ h = m_nScreenHeight;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Gets the abs orientation of the camera
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::ComputeAbsCameraTransform( Vector &vecAbsOrigin, QAngle &angAbsRotation )
+{
+ CBasePlayer *pPlayer = GetPlayerOwner();
+ if ( !pPlayer )
+ {
+ vecAbsOrigin.Init();
+ angAbsRotation.Init();
+ return;
+ }
+
+ float flFOV = m_flFOV;
+
+ float flZNear = view->GetZNear();
+ float flZFar = view->GetZFar();
+ Vector viewOrigin;
+ QAngle viewAngles;
+ pPlayer->CalcView( viewOrigin, viewAngles, flZNear, flZFar, flFOV );
+
+ // Offset the view along the forward direction vector by the arm length
+ Vector vecForward;
+ AngleVectors( viewAngles, &vecForward );
+ VectorMA( viewOrigin, m_flArmLength, vecForward, viewOrigin );
+
+ // Use player roll
+ QAngle angles = m_angRelativeAngles;
+ angles.z = viewAngles.z;
+
+ // Compute the actual orientation of the view
+ matrix3x4_t cameraToWorld, overlayToCamera, overlayToWorld;
+ AngleMatrix( vec3_angle, viewOrigin, cameraToWorld );
+ AngleMatrix( angles, m_vecRelativePosition, overlayToCamera );
+ ConcatTransforms( cameraToWorld, overlayToCamera, overlayToWorld );
+ MatrixAngles( overlayToWorld, angAbsRotation, vecAbsOrigin );
+
+ // give the toolsystem a chance to override the view
+ ToolFramework_SetupEngineView( vecAbsOrigin, angAbsRotation, flFOV );
+}
+
+
+//-----------------------------------------------------------------------------
+// Gets the bounds of the overlay to draw
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::GetOverlayBounds( int &x, int &y, int &w, int &h )
+{
+ const CViewSetup *pViewSetup = view->GetViewSetup();
+ if ( !m_bFullScreen )
+ {
+ w = pViewSetup->width * INSET_VIEW_FACTOR;
+ h = pViewSetup->height * INSET_VIEW_FACTOR;
+ x = pViewSetup->x + ( pViewSetup->width - w ) / 2;
+ y = pViewSetup->height - h;
+ }
+ else
+ {
+ w = pViewSetup->width;
+ h = pViewSetup->height;
+ x = pViewSetup->x;
+ y = pViewSetup->y;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// When drawing the model, if drawing the viewmodel, draw an overlay of what's being rendered
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::ViewModelDrawn( CBaseViewModel *pBaseViewModel )
+{
+ // NOTE: This is not recursively called because we do not draw viewmodels in the overlay
+ CViewSetup overlayView = *view->GetViewSetup();
+
+ m_nScreenWidth = overlayView.width;
+ m_nScreenHeight = overlayView.height;
+
+ GetOverlayBounds( overlayView.x, overlayView.y, overlayView.width, overlayView.height );
+ overlayView.m_bRenderToSubrectOfLargerScreen = true;
+ overlayView.fov = m_flFOV;
+
+ // Compute the location of the camera
+ ComputeAbsCameraTransform( overlayView.origin, overlayView.angles );
+
+ // give the toolsystem a chance to override the view
+ ToolFramework_SetupEngineView( overlayView.origin, overlayView.angles, overlayView.fov );
+
+ view->QueueOverlayRenderView( overlayView, VIEW_CLEAR_COLOR | VIEW_CLEAR_DEPTH, RENDERVIEW_UNSPECIFIED );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Draw the weapon's crosshair
+//-----------------------------------------------------------------------------
+void CWeaponIFMBaseCamera::DrawCrosshair( void )
+{
+ BaseClass::DrawCrosshair();
+
+ int x, y, w, h;
+ GetOverlayBounds( x, y, w, h );
+
+ // Draw the targeting zone around the crosshair
+ int r, g, b, a;
+ gHUD.m_clrYellowish.GetColor( r, g, b, a );
+
+ Color light( r, g, b, 160 );
+
+ int nBorderSize = 4;
+ vgui::surface()->DrawSetColor( light );
+ vgui::surface()->DrawFilledRect( x-nBorderSize, y-nBorderSize, x+w+nBorderSize, y );
+ vgui::surface()->DrawFilledRect( x-nBorderSize, y+h, x+w+nBorderSize, y+h+nBorderSize );
+ vgui::surface()->DrawFilledRect( x-nBorderSize, y, x, y+h );
+ vgui::surface()->DrawFilledRect( x+w, y, x+w+nBorderSize, y+h );
+}
+
+#endif // CLIENT_DLL
+
+