From a718ff266ef5d1d15a710df37f6ebcfaea0f3515 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Thu, 9 Jul 2009 02:23:40 +0000 Subject: [PATCH] nJoy: Fixed the radius adjustment git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3717 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/InputCommon/Src/Configuration.cpp | 44 +++++++++++++------ Source/Core/InputCommon/Src/SDL.h | 3 +- .../Plugin_Wiimote/Src/ConfigGamepad.cpp | 6 +-- Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp | 5 +-- .../Src/GUI/ConfigAdvanced.cpp | 9 +--- Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp | 10 +---- 6 files changed, 39 insertions(+), 38 deletions(-) diff --git a/Source/Core/InputCommon/Src/Configuration.cpp b/Source/Core/InputCommon/Src/Configuration.cpp index 3faa4a1d2d..35260fd40c 100644 --- a/Source/Core/InputCommon/Src/Configuration.cpp +++ b/Source/Core/InputCommon/Src/Configuration.cpp @@ -112,6 +112,30 @@ int Pad_Convert(int _val) ///////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +// Adjust the radius +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void RadiusAdjustment(int &_x, int &_y, int _pad, std::string SRadius) +{ + // Get the radius setting + int Tmp = atoi (SRadius.substr(0, SRadius.length() - 1).c_str()); + float RadiusSetting = Tmp / 100.0f; + + // Get current angle + float Deg = Rad2Deg(atan2((float)_y, (float)_x)); + // Get the current radius + float Radius = sqrt((float)(_x*_x + _y*_y)); + // Adjust radius + Radius = Radius * RadiusSetting; + // Produce new coordinates + float x = Radius * cos(Deg2Rad(Deg)); + float y = Radius * sin(Deg2Rad(Deg)); + // Update values + _x = (int)x, _y = (int)y; +} +///////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////////////////////// /* Convert the stick raidus from a square or rounded box to a circular radius. I don't know what input values the actual GC controller produce for the GC, it may be a square, a circle or @@ -148,9 +172,9 @@ float Square2CircleDistance(float deg) return Distance; } // Produce a perfect circle from an original square or rounded box -std::vector Square2Circle(int _x, int _y, int _pad, std::string SDiagonal, bool Circle2Square) +void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circle2Square) { - // Do we need this? + // Do we need to do this check? if(_x > 32767) _x = 32767; if(_y > 32767) _y = 32767; // upper limit if(_x < -32768) _x = -32768; if(_y < -32768) _y = -32768; // lower limit @@ -189,21 +213,15 @@ std::vector Square2Circle(int _x, int _y, int _pad, std::string SDiagonal, // Calculate x and y and return it float x = result_dist * cos(Deg2Rad(deg)); float y = result_dist * sin(Deg2Rad(deg)); - // Make integers - int int_x = (int)floor(x); - int int_y = (int)floor(y); + // Update coordinates + _x = (int)floor(x); + _y = (int)floor(y); // Boundaries - if (int_x < -32768) int_x = -32768; if (int_x > 32767) int_x = 32767; - if (int_y < -32768) int_y = -32768; if (int_y > 32767) int_y = 32767; - // Return it - std::vector vec; - vec.push_back(int_x); - vec.push_back(int_y); + if (_x < -32768) _x = -32768; if (_x > 32767) _x = 32767; + if (_y < -32768) _y = -32768; if (_y > 32767) _y = 32767; // Debugging //Console::Print("%f %f %i", corner_circle_dist, Diagonal, Tmp)); - - return vec; } ///////////////////////////////////////////////////////////////////// diff --git a/Source/Core/InputCommon/Src/SDL.h b/Source/Core/InputCommon/Src/SDL.h index 38f4bd759a..49a4e9fd4c 100644 --- a/Source/Core/InputCommon/Src/SDL.h +++ b/Source/Core/InputCommon/Src/SDL.h @@ -239,7 +239,8 @@ float Rad2Deg(float Rad); int Pad_Convert(int _val); float SquareDistance(float deg); bool IsDeadZone(float DeadZone, int x, int y); -std::vector Square2Circle(int _x, int _y, int _pad, std::string SDiagonal, bool Circle2Square = false); +void Square2Circle(int &_x, int &_y, int _pad, std::string SDiagonal, bool Circle2Square = false); +void RadiusAdjustment(int &_x, int &_y, int _pad, std::string SRadius); // Input configuration std::string VKToString(int keycode); diff --git a/Source/Plugins/Plugin_Wiimote/Src/ConfigGamepad.cpp b/Source/Plugins/Plugin_Wiimote/Src/ConfigGamepad.cpp index 8d36640a31..16593cd555 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/ConfigGamepad.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/ConfigGamepad.cpp @@ -635,11 +635,7 @@ void WiimotePadConfigDialog::PadGetStatus() // Produce square if(WiiMoteEmu::PadMapping[Page].bCircle2Square) { - std::vector main_xy = InputCommon::Square2Circle(main_x, main_y, Page, WiiMoteEmu::PadMapping[Page].SDiagonal, true); - main_x_after = main_xy.at(0); - main_y_after = main_xy.at(1); - //main_x = main_xy.at(0); - //main_y = main_xy.at(1); + InputCommon::Square2Circle(main_x_after, main_y_after, Page, WiiMoteEmu::PadMapping[Page].SDiagonal, true); } // Check dead zone float DeadZoneLeft = (float)WiiMoteEmu::PadMapping[Page].DeadZoneL / 100.0; diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp index b4ef92ac42..7282d0c5e8 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuPad.cpp @@ -83,10 +83,7 @@ void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr) // Check the circle to square option if(PadMapping[Page].bCircle2Square) { - std::vector main_xy = InputCommon::Square2Circle(Lx, Ly, Page, PadMapping[Page].SDiagonal, true); - - Lx = main_xy.at(0); - Ly = main_xy.at(1); + InputCommon::Square2Circle(Lx, Ly, Page, PadMapping[Page].SDiagonal, true); } // Dead zone adjustment diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp index 4573ec5e60..674d5ebeaf 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp @@ -88,18 +88,13 @@ void PADConfigDialognJoy::PadGetStatus() int main_x_after = main_x, main_y_after = main_y; if(PadMapping[notebookpage].bSquareToCircle) { - std::vector main_xy = InputCommon::Square2Circle(main_x, main_y, notebookpage, PadMapping[notebookpage].SDiagonal); - main_x_after = main_xy.at(0); - main_y_after = main_xy.at(1); + InputCommon::Square2Circle(main_x_after, main_y_after, notebookpage, PadMapping[notebookpage].SDiagonal); } // Adjust radius if(PadMapping[notebookpage].bRadiusOnOff) { // Get the manually configured diagonal distance - int Tmp = atoi (PadMapping[notebookpage].SRadius.substr(0, PadMapping[notebookpage].SRadius.length() - 1).c_str()); - float Radius = Tmp / 100.0f; - main_x_after = (int)((float)main_x_after * Radius); - main_y_after = (int)((float)main_y_after * Radius); + InputCommon::RadiusAdjustment(main_x_after, main_y_after, notebookpage, PadMapping[notebookpage].SRadius); } // diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp index e7a6a6662f..9843dc847c 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp @@ -447,18 +447,12 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) // Check if we should make adjustments if (PadMapping[_numPAD].bSquareToCircle) { - std::vector main_xy = InputCommon::Square2Circle(i_main_stick_x, i_main_stick_y, _numPAD, PadMapping[_numPAD].SDiagonal); - i_main_stick_x = main_xy.at(0); - i_main_stick_y = main_xy.at(1); + InputCommon::Square2Circle(i_main_stick_x, i_main_stick_y, _numPAD, PadMapping[_numPAD].SDiagonal); } // Radius adjustment if (PadMapping[_numPAD].bRadiusOnOff) { - // Get the manually configured diagonal distance - int Tmp = atoi (PadMapping[_numPAD].SRadius.substr(0, PadMapping[_numPAD].SRadius.length() - 1).c_str()); - float Radius = Tmp / 100.0f; - i_main_stick_x = (int)((float)i_main_stick_x * Radius); - i_main_stick_y = (int)((float)i_main_stick_y * Radius); + InputCommon::RadiusAdjustment(i_main_stick_x, i_main_stick_y, _numPAD, PadMapping[_numPAD].SRadius); } // Convert axis values