source-engine/game/client/input.h
2022-03-01 23:00:42 +03:00

290 lines
8.6 KiB
C++

//========= Copyright 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"
typedef unsigned int CRC32_t;
//-----------------------------------------------------------------------------
// 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 CInput : public IInput
{
// Interface
public:
CInput( void );
~CInput( void );
virtual void Init_All( void );
virtual void Shutdown_All( void );
virtual int GetButtonBits( int );
virtual void CreateMove ( int sequence_number, float input_sample_frametime, bool active );
virtual void ExtraMouseSample( float frametime, bool active );
virtual bool WriteUsercmdDeltaToBuffer( bf_write *buf, int from, int to, bool isnewcommand );
virtual void EncodeUserCmdToBuffer( bf_write& buf, int slot );
virtual void DecodeUserCmdFromBuffer( bf_read& buf, int slot );
virtual CUserCmd *GetUserCmd( 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( void );
virtual void Joystick_SetSampleTime(float frametime);
virtual void IN_SetSampleTime( float frametime );
virtual void AccumulateMouse( void );
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 float Joystick_GetForward( void );
virtual float Joystick_GetSide( void );
virtual float Joystick_GetPitch( void );
virtual float Joystick_GetYaw( void );
virtual void ClearInputButton( int bits );
virtual void CAM_Think( void );
virtual int CAM_IsThirdPerson( void );
virtual void CAM_ToThirdPerson(void);
virtual void CAM_ToFirstPerson(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 );
// orthographic camera info
virtual void CAM_ToOrthographic();
virtual bool CAM_IsOrthographic() const;
virtual void CAM_OrthographicSize( float& w, float& h ) const;
virtual float CAM_CapYaw( float fVal ) { return fVal; }
#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 bool EnableJoystickMode();
// Private Implementation
private:
// Implementation specific initialization
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( CUserCmd *cmd );
void ComputeUpwardMove( CUserCmd *cmd );
void ComputeSideMove( CUserCmd *cmd );
void AdjustAngles ( float frametime );
void ClampAngles( QAngle& viewangles );
void AdjustPitch( float speed, QAngle& viewangles );
virtual void AdjustYaw( float speed, QAngle& viewangles );
float DetermineKeySpeed( float frametime );
void GetAccumulatedMouseDeltasAndResetAccumulators( float *mx, float *my );
void GetMouseDelta( float inmousex, float inmousey, float *pOutMouseX, float *pOutMouseY );
void ScaleMouse( float *x, float *y );
void ApplyMouse( QAngle& viewangles, CUserCmd *cmd, float mouse_x, float mouse_y );
void MouseMove ( CUserCmd *cmd );
// Joystick movement input helpers
void ControllerMove ( float frametime, CUserCmd *cmd );
void JoyStickMove ( float frametime, CUserCmd *cmd );
float ScaleAxisValue( const float axisValue, const float axisThreshold );
virtual float JoyStickAdjustYaw( float flSpeed ) { return flSpeed; }
// 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);
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 );
// Private Data
private:
typedef struct
{
unsigned int AxisFlags;
unsigned int AxisMap;
unsigned int ControlMap;
} joy_axis_t;
void DescribeJoystickAxis( 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;
// Used to support hotplugging by reinitializing the advanced joystick system when we toggle between some/none joysticks.
bool m_fHadJoysticks;
// Accumulated mouse deltas
float m_flAccumulatedMouseXMovement;
float m_flAccumulatedMouseYMovement;
float m_flPreviousMouseXPosition;
float m_flPreviousMouseYPosition;
float m_flRemainingJoystickSampleTime;
float m_flKeyboardSampleTime;
// 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;
// Joystick Axis data
joy_axis_t m_rgAxes[ MAX_JOYSTICK_AXES ];
// List of queryable keys
CKeyboardKey *m_pKeys;
// 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;
// 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;
QAngle m_angPreviousViewAngles;
float m_flLastForwardMove;
float m_flPreviousJoystickForward;
float m_flPreviousJoystickSide;
float m_flPreviousJoystickPitch;
float m_flPreviousJoystickYaw;
class CVerifiedUserCmd
{
public:
CUserCmd m_cmd;
CRC32_t m_crc;
};
CUserCmd *m_pCommands;
CVerifiedUserCmd *m_pVerifiedCommands;
CameraThirdData_t *m_pCameraThirdData;
// Set until polled by CreateMove and cleared
CHandle< C_BaseCombatWeapon > m_hSelectedWeapon;
#if defined( HL2_CLIENT_DLL )
CUtlVector< CEntityGroundContact > m_EntityGroundContact;
#endif
};
extern kbutton_t in_strafe;
extern kbutton_t in_speed;
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 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