This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

296 lines
9.3 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//===========================================================================//
#if !defined(INPUT_H)
#define INPUT_H
#ifdef _WIN32
#pragma once
#endif
#include "ehandle.h"
#include "iinput.h"
#include "inputsystem/AnalogCode.h"
#include "kbutton.h"
#include "mathlib/vector.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) const { return fVal; }
virtual float CAM_CapPitch(float fVal) const { 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
protected:
// 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);
virtual void ApplyMouse(QAngle &viewangles, CUserCmd *cmd, float mouse_x,
float mouse_y);
virtual 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