From 9aaf4e5e081ccdcee61f40397d5c14c11371ce62 Mon Sep 17 00:00:00 2001 From: The Dax Date: Sat, 6 Jul 2013 21:29:30 -0400 Subject: [PATCH] Add RightStickBind support. It's still not 100% bug free... --- Windows/DinputDevice.cpp | 370 ++++++++++++++++++++++++++++----------- Windows/DinputDevice.h | 1 - 2 files changed, 269 insertions(+), 102 deletions(-) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 01ed5e9925..5a4bf4d65a 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -53,6 +53,8 @@ static const struct {int from, to;} dinput_ctrl_map[] = { {POV_CODE_RIGHT, KEYCODE_DPAD_RIGHT}, }; + + struct Stick { float x; float y; @@ -142,7 +144,6 @@ DinputDevice::DinputDevice() dipw.dwData = 1000; analog |= FAILED(pJoystick->SetProperty(DIPROP_DEADZONE, &dipw.diph))?false:true; - ZeroMemory(&this->prevState, sizeof(prevState)); } DinputDevice::~DinputDevice() @@ -186,21 +187,6 @@ int DinputDevice::UpdateState(InputState &input_state) if(FAILED(pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js))) return -1; - this->prevState = js; - - /*switch (js.rgdwPOV[0]) - { - case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; - case JOY_POVBACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN); break; - case JOY_POVLEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT); break; - case JOY_POVRIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT); break; - case JOY_POVFORWARD_RIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP | POV_CODE_RIGHT); break; - case JOY_POVRIGHT_BACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT | POV_CODE_DOWN); break; - case JOY_POVBACKWARD_LEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN | POV_CODE_LEFT); break; - case JOY_POVLEFT_FORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT | POV_CODE_UP); break; - }*/ - - ApplyButtons(js, input_state); if (analog) @@ -233,75 +219,6 @@ int DinputDevice::UpdateState(InputState &input_state) NativeAxis(axis); } - const LONG rthreshold = 8000; - - switch (g_Config.iRightStickBind) { - case 0: - break; - case 1: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_UP; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_DOWN; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_UP; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_DOWN; - } - break; - case 2: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_B; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_X; - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_B; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_X; - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - break; - case 3: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - } - break; - case 4: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RBUMPER; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LBUMPER; - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_Y; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_A; - } - break; - case 5: - if(!g_Config.iSwapRightAxes) { - if (js.lRz > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lRz < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - } - else { - if (js.lZ > rthreshold) input_state.pad_buttons |= PAD_BUTTON_RIGHT; - else if (js.lZ < -rthreshold) input_state.pad_buttons |= PAD_BUTTON_LEFT; - } - break; - } - return UPDATESTATE_SKIP_PAD; } @@ -321,18 +238,6 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { BYTE *buttons = state.rgbButtons; u32 downMask = 0x80; - //switch (state.rgdwPOV[0]) - //{ - // case JOY_POVFORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP); break; - // case JOY_POVBACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN); break; - // case JOY_POVLEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT); break; - // case JOY_POVRIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT); break; - // case JOY_POVFORWARD_RIGHT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_UP | POV_CODE_RIGHT); break; - // case JOY_POVRIGHT_BACKWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_RIGHT | POV_CODE_DOWN); break; - // case JOY_POVBACKWARD_LEFT: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_DOWN | POV_CODE_LEFT); break; - // case JOY_POVLEFT_FORWARD: input_state.pad_buttons |= getPadCodeFromVirtualPovCode(POV_CODE_LEFT | POV_CODE_UP); break; - //} - for(u8 i = 0; i < dinput_ctrl_map_size; i++) { if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] & downMask)) { KeyInput key; @@ -340,6 +245,28 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { key.flags = KEY_DOWN; key.keyCode = dinput_ctrl_map[i].to; NativeKey(key); + + // Hack needed to let the special buttons work.. + switch(dinput_ctrl_map[i].from) + { + case 6: + input_state.pad_buttons |= PAD_BUTTON_LEFT_THUMB; + break; + case 7: + case 11: + input_state.pad_buttons |= PAD_BUTTON_RIGHT_THUMB; + break; + case 4: + input_state.pad_buttons |= PAD_BUTTON_LEFT_TRIGGER; + break; + case 5: + input_state.pad_buttons |= PAD_BUTTON_RIGHT_TRIGGER; + break; + case 10: + input_state.pad_buttons |= PAD_BUTTON_BACK; + break; + + } } if (dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX && (state.rgbButtons[dinput_ctrl_map[i].from] == 0)) { @@ -350,27 +277,71 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); } + // TODO: Is there really no better way to do the POV buttons? if(dinput_ctrl_map[i].from < DIRECTINPUT_RGBBUTTONS_MAX) { KeyInput key; key.deviceId = DEVICE_ID_PAD_0; - //key.flags = KEY_UP; switch(state.rgdwPOV[0]) { case JOY_POVFORWARD: key.keyCode = KEYCODE_DPAD_UP; key.flags = KEY_DOWN; + NativeKey(key); break; + + case JOY_POVLEFT_FORWARD: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVFORWARD_RIGHT: + key.keyCode = KEYCODE_DPAD_UP; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_RIGHT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + case JOY_POVBACKWARD: key.keyCode = KEYCODE_DPAD_DOWN; key.flags = KEY_DOWN; + NativeKey(key); break; + + case JOY_POVBACKWARD_LEFT: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + + case JOY_POVRIGHT_BACKWARD: + key.keyCode = KEYCODE_DPAD_DOWN; + key.flags = KEY_DOWN; + NativeKey(key); + key.keyCode = KEYCODE_DPAD_LEFT; + key.flags = KEY_DOWN; + NativeKey(key); + break; + case JOY_POVLEFT: key.keyCode = KEYCODE_DPAD_LEFT; key.flags = KEY_DOWN; + NativeKey(key); break; + case JOY_POVRIGHT: key.keyCode = KEYCODE_DPAD_RIGHT; key.flags = KEY_DOWN; + NativeKey(key); break; + default: key.keyCode = KEYCODE_DPAD_UP; key.flags = KEY_UP; @@ -386,10 +357,207 @@ void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) { NativeKey(key); break; } - - NativeKey(key); } } + + const LONG rthreshold = 8000; + + KeyInput RAS; + RAS.deviceId = DEVICE_ID_PAD_0; + switch (g_Config.iRightStickBind) { + case 0: + break; + case 1: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_UP; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_DOWN; + NativeKey(RAS); + } + } + else { + if (state.lX > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_UP; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_DOWN; + NativeKey(RAS); + } + } + break; + case 2: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_B; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_X; + NativeKey(RAS); + } + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_B; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_X; + NativeKey(RAS); + } + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + break; + case 3: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + } + break; + case 4: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_R1; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_L1; + NativeKey(RAS); + } + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_BUTTON_Y; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = RAS.keyCode = KEYCODE_BUTTON_A; + NativeKey(RAS); + } + } + break; + case 5: + if(!g_Config.iSwapRightAxes) { + if (state.lRz > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + else if (state.lRz < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + } + else { + if (state.lZ > rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_LEFT; + NativeKey(RAS); + } + else if (state.lZ < -rthreshold) { + RAS.flags = KEY_DOWN; + RAS.keyCode = KEYCODE_DPAD_RIGHT; + NativeKey(RAS); + } + } + break; + } } int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) @@ -422,4 +590,4 @@ int DinputDevice::UpdateRawStateSingle(RawInputState &rawState) } } return FALSE; -} \ No newline at end of file +} diff --git a/Windows/DinputDevice.h b/Windows/DinputDevice.h index 66a6ee56bd..753a424c51 100644 --- a/Windows/DinputDevice.h +++ b/Windows/DinputDevice.h @@ -38,5 +38,4 @@ private: LPDIRECTINPUT8 pDI; LPDIRECTINPUTDEVICE8 pJoystick; bool analog; - DIJOYSTATE2 prevState; };