1#include "WindowsGamepad.h"
3#include "ViewContext.h"
5#include "Input/InputManager.h"
6#include "Input/GamepadMapping.h"
8#include "Services/Time.h"
10#define WIN32_LEAN_AND_MEAN
14#pragma comment(lib, "Xinput9_1_0.lib")
16void Cogs::Platform::GamepadHandler::initialize(Core::ViewContext* viewContext) {
19 mapping.fill(NoMapping);
23void Cogs::Platform::GamepadHandler::update()
25 Core::InputManager* inputManager = view->inputManager.get();
26 const double t = view->getContext()->time->getAnimationTime();
28 for (
int i = 0; i < XUSER_MAX_COUNT; ++i) {
29 if (mapping[i] == Disconnected && (t - checkedTime[i]) < checkInterval)
continue;
31 XINPUT_STATE xState = {};
32 auto result = XInputGetState(DWORD(i), &xState);
34 if (result != ERROR_SUCCESS) {
35 if (mapping[i] == Connected) {
36 auto & state = inputManager->getDevice((Core::InputDevices::EValues)(Core::InputDevices::Gamepad0 + i));
38 state.isConnected =
false;
41 mapping[i] = Disconnected;
42 checkedTime[i] = t + i * 0.1;
47 auto & state = inputManager->getDevice((Core::InputDevices::EValues)(Core::InputDevices::Gamepad0 + i));
49 if (mapping[i] == NoMapping) {
50 if (state.isConnected) {
57 state.axisMask = 0x000000000000003F;
58 state.buttonMask = 0x000000000000FFFF;
60 state.isConnected =
true;
62 mapping[i] = Connected;
65 for (
size_t ii = 0; ii < 16; ++ii) {
66 state.setButton(ii, (xState.Gamepad.wButtons & (1 << ii)) != 0);
69 state.setAxis(Core::Gamepad::TriggerLeft, (
float)xState.Gamepad.bLeftTrigger / 255.0f);
70 state.setAxis(Core::Gamepad::TriggerRight, (
float)xState.Gamepad.bRightTrigger / 255.0f);
74 const float positiveRange = 32768 - 1;
75 const float negativeRange = 32768;
77 state.setAxis(Core::Gamepad::StickLeftX, (
float)xState.Gamepad.sThumbLX / (xState.Gamepad.sThumbLX > 0 ? positiveRange : negativeRange));
78 state.setAxis(Core::Gamepad::StickLeftY, (
float)xState.Gamepad.sThumbLY / (xState.Gamepad.sThumbLY > 0 ? positiveRange : negativeRange));
79 state.setAxis(Core::Gamepad::StickRightX, (
float)xState.Gamepad.sThumbRX / (xState.Gamepad.sThumbRX > 0 ? positiveRange : negativeRange));
80 state.setAxis(Core::Gamepad::StickRightY, (
float)xState.Gamepad.sThumbRY / (xState.Gamepad.sThumbRY > 0 ? positiveRange : negativeRange));