summaryrefslogtreecommitdiff
path: root/game/client/c_vehicle_choreo_generic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/c_vehicle_choreo_generic.cpp')
-rw-r--r--game/client/c_vehicle_choreo_generic.cpp259
1 files changed, 259 insertions, 0 deletions
diff --git a/game/client/c_vehicle_choreo_generic.cpp b/game/client/c_vehicle_choreo_generic.cpp
new file mode 100644
index 0000000..52eba09
--- /dev/null
+++ b/game/client/c_vehicle_choreo_generic.cpp
@@ -0,0 +1,259 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "hud.h"
+#include "c_props.h"
+#include "iclientvehicle.h"
+#include <vgui_controls/Controls.h>
+#include <Color.h>
+#include "vehicle_choreo_generic_shared.h"
+#include "vehicle_viewblend_shared.h"
+// NVNT haptic utils
+#include "haptics/haptic_utils.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+extern float RemapAngleRange( float startInterval, float endInterval, float value );
+
+
+#define ROLL_CURVE_ZERO 5 // roll less than this is clamped to zero
+#define ROLL_CURVE_LINEAR 45 // roll greater than this is copied out
+
+#define PITCH_CURVE_ZERO 10 // pitch less than this is clamped to zero
+#define PITCH_CURVE_LINEAR 45 // pitch greater than this is copied out
+ // spline in between
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class C_PropVehicleChoreoGeneric : public C_DynamicProp, public IClientVehicle
+{
+ DECLARE_CLASS( C_PropVehicleChoreoGeneric, C_DynamicProp );
+
+public:
+
+ DECLARE_CLIENTCLASS();
+ DECLARE_DATADESC();
+
+ C_PropVehicleChoreoGeneric();
+
+ void PreDataUpdate( DataUpdateType_t updateType );
+ void PostDataUpdate( DataUpdateType_t updateType );
+
+public:
+
+ // IClientVehicle overrides.
+ virtual void GetVehicleViewPosition( int nRole, Vector *pOrigin, QAngle *pAngles, float *pFOV = NULL );
+ virtual void GetVehicleFOV( float &flFOV )
+ {
+ flFOV = m_flFOV;
+ }
+ virtual void DrawHudElements();
+ virtual bool IsPassengerUsingStandardWeapons( int nRole = VEHICLE_ROLE_DRIVER ) { return false; }
+ virtual void UpdateViewAngles( C_BasePlayer *pLocalPlayer, CUserCmd *pCmd );
+ virtual C_BaseCombatCharacter *GetPassenger( int nRole );
+ virtual int GetPassengerRole( C_BaseCombatCharacter *pPassenger );
+ virtual void GetVehicleClipPlanes( float &flZNear, float &flZFar ) const;
+ virtual int GetPrimaryAmmoType() const { return -1; }
+ virtual int GetPrimaryAmmoCount() const { return -1; }
+ virtual int GetPrimaryAmmoClip() const { return -1; }
+ virtual bool PrimaryAmmoUsesClips() const { return false; }
+ virtual int GetJoystickResponseCurve() const { return 0; }
+
+public:
+
+ // C_BaseEntity overrides.
+ virtual IClientVehicle* GetClientVehicle() { return this; }
+ virtual C_BaseEntity *GetVehicleEnt() { return this; }
+ virtual void SetupMove( C_BasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move ) {}
+ virtual void ProcessMovement( C_BasePlayer *pPlayer, CMoveData *pMoveData ) {}
+ virtual void FinishMove( C_BasePlayer *player, CUserCmd *ucmd, CMoveData *move ) {}
+ virtual bool IsPredicted() const { return false; }
+ virtual void ItemPostFrame( C_BasePlayer *pPlayer ) {}
+ virtual bool IsSelfAnimating() { return false; };
+
+private:
+
+ CHandle<C_BasePlayer> m_hPlayer;
+ CHandle<C_BasePlayer> m_hPrevPlayer;
+
+ bool m_bEnterAnimOn;
+ bool m_bExitAnimOn;
+ Vector m_vecEyeExitEndpoint;
+ float m_flFOV; // The current FOV (changes during entry/exit anims).
+
+ ViewSmoothingData_t m_ViewSmoothingData;
+
+ vehicleview_t m_vehicleView;
+};
+
+IMPLEMENT_CLIENTCLASS_DT(C_PropVehicleChoreoGeneric, DT_PropVehicleChoreoGeneric, CPropVehicleChoreoGeneric)
+ RecvPropEHandle( RECVINFO(m_hPlayer) ),
+ RecvPropBool( RECVINFO( m_bEnterAnimOn ) ),
+ RecvPropBool( RECVINFO( m_bExitAnimOn ) ),
+ RecvPropVector( RECVINFO( m_vecEyeExitEndpoint ) ),
+ RecvPropBool( RECVINFO( m_vehicleView.bClampEyeAngles ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flPitchCurveZero ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flPitchCurveLinear ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flRollCurveZero ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flRollCurveLinear ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flFOV ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flYawMin ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flYawMax ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flPitchMin ) ),
+ RecvPropFloat( RECVINFO( m_vehicleView.flPitchMax ) ),
+END_RECV_TABLE()
+
+
+BEGIN_DATADESC( C_PropVehicleChoreoGeneric )
+ DEFINE_EMBEDDED( m_ViewSmoothingData ),
+END_DATADESC()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_PropVehicleChoreoGeneric::C_PropVehicleChoreoGeneric( void )
+{
+ memset( &m_ViewSmoothingData, 0, sizeof( m_ViewSmoothingData ) );
+
+ m_ViewSmoothingData.pVehicle = this;
+ m_ViewSmoothingData.flPitchCurveZero = PITCH_CURVE_ZERO;
+ m_ViewSmoothingData.flPitchCurveLinear = PITCH_CURVE_LINEAR;
+ m_ViewSmoothingData.flRollCurveZero = ROLL_CURVE_ZERO;
+ m_ViewSmoothingData.flRollCurveLinear = ROLL_CURVE_LINEAR;
+ m_flFOV = 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : updateType -
+//-----------------------------------------------------------------------------
+void C_PropVehicleChoreoGeneric::PreDataUpdate( DataUpdateType_t updateType )
+{
+ BaseClass::PreDataUpdate( updateType );
+
+ m_hPrevPlayer = m_hPlayer;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_PropVehicleChoreoGeneric::PostDataUpdate( DataUpdateType_t updateType )
+{
+ BaseClass::PostDataUpdate( updateType );
+
+ // NVNT if we have entered this vehicle notify the haptics system
+ if ( m_hPlayer && !m_hPrevPlayer )
+ {
+#if defined( WIN32 ) && !defined( _X360 )
+ //They have just entered the vehicle.
+ HapticsEnteredVehicle(this,m_hPlayer);
+#endif
+ }
+
+ if ( !m_hPlayer && m_hPrevPlayer )
+ {
+#if defined( WIN32 ) && !defined( _X360 )
+ // NVNT we have just exited this vehicle so we notify the haptics system
+ HapticsExitedVehicle(this,m_hPrevPlayer);
+#endif
+ // They have just exited the vehicle.
+ // Sometimes we never reach the end of our exit anim, such as if the
+ // animation doesn't have fadeout 0 specified in the QC, so we fail to
+ // catch it in VehicleViewSmoothing. Catch it here instead.
+ m_ViewSmoothingData.bWasRunningAnim = false;
+
+ //There's no need to "smooth" the view when leaving the vehicle so just set this here so the stair code doesn't get confused.
+ m_hPrevPlayer->SetOldPlayerZ( m_hPrevPlayer->GetLocalOrigin().z );
+ }
+
+ m_ViewSmoothingData.bClampEyeAngles = m_vehicleView.bClampEyeAngles;
+ m_ViewSmoothingData.flFOV = m_vehicleView.flFOV;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_BaseCombatCharacter *C_PropVehicleChoreoGeneric::GetPassenger( int nRole )
+{
+ if ( nRole == VEHICLE_ROLE_DRIVER )
+ return m_hPlayer.Get();
+
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Returns the role of the passenger
+//-----------------------------------------------------------------------------
+int C_PropVehicleChoreoGeneric::GetPassengerRole( C_BaseCombatCharacter *pPassenger )
+{
+ if ( m_hPlayer.Get() == pPassenger )
+ return VEHICLE_ROLE_DRIVER;
+
+ return VEHICLE_ROLE_NONE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Modify the player view/camera while in a vehicle
+//-----------------------------------------------------------------------------
+void C_PropVehicleChoreoGeneric::GetVehicleViewPosition( int nRole, Vector *pAbsOrigin, QAngle *pAbsAngles, float *pFOV /*=NULL*/ )
+{
+ SharedVehicleViewSmoothing( m_hPlayer,
+ pAbsOrigin, pAbsAngles,
+ m_bEnterAnimOn, m_bExitAnimOn,
+ m_vecEyeExitEndpoint,
+ &m_ViewSmoothingData,
+ pFOV );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pLocalPlayer -
+// pCmd -
+//-----------------------------------------------------------------------------
+void C_PropVehicleChoreoGeneric::UpdateViewAngles( C_BasePlayer *pLocalPlayer, CUserCmd *pCmd )
+{
+ int eyeAttachmentIndex = LookupAttachment( "vehicle_driver_eyes" );
+ Vector vehicleEyeOrigin;
+ QAngle vehicleEyeAngles;
+ GetAttachmentLocal( eyeAttachmentIndex, vehicleEyeOrigin, vehicleEyeAngles );
+
+ // Limit the yaw.
+ float flAngleDiff = AngleDiff( pCmd->viewangles.y, vehicleEyeAngles.y );
+ flAngleDiff = clamp( flAngleDiff, (float) m_vehicleView.flYawMin, (float) m_vehicleView.flYawMax );
+ pCmd->viewangles.y = vehicleEyeAngles.y + flAngleDiff;
+
+ // Limit the pitch -- don't let them look down into the empty pod!
+ flAngleDiff = AngleDiff( pCmd->viewangles.x, vehicleEyeAngles.x );
+ flAngleDiff = clamp( flAngleDiff, (float) m_vehicleView.flPitchMin, (float) m_vehicleView.flPitchMax );
+ pCmd->viewangles.x = vehicleEyeAngles.x + flAngleDiff;
+}
+
+
+//-----------------------------------------------------------------------------
+// Futzes with the clip planes
+//-----------------------------------------------------------------------------
+void C_PropVehicleChoreoGeneric::GetVehicleClipPlanes( float &flZNear, float &flZFar ) const
+{
+ // Pod doesn't need to adjust the clip planes.
+ //flZNear = 6;
+}
+
+
+//-----------------------------------------------------------------------------
+// Renders hud elements
+//-----------------------------------------------------------------------------
+void C_PropVehicleChoreoGeneric::DrawHudElements( )
+{
+}
+
+