2019-02-13 14:10:36 -05:00
|
|
|
#include "stdafx.h"
|
|
|
|
#include "XInputManager.h"
|
|
|
|
#include "../Core/Console.h"
|
2019-10-19 16:13:11 -04:00
|
|
|
#include "../Core/EmuSettings.h"
|
2019-02-13 14:10:36 -05:00
|
|
|
|
|
|
|
XInputManager::XInputManager(shared_ptr<Console> console)
|
|
|
|
{
|
|
|
|
_console = console;
|
2020-12-19 23:33:11 +03:00
|
|
|
for (int i = 0; i < XUSER_MAX_COUNT; i++)
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
_gamePadStates.push_back(shared_ptr<XINPUT_STATE>(new XINPUT_STATE()));
|
|
|
|
_gamePadConnected.push_back(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void XInputManager::RefreshState()
|
|
|
|
{
|
|
|
|
XINPUT_STATE state;
|
2020-12-19 23:33:11 +03:00
|
|
|
for (DWORD i = 0; i < XUSER_MAX_COUNT; i++)
|
|
|
|
{
|
|
|
|
if (_gamePadConnected[i])
|
|
|
|
{
|
|
|
|
if (XInputGetState(i, &state) != ERROR_SUCCESS)
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
//XInputGetState is incredibly slow when no controller is plugged in
|
|
|
|
ZeroMemory(_gamePadStates[i].get(), sizeof(XINPUT_STATE));
|
|
|
|
_gamePadConnected[i] = false;
|
2020-12-19 23:33:11 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
*_gamePadStates[i] = state;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool XInputManager::NeedToUpdate()
|
|
|
|
{
|
2020-12-19 23:33:11 +03:00
|
|
|
for (int i = 0; i < XUSER_MAX_COUNT; i++)
|
|
|
|
{
|
|
|
|
if (!_gamePadConnected[i])
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
XINPUT_STATE state;
|
2020-12-19 23:33:11 +03:00
|
|
|
if (XInputGetState(i, &state) == ERROR_SUCCESS)
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void XInputManager::UpdateDeviceList()
|
|
|
|
{
|
|
|
|
//Periodically detect if a controller has been plugged in to allow controllers to be plugged in after the emu is started
|
2020-12-19 23:33:11 +03:00
|
|
|
for (int i = 0; i < XUSER_MAX_COUNT; i++)
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
_gamePadConnected[i] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool XInputManager::IsPressed(uint8_t gamepadPort, uint8_t button)
|
|
|
|
{
|
2020-12-19 23:33:11 +03:00
|
|
|
if (_gamePadConnected[gamepadPort])
|
|
|
|
{
|
|
|
|
XINPUT_GAMEPAD& gamepad = _gamePadStates[gamepadPort]->Gamepad;
|
|
|
|
if (button <= 16)
|
|
|
|
{
|
2019-02-13 14:10:36 -05:00
|
|
|
WORD xinputButton = 1 << (button - 1);
|
|
|
|
return (_gamePadStates[gamepadPort]->Gamepad.wButtons & xinputButton) != 0;
|
2020-12-19 23:33:11 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-10-19 16:13:11 -04:00
|
|
|
double ratio = _console->GetSettings()->GetControllerDeadzoneRatio() * 2;
|
2019-02-13 14:10:36 -05:00
|
|
|
|
2020-12-19 23:33:11 +03:00
|
|
|
switch (button)
|
|
|
|
{
|
|
|
|
case 17: return gamepad.bLeftTrigger > (XINPUT_GAMEPAD_TRIGGER_THRESHOLD * ratio);
|
|
|
|
case 18: return gamepad.bRightTrigger > (XINPUT_GAMEPAD_TRIGGER_THRESHOLD * ratio);
|
|
|
|
case 19: return gamepad.sThumbRY > (XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE * ratio);
|
|
|
|
case 20: return gamepad.sThumbRY < -(XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE * ratio);
|
|
|
|
case 21: return gamepad.sThumbRX < -(XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE * ratio);
|
|
|
|
case 22: return gamepad.sThumbRX > (XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE * ratio);
|
|
|
|
case 23: return gamepad.sThumbLY > (XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE * ratio);
|
|
|
|
case 24: return gamepad.sThumbLY < -(XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE * ratio);
|
|
|
|
case 25: return gamepad.sThumbLX < -(XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE * ratio);
|
|
|
|
case 26: return gamepad.sThumbLX > (XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE * ratio);
|
2019-02-13 14:10:36 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|