416 lines
13 KiB
C++
416 lines
13 KiB
C++
//===== Copyright 1996-2005, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//===========================================================================//
|
|
|
|
#if !defined( INPUT_H )
|
|
#define INPUT_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "iinput.h"
|
|
#include "mathlib/vector.h"
|
|
#include "kbutton.h"
|
|
#include "ehandle.h"
|
|
#include "inputsystem/AnalogCode.h"
|
|
#include "shareddefs.h"
|
|
|
|
typedef uint32 CRC32_t;
|
|
|
|
// TrackIR
|
|
extern QAngle g_angleCenter;
|
|
// TrackIR
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
class CKeyboardKey
|
|
{
|
|
public:
|
|
// Name for key
|
|
char name[ 32 ];
|
|
// Pointer to the underlying structure
|
|
kbutton_t *pkey;
|
|
// Next key in key list.
|
|
CKeyboardKey *next;
|
|
};
|
|
|
|
class ConVar;
|
|
|
|
class CVerifiedUserCmd
|
|
{
|
|
public:
|
|
CUserCmd m_cmd;
|
|
CRC32_t m_crc;
|
|
};
|
|
|
|
class CInput : public ::IInput
|
|
{
|
|
// Interface
|
|
public:
|
|
CInput( void );
|
|
~CInput( void );
|
|
void InitMouse( void );
|
|
virtual void Init_All( void );
|
|
virtual void Shutdown_All( void );
|
|
virtual int GetButtonBits( bool bResetState );
|
|
virtual void CreateMove ( int sequence_number, float input_sample_frametime, bool active );
|
|
virtual void ExtraMouseSample( float frametime, bool active );
|
|
virtual bool WriteUsercmdDeltaToBuffer( int nSlot, bf_write *buf, int from, int to, bool isnewcommand );
|
|
virtual void EncodeUserCmdToBuffer( int nSlot, bf_write& buf, int slot );
|
|
virtual void DecodeUserCmdFromBuffer( int nSlot, bf_read& buf, int slot );
|
|
|
|
virtual CUserCmd *GetUserCmd( int nSlot, int sequence_number );
|
|
|
|
virtual void MakeWeaponSelection( C_BaseCombatWeapon *weapon );
|
|
|
|
virtual float KeyState( kbutton_t *key );
|
|
virtual int KeyEvent( int down, ButtonCode_t keynum, const char *pszCurrentBinding );
|
|
virtual kbutton_t *FindKey( const char *name );
|
|
|
|
virtual void ControllerCommands( void );
|
|
virtual void Joystick_Advanced( bool bSilent );
|
|
virtual void Joystick_SetSampleTime(float frametime);
|
|
virtual float Joystick_GetPitch( void );
|
|
virtual float Joystick_GetYaw( void );
|
|
virtual void Joystick_Querry( float &forward, float &side, float &pitch, float &yaw );
|
|
virtual void Joystick_ForceRecentering( int nStick, bool bSet = true );
|
|
virtual void IN_SetSampleTime( float frametime );
|
|
|
|
virtual void AccumulateMouse( int nSlot );
|
|
virtual void ActivateMouse( void );
|
|
virtual void DeactivateMouse( void );
|
|
virtual void ClearStates( void );
|
|
virtual float GetLookSpring( void );
|
|
|
|
virtual void GetFullscreenMousePos( int *mx, int *my, int *unclampedx = NULL, int *unclampedy = NULL );
|
|
virtual void SetFullscreenMousePos( int mx, int my );
|
|
virtual void ResetMouse( void );
|
|
|
|
// virtual bool IsNoClipping( void );
|
|
virtual float GetLastForwardMove( void );
|
|
virtual void ClearInputButton( int bits );
|
|
|
|
virtual void CAM_Think( void );
|
|
virtual int CAM_IsThirdPerson( int nSlot = -1 );
|
|
virtual bool CAM_IsThirdPersonOverview( int nSlot = -1 );
|
|
virtual void CAM_GetCameraOffset( Vector& ofs );
|
|
virtual void CAM_ToThirdPerson(void);
|
|
virtual void CAM_ToFirstPerson(void);
|
|
virtual void CAM_ToThirdPersonShoulder(void);
|
|
virtual void CAM_ToThirdPersonOverview(void);
|
|
virtual void CAM_StartMouseMove(void);
|
|
virtual void CAM_EndMouseMove(void);
|
|
virtual void CAM_StartDistance(void);
|
|
virtual void CAM_EndDistance(void);
|
|
virtual int CAM_InterceptingMouse( void );
|
|
virtual void CAM_Command( int command );
|
|
|
|
// orthographic camera info
|
|
virtual void CAM_ToOrthographic();
|
|
virtual bool CAM_IsOrthographic() const;
|
|
virtual void CAM_OrthographicSize( float& w, float& h ) const;
|
|
|
|
#if defined( HL2_CLIENT_DLL )
|
|
// IK back channel info
|
|
virtual void AddIKGroundContactInfo( int entindex, float minheight, float maxheight );
|
|
#endif
|
|
virtual void LevelInit( void );
|
|
|
|
virtual void CAM_SetCameraThirdData( CameraThirdData_t *pCameraData, const QAngle &vecCameraOffset );
|
|
virtual void CAM_CameraThirdThink( void );
|
|
|
|
virtual void CheckPaused( CUserCmd *cmd );
|
|
virtual void CheckSplitScreenMimic( int nSlot, CUserCmd *cmd, CUserCmd *pPlayer0Command );
|
|
|
|
// Private Implementation
|
|
protected:
|
|
// Implementation specific initialization
|
|
virtual void Init_Camera( void );
|
|
void Init_Keyboard( void );
|
|
void Init_Mouse( void );
|
|
void Shutdown_Keyboard( void );
|
|
// Add a named key to the list queryable by the engine
|
|
void AddKeyButton( const char *name, kbutton_t *pkb );
|
|
// Mouse/keyboard movement input helpers
|
|
void ScaleMovements( CUserCmd *cmd );
|
|
void ComputeForwardMove( int nSlot, CUserCmd *cmd );
|
|
void ComputeUpwardMove( int nSlot, CUserCmd *cmd );
|
|
void ComputeSideMove( int nSlot, CUserCmd *cmd );
|
|
void AdjustAngles ( int nSlot, float frametime );
|
|
void ClampAngles( QAngle& viewangles );
|
|
void AdjustPitch( int nSlot, float speed, QAngle& viewangles );
|
|
void AdjustYaw( int nSlot, float speed, QAngle& viewangles );
|
|
float DetermineKeySpeed( int nSlot, float frametime );
|
|
void GetAccumulatedMouseDeltasAndResetAccumulators( int nSlot, float *mx, float *my );
|
|
void GetMouseDelta( int nSlot, float inmousex, float inmousey, float *pOutMouseX, float *pOutMouseY );
|
|
void ScaleMouse( int nSlot, float *x, float *y );
|
|
virtual void ApplyMouse( int nSlot, QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y );
|
|
void MouseMove ( int nSlot, CUserCmd *cmd );
|
|
void MotionControllerMove( float frametime, CUserCmd *cmd );
|
|
float HandleMotionControllerInputSmoothing( float flDeadZonePct, float val );
|
|
|
|
// Joystick movement input helpers
|
|
void ControllerMove( int nSlot, float frametime, CUserCmd *cmd );
|
|
float ScaleAxisValue( const float axisValue, const float axisThreshold );
|
|
virtual void JoyStickMove( float frametime, CUserCmd *cmd );
|
|
virtual void SteamControllerMove( float frametime, CUserCmd *cmd );
|
|
|
|
virtual bool ControllerModeActive( void );
|
|
virtual bool JoyStickActive();
|
|
virtual void JoyStickSampleAxes( float &forward, float &side, float &pitch, float &yaw, bool &bAbsoluteYaw, bool &bAbsolutePitch );
|
|
virtual void JoyStickThirdPersonPlatformer( CUserCmd *cmd, float &forward, float &side, float &pitch, float &yaw );
|
|
virtual void JoyStickTurn( CUserCmd *cmd, float &yaw, float &pitch, float frametime, bool bAbsoluteYaw, bool bAbsolutePitch );
|
|
virtual void JoyStickForwardSideControl( float forward, float side, float &joyForwardMove, float &joySideMove );
|
|
virtual void JoyStickApplyMovement( CUserCmd *cmd, float joyForwardMove, float joySideMove );
|
|
float ResponseCurveLookDefault( int nSlot, float x, int axis, float otherAxis, float dist, float frametime );
|
|
float ResponseCurveLook( int nSlot, int curve, float x, int axis, float otherAxis, float dist, float frametime );
|
|
float ResponseCurveLookAccelerated( int nSlot, float x, int axis, float otherAxis, float dist, float frametime );
|
|
float ResponseCurveLookPolynomial( int nSlot, float x, int axis, float otherAxis, float dist, float frametime );
|
|
|
|
float AutoAimDampening( float x, int axis, float dist );
|
|
float UpdateAndGetQuickTurnYaw( int nSlot, float lookFrametime, float angle );
|
|
|
|
// Call this to get the cursor position. The call will be logged in the VCR file if there is one.
|
|
void GetMousePos(int &x, int &y);
|
|
void SetMousePos(int x, int y);
|
|
virtual void GetWindowCenter( int&x, int& y );
|
|
// Called once per frame to allow convar overrides to acceleration settings when mouse is active
|
|
void CheckMouseAcclerationVars();
|
|
|
|
void ValidateUserCmd( CUserCmd *usercmd, int sequence_number );
|
|
|
|
// TrackIR
|
|
void TrackIRMove ( float frametime, CUserCmd *cmd );
|
|
void Init_TrackIR( void );
|
|
void Shutdown_TrackIR( void );
|
|
|
|
bool m_fTrackIRAvailable;
|
|
// TrackIR
|
|
|
|
// SteamController
|
|
void ApplySteamControllerCameraMove( QAngle& viewangles, CUserCmd *cmd, Vector2D vecPosition );
|
|
|
|
protected:
|
|
typedef struct
|
|
{
|
|
unsigned int AxisFlags;
|
|
unsigned int AxisMap;
|
|
unsigned int ControlMap;
|
|
} joy_axis_t;
|
|
|
|
void DescribeJoystickAxis( int nJoystick, char const *axis, joy_axis_t *mapping );
|
|
char const *DescribeAxis( int index );
|
|
|
|
enum
|
|
{
|
|
GAME_AXIS_NONE = 0,
|
|
GAME_AXIS_FORWARD,
|
|
GAME_AXIS_PITCH,
|
|
GAME_AXIS_SIDE,
|
|
GAME_AXIS_YAW,
|
|
MAX_GAME_AXES
|
|
};
|
|
|
|
enum
|
|
{
|
|
CAM_COMMAND_NONE = 0,
|
|
CAM_COMMAND_TOTHIRDPERSON = 1,
|
|
CAM_COMMAND_TOFIRSTPERSON = 2
|
|
};
|
|
|
|
enum
|
|
{
|
|
MOUSE_ACCEL_THRESHHOLD1 = 0, // if mouse moves > this many mickey's double it
|
|
MOUSE_ACCEL_THRESHHOLD2, // if mouse moves > this many mickey's double it a second time
|
|
MOUSE_SPEED_FACTOR, // 0 = disabled, 1 = threshold 1 enabled, 2 = threshold 2 enabled
|
|
|
|
NUM_MOUSE_PARAMS,
|
|
};
|
|
|
|
// Has the mouse been initialized?
|
|
bool m_fMouseInitialized;
|
|
// Is the mosue active?
|
|
bool m_fMouseActive;
|
|
// Has the joystick advanced initialization been run?
|
|
bool m_fJoystickAdvancedInit;
|
|
// Between controller and mouse, what's the primary input
|
|
bool m_bControllerMode;
|
|
float m_fAccumulatedMouseMove;
|
|
float m_lastAutoAimValue;
|
|
|
|
// Accumulated mouse deltas
|
|
|
|
struct PerUserInput_t
|
|
{
|
|
PerUserInput_t()
|
|
{
|
|
m_flAccumulatedMouseXMovement = 0;
|
|
m_flAccumulatedMouseYMovement = 0;
|
|
m_flPreviousMouseXPosition = 0;
|
|
m_flPreviousMouseYPosition = 0;
|
|
m_flRemainingJoystickSampleTime = 0;
|
|
m_flKeyboardSampleTime = 0;
|
|
|
|
m_flSpinFrameTime = 0;
|
|
m_flSpinRate = 0;
|
|
m_flLastYawAngle = 0;
|
|
|
|
// Is the 3rd person camera using the mouse?
|
|
m_fCameraInterceptingMouse = 0;
|
|
// Are we in 3rd person view?
|
|
m_fCameraInThirdPerson = 0;
|
|
// Should we move view along with mouse?
|
|
m_fCameraMovingWithMouse = 0;
|
|
// What is the current camera offset from the view origin?
|
|
m_vecCameraOffset.Init();
|
|
// Is the camera in distance moving mode?
|
|
m_fCameraDistanceMove = 0;
|
|
// Old and current mouse position readings.
|
|
m_nCameraOldX = 0;
|
|
m_nCameraOldY = 0;
|
|
m_nCameraX = 0;
|
|
m_nCameraY = 0;
|
|
|
|
// orthographic camera settings
|
|
m_CameraIsOrthographic = 0;
|
|
|
|
m_CameraIsThirdPersonOverview = 0;
|
|
|
|
m_angPreviousViewAngles.Init();
|
|
m_angPreviousViewAnglesTilt.Init();
|
|
|
|
m_flLastForwardMove = 0;
|
|
|
|
m_pCommands = 0;
|
|
m_pVerifiedCommands = NULL;
|
|
|
|
m_nClearInputState = 0;
|
|
m_pCameraThirdData = NULL;
|
|
m_nCamCommand = 0;
|
|
|
|
m_flPreviousJoystickForwardMove = 0;
|
|
m_flPreviousJoystickSideMove = 0;
|
|
m_flPreviousJoystickYaw = 0;
|
|
m_flPreviousJoystickPitch = 0;
|
|
m_bPreviousJoystickUseAbsoluteYaw = 0;
|
|
m_bPreviousJoystickUseAbsolutePitch = 0;
|
|
m_bForceJoystickRecentering[ 0 ] = false;
|
|
m_bForceJoystickRecentering[ 1 ] = false;
|
|
}
|
|
|
|
float m_flAccumulatedMouseXMovement;
|
|
float m_flAccumulatedMouseYMovement;
|
|
float m_flPreviousMouseXPosition;
|
|
float m_flPreviousMouseYPosition;
|
|
float m_flRemainingJoystickSampleTime;
|
|
float m_flKeyboardSampleTime;
|
|
|
|
float m_flSpinFrameTime;
|
|
float m_flSpinRate;
|
|
float m_flLastYawAngle;
|
|
|
|
// Joystick Axis data
|
|
joy_axis_t m_rgAxes[ MAX_JOYSTICK_AXES ];
|
|
|
|
// Is the 3rd person camera using the mouse?
|
|
bool m_fCameraInterceptingMouse;
|
|
// Are we in 3rd person view?
|
|
bool m_fCameraInThirdPerson;
|
|
// Should we move view along with mouse?
|
|
bool m_fCameraMovingWithMouse;
|
|
// What is the current camera offset from the view origin?
|
|
Vector m_vecCameraOffset;
|
|
// Is the camera in distance moving mode?
|
|
bool m_fCameraDistanceMove;
|
|
// Old and current mouse position readings.
|
|
int m_nCameraOldX;
|
|
int m_nCameraOldY;
|
|
int m_nCameraX;
|
|
int m_nCameraY;
|
|
|
|
// orthographic camera settings
|
|
bool m_CameraIsOrthographic;
|
|
|
|
// orthographic camera settings
|
|
bool m_CameraIsThirdPersonOverview;
|
|
|
|
QAngle m_angPreviousViewAngles;
|
|
QAngle m_angPreviousViewAnglesTilt;
|
|
|
|
float m_flLastForwardMove;
|
|
|
|
int m_nClearInputState;
|
|
|
|
CUserCmd *m_pCommands;
|
|
CVerifiedUserCmd *m_pVerifiedCommands;
|
|
|
|
// Set until polled by CreateMove and cleared
|
|
CHandle< C_BaseCombatWeapon > m_hSelectedWeapon;
|
|
|
|
#if defined( HL2_CLIENT_DLL )
|
|
CUtlVector< CEntityGroundContact > m_EntityGroundContact;
|
|
#endif
|
|
|
|
CameraThirdData_t *m_pCameraThirdData;
|
|
int m_nCamCommand;
|
|
|
|
// Cached movement from the previous sample
|
|
// Note: To be used when we run out of sample time,
|
|
// instead of leaving zeros in CUserCmd's.
|
|
float m_flPreviousJoystickForwardMove;
|
|
float m_flPreviousJoystickSideMove;
|
|
float m_flPreviousJoystickYaw;
|
|
float m_flPreviousJoystickPitch;
|
|
bool m_bPreviousJoystickUseAbsoluteYaw;
|
|
bool m_bPreviousJoystickUseAbsolutePitch;
|
|
bool m_bForceJoystickRecentering[ 2 ];
|
|
};
|
|
|
|
PerUserInput_t &GetPerUser( int nSlot = -1 );
|
|
const PerUserInput_t &GetPerUser( int nSlot = -1 ) const;
|
|
|
|
// Flag to restore systemparameters when exiting
|
|
bool m_fRestoreSPI;
|
|
// Original mouse parameters
|
|
int m_rgOrigMouseParms[ NUM_MOUSE_PARAMS ];
|
|
// Current mouse parameters.
|
|
int m_rgNewMouseParms[ NUM_MOUSE_PARAMS ];
|
|
bool m_rgCheckMouseParam[ NUM_MOUSE_PARAMS ];
|
|
// Are the parameters valid
|
|
bool m_fMouseParmsValid;
|
|
// List of queryable keys
|
|
CKeyboardKey *m_pKeys;
|
|
|
|
PerUserInput_t m_PerUser[ MAX_SPLITSCREEN_PLAYERS ];
|
|
|
|
InputContextHandle_t m_hInputContext;
|
|
CThreadFastMutex m_IKContactPointMutex;
|
|
};
|
|
|
|
extern kbutton_t in_strafe;
|
|
extern kbutton_t in_speed;
|
|
extern kbutton_t in_zoom;
|
|
extern kbutton_t in_jlook;
|
|
extern kbutton_t in_graph;
|
|
extern kbutton_t in_moveleft;
|
|
extern kbutton_t in_moveright;
|
|
extern kbutton_t in_forward;
|
|
extern kbutton_t in_back;
|
|
extern kbutton_t in_joyspeed;
|
|
extern kbutton_t in_lookspin;
|
|
|
|
extern class ConVar in_joystick;
|
|
extern class ConVar joy_autosprint;
|
|
|
|
extern void KeyDown( kbutton_t *b, const char *c );
|
|
extern void KeyUp( kbutton_t *b, const char *c );
|
|
|
|
|
|
#endif // INPUT_H
|
|
|