summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/Pad.cpp56
-rw-r--r--src/core/Pad.h4
-rw-r--r--src/core/config.h1
3 files changed, 60 insertions, 1 deletions
diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp
index 51102c7b..9a911aa4 100644
--- a/src/core/Pad.cpp
+++ b/src/core/Pad.cpp
@@ -5,6 +5,10 @@
#pragma warning( pop )
#include "common.h"
+#ifdef XINPUT
+#include <Xinput.h>
+#pragma comment( lib, "Xinput.lib" )
+#endif
#include "patcher.h"
#include "Pad.h"
#include "ControllerConfig.h"
@@ -547,12 +551,60 @@ void CPad::AddToPCCheatString(char c)
#undef _CHEATCMP
}
+#ifdef XINPUT
+void CPad::AffectFromXinput(uint32 pad)
+{
+ XINPUT_STATE xstate;
+ memset(&xstate, 0, sizeof(XINPUT_STATE));
+ if (XInputGetState(pad, &xstate) == ERROR_SUCCESS)
+ {
+ PCTempJoyState.Circle = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 255 : 0;
+ PCTempJoyState.Cross = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 255 : 0;
+ PCTempJoyState.Square = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 255 : 0;
+ PCTempJoyState.Triangle = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 255 : 0;
+ PCTempJoyState.DPadDown = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? 255 : 0;
+ PCTempJoyState.DPadLeft = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) ? 255 : 0;
+ PCTempJoyState.DPadRight = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) ? 255 : 0;
+ PCTempJoyState.DPadUp = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? 255 : 0;
+ PCTempJoyState.LeftShock = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 255 : 0;
+ PCTempJoyState.LeftShoulder1 = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 255 : 0;
+ PCTempJoyState.LeftShoulder2 = xstate.Gamepad.bLeftTrigger;
+ PCTempJoyState.RightShock = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 255 : 0;
+ PCTempJoyState.RightShoulder1 = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 255 : 0;
+ PCTempJoyState.RightShoulder2 = xstate.Gamepad.bRightTrigger;
+
+ PCTempJoyState.Select = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 255 : 0;
+ PCTempJoyState.Start = (xstate.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 255 : 0;
+
+ float lx = (float)xstate.Gamepad.sThumbLX / (float)0x7FFF;
+ float ly = (float)xstate.Gamepad.sThumbLY / (float)0x7FFF;
+ float rx = (float)xstate.Gamepad.sThumbRX / (float)0x7FFF;
+ float ry = (float)xstate.Gamepad.sThumbRY / (float)0x7FFF;
+
+ if (Abs(lx) > 0.3f || Abs(ly) > 0.3f) {
+ PCTempJoyState.LeftStickX = (int32)(lx * 128.0f);
+ PCTempJoyState.LeftStickY = (int32)(-ly * 128.0f);
+ }
+
+ if (Abs(rx) > 0.3f || Abs(ry) > 0.3f) {
+ PCTempJoyState.RightStickX = (int32)(rx * 128.0f);
+ PCTempJoyState.RightStickY = (int32)(ry * 128.0f);
+ }
+ }
+}
+#endif
+
void CPad::UpdatePads(void)
{
bool bUpdate = true;
GetPad(0)->UpdateMouse();
+#ifdef XINPUT
+ GetPad(0)->AffectFromXinput(0);
+ GetPad(1)->AffectFromXinput(1);
+#else
CapturePad(0);
+#endif
ControlsManager.ClearSimButtonPressCheckers();
@@ -566,9 +618,11 @@ void CPad::UpdatePads(void)
{
GetPad(0)->Update(0);
}
-
+
+#if defined(MASTER) && !defined(XINPUT)
GetPad(1)->NewState.Clear();
GetPad(1)->OldState.Clear();
+#endif
OldKeyState = NewKeyState;
NewKeyState = TempKeyState;
diff --git a/src/core/Pad.h b/src/core/Pad.h
index fec21df3..6cabdf54 100644
--- a/src/core/Pad.h
+++ b/src/core/Pad.h
@@ -247,6 +247,10 @@ public:
static char *EditString(char *pStr, int32 nSize);
static int32 *EditCodesForControls(int32 *pRsKeys, int32 nSize);
+#ifdef XINPUT
+ void AffectFromXinput(uint32 pad);
+#endif
+
// mouse
bool GetLeftMouseJustDown() { return !!(NewMouseControllerState.LMB && !OldMouseControllerState.LMB); }
bool GetRightMouseJustDown() { return !!(NewMouseControllerState.RMB && !OldMouseControllerState.RMB); }
diff --git a/src/core/config.h b/src/core/config.h
index 8b7b5a18..ba00992a 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -174,6 +174,7 @@ enum Config {
#define TOGGLEABLE_BETA_FEATURES // toggleable from debug menu. not too many things
// Pad
+#define XINPUT
#define KANGAROO_CHEAT
#define REGISTER_START_BUTTON // currently only in menu sadly. resumes the game