summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorayuanx <ayuanx@gmail.com>2009-12-04 16:36:24 +0000
committerayuanx <ayuanx@gmail.com>2009-12-04 16:36:24 +0000
commitc71adffa80907f02715b98db8836f8018dc95ae4 (patch)
tree9cda05a5050dd2c85d8ce469f99a9889f6898d59 /Source
parentd919a641c1b10fa6df1b09e088c0378df2808677 (diff)
New Feature: Free Swing for EMU WiiMote
How to: First bind Roll & Pitch to "Analog 1" or "Analog 2", then set Roll Degree and Pitch Degree both to: "Free Swing". Now in games, you can swing your emulated wiimote to Up/Down/Left/Right by simply pushing your binding analog stick to Up/Down/Left/Right. PS:The swing direction will automatically adjust itself when "Upright Wiimote" option is checked. Now you can play "Mad World" with emulated wiimote. :) git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4641 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source')
-rw-r--r--Source/Plugins/Plugin_Wiimote/Src/Config.cpp4
-rw-r--r--Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp22
-rw-r--r--Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp44
-rw-r--r--Source/Plugins/Plugin_Wiimote/Src/EmuMain.h6
-rw-r--r--Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp60
5 files changed, 81 insertions, 55 deletions
diff --git a/Source/Plugins/Plugin_Wiimote/Src/Config.cpp b/Source/Plugins/Plugin_Wiimote/Src/Config.cpp
index 57fb709175..d2fa3b1a13 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/Config.cpp
+++ b/Source/Plugins/Plugin_Wiimote/Src/Config.cpp
@@ -274,8 +274,8 @@ void Config::Load(bool ChangePad)
iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false);
iniFile.Get(SectionName, "TriggerType", &Trigger.Type, Trigger.TRIGGER_OFF);
iniFile.Get(SectionName, "TriggerUpright", &Trigger.Upright, false);
- iniFile.Get(SectionName, "TriggerRollRange", &Trigger.Range.Roll, 50);
- iniFile.Get(SectionName, "TriggerPitchRange", &Trigger.Range.Pitch, false);
+ iniFile.Get(SectionName, "TriggerRollRange", &Trigger.Range.Roll, 0);
+ iniFile.Get(SectionName, "TriggerPitchRange", &Trigger.Range.Pitch, 0);
// Wiimote
for (int x = 0; x < WM_CONTROLS; x++)
diff --git a/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp b/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp
index ee6c949421..39b2f75bb7 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp
+++ b/Source/Plugins/Plugin_Wiimote/Src/ConfigPadDlg.cpp
@@ -363,9 +363,11 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
StrTilt.Add(wxString::FromAscii("Triggers"));
// The range is in degrees and are set at even 5 degrees values
wxArrayString StrTiltRangeRoll, StrTiltRangePitch;
- for (int i = 0; i < 37; i++)
+ StrTiltRangeRoll.Add(wxString::Format(wxT("Free Swing")));
+ for (int i = 1; i < 37; i++)
StrTiltRangeRoll.Add(wxString::Format(wxT("%i"), i*5));
- for (int i = 0; i < 37; i++)
+ StrTiltRangePitch.Add(wxString::Format(wxT("Free Swing")));
+ for (int i = 1; i < 37; i++)
StrTiltRangePitch.Add(wxString::Format(wxT("%i"), i*5));
// The Trigger type list
@@ -1004,10 +1006,22 @@ void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
g_Config.Trigger.Type = m_TiltComboInput[Page]->GetSelection();
break;
case ID_TILT_RANGE_ROLL:
- m_TiltComboRangeRoll[Page]->GetValue().ToLong(&TmpValue); g_Config.Trigger.Range.Roll = TmpValue;
+ if (m_TiltComboRangeRoll[Page]->GetSelection() == 0)
+ g_Config.Trigger.Range.Roll = 0;
+ else
+ {
+ m_TiltComboRangeRoll[Page]->GetValue().ToLong(&TmpValue);
+ g_Config.Trigger.Range.Roll = TmpValue;
+ }
break;
case ID_TILT_RANGE_PITCH:
- m_TiltComboRangePitch[Page]->GetValue().ToLong(&TmpValue); g_Config.Trigger.Range.Pitch = TmpValue;
+ if (m_TiltComboRangePitch[Page]->GetSelection() == 0)
+ g_Config.Trigger.Range.Pitch = 0;
+ else
+ {
+ m_TiltComboRangePitch[Page]->GetValue().ToLong(&TmpValue);
+ g_Config.Trigger.Range.Pitch = TmpValue;
+ }
break;
case IDC_JOYNAME:
DoChangeJoystick();
diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp
index 0dcf4c5ddc..472700ccba 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp
+++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp
@@ -44,7 +44,7 @@ namespace WiiMoteEmu
// Accelerometer functions
//******************************************************************************
-
+/*
// Test the calculations
void TiltTest(u8 x, u8 y, u8 z)
{
@@ -61,20 +61,20 @@ void TiltTest(u8 x, u8 y, u8 z)
(_Pitch >= 0) ? StringFromFormat(" %03i", (int)_Pitch).c_str() : StringFromFormat("%04i", (int)_Pitch).c_str());
NOTICE_LOG(CONSOLE, "\n%s", To.c_str());
}
-
+*/
/* Angles adjustment for the upside down state when both roll and pitch is
used. When the absolute values of the angles go over 90 the Wiimote is
upside down and these adjustments are needed. */
-void AdjustAngles(float &Roll, float &Pitch)
+void AdjustAngles(int &Roll, int &Pitch)
{
- float OldPitch = Pitch;
+ int OldPitch = Pitch;
if (abs(Roll) > 90)
{
if (Pitch >= 0)
Pitch = 180 - Pitch; // 15 to 165
- else if (Pitch < 0)
+ else
Pitch = -180 - Pitch; // -15 to -165
}
@@ -82,18 +82,44 @@ void AdjustAngles(float &Roll, float &Pitch)
{
if (Roll >= 0)
Roll = 180 - Roll; // 15 to 165
- else if (Roll < 0)
+ else
Roll = -180 - Roll; // -15 to -165
}
}
// Angles to accelerometer values
-void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_z)
+void PitchDegreeToAccelerometer(int Roll, int Pitch, u8 &_x, u8 &_y, u8 &_z)
{
+ // Direct mapping from analog stick to x/y accelerometer
+ if (g_Config.Trigger.Range.Pitch == 0 && g_Config.Trigger.Range.Roll == 0)
+ {
+ if (abs(Roll) <= abs(g_wm.cal_g.x))
+ Roll = 0;
+ if (abs(Pitch) <= abs(g_wm.cal_g.y))
+ Pitch = 0;
+ int ix = g_wm.cal_zero.x + Roll;
+ int iy = g_wm.cal_zero.y + Pitch;
+ if (ix > 0xFF) ix = 0xFF;
+ if (ix < 0x00) ix = 0x00;
+ if (iy > 0xFF) iy = 0xFF;
+ if (iy < 0x00) iy = 0x00;
+ if (!g_Config.Trigger.Upright)
+ {
+ _x = ix;
+ _y = iy;
+ }
+ else
+ {
+ _x = ix;
+ _z = iy;
+ }
+ return;
+ }
+
// We need radiands for the math functions
- _Roll = InputCommon::Deg2Rad(_Roll);
- _Pitch = InputCommon::Deg2Rad(_Pitch);
+ float _Roll = InputCommon::Deg2Rad((float)Roll);
+ float _Pitch = InputCommon::Deg2Rad((float)Pitch);
// We need decimal values
float x = (float)_x, y = (float)_y, z = (float)_z;
diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h
index 0878cd43db..bd69f49191 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h
+++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h
@@ -57,12 +57,12 @@ void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONT
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr);
// Accelerometer
-void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_z);
+void PitchDegreeToAccelerometer(int _Roll, int _Pitch, u8 &_x, u8 &_y, u8 &_z);
void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, int&, int&);
float AccelerometerToG(float Current, float Neutral, float G);
-void TiltTest(u8 x, u8 y, u8 z);
+//void TiltTest(u8 x, u8 y, u8 z);
void Tilt(u8 &_x, u8 &_y, u8 &_z);
-void AdjustAngles(float &Roll, float &Pitch);
+void AdjustAngles(int &Roll, int &Pitch);
// IR data
void IRData2Dots(u8 *Data);
diff --git a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp
index 4d36d3f781..167f919e6a 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp
+++ b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp
@@ -428,7 +428,8 @@ u8 g_x, g_y, g_z, g_X, g_Y, g_Z;
int Shake[] = {0, 0};
// For the tilt function, the size of this list determines how fast Y returns to its neutral value
-std::vector<u8> yhist(15, 0); float KbDegree;
+std::vector<u8> yhist(15, 0);
+int KbDegree;
// Single shake of all three directions
@@ -485,7 +486,7 @@ void SingleShake(u8 &_x, u8 &_y, u8 &_z, int wm)
/* Tilting Wiimote with gamepad. We can guess that the game will calculate a
Wiimote pitch and use it as a measure of the tilting of the Wiimote. We are
interested in this tilting range 90 to -90*/
-void TiltWiimoteGamepad(float &Roll, float &Pitch)
+void TiltWiimoteGamepad(int &Roll, int &Pitch)
{
// Return if we have no pads
if (NumGoodPads == 0) return;
@@ -499,18 +500,12 @@ void TiltWiimoteGamepad(float &Roll, float &Pitch)
lose any precision by doing this we could consider not doing this
adjustment. And instead for example upsize the XInput trigger from 0x80
to 0x8000. */
- int _Lx, _Ly, _Rx, _Ry, _Tl, _Tr;
- PadStateAdjustments(_Lx, _Ly, _Rx, _Ry, _Tl, _Tr);
- float Lx = (float)_Lx;
- float Ly = (float)_Ly;
- float Rx = (float)_Rx;
- float Ry = (float)_Ry;
- float Tl = (float)_Tl;
- float Tr = (float)_Tr;
+ int Lx, Ly, Rx, Ry, Tl, Tr;
+ PadStateAdjustments(Lx, Ly, Rx, Ry, Tl, Tr);;
// Save the Range in degrees, 45 and 90 are good values in some games
- float RollRange = (float)g_Config.Trigger.Range.Roll;
- float PitchRange = (float)g_Config.Trigger.Range.Pitch;
+ int RollRange = g_Config.Trigger.Range.Roll;
+ int PitchRange = g_Config.Trigger.Range.Pitch;
// The trigger currently only controls pitch
if (g_Config.Trigger.Type == g_Config.Trigger.TRIGGER)
@@ -521,47 +516,43 @@ void TiltWiimoteGamepad(float &Roll, float &Pitch)
// Invert
if (PadMapping[Page].bPitchInvert) { Tl = -Tl; Tr = -Tr; }
// The final value
- Pitch = Tl * (PitchRange / 128.0)
- - Tr * (PitchRange / 128.0);
+ Pitch = Tl * ((float)PitchRange / 128.0)
+ - Tr * ((float)PitchRange / 128.0);
}
- /* For the analog stick roll us by default set to the X-axis, pitch is by
+ /* For the analog stick roll is by default set to the X-axis, pitch is by
default set to the Y-axis. By changing the axis mapping and the invert
options this can be altered in any way */
else if (g_Config.Trigger.Type == g_Config.Trigger.ANALOG1)
{
// Adjust the trigger to go between negative and positive values
- Lx = Lx - 128.0;
- Ly = Ly - 128.0;
+ Lx = Lx - 128;
+ Ly = Ly - 128;
// Invert
if (PadMapping[Page].bRollInvert) Lx = -Lx; // else Tr = -Tr;
if (PadMapping[Page].bPitchInvert) Ly = -Ly; // else Tr = -Tr;
// Produce the final value
- Roll = Lx * (RollRange / 128.0);
- Pitch = Ly * (PitchRange / 128.0);
+ Roll = (RollRange) ? RollRange * ((float)Lx / 128.0) : Lx;
+ Pitch = (PitchRange) ? PitchRange * ((float)Ly / 128.0) : Ly;
}
// Otherwise we are using ANALOG2
else
{
// Adjust the trigger to go between negative and positive values
- Rx = Rx - 128.0;
- Ry = Ry - 128.0;
+ Rx = Rx - 128;
+ Ry = Ry - 128;
// Invert
if (PadMapping[Page].bRollInvert) Rx = -Rx; // else Tr = -Tr;
if (PadMapping[Page].bPitchInvert) Ry = -Ry; // else Tr = -Tr;
// Produce the final value
- Roll = Rx * (RollRange / 128.0);
- Pitch = Ry * (PitchRange / 128.0);
+ Roll = (RollRange) ? RollRange * ((float)Rx / 128.0) : Rx;
+ Pitch = (PitchRange) ? PitchRange * ((float)Ry / 128.0) : Ry;
}
-
- // Adjustment to prevent a slightly to high angle
- if (Pitch >= PitchRange) Pitch = PitchRange - 0.1;
- if (Roll >= RollRange) Roll = RollRange - 0.1;
}
// Tilting Wiimote with keyboard
-void TiltWiimoteKeyboard(float &Roll, float &Pitch)
+void TiltWiimoteKeyboard(int &Roll, int &Pitch)
{
#ifdef _WIN32
if(IsKey(g_Wiimote_kbd.PITCH_L))
@@ -599,7 +590,7 @@ void TiltWiimoteKeyboard(float &Roll, float &Pitch)
else
{
Pitch = KbDegree;
- //DEBUG_LOG(WIIMOTE, "Degree: %2.1f", KbDegree);
+ //DEBUG_LOG(WIIMOTE, "Degree: %i", KbDegree);
}
#endif
}
@@ -607,11 +598,11 @@ void TiltWiimoteKeyboard(float &Roll, float &Pitch)
// Tilting Wiimote (Wario Land aiming, Mario Kart steering and other things)
void Tilt(u8 &_x, u8 &_y, u8 &_z)
{
- // Ceck if it's on
+ // Check if it's on
if (g_Config.Trigger.Type == g_Config.Trigger.TRIGGER_OFF) return;
// Set to zero
- float Roll = 0, Pitch = 0;
+ int Roll = 0, Pitch = 0;
// Select input method and return the x, y, x values
if (g_Config.Trigger.Type == g_Config.Trigger.KEYBOARD)
@@ -626,12 +617,7 @@ void Tilt(u8 &_x, u8 &_y, u8 &_z)
//PitchDegreeToAccelerometer(Roll, Pitch, _x, _y, _z, g_Config.Trigger.Roll, g_Config.Trigger.Pitch);
PitchDegreeToAccelerometer(Roll, Pitch, _x, _y, _z);
- if (g_DebugData)
- {
- /*DEBUG_LOG(WIIMOTE, "L:%2.1f R:%2.1f Lx:%2.1f Range:%2.1f Degree:%2.1f L:%i R:%i",
- Tl, Tr, Lx, Range, Degree, PadState[Page].Axis.Tl, PadState[Page].Axis.Tr);*/
- /*DEBUG_LOG(WIIMOTE, "Roll:%2.1f Pitch:%2.1f", Roll, Pitch);*/
- }
+ //DEBUG_LOG(WIIMOTE, "Roll:%i, Pitch:%i, _x:%i, _y:%i, _z:%i", Roll, Pitch, _x, _y, _z);
}
void FillReportAcc(wm_accel& _acc)