Input: Added option to control analog stick deadzone size

This commit is contained in:
Sour 2019-10-19 16:13:11 -04:00
parent a3829c58fa
commit fdb8ca6292
8 changed files with 32 additions and 21 deletions

View file

@ -285,3 +285,15 @@ bool EmuSettings::IsInputEnabled()
{ {
return !CheckFlag(EmulationFlags::InBackground) || _preferences.AllowBackgroundInput; return !CheckFlag(EmulationFlags::InBackground) || _preferences.AllowBackgroundInput;
} }
double EmuSettings::GetControllerDeadzoneRatio()
{
switch(_input.ControllerDeadzoneSize) {
case 0: return 0.5;
case 1: return 0.75;
case 2: return 1;
case 3: return 1.25;
case 4: return 1.5;
}
return 1;
}

View file

@ -70,4 +70,5 @@ public:
void InitializeRam(void* data, uint32_t length); void InitializeRam(void* data, uint32_t length);
bool IsInputEnabled(); bool IsInputEnabled();
double GetControllerDeadzoneRatio();
}; };

View file

@ -187,10 +187,9 @@ void ShortcutKeyHandler::CheckMappedKeys()
void ShortcutKeyHandler::ProcessKeys() void ShortcutKeyHandler::ProcessKeys()
{ {
//TODO if(!_console->GetSettings()->IsInputEnabled()) {
/*if(!_console->GetSettings()->IsInputEnabled()) {
return; return;
}*/ }
auto lock = _lock.AcquireSafe(); auto lock = _lock.AcquireSafe();
KeyManager::RefreshKeyState(); KeyManager::RefreshKeyState();

View file

@ -122,7 +122,7 @@ void LinuxGameController::Calibrate()
bool LinuxGameController::CheckAxis(unsigned int code, bool forPositive) bool LinuxGameController::CheckAxis(unsigned int code, bool forPositive)
{ {
double deadZoneRatio = 1; //TODO _console->GetSettings()->GetControllerDeadzoneRatio(); double deadZoneRatio = _console->GetSettings()->GetControllerDeadzoneRatio();
int deadZoneNegative = (_axisDefaultValue[code] - libevdev_get_abs_minimum(_device, code)) * 0.400 * deadZoneRatio; int deadZoneNegative = (_axisDefaultValue[code] - libevdev_get_abs_minimum(_device, code)) * 0.400 * deadZoneRatio;
int deadZonePositive = (libevdev_get_abs_maximum(_device, code) - _axisDefaultValue[code]) * 0.400 * deadZoneRatio; int deadZonePositive = (libevdev_get_abs_maximum(_device, code) - _axisDefaultValue[code]) * 0.400 * deadZoneRatio;

View file

@ -64,6 +64,7 @@
this.chkDisplayPort2 = new System.Windows.Forms.CheckBox(); this.chkDisplayPort2 = new System.Windows.Forms.CheckBox();
this.chkDisplayPort3 = new System.Windows.Forms.CheckBox(); this.chkDisplayPort3 = new System.Windows.Forms.CheckBox();
this.chkDisplayPort4 = new System.Windows.Forms.CheckBox(); this.chkDisplayPort4 = new System.Windows.Forms.CheckBox();
this.chkDisplayPort5 = new System.Windows.Forms.CheckBox();
this.chkDisplayInputHorizontally = new System.Windows.Forms.CheckBox(); this.chkDisplayInputHorizontally = new System.Windows.Forms.CheckBox();
this.flowLayoutPanel3 = new System.Windows.Forms.FlowLayoutPanel(); this.flowLayoutPanel3 = new System.Windows.Forms.FlowLayoutPanel();
this.lblDisplayPosition = new System.Windows.Forms.Label(); this.lblDisplayPosition = new System.Windows.Forms.Label();
@ -74,7 +75,6 @@
this.trkControllerDeadzoneSize = new System.Windows.Forms.TrackBar(); this.trkControllerDeadzoneSize = new System.Windows.Forms.TrackBar();
this.lblSmall = new System.Windows.Forms.Label(); this.lblSmall = new System.Windows.Forms.Label();
this.lblLarge = new System.Windows.Forms.Label(); this.lblLarge = new System.Windows.Forms.Label();
this.chkDisplayPort5 = new System.Windows.Forms.CheckBox();
this.tabMain.SuspendLayout(); this.tabMain.SuspendLayout();
this.tpgControllers.SuspendLayout(); this.tpgControllers.SuspendLayout();
this.tlpControllers.SuspendLayout(); this.tlpControllers.SuspendLayout();
@ -543,6 +543,16 @@
this.chkDisplayPort4.Text = "Port 4"; this.chkDisplayPort4.Text = "Port 4";
this.chkDisplayPort4.UseVisualStyleBackColor = true; this.chkDisplayPort4.UseVisualStyleBackColor = true;
// //
// chkDisplayPort5
//
this.chkDisplayPort5.AutoSize = true;
this.chkDisplayPort5.Location = new System.Drawing.Point(243, 3);
this.chkDisplayPort5.Name = "chkDisplayPort5";
this.chkDisplayPort5.Size = new System.Drawing.Size(54, 17);
this.chkDisplayPort5.TabIndex = 4;
this.chkDisplayPort5.Text = "Port 5";
this.chkDisplayPort5.UseVisualStyleBackColor = true;
//
// chkDisplayInputHorizontally // chkDisplayInputHorizontally
// //
this.chkDisplayInputHorizontally.AutoSize = true; this.chkDisplayInputHorizontally.AutoSize = true;
@ -613,7 +623,6 @@
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel5.Size = new System.Drawing.Size(356, 55); this.tableLayoutPanel5.Size = new System.Drawing.Size(356, 55);
this.tableLayoutPanel5.TabIndex = 3; this.tableLayoutPanel5.TabIndex = 3;
this.tableLayoutPanel5.Visible = false;
// //
// lblDeadzone // lblDeadzone
// //
@ -658,16 +667,6 @@
this.lblLarge.TabIndex = 3; this.lblLarge.TabIndex = 3;
this.lblLarge.Text = "Large"; this.lblLarge.Text = "Large";
// //
// chkDisplayPort5
//
this.chkDisplayPort5.AutoSize = true;
this.chkDisplayPort5.Location = new System.Drawing.Point(243, 3);
this.chkDisplayPort5.Name = "chkDisplayPort5";
this.chkDisplayPort5.Size = new System.Drawing.Size(54, 17);
this.chkDisplayPort5.TabIndex = 4;
this.chkDisplayPort5.Text = "Port 5";
this.chkDisplayPort5.UseVisualStyleBackColor = true;
//
// frmInputConfig // frmInputConfig
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

View file

@ -46,6 +46,7 @@ namespace Mesen.GUI.Forms.Config
AddBinding(nameof(InputConfig.DisplayInputPort5), chkDisplayPort5); AddBinding(nameof(InputConfig.DisplayInputPort5), chkDisplayPort5);
AddBinding(nameof(InputConfig.DisplayInputPosition), cboDisplayInputPosition); AddBinding(nameof(InputConfig.DisplayInputPosition), cboDisplayInputPosition);
AddBinding(nameof(InputConfig.DisplayInputHorizontally), chkDisplayInputHorizontally); AddBinding(nameof(InputConfig.DisplayInputHorizontally), chkDisplayInputHorizontally);
AddBinding(nameof(InputConfig.ControllerDeadzoneSize), trkControllerDeadzoneSize);
UpdateUiSections(); UpdateUiSections();
} }

View file

@ -11,6 +11,7 @@
#include <algorithm> #include <algorithm>
#include "../Core/MessageManager.h" #include "../Core/MessageManager.h"
#include "../Core/Console.h" #include "../Core/Console.h"
#include "../Core/EmuSettings.h"
LPDIRECTINPUT8 DirectInputManager::_directInput = nullptr; LPDIRECTINPUT8 DirectInputManager::_directInput = nullptr;
vector<DirectInputData> DirectInputManager::_joysticks; vector<DirectInputData> DirectInputManager::_joysticks;
@ -353,9 +354,7 @@ bool DirectInputManager::IsPressed(int port, int button)
DIJOYSTATE2& state = _joysticks[port].state; DIJOYSTATE2& state = _joysticks[port].state;
DIJOYSTATE2& defaultState = _joysticks[port].defaultState; DIJOYSTATE2& defaultState = _joysticks[port].defaultState;
int deadRange = (int)(500 * 1); int deadRange = (int)(500 * _console->GetSettings()->GetControllerDeadzoneRatio());
//TODO
//_console->GetSettings()->GetControllerDeadzoneRatio()
int povDirection = state.rgdwPOV[0] / 4500; int povDirection = state.rgdwPOV[0] / 4500;
bool povCentered = (LOWORD(state.rgdwPOV[0]) == 0xFFFF) || povDirection >= 8; bool povCentered = (LOWORD(state.rgdwPOV[0]) == 0xFFFF) || povDirection >= 8;

View file

@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "XInputManager.h" #include "XInputManager.h"
#include "../Core/Console.h" #include "../Core/Console.h"
#include "../Core/EmuSettings.h"
XInputManager::XInputManager(shared_ptr<Console> console) XInputManager::XInputManager(shared_ptr<Console> console)
{ {
@ -56,8 +57,7 @@ bool XInputManager::IsPressed(uint8_t gamepadPort, uint8_t button)
WORD xinputButton = 1 << (button - 1); WORD xinputButton = 1 << (button - 1);
return (_gamePadStates[gamepadPort]->Gamepad.wButtons & xinputButton) != 0; return (_gamePadStates[gamepadPort]->Gamepad.wButtons & xinputButton) != 0;
} else { } else {
//TODO double ratio = _console->GetSettings()->GetControllerDeadzoneRatio() * 2;
double ratio = 1; //_console->GetSettings()->GetControllerDeadzoneRatio() * 2;
switch(button) { switch(button) {
case 17: return gamepad.bLeftTrigger > (XINPUT_GAMEPAD_TRIGGER_THRESHOLD * ratio); case 17: return gamepad.bLeftTrigger > (XINPUT_GAMEPAD_TRIGGER_THRESHOLD * ratio);