Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

218 lines
6.7 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: A base class that deals with four-wheel vehicles
//
// $NoKeywords: $
//=============================================================================//
#ifndef FOUR_WHEEL_VEHICLE_PHYSICS_H
#define FOUR_WHEEL_VEHICLE_PHYSICS_H
#ifdef _WIN32
#pragma once
#endif
#include "vphysics/vehicles.h"
#include "vcollide_parse.h"
#include "datamap.h"
#include "vehicle_sounds.h"
// in/sec to miles/hour
#define INS2MPH_SCALE ( 3600 * (1/5280.0f) * (1/12.0f) )
#define INS2MPH(x) ( (x) * INS2MPH_SCALE )
#define MPH2INS(x) ( (x) * (1/INS2MPH_SCALE) )
class CBaseAnimating;
class CFourWheelServerVehicle;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CFourWheelVehiclePhysics
{
public:
DECLARE_DATADESC();
CFourWheelVehiclePhysics( CBaseAnimating *pOuter );
~CFourWheelVehiclePhysics ();
// Call Precache + Spawn from the containing entity's Precache + Spawn methods
void Spawn();
void SetOuter( CBaseAnimating *pOuter, CFourWheelServerVehicle *pServerVehicle );
// Initializes the vehicle physics so we can drive it
bool Initialize( const char *pScriptName, unsigned int nVehicleType );
void Teleport( matrix3x4_t& relativeTransform );
bool VPhysicsUpdate( IPhysicsObject *pPhysics );
bool Think();
void PlaceWheelDust( int wheelIndex, bool ignoreSpeed = false );
void DrawDebugGeometryOverlays();
int DrawDebugTextOverlays( int nOffset );
// Updates the controls based on user input
void UpdateDriverControls( CUserCmd *cmd, float flFrameTime );
// Various steering parameters
void SetThrottle( float flThrottle );
void SetMaxThrottle( float flMaxThrottle );
void SetMaxReverseThrottle( float flMaxThrottle );
void SetSteering( float flSteering, float flSteeringRate );
void SetSteeringDegrees( float flDegrees );
void SetAction( float flAction );
void TurnOn( );
void TurnOff();
void ReleaseHandbrake();
void SetHandbrake( bool bBrake );
bool IsOn() const { return m_bIsOn; }
void ResetControls();
void SetBoost( float flBoost );
bool UpdateBooster( void );
void SetHasBrakePedal( bool bHasBrakePedal );
// Engine
void SetDisableEngine( bool bDisable );
bool IsEngineDisabled( void ) { return m_pVehicle->IsEngineDisabled(); }
// Enable/Disable Motion
void EnableMotion( void );
void DisableMotion( void );
// Shared code to compute the vehicle view position
void GetVehicleViewPosition( const char *pViewAttachment, float flPitchFactor, Vector *pAbsPosition, QAngle *pAbsAngles );
IPhysicsObject *GetWheel( int iWheel ) { return m_pWheels[iWheel]; }
int GetSpeed() const;
int GetMaxSpeed() const;
int GetRPM() const;
float GetThrottle() const;
bool HasBoost() const;
int BoostTimeLeft() const;
bool IsBoosting( void );
float GetHLSpeed() const;
float GetSteering() const;
float GetSteeringDegrees() const;
IPhysicsVehicleController* GetVehicle(void) { return m_pVehicle; }
float GetWheelBaseHeight(int wheelIndex) { return m_wheelBaseHeight[wheelIndex]; }
float GetWheelTotalHeight(int wheelIndex) { return m_wheelTotalHeight[wheelIndex]; }
IPhysicsVehicleController *GetVehicleController() { return m_pVehicle; }
const vehicleparams_t &GetVehicleParams( void ) { return m_pVehicle->GetVehicleParams(); }
const vehicle_controlparams_t &GetVehicleControls( void ) { return m_controls; }
const vehicle_operatingparams_t &GetVehicleOperatingParams( void ) { return m_pVehicle->GetOperatingParams(); }
int VPhysicsGetObjectList( IPhysicsObject **pList, int listMax );
private:
// engine sounds
void CalcWheelData( vehicleparams_t &vehicle );
void SteeringRest( float carSpeed, const vehicleparams_t &vehicleData );
void SteeringTurn( float carSpeed, const vehicleparams_t &vehicleData, bool bTurnLeft, bool bBrake, bool bThrottle );
void SteeringTurnAnalog( float carSpeed, const vehicleparams_t &vehicleData, float sidemove );
// A couple wrapper methods to perform common operations
int LookupPoseParameter( const char *szName );
float GetPoseParameter( int iParameter );
float SetPoseParameter( int iParameter, float flValue );
bool GetAttachment ( const char *szName, Vector &origin, QAngle &angles );
void InitializePoseParameters();
bool ParseVehicleScript( const char *pScriptName, solid_t &solid, vehicleparams_t &vehicle );
private:
// This is the entity that contains this class
CHandle<CBaseAnimating> m_pOuter;
CFourWheelServerVehicle *m_pOuterServerVehicle;
vehicle_controlparams_t m_controls;
IPhysicsVehicleController *m_pVehicle;
// Vehicle state info
int m_nSpeed;
int m_nLastSpeed;
int m_nRPM;
float m_fLastBoost;
int m_nBoostTimeLeft;
int m_nHasBoost;
float m_maxThrottle;
float m_flMaxRevThrottle;
float m_flMaxSpeed;
float m_actionSpeed;
IPhysicsObject *m_pWheels[4];
int m_wheelCount;
Vector m_wheelPosition[4];
QAngle m_wheelRotation[4];
float m_wheelBaseHeight[4];
float m_wheelTotalHeight[4];
int m_poseParameters[12];
float m_actionValue;
float m_actionScale;
float m_debugRadius;
float m_throttleRate;
float m_throttleStartTime;
float m_throttleActiveTime;
float m_turboTimer;
float m_flVehicleVolume; // NPC driven vehicles used louder sounds
bool m_bIsOn;
bool m_bLastThrottle;
bool m_bLastBoost;
bool m_bLastSkid;
};
//-----------------------------------------------------------------------------
// Physics state..
//-----------------------------------------------------------------------------
inline int CFourWheelVehiclePhysics::GetSpeed() const
{
return m_nSpeed;
}
inline int CFourWheelVehiclePhysics::GetMaxSpeed() const
{
return INS2MPH(m_pVehicle->GetVehicleParams().engine.maxSpeed);
}
inline int CFourWheelVehiclePhysics::GetRPM() const
{
return m_nRPM;
}
inline float CFourWheelVehiclePhysics::GetThrottle() const
{
return m_controls.throttle;
}
inline bool CFourWheelVehiclePhysics::HasBoost() const
{
return m_nHasBoost != 0;
}
inline int CFourWheelVehiclePhysics::BoostTimeLeft() const
{
return m_nBoostTimeLeft;
}
inline void CFourWheelVehiclePhysics::SetOuter( CBaseAnimating *pOuter, CFourWheelServerVehicle *pServerVehicle )
{
m_pOuter = pOuter;
m_pOuterServerVehicle = pServerVehicle;
}
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
#endif // FOUR_WHEEL_VEHICLE_PHYSICS_H