mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-09 22:18:58 +01:00
nJoy: Fixed the radius adjustment
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3717 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
8fa315879a
commit
a718ff266e
@ -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<int> 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<int> 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<int> 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;
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -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<int> 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);
|
||||
|
@ -635,11 +635,7 @@ void WiimotePadConfigDialog::PadGetStatus()
|
||||
// Produce square
|
||||
if(WiiMoteEmu::PadMapping[Page].bCircle2Square)
|
||||
{
|
||||
std::vector<int> 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;
|
||||
|
@ -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<int> 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
|
||||
|
@ -88,18 +88,13 @@ void PADConfigDialognJoy::PadGetStatus()
|
||||
int main_x_after = main_x, main_y_after = main_y;
|
||||
if(PadMapping[notebookpage].bSquareToCircle)
|
||||
{
|
||||
std::vector<int> 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);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -447,18 +447,12 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||
// Check if we should make adjustments
|
||||
if (PadMapping[_numPAD].bSquareToCircle)
|
||||
{
|
||||
std::vector<int> 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user