From 4692f1084f68b69a643324a24b349d19765a3d74 Mon Sep 17 00:00:00 2001 From: ayuanx Date: Tue, 2 Feb 2010 02:39:21 +0000 Subject: [PATCH] Re-added Semi-Pressure git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4990 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/InputCommon/Src/SDL_Util.cpp | 4 +-- Source/Plugins/Plugin_GCPad/Src/Config.cpp | 16 ++++++++++ Source/Plugins/Plugin_GCPad/Src/ConfigBox.cpp | 30 +++++++++++++++++-- Source/Plugins/Plugin_GCPad/Src/ConfigBox.h | 17 +++++++---- Source/Plugins/Plugin_GCPad/Src/GCPad.cpp | 22 ++++++++++---- Source/Plugins/Plugin_GCPad/Src/GCPad.h | 22 ++++---------- Source/Plugins/Plugin_GCPad/Src/Rumble.cpp | 19 ++++++++++-- 7 files changed, 96 insertions(+), 34 deletions(-) diff --git a/Source/Core/InputCommon/Src/SDL_Util.cpp b/Source/Core/InputCommon/Src/SDL_Util.cpp index 5c3c33ba3f..cf97a608fb 100644 --- a/Source/Core/InputCommon/Src/SDL_Util.cpp +++ b/Source/Core/InputCommon/Src/SDL_Util.cpp @@ -102,8 +102,8 @@ bool SearchDevices(std::vector &_joyinfo, int &_NumPads, int &_ bool AvoidValues(int value, bool NoTriggerFilter) { // Avoid detecting very small or very big (for triggers) values - if( (value > -200 && value < 200) // Small values - || ((value < -0x6000 || value > 0x6000) && !NoTriggerFilter)) // Big values + if( (value > -0x1000 && value < 0x1000) // Small values + || ((value < -0x7000 || value > 0x7000) && !NoTriggerFilter)) // Big values return true; // Avoid else return false; // Keep diff --git a/Source/Plugins/Plugin_GCPad/Src/Config.cpp b/Source/Plugins/Plugin_GCPad/Src/Config.cpp index 10863a1fc1..ecfae779c8 100644 --- a/Source/Plugins/Plugin_GCPad/Src/Config.cpp +++ b/Source/Plugins/Plugin_GCPad/Src/Config.cpp @@ -41,11 +41,13 @@ static const char* gcControlNames[] = "Stick_Down", "Stick_Left", "Stick_Right", + "Stick_Semi", "CStick_Up", "CStick_Down", "CStick_Left", "CStick_Right", + "CStick_Semi", "Shoulder_L", "Shoulder_R", @@ -70,10 +72,12 @@ static const int gcDefaultControls[] = VK_DOWN, VK_LEFT, VK_RIGHT, + VK_LSHIFT, 'I', 'K', 'J', 'L', + VK_LCONTROL, 'Q', 'W', 0x00, @@ -95,10 +99,12 @@ static const int gcDefaultControls[] = XK_Down, // Main stick down XK_Left, // Main stick left XK_Right, // Main stick right + XK_Shift_L, // Main stick semi XK_i, // C-stick up XK_k, // C-stick down XK_j, // C-stick left XK_l, // C-stick right + XK_Control_L, // C-stick semi XK_q, // L XK_w, // R 0x00, // L semi-press @@ -122,10 +128,12 @@ static const int gcDefaultControls[] = 125, // Main stick down (down) 123, // Main stick left (left) 124, // Main stick right (right) + 56, // Main stick semi (left shift) 34, // C-stick up (i) 40, // C-stick down (k) 38, // C-stick left (j) 37, // C-stick right (l) + 59, // C-stick semi (left control) 12, // L (q) 13, // R (w) -1, // L semi-press (none) @@ -182,6 +190,10 @@ void Config::Save() file.Set(SectionName.c_str(), "Source_CStick", GCMapping[i].Stick.Sub); file.Set(SectionName.c_str(), "Source_Shoulder", GCMapping[i].Stick.Shoulder); + file.Set(SectionName.c_str(), "Pressure_Stick", GCMapping[i].Pressure.Main); + file.Set(SectionName.c_str(), "Pressure_CStick", GCMapping[i].Pressure.Sub); + file.Set(SectionName.c_str(), "Pressure_Shoulder", GCMapping[i].Pressure.Shoulder); + // ButtonMapping for (int x = 0; x < LAST_CONSTANT; x++) file.Set(SectionName.c_str(), gcControlNames[x], GCMapping[i].Button[x]); @@ -225,6 +237,10 @@ void Config::Load() file.Get(SectionName.c_str(), "Source_CStick", &GCMapping[i].Stick.Sub, 0); file.Get(SectionName.c_str(), "Source_Shoulder", &GCMapping[i].Stick.Shoulder, 0); + file.Get(SectionName.c_str(), "Pressure_Stick", &GCMapping[i].Pressure.Main, DEF_STICK_HALF); + file.Get(SectionName.c_str(), "Pressure_CStick", &GCMapping[i].Pressure.Sub, DEF_STICK_HALF); + file.Get(SectionName.c_str(), "Pressure_Shoulder", &GCMapping[i].Pressure.Shoulder, DEF_TRIGGER_HALF); + // ButtonMapping for (int x = 0; x < LAST_CONSTANT; x++) file.Get(SectionName.c_str(), gcControlNames[x], &GCMapping[i].Button[x], gcDefaultControls[x]); diff --git a/Source/Plugins/Plugin_GCPad/Src/ConfigBox.cpp b/Source/Plugins/Plugin_GCPad/Src/ConfigBox.cpp index 1abfff1773..8af474189f 100644 --- a/Source/Plugins/Plugin_GCPad/Src/ConfigBox.cpp +++ b/Source/Plugins/Plugin_GCPad/Src/ConfigBox.cpp @@ -46,6 +46,9 @@ BEGIN_EVENT_TABLE(GCPadConfigDialog,wxDialog) EVT_COMBOBOX(IDC_STICK_SOURCE, GCPadConfigDialog::ChangeSettings) EVT_COMBOBOX(IDC_CSTICK_SOURCE, GCPadConfigDialog::ChangeSettings) EVT_COMBOBOX(IDC_TRIGGER_SOURCE, GCPadConfigDialog::ChangeSettings) + EVT_SLIDER(IDS_STICK_PRESS, GCPadConfigDialog::ChangeSettings) + EVT_SLIDER(IDS_CSTICK_PRESS, GCPadConfigDialog::ChangeSettings) + EVT_SLIDER(IDS_TRIGGER_PRESS, GCPadConfigDialog::ChangeSettings) EVT_BUTTON(IDB_ANALOG_LEFT_X, GCPadConfigDialog::OnAxisClick) EVT_BUTTON(IDB_ANALOG_LEFT_Y, GCPadConfigDialog::OnAxisClick) @@ -68,10 +71,12 @@ BEGIN_EVENT_TABLE(GCPadConfigDialog,wxDialog) EVT_BUTTON(IDB_MAIN_DOWN, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_MAIN_LEFT, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_MAIN_RIGHT, GCPadConfigDialog::OnButtonClick) + EVT_BUTTON(IDB_MAIN_SEMI, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SUB_UP, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SUB_DOWN, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SUB_LEFT, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SUB_RIGHT, GCPadConfigDialog::OnButtonClick) + EVT_BUTTON(IDB_SUB_SEMI, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SHDR_L, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SHDR_R, GCPadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_SHDR_SEMI_L, GCPadConfigDialog::OnButtonClick) @@ -310,6 +315,15 @@ void GCPadConfigDialog::ChangeSettings(wxCommandEvent& event) case IDC_TRIGGER_SOURCE: GCMapping[m_Page].Stick.Shoulder = m_Combo_TriggerSrc[m_Page]->GetSelection(); break; + case IDS_STICK_PRESS: + GCMapping[m_Page].Pressure.Main = m_Slider_Stick[m_Page]->GetValue(); + break; + case IDS_CSTICK_PRESS: + GCMapping[m_Page].Pressure.Sub = m_Slider_CStick[m_Page]->GetValue(); + break; + case IDS_TRIGGER_PRESS: + GCMapping[m_Page].Pressure.Shoulder = m_Slider_Trigger[m_Page]->GetValue(); + break; } UpdateGUI(); @@ -348,6 +362,9 @@ void GCPadConfigDialog::UpdateGUI() m_Combo_StickSrc[m_Page]->SetSelection(GCMapping[m_Page].Stick.Main); m_Combo_CStickSrc[m_Page]->SetSelection(GCMapping[m_Page].Stick.Sub); m_Combo_TriggerSrc[m_Page]->SetSelection(GCMapping[m_Page].Stick.Shoulder); + m_Slider_Stick[m_Page]->SetValue(GCMapping[m_Page].Pressure.Main); + m_Slider_CStick[m_Page]->SetValue(GCMapping[m_Page].Pressure.Sub); + m_Slider_Trigger[m_Page]->SetValue(GCMapping[m_Page].Pressure.Shoulder); for (int i = 0; i <= IDB_TRIGGER_R - IDB_ANALOG_LEFT_X; i++) { @@ -439,11 +456,13 @@ void GCPadConfigDialog::CreateGUIControls() wxT("Down"), wxT("Left"), wxT("Right"), + wxT("Semi"), wxT("Up"), // C-Stick wxT("Down"), wxT("Left"), wxT("Right"), + wxT("Semi"), wxT("L"), // Triggers wxT("R"), @@ -671,14 +690,21 @@ void GCPadConfigDialog::CreateGUIControls() m_gButton[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); else if (x <= IDB_DPAD_RIGHT) m_gDPad[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); - else if (x <= IDB_MAIN_RIGHT) + else if (x <= IDB_MAIN_SEMI) m_gStick[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); - else if (x <= IDB_SUB_RIGHT) + else if (x <= IDB_SUB_SEMI) m_gCStick[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); else m_gTrigger[i]->Add(m_Sizer_Pad[x - IDB_BTN_A][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); } + m_Slider_Stick[i] = new wxSlider(m_Controller[i], IDS_STICK_PRESS, DEF_STICK_HALF, 0, DEF_STICK_FULL, wxDefaultPosition, wxSize(100,-1), wxSL_LABELS | wxSL_TOP); + m_gStick[i]->Add(m_Slider_Stick[i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); + m_Slider_CStick[i] = new wxSlider(m_Controller[i], IDS_CSTICK_PRESS, DEF_STICK_HALF, 0, DEF_STICK_FULL, wxDefaultPosition, wxSize(100,-1), wxSL_LABELS | wxSL_TOP); + m_gCStick[i]->Add(m_Slider_CStick[i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); + m_Slider_Trigger[i] = new wxSlider(m_Controller[i], IDS_TRIGGER_PRESS, DEF_TRIGGER_HALF, 0, DEF_TRIGGER_FULL, wxDefaultPosition, wxSize(100,-1), wxSL_LABELS | wxSL_TOP); + m_gTrigger[i]->Add(m_Slider_Trigger[i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1); + // Row 4 Sizers: Button Mapping m_sHorizMapping[i] = new wxBoxSizer(wxHORIZONTAL); m_sHorizMapping[i]->Add(m_gButton[i], 0, (wxLEFT), 5); diff --git a/Source/Plugins/Plugin_GCPad/Src/ConfigBox.h b/Source/Plugins/Plugin_GCPad/Src/ConfigBox.h index 587203879b..2d3aebe4bf 100644 --- a/Source/Plugins/Plugin_GCPad/Src/ConfigBox.h +++ b/Source/Plugins/Plugin_GCPad/Src/ConfigBox.h @@ -62,11 +62,13 @@ class GCPadConfigDialog : public wxDialog IDB_MAIN_DOWN, IDB_MAIN_LEFT, IDB_MAIN_RIGHT, + IDB_MAIN_SEMI, IDB_SUB_UP, IDB_SUB_DOWN, IDB_SUB_LEFT, IDB_SUB_RIGHT, + IDB_SUB_SEMI, IDB_SHDR_L, IDB_SHDR_R, @@ -96,7 +98,8 @@ class GCPadConfigDialog : public wxDialog IDC_STICK_DIAGONAL, IDC_STICK_S2C, IDC_RUMBLE, IDC_RUMBLE_STRENGTH, IDC_TRIGGER_TYPE, - IDC_STICK_SOURCE, IDC_CSTICK_SOURCE, IDC_TRIGGER_SOURCE, + IDC_STICK_SOURCE, IDC_CSTICK_SOURCE, IDC_TRIGGER_SOURCE, + IDS_STICK_PRESS, IDS_CSTICK_PRESS, IDS_TRIGGER_PRESS, }; wxNotebook *m_Notebook; @@ -111,7 +114,11 @@ class GCPadConfigDialog : public wxDialog *m_bmpSquareLeftOut[4], *m_bmpSquareRightIn[4], *m_bmpSquareRightOut[4]; - + + wxSlider *m_Slider_Stick[4], + *m_Slider_CStick[4], + *m_Slider_Trigger[4]; + wxCheckBox *m_CheckS2C[4], *m_CheckRumble[4]; @@ -176,9 +183,9 @@ class GCPadConfigDialog : public wxDialog *m_tTriggerSource[4], *m_Text_Analog[IDB_TRIGGER_R - IDB_ANALOG_LEFT_X + 1][4], *m_Text_Pad[IDB_SHDR_SEMI_R - IDB_BTN_A + 1][4], - *m_Text_StickSrc[5], - *m_Text_CStickSrc[5], - *m_Text_TriggerSrc[5]; + *m_Text_StickSrc[4], + *m_Text_CStickSrc[4], + *m_Text_TriggerSrc[4]; wxStaticBitmap *m_bmpDotLeftIn[4], *m_bmpDotLeftOut[4], diff --git a/Source/Plugins/Plugin_GCPad/Src/GCPad.cpp b/Source/Plugins/Plugin_GCPad/Src/GCPad.cpp index 5b27b988c8..031f736e11 100644 --- a/Source/Plugins/Plugin_GCPad/Src/GCPad.cpp +++ b/Source/Plugins/Plugin_GCPad/Src/GCPad.cpp @@ -205,7 +205,9 @@ void Shutdown() // Finally close SDL if (SDL_WasInit(0)) + { SDL_Quit(); + } // Remove the pointer to the initialize data g_PADInitialize = NULL; @@ -280,15 +282,17 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) if (GCMapping[_numPAD].Stick.Main == FROM_KEYBOARD) { + int iMagnitude = DEF_STICK_FULL; bool bUp = false; bool bDown = false; bool bLeft = false; bool bRight = false; + if (IsKey(EGC_STICK_SEMI)) iMagnitude = GCMapping[_numPAD].Pressure.Main; if (IsKey(EGC_STICK_UP)) bUp = true; else if (IsKey(EGC_STICK_DOWN)) bDown = true; if (IsKey(EGC_STICK_LEFT)) bLeft = true; else if (IsKey(EGC_STICK_RIGHT)) bRight = true; - EmulateAnalogStick(_pPADStatus->stickX, _pPADStatus->stickY, bUp, bDown, bLeft, bRight, DEF_STICK_FULL); + EmulateAnalogStick(_pPADStatus->stickX, _pPADStatus->stickY, bUp, bDown, bLeft, bRight, iMagnitude); } else if (GCMapping[_numPAD].Stick.Main == FROM_ANALOG1) { @@ -310,15 +314,17 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) if (GCMapping[_numPAD].Stick.Sub == FROM_KEYBOARD) { + int iMagnitude = DEF_STICK_FULL; bool bUp = false; bool bDown = false; bool bLeft = false; bool bRight = false; + if (IsKey(EGC_CSTICK_SEMI)) iMagnitude = GCMapping[_numPAD].Pressure.Sub; if (IsKey(EGC_CSTICK_UP)) bUp = true; else if (IsKey(EGC_CSTICK_DOWN)) bDown = true; if (IsKey(EGC_CSTICK_LEFT)) bLeft = true; else if (IsKey(EGC_CSTICK_RIGHT)) bRight = true; - EmulateAnalogStick(_pPADStatus->substickX, _pPADStatus->substickY, bUp, bDown, bLeft, bRight, DEF_STICK_FULL); + EmulateAnalogStick(_pPADStatus->substickX, _pPADStatus->substickY, bUp, bDown, bLeft, bRight, iMagnitude); } else if (GCMapping[_numPAD].Stick.Sub == FROM_ANALOG1) { @@ -342,22 +348,26 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) { if (IsKey(EGC_TGR_L)) { - _pPADStatus->button |= PAD_TRIGGER_L; _pPADStatus->triggerLeft = DEF_TRIGGER_FULL; + _pPADStatus->button |= PAD_TRIGGER_L; } else if (IsKey(EGC_TGR_SEMI_L)) { - _pPADStatus->triggerLeft = DEF_TRIGGER_FULL / 2; + _pPADStatus->triggerLeft = GCMapping[_numPAD].Pressure.Shoulder; + if (_pPADStatus->triggerLeft > DEF_TRIGGER_THRESHOLD) + _pPADStatus->button |= PAD_TRIGGER_L; } if (IsKey(EGC_TGR_R)) { - _pPADStatus->button |= PAD_TRIGGER_R; _pPADStatus->triggerRight = DEF_TRIGGER_FULL; + _pPADStatus->button |= PAD_TRIGGER_R; } else if (IsKey(EGC_TGR_SEMI_R)) { - _pPADStatus->triggerRight = DEF_TRIGGER_FULL / 2; + _pPADStatus->triggerRight = GCMapping[_numPAD].Pressure.Shoulder; + if (_pPADStatus->triggerRight > DEF_TRIGGER_THRESHOLD) + _pPADStatus->button |= PAD_TRIGGER_R; } } else if (GCMapping[_numPAD].Stick.Shoulder == FROM_ANALOG1) diff --git a/Source/Plugins/Plugin_GCPad/Src/GCPad.h b/Source/Plugins/Plugin_GCPad/Src/GCPad.h index b9ec787b36..bed833d36d 100644 --- a/Source/Plugins/Plugin_GCPad/Src/GCPad.h +++ b/Source/Plugins/Plugin_GCPad/Src/GCPad.h @@ -38,26 +38,11 @@ #include "pluginspecs_pad.h" -// SDL Haptic fails on windows, it just doesn't work (even the sample doesn't work) -// So until i can make it work, this is all disabled >:( -#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32) - #define SDL_RUMBLE -#else - #ifdef _WIN32 - #define RUMBLE_HACK - #define DIRECTINPUT_VERSION 0x0800 - #define WIN32_LEAN_AND_MEAN - - #pragma comment(lib, "dxguid.lib") - #pragma comment(lib, "dinput8.lib") - #pragma comment(lib, "winmm.lib") - #include - #endif -#endif - #define DEF_BUTTON_FULL 255 #define DEF_STICK_FULL 100 +#define DEF_STICK_HALF 50 #define DEF_TRIGGER_FULL 255 +#define DEF_TRIGGER_HALF 128 #define DEF_TRIGGER_THRESHOLD 230 // GC Pad Buttons @@ -79,11 +64,13 @@ enum EGCPad EGC_STICK_DOWN, EGC_STICK_LEFT, EGC_STICK_RIGHT, + EGC_STICK_SEMI, EGC_CSTICK_UP, EGC_CSTICK_DOWN, EGC_CSTICK_LEFT, EGC_CSTICK_RIGHT, + EGC_CSTICK_SEMI, EGC_TGR_L, EGC_TGR_R, @@ -137,6 +124,7 @@ struct CONTROLLER_MAPPING_GC // PAD MAPPING GC int Diagonal; SStickMapping Stick; + SStickMapping Pressure; int Button[LAST_CONSTANT]; }; diff --git a/Source/Plugins/Plugin_GCPad/Src/Rumble.cpp b/Source/Plugins/Plugin_GCPad/Src/Rumble.cpp index 28d596405f..20c58adaa9 100644 --- a/Source/Plugins/Plugin_GCPad/Src/Rumble.cpp +++ b/Source/Plugins/Plugin_GCPad/Src/Rumble.cpp @@ -22,6 +22,23 @@ #include "XInput.h" #endif +// SDL Haptic fails on windows, it just doesn't work (even the sample doesn't work) +// So until i can make it work, this is all disabled >:( +#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32) && !defined(__APPLE__) + #define SDL_RUMBLE +#else + #ifdef _WIN32 + #define RUMBLE_HACK + #define DIRECTINPUT_VERSION 0x0800 + #define WIN32_LEAN_AND_MEAN + + #pragma comment(lib, "dxguid.lib") + #pragma comment(lib, "dinput8.lib") + #pragma comment(lib, "winmm.lib") + #include + #endif +#endif + #ifdef RUMBLE_HACK @@ -33,8 +50,6 @@ struct RUMBLE // GC Pad rumble DIDevice DIEFFECT eff; }; -#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } } - BOOL CALLBACK EnumFFDevicesCallback(const DIDEVICEINSTANCE* pInst, VOID* pContext); BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext); void SetDeviceForcesXY(int pad, int nXYForce);