2021-12-25 22:36:38 +01:00
|
|
|
#pragma once
|
2024-04-05 17:09:47 +02:00
|
|
|
#include "inputsystem/iinputsystem.h"
|
|
|
|
#include "mathlib/bitvec.h"
|
|
|
|
#include "tier1/utlstringmap.h"
|
|
|
|
#include <Xinput.h>
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2024-04-05 17:09:47 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Implementation of the input system
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class CInputSystem : public CTier1AppSystem< IInputSystem >
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
|
|
|
public:
|
2024-04-05 17:09:47 +02:00
|
|
|
// !!!interface implemented in engine!!!
|
2021-12-25 22:36:38 +01:00
|
|
|
|
|
|
|
private:
|
2024-04-05 17:09:47 +02:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
INPUT_STATE_QUEUED = 0,
|
|
|
|
INPUT_STATE_CURRENT,
|
|
|
|
|
|
|
|
INPUT_STATE_COUNT,
|
2023-12-24 02:58:11 +01:00
|
|
|
|
|
|
|
BUTTON_EVENT_COUNT = 128
|
2024-04-05 17:09:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct xdevice_t
|
|
|
|
{
|
|
|
|
struct xvibration_t
|
|
|
|
{
|
|
|
|
float leftMainMotor;
|
|
|
|
float rightMainMotor;
|
|
|
|
float leftTriggerMotor;
|
|
|
|
float rightTriggerMotor;
|
|
|
|
};
|
|
|
|
|
2023-12-24 02:58:11 +01:00
|
|
|
struct unkownhiddevice_t
|
|
|
|
{
|
|
|
|
struct state_t
|
|
|
|
{
|
|
|
|
SRWLOCK lock;
|
|
|
|
char unk0[56];
|
|
|
|
xvibration_t vibration;
|
|
|
|
char unk1[48];
|
|
|
|
};
|
|
|
|
|
|
|
|
// Name might be incorrect!
|
|
|
|
state_t states[INPUT_STATE_COUNT];
|
|
|
|
HANDLE hThread0;
|
|
|
|
HANDLE hthread1;
|
|
|
|
};
|
|
|
|
|
2024-04-05 17:09:47 +02:00
|
|
|
int userId;
|
|
|
|
char active;
|
|
|
|
XINPUT_STATE states[INPUT_STATE_COUNT];
|
|
|
|
int newState;
|
2023-12-24 02:58:11 +01:00
|
|
|
xKey_t lastStickKeys[MAX_JOYSTICK_AXES-2]; // -2 as U and V aren't polled.
|
|
|
|
int unk0;
|
2024-04-05 17:09:47 +02:00
|
|
|
bool pendingRumbleUpdate;
|
|
|
|
_BYTE gap41[3];
|
|
|
|
xvibration_t vibration;
|
2023-12-24 02:58:11 +01:00
|
|
|
bool isXbox360Gamepad;
|
|
|
|
bool nonXboxDevice; // uses unknownHidDevice when set
|
2024-04-05 17:09:47 +02:00
|
|
|
_BYTE gap56[42];
|
2023-12-24 02:58:11 +01:00
|
|
|
unkownhiddevice_t unknownHidDevice;
|
|
|
|
_BYTE gap190[42];
|
2024-04-05 17:09:47 +02:00
|
|
|
};
|
2023-12-24 02:58:11 +01:00
|
|
|
static_assert(sizeof(xdevice_t) == 0x1C0);
|
2024-04-05 17:09:47 +02:00
|
|
|
|
|
|
|
struct appKey_t
|
|
|
|
{
|
|
|
|
int repeats;
|
|
|
|
int sample;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct InputState_t
|
|
|
|
{
|
|
|
|
// Analog states
|
|
|
|
CBitVec<BUTTON_CODE_LAST> m_ButtonState;
|
2023-12-24 02:58:11 +01:00
|
|
|
int m_pAnalogValue[ANALOG_CODE_LAST];
|
2024-04-05 17:09:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
HWND m_ChainedWndProc;
|
|
|
|
HWND m_hAttachedHWnd;
|
|
|
|
bool m_bEnabled;
|
|
|
|
bool m_bPumpEnabled;
|
|
|
|
bool m_bIsPolling;
|
|
|
|
bool m_bIMEComposing;
|
|
|
|
bool m_bMouseCursorVisible;
|
|
|
|
bool m_bJoystickCursorVisible;
|
|
|
|
bool m_bIsInGame; // Delay joystick polling if in-game.
|
|
|
|
|
|
|
|
// Current button state
|
|
|
|
InputState_t m_InputState[INPUT_STATE_COUNT];
|
|
|
|
|
|
|
|
// Current button state mutex
|
|
|
|
CRITICAL_SECTION m_InputStateMutex;
|
|
|
|
int unknown0;
|
|
|
|
short unknown1;
|
|
|
|
bool unknown2;
|
|
|
|
|
|
|
|
// Analog event mutex
|
|
|
|
CRITICAL_SECTION m_AnalogEventMutex;
|
|
|
|
int unknown3;
|
|
|
|
short unknown4;
|
|
|
|
bool unknown5;
|
|
|
|
|
|
|
|
// Analog events
|
|
|
|
InputEvent_t m_AnalogEvents[JOYSTICK_AXIS_BUTTON_COUNT];
|
|
|
|
int m_AnalogEventTypes[JOYSTICK_AXIS_BUTTON_COUNT];
|
|
|
|
|
|
|
|
// Button events
|
2023-12-24 02:58:11 +01:00
|
|
|
InputEvent_t m_Events[BUTTON_EVENT_COUNT];
|
2023-12-24 15:15:17 +01:00
|
|
|
|
|
|
|
// Current event
|
2024-04-05 17:09:47 +02:00
|
|
|
InputEvent_t m_CurrentEvent;
|
|
|
|
|
|
|
|
DWORD m_StartupTimeTick;
|
|
|
|
int m_nLastPollTick;
|
|
|
|
int m_nLastSampleTick;
|
|
|
|
int m_nLastAnalogPollTick;
|
|
|
|
int m_nLastAnalogSampleTick;
|
|
|
|
|
|
|
|
// Mouse wheel hack
|
|
|
|
UINT m_uiMouseWheel;
|
|
|
|
|
|
|
|
// Xbox controller info
|
|
|
|
int m_nJoystickCount;
|
2023-12-24 02:58:11 +01:00
|
|
|
appKey_t m_appXKeys[XUSER_MAX_COUNT][XK_MAX_KEYS];
|
2024-04-05 17:09:47 +02:00
|
|
|
char pad_unk[16];
|
|
|
|
xdevice_t m_XDevices[XUSER_MAX_COUNT];
|
|
|
|
|
|
|
|
// Used to determine whether to generate UI events
|
|
|
|
int m_nUIEventClientCount;
|
|
|
|
|
|
|
|
// Raw mouse input
|
|
|
|
bool m_bRawInputSupported;
|
|
|
|
CRITICAL_SECTION m_MouseAccumMutex;
|
|
|
|
int m_mouseRawAccumX;
|
|
|
|
int m_mouseRawAccumY;
|
|
|
|
|
|
|
|
_BYTE gap1785[8];
|
|
|
|
|
|
|
|
// Current mouse capture window
|
|
|
|
PlatWindow_t m_hCurrentCaptureWnd;
|
|
|
|
|
|
|
|
// For the 'SleepUntilInput' feature
|
|
|
|
HANDLE m_hEvent;
|
|
|
|
|
|
|
|
InputCursorHandle_t m_pDefaultCursors[INPUT_CURSOR_COUNT];
|
|
|
|
CUtlStringMap<InputCursorHandle_t> m_UserCursors;
|
|
|
|
|
|
|
|
CSysModule* m_pXInputDLL;
|
|
|
|
CSysModule* m_pRawInputDLL;
|
|
|
|
|
|
|
|
// NVNT falcon module
|
|
|
|
CSysModule* m_pNovintDLL; // Unused in R5?
|
|
|
|
|
|
|
|
bool m_bIgnoreLocalJoystick;
|
|
|
|
InputCursorHandle_t m_hCursor;
|
2021-12-25 22:36:38 +01:00
|
|
|
};
|
2023-12-24 02:58:11 +01:00
|
|
|
static_assert(sizeof(CInputSystem) == 0x18E8);
|
2021-12-25 22:36:38 +01:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-10-20 01:17:51 +02:00
|
|
|
extern CInputSystem* g_pInputSystem;
|
|
|
|
|
2021-12-25 22:36:38 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-05-13 14:53:25 +02:00
|
|
|
class VInputSystem : public IDetour
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetAdr(void) const
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2023-01-25 02:26:52 +01:00
|
|
|
LogVarAdr("g_pInputSystem", reinterpret_cast<uintptr_t>(g_pInputSystem));
|
2021-12-25 22:36:38 +01:00
|
|
|
}
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetFun(void) const { }
|
2022-04-18 03:35:08 +02:00
|
|
|
virtual void GetVar(void) const
|
|
|
|
{
|
2022-12-01 22:44:55 +01:00
|
|
|
g_pInputSystem = g_GameDll.FindPatternSIMD("48 83 EC 28 48 8B 0D ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 85 C9 74 11")
|
|
|
|
.FindPatternSelf("48 89 05", CMemory::Direction::DOWN, 40).ResolveRelativeAddressSelf(0x3, 0x7).RCast<CInputSystem*>();
|
2022-04-18 03:35:08 +02:00
|
|
|
}
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetCon(void) const { }
|
2023-11-26 13:21:20 +01:00
|
|
|
virtual void Detour(const bool bAttach) const { }
|
2021-12-25 22:36:38 +01:00
|
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|