Implemented Nunchuck Roll/Pitch

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4702 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
ayuanx 2009-12-17 14:15:56 +00:00
parent b0ef811786
commit 7d1fdb85f3
11 changed files with 348 additions and 169 deletions

View File

@ -191,8 +191,8 @@ struct PadWiimote
}; };
struct PadNunchuck struct PadNunchuck
{ {
int keyForControls[7]; int keyForControls[11];
// Order is Z, C, L, R, U, D, Shake // Order is Z, C, L, R, U, D, RollL, RollR, PitchU, PitchD, Shake
}; };
struct PadClassicController struct PadClassicController
{ {

View File

@ -100,6 +100,10 @@ static const char* ncControlNames[] =
"NcR", "NcR",
"NcU", "NcU",
"NcD", "NcD",
"NcRollL",
"NcRollR",
"NcPitchU",
"NcPitchD",
"NcShake", "NcShake",
}; };
static int nCDefaultControls[] = static int nCDefaultControls[] =
@ -111,7 +115,11 @@ static int nCDefaultControls[] =
VK_NUMPAD6, VK_NUMPAD6,
VK_NUMPAD8, VK_NUMPAD8,
VK_NUMPAD5, VK_NUMPAD5,
VK_ADD VK_NUMPAD7,
VK_NUMPAD9,
VK_NUMPAD1,
VK_NUMPAD3,
VK_NUMPAD2
#elif defined(HAVE_X11) && HAVE_X11 #elif defined(HAVE_X11) && HAVE_X11
XK_KP_0, XK_KP_0,
XK_KP_Decimal, XK_KP_Decimal,
@ -119,9 +127,13 @@ static int nCDefaultControls[] =
XK_KP_6, XK_KP_6,
XK_KP_8, XK_KP_8,
XK_KP_5, XK_KP_5,
XK_KP_Add XK_KP_7,
XK_KP_9,
XK_KP_1,
XK_KP_3,
XK_KP_2
#else #else
0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0
#endif #endif
}; };
@ -288,7 +300,8 @@ void Config::Load(bool ChangePad)
sprintf(SectionName, "Wiimote%i", i + 1); sprintf(SectionName, "Wiimote%i", i + 1);
iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false); iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false);
iniFile.Get(SectionName, "TiltType", &Tilt.Type, Tilt.KEYBOARD); iniFile.Get(SectionName, "TiltTypeWM", &Tilt.TypeWM, Tilt.KEYBOARD);
iniFile.Get(SectionName, "TiltTypeNC", &Tilt.TypeNC, Tilt.KEYBOARD);
iniFile.Get(SectionName, "TiltRollSwing", &Tilt.Range.RollSwing, false); iniFile.Get(SectionName, "TiltRollSwing", &Tilt.Range.RollSwing, false);
iniFile.Get(SectionName, "TiltRollDegree", &Tilt.Range.RollDegree, 60); iniFile.Get(SectionName, "TiltRollDegree", &Tilt.Range.RollDegree, 60);
Tilt.Range.Roll = (Tilt.Range.RollSwing) ? 0 : Tilt.Range.RollDegree; Tilt.Range.Roll = (Tilt.Range.RollSwing) ? 0 : Tilt.Range.RollDegree;
@ -375,7 +388,7 @@ void Config::Save(int Slot)
{ {
IniFile iniFile; IniFile iniFile;
iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini"); iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini");
// iniFile.Set("Settings", "InputActive", bInputActive); iniFile.Set("Settings", "InputActive", bInputActive);
iniFile.Set("Settings", "Sideways", bSideways); iniFile.Set("Settings", "Sideways", bSideways);
iniFile.Set("Settings", "Upright", bUpright); iniFile.Set("Settings", "Upright", bUpright);
iniFile.Set("Settings", "MotionPlusConnected", bMotionPlusConnected); iniFile.Set("Settings", "MotionPlusConnected", bMotionPlusConnected);
@ -398,7 +411,8 @@ void Config::Save(int Slot)
sprintf(SectionName, "Wiimote%i", i + 1); sprintf(SectionName, "Wiimote%i", i + 1);
iniFile.Set(SectionName, "NoTriggerFilter", bNoTriggerFilter); iniFile.Set(SectionName, "NoTriggerFilter", bNoTriggerFilter);
iniFile.Set(SectionName, "TiltType", Tilt.Type);; iniFile.Set(SectionName, "TiltTypeWM", Tilt.TypeWM);
iniFile.Set(SectionName, "TiltTypeNC", Tilt.TypeNC);
iniFile.Set(SectionName, "TiltRollDegree", Tilt.Range.RollDegree); iniFile.Set(SectionName, "TiltRollDegree", Tilt.Range.RollDegree);
iniFile.Set(SectionName, "TiltRollSwing", Tilt.Range.RollSwing); iniFile.Set(SectionName, "TiltRollSwing", Tilt.Range.RollSwing);
iniFile.Set(SectionName, "TiltRollInvert", Tilt.RollInvert); iniFile.Set(SectionName, "TiltRollInvert", Tilt.RollInvert);

View File

@ -24,7 +24,7 @@
#define AN_CONTROLS 6 #define AN_CONTROLS 6
#define WM_CONTROLS 16 #define WM_CONTROLS 16
#define NC_CONTROLS 7 #define NC_CONTROLS 11
#define CC_CONTROLS 23 #define CC_CONTROLS 23
#define GH3_CONTROLS 14 #define GH3_CONTROLS 14
@ -61,7 +61,8 @@ struct Config
ANALOG2, ANALOG2,
TRIGGER TRIGGER
}; };
int Type; int TypeWM;
int TypeNC;
bool RollInvert; bool RollInvert;
bool PitchInvert; bool PitchInvert;
TiltRange Range; TiltRange Range;

View File

@ -132,7 +132,8 @@ void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller)
m_RumbleStrength[controller]->SetSelection(WiiMoteEmu::PadMapping[controller].RumbleStrength); m_RumbleStrength[controller]->SetSelection(WiiMoteEmu::PadMapping[controller].RumbleStrength);
m_TriggerType[controller]->SetSelection(WiiMoteEmu::PadMapping[controller].triggertype); m_TriggerType[controller]->SetSelection(WiiMoteEmu::PadMapping[controller].triggertype);
m_TiltComboInput[controller]->SetSelection(g_Config.Tilt.Type); m_TiltTypeWM[controller]->SetSelection(g_Config.Tilt.TypeWM);
m_TiltTypeNC[controller]->SetSelection(g_Config.Tilt.TypeNC);
m_TiltComboRangeRoll[controller]->SetSelection(g_Config.Tilt.Range.RollDegree / 5 - 1); // 5 to 180, step 5 m_TiltComboRangeRoll[controller]->SetSelection(g_Config.Tilt.Range.RollDegree / 5 - 1); // 5 to 180, step 5
m_TiltComboRangePitch[controller]->SetSelection(g_Config.Tilt.Range.PitchDegree / 5 - 1); // 5 to 180, step 5 m_TiltComboRangePitch[controller]->SetSelection(g_Config.Tilt.Range.PitchDegree / 5 - 1); // 5 to 180, step 5
m_TiltRollSwing[controller]->SetValue(g_Config.Tilt.Range.RollSwing); m_TiltRollSwing[controller]->SetValue(g_Config.Tilt.Range.RollSwing);

View File

@ -45,7 +45,8 @@ BEGIN_EVENT_TABLE(WiimotePadConfigDialog,wxDialog)
EVT_COMBOBOX(IDC_DEAD_ZONE_RIGHT, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(IDC_DEAD_ZONE_RIGHT, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_COMBOBOX(IDC_STICK_DIAGONAL, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(IDC_STICK_DIAGONAL, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_CHECKBOX(IDC_STICK_C2S, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(IDC_STICK_C2S, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_COMBOBOX(IDC_TILT_INPUT, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(IDC_TILT_TYPE_WM, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_COMBOBOX(IDC_TILT_TYPE_NC, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_COMBOBOX(IDC_TILT_ROLL, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(IDC_TILT_ROLL, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_CHECKBOX(IDC_TILT_ROLL_SWING, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(IDC_TILT_ROLL_SWING, WiimotePadConfigDialog::GeneralSettingsChanged)
EVT_COMBOBOX(IDC_TILT_PITCH, WiimotePadConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(IDC_TILT_PITCH, WiimotePadConfigDialog::GeneralSettingsChanged)
@ -79,6 +80,8 @@ BEGIN_EVENT_TABLE(WiimotePadConfigDialog,wxDialog)
EVT_BUTTON(IDB_NC_Z, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_C, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_Z, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_C, WiimotePadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_NC_L, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_R, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_L, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_R, WiimotePadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_NC_U, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_D, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_U, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_D, WiimotePadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_NC_ROLL_L, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_ROLL_R, WiimotePadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_NC_PITCH_U, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_PITCH_D, WiimotePadConfigDialog::OnButtonClick)
EVT_BUTTON(IDB_NC_SHAKE, WiimotePadConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_SHAKE, WiimotePadConfigDialog::OnButtonClick)
// Classic Controller // Classic Controller
@ -445,6 +448,10 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
wxT("Right"), wxT("Right"),
wxT("Up"), wxT("Up"),
wxT("Down"), wxT("Down"),
wxT("Roll Left"),
wxT("Roll Right"),
wxT("Pitch Up"),
wxT("Pitch Down"),
wxT("Shake"), wxT("Shake"),
}; };
@ -567,42 +574,55 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
m_gJoyPad[i]->AddStretchSpacer(); m_gJoyPad[i]->AddStretchSpacer();
// Tilt Wiimote // Tilt Wiimote
m_TiltComboInput[i] = new wxComboBox(m_Controller[i], IDC_TILT_INPUT, StrTilt[0], wxDefaultPosition, wxSize(80, -1), StrTilt, wxCB_READONLY); m_tTiltTypeWM[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Wiimote"));
m_TiltComboInput[i]->SetSelection(g_Config.Tilt.Type); m_tTiltTypeNC[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Nunchuck"));
m_TiltComboInput[i]->SetToolTip(wxT("Control tilting by keyboard or analog stick or trigger"));
m_TiltTextRoll[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Roll L/R")); m_TiltTypeWM[i] = new wxComboBox(m_Controller[i], IDC_TILT_TYPE_WM, StrTilt[0], wxDefaultPosition, wxSize(70, -1), StrTilt, wxCB_READONLY);
m_TiltTextPitch[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Pitch U/D")); m_TiltTypeWM[i]->SetSelection(g_Config.Tilt.TypeWM);
m_TiltTypeWM[i]->SetToolTip(wxT("Control Wiimote tilting by keyboard or stick or trigger"));
m_TiltComboRangeRoll[i] = new wxComboBox(m_Controller[i], IDC_TILT_ROLL, StrTiltRangeRoll[0], wxDefaultPosition, wxSize(40, -1), StrTiltRangeRoll, wxCB_READONLY); m_TiltTypeNC[i] = new wxComboBox(m_Controller[i], IDC_TILT_TYPE_NC, StrTilt[0], wxDefaultPosition, wxSize(70, -1), StrTilt, wxCB_READONLY);
m_TiltTypeNC[i]->SetSelection(g_Config.Tilt.TypeNC);
m_TiltTypeNC[i]->SetToolTip(wxT("Control Nunchuck tilting by keyboard or stick or trigger"));
m_TiltTextRoll[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Roll Left/Right"));
m_TiltTextPitch[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Pitch Up/Down"));
m_TiltComboRangeRoll[i] = new wxComboBox(m_Controller[i], IDC_TILT_ROLL, StrTiltRangeRoll[0], wxDefaultPosition, wxSize(50, -1), StrTiltRangeRoll, wxCB_READONLY);
m_TiltComboRangeRoll[i]->SetValue(wxString::Format(wxT("%i"), g_Config.Tilt.Range.Roll)); m_TiltComboRangeRoll[i]->SetValue(wxString::Format(wxT("%i"), g_Config.Tilt.Range.Roll));
m_TiltComboRangeRoll[i]->SetToolTip(wxT("The maximum Left/Righ Roll in degrees")); m_TiltComboRangeRoll[i]->SetToolTip(wxT("The maximum Left/Righ Roll in degrees"));
m_TiltComboRangePitch[i] = new wxComboBox(m_Controller[i], IDC_TILT_PITCH, StrTiltRangePitch[0], wxDefaultPosition, wxSize(40, -1), StrTiltRangePitch, wxCB_READONLY); m_TiltComboRangePitch[i] = new wxComboBox(m_Controller[i], IDC_TILT_PITCH, StrTiltRangePitch[0], wxDefaultPosition, wxSize(50, -1), StrTiltRangePitch, wxCB_READONLY);
m_TiltComboRangePitch[i]->SetValue(wxString::Format(wxT("%i"), g_Config.Tilt.Range.Pitch)); m_TiltComboRangePitch[i]->SetValue(wxString::Format(wxT("%i"), g_Config.Tilt.Range.Pitch));
m_TiltComboRangePitch[i]->SetToolTip(wxT("The maximum Up/Down Pitch in degrees")); m_TiltComboRangePitch[i]->SetToolTip(wxT("The maximum Up/Down Pitch in degrees"));
m_TiltRollSwing[i] = new wxCheckBox(m_Controller[i], IDC_TILT_ROLL_SWING, wxT("Swing")); m_TiltRollSwing[i] = new wxCheckBox(m_Controller[i], IDC_TILT_ROLL_SWING, wxT("Swing"));
m_TiltRollSwing[i]->SetToolTip(wxT("Emulate Left/Right Swing instead of Left/Right Roll")); m_TiltRollSwing[i]->SetToolTip(wxT("Emulate Swing Left/Right instead of Roll Left/Right"));
m_TiltPitchSwing[i] = new wxCheckBox(m_Controller[i], IDC_TILT_PITCH_SWING, wxT("Swing")); m_TiltPitchSwing[i] = new wxCheckBox(m_Controller[i], IDC_TILT_PITCH_SWING, wxT("Swing"));
m_TiltPitchSwing[i]->SetToolTip(wxT("Emulate Up/Down Swing instead of Up/Down Pitch")); m_TiltPitchSwing[i]->SetToolTip(wxT("Emulate Swing Up/Down instead of Pitch Up/Down"));
m_TiltRollInvert[i] = new wxCheckBox(m_Controller[i], IDC_TILT_ROLL_INVERT, wxT("Invert")); m_TiltRollInvert[i] = new wxCheckBox(m_Controller[i], IDC_TILT_ROLL_INVERT, wxT("Invert"));
m_TiltRollInvert[i]->SetToolTip(wxT("Invert Left/Right direction")); m_TiltRollInvert[i]->SetToolTip(wxT("Invert Left/Right direction (only effective for stick and trigger)"));
m_TiltPitchInvert[i] = new wxCheckBox(m_Controller[i], IDC_TILT_PITCH_INVERT, wxT("Invert")); m_TiltPitchInvert[i] = new wxCheckBox(m_Controller[i], IDC_TILT_PITCH_INVERT, wxT("Invert"));
m_TiltPitchInvert[i]->SetToolTip(wxT("Invert Up/Down direction")); m_TiltPitchInvert[i]->SetToolTip(wxT("Invert Up/Down direction (only effective for stick and trigger)"));
// Sizers // Sizers
m_sTiltType[i] = new wxBoxSizer(wxHORIZONTAL);
m_sTiltType[i]->Add(m_tTiltTypeWM[i], 0, wxEXPAND | (wxUP | wxDOWN | wxRIGHT), 4);
m_sTiltType[i]->Add(m_TiltTypeWM[i], 0, wxEXPAND | (wxDOWN | wxRIGHT), 4);
m_sTiltType[i]->Add(m_tTiltTypeNC[i], 0, wxEXPAND | (wxUP | wxDOWN | wxLEFT), 4);
m_sTiltType[i]->Add(m_TiltTypeNC[i], 0, wxEXPAND | (wxDOWN | wxLEFT), 4);
m_sGridTilt[i] = new wxGridBagSizer(0, 0); m_sGridTilt[i] = new wxGridBagSizer(0, 0);
m_sGridTilt[i]->Add(m_TiltTextRoll[i], wxGBPosition(0, 0), wxGBSpan(1, 1), (wxTOP), 4); m_sGridTilt[i]->Add(m_TiltTextRoll[i], wxGBPosition(0, 0), wxGBSpan(1, 1), (wxUP | wxRIGHT), 4);
m_sGridTilt[i]->Add(m_TiltRollInvert[i], wxGBPosition(1, 0), wxGBSpan(1, 1), (wxTOP), 4);
m_sGridTilt[i]->Add(m_TiltComboRangeRoll[i], wxGBPosition(0, 1), wxGBSpan(1, 1), (wxLEFT | wxRIGHT), 4); m_sGridTilt[i]->Add(m_TiltComboRangeRoll[i], wxGBPosition(0, 1), wxGBSpan(1, 1), (wxLEFT | wxRIGHT), 4);
m_sGridTilt[i]->Add(m_TiltRollSwing[i], wxGBPosition(1, 1), wxGBSpan(1, 1), (wxTOP | wxLEFT | wxRIGHT), 4); m_sGridTilt[i]->Add(m_TiltRollSwing[i], wxGBPosition(0, 2), wxGBSpan(1, 1), (wxUP | wxLEFT | wxRIGHT), 4);
m_sGridTilt[i]->Add(m_TiltTextPitch[i], wxGBPosition(0, 2), wxGBSpan(1, 1), (wxLEFT | wxTOP), 4); m_sGridTilt[i]->Add(m_TiltRollInvert[i], wxGBPosition(0, 3), wxGBSpan(1, 1), (wxUP | wxLEFT), 4);
m_sGridTilt[i]->Add(m_TiltPitchInvert[i], wxGBPosition(1, 2), wxGBSpan(1, 1), (wxLEFT | wxTOP), 4); m_sGridTilt[i]->Add(m_TiltTextPitch[i], wxGBPosition(1, 0), wxGBSpan(1, 1), (wxUP | wxRIGHT), 4);
m_sGridTilt[i]->Add(m_TiltComboRangePitch[i], wxGBPosition(0, 3), wxGBSpan(1, 1), (wxLEFT), 4); m_sGridTilt[i]->Add(m_TiltComboRangePitch[i], wxGBPosition(1, 1), wxGBSpan(1, 1), (wxLEFT | wxRIGHT), 4);
m_sGridTilt[i]->Add(m_TiltPitchSwing[i], wxGBPosition(1, 3), wxGBSpan(1, 1), (wxLEFT | wxTOP), 4); m_sGridTilt[i]->Add(m_TiltPitchSwing[i], wxGBPosition(1, 2), wxGBSpan(1, 1), (wxUP | wxLEFT | wxRIGHT), 4);
m_sGridTilt[i]->Add(m_TiltPitchInvert[i], wxGBPosition(1, 3), wxGBSpan(1, 1), (wxUP | wxLEFT), 4);
m_gTilt[i] = new wxStaticBoxSizer (wxVERTICAL, m_Controller[i], wxT("Tilt and Swing")); m_gTilt[i] = new wxStaticBoxSizer (wxVERTICAL, m_Controller[i], wxT("Tilt and Swing"));
m_gTilt[i]->AddStretchSpacer(); m_gTilt[i]->AddStretchSpacer();
m_gTilt[i]->Add(m_TiltComboInput[i], 0, wxEXPAND | (wxLEFT | wxRIGHT | wxDOWN), 5); m_gTilt[i]->Add(m_sTiltType[i], 0, wxEXPAND | (wxLEFT | wxDOWN), 5);
m_gTilt[i]->Add(m_sGridTilt[i], 0, wxEXPAND | (wxLEFT), 5); m_gTilt[i]->Add(m_sGridTilt[i], 0, wxEXPAND | (wxLEFT), 5);
m_gTilt[i]->AddStretchSpacer(); m_gTilt[i]->AddStretchSpacer();
@ -735,9 +755,8 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
} }
m_gWiimote[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Wiimote")); m_gWiimote[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Wiimote"));
m_gWiimote[i]->Add(m_sWmVertLeft[i], 0, wxALIGN_RIGHT | (wxALL), 0); m_gWiimote[i]->Add(m_sWmVertLeft[i], 0, (wxLEFT | wxRIGHT | wxDOWN), 1);
m_gWiimote[i]->Add(m_sWmVertRight[i], 0, wxALIGN_RIGHT | (wxLEFT), 5); m_gWiimote[i]->Add(m_sWmVertRight[i], 0, (wxLEFT | wxRIGHT | wxDOWN), 1);
m_gWiimote[i]->AddSpacer(1);
// Extension Mapping // Extension Mapping
if(g_Config.iExtensionConnected == EXT_NUNCHUCK) if(g_Config.iExtensionConnected == EXT_NUNCHUCK)
@ -746,14 +765,6 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
m_NunchuckTextStick[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Stick")); m_NunchuckTextStick[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Stick"));
m_NunchuckComboStick[i] = new wxComboBox(m_Controller[i], IDC_NUNCHUCK_STICK, StrNunchuck[0], wxDefaultPosition, wxSize(70, -1), StrNunchuck, wxCB_READONLY); m_NunchuckComboStick[i] = new wxComboBox(m_Controller[i], IDC_NUNCHUCK_STICK, StrNunchuck[0], wxDefaultPosition, wxSize(70, -1), StrNunchuck, wxCB_READONLY);
m_NunchuckComboStick[i]->SetSelection(g_Config.Nunchuck.Type); m_NunchuckComboStick[i]->SetSelection(g_Config.Nunchuck.Type);
m_sNunchuckStick[i] = new wxBoxSizer(wxHORIZONTAL);
m_sNunchuckStick[i]->Add(m_NunchuckTextStick[i], 0, (wxUP), 4);
m_sNunchuckStick[i]->Add(m_NunchuckComboStick[i], 0, (wxLEFT), 2);
m_gNunchuck[i] = new wxStaticBoxSizer (wxVERTICAL, m_Controller[i], wxT("Nunchuck"));
m_gNunchuck[i]->Add(m_sNunchuckStick[i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 2);
m_gNunchuck[i]->AddSpacer(2);
for (int x = 0; x < NC_CONTROLS; x++) for (int x = 0; x < NC_CONTROLS; x++)
{ {
@ -761,10 +772,30 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
m_Button_NunChuck[x][i] = new wxButton(m_Controller[i], x + IDB_NC_Z, wxEmptyString, wxDefaultPosition, wxSize(BtW, BtH)); m_Button_NunChuck[x][i] = new wxButton(m_Controller[i], x + IDB_NC_Z, wxEmptyString, wxDefaultPosition, wxSize(BtW, BtH));
m_Button_NunChuck[x][i]->SetFont(m_SmallFont); m_Button_NunChuck[x][i]->SetFont(m_SmallFont);
m_Sizer_NunChuck[x][i] = new wxBoxSizer(wxHORIZONTAL); m_Sizer_NunChuck[x][i] = new wxBoxSizer(wxHORIZONTAL);
m_Sizer_NunChuck[x][i]->Add(m_statictext_NunChuck[x][i], 0, wxALIGN_RIGHT | (wxUP), 4); m_Sizer_NunChuck[x][i]->Add(m_statictext_NunChuck[x][i], 0, (wxUP), 4);
m_Sizer_NunChuck[x][i]->Add(m_Button_NunChuck[x][i], 0, wxALIGN_RIGHT | (wxLEFT), 2); m_Sizer_NunChuck[x][i]->Add(m_Button_NunChuck[x][i], 0, (wxLEFT), 2);
m_gNunchuck[i]->Add(m_Sizer_NunChuck[x][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
} }
// Sizers
m_sNunchuckStick[i] = new wxBoxSizer(wxHORIZONTAL);
m_sNunchuckStick[i]->Add(m_NunchuckTextStick[i], 0, (wxUP), 4);
m_sNunchuckStick[i]->Add(m_NunchuckComboStick[i], 0, (wxLEFT), 2);
m_sNCVertLeft[i] = new wxBoxSizer(wxVERTICAL);
m_sNCVertRight[i] = new wxBoxSizer(wxVERTICAL);
m_sNCVertRight[i]->Add(m_sNunchuckStick[i], 0, wxALIGN_RIGHT | (wxALL), 2);
m_sNCVertRight[i]->AddSpacer(2);
for (int x = IDB_NC_Z; x <= IDB_NC_SHAKE; x++)
if (x < IDB_NC_ROLL_L) // Make some balance
m_sNCVertLeft[i]->Add(m_Sizer_NunChuck[x - IDB_NC_Z][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
else
m_sNCVertRight[i]->Add(m_Sizer_NunChuck[x - IDB_NC_Z][i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
m_gNunchuck[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Nunchuck"));
m_gNunchuck[i]->Add(m_sNCVertLeft[i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
m_gNunchuck[i]->Add(m_sNCVertRight[i], 0, wxALIGN_RIGHT | (wxLEFT | wxRIGHT | wxDOWN), 1);
} }
else if(g_Config.iExtensionConnected == EXT_CLASSIC_CONTROLLER) else if(g_Config.iExtensionConnected == EXT_CLASSIC_CONTROLLER)
{ {
@ -834,7 +865,7 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
else if(g_Config.iExtensionConnected == EXT_GUITARHERO3_CONTROLLER) else if(g_Config.iExtensionConnected == EXT_GUITARHERO3_CONTROLLER)
{ {
// Stick controls // Stick controls
m_tGH3Analog[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Joystick")); m_tGH3Analog[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Stick"));
m_GH3ComboAnalog[i] = new wxComboBox(m_Controller[i], IDC_GH3_ANALOG, StrAnalogArray[0], wxDefaultPosition, wxSize(70, -1), StrAnalogArray, wxCB_READONLY); m_GH3ComboAnalog[i] = new wxComboBox(m_Controller[i], IDC_GH3_ANALOG, StrAnalogArray[0], wxDefaultPosition, wxSize(70, -1), StrAnalogArray, wxCB_READONLY);
m_GH3ComboAnalog[i]->SetSelection(g_Config.GH3Controller.AType); m_GH3ComboAnalog[i]->SetSelection(g_Config.GH3Controller.AType);
@ -938,8 +969,11 @@ void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
case IDC_JOYNAME: case IDC_JOYNAME:
DoChangeJoystick(); DoChangeJoystick();
break; break;
case IDC_TILT_INPUT: case IDC_TILT_TYPE_WM:
g_Config.Tilt.Type = m_TiltComboInput[Page]->GetSelection(); g_Config.Tilt.TypeWM = m_TiltTypeWM[Page]->GetSelection();
break;
case IDC_TILT_TYPE_NC:
g_Config.Tilt.TypeNC = m_TiltTypeNC[Page]->GetSelection();
break; break;
case IDC_TILT_ROLL: case IDC_TILT_ROLL:
case IDC_TILT_ROLL_SWING: case IDC_TILT_ROLL_SWING:

View File

@ -112,7 +112,8 @@ class WiimotePadConfigDialog : public wxDialog
*m_ComboDeadZoneRight[4], *m_ComboDeadZoneRight[4],
*m_ComboDiagonal[4], *m_ComboDiagonal[4],
*m_RumbleStrength[4], *m_RumbleStrength[4],
*m_TiltComboInput[4], *m_TiltTypeWM[4],
*m_TiltTypeNC[4],
*m_TiltComboRangeRoll[4], *m_TiltComboRangeRoll[4],
*m_TiltComboRangePitch[4], *m_TiltComboRangePitch[4],
*m_TriggerType[4], *m_TriggerType[4],
@ -136,6 +137,7 @@ class WiimotePadConfigDialog : public wxDialog
*m_sC2SDeadZone[4], *m_sC2SDeadZone[4],
*m_sJoyname[4], *m_sJoyname[4],
*m_sRumble[4], *m_sRumble[4],
*m_sTiltType[4],
*m_sHorizController[4], *m_sHorizController[4],
*m_sHorizStatus[4], *m_sHorizStatus[4],
*m_Sizer_Analog[AN_CONTROLS][4], *m_Sizer_Analog[AN_CONTROLS][4],
@ -148,6 +150,8 @@ class WiimotePadConfigDialog : public wxDialog
*m_sWmVertRight[4], *m_sWmVertRight[4],
*m_Sizer_NunChuck[NC_CONTROLS][4], *m_Sizer_NunChuck[NC_CONTROLS][4],
*m_sNunchuckStick[4], *m_sNunchuckStick[4],
*m_sNCVertLeft[4],
*m_sNCVertRight[4],
*m_Sizer_Classic[CC_CONTROLS][4], *m_Sizer_Classic[CC_CONTROLS][4],
*m_sCcLeftStick[4], *m_sCcLeftStick[4],
*m_sCcRightStick[4], *m_sCcRightStick[4],
@ -175,6 +179,7 @@ class WiimotePadConfigDialog : public wxDialog
wxStaticText *m_ComboDeadZoneLabel[4], wxStaticText *m_ComboDeadZoneLabel[4],
*m_DiagonalLabel[4], *m_DiagonalLabel[4],
*m_RumbleStrengthLabel[4], *m_RumbleStrengthLabel[4],
*m_tTiltTypeWM[4], *m_tTiltTypeNC[4],
*m_TiltTextRoll[4], *m_TiltTextPitch[4], *m_TiltTextRoll[4], *m_TiltTextPitch[4],
*m_tStatusLeftIn[4], *m_tStatusLeftOut[4], *m_tStatusRightIn[4], *m_tStatusRightOut[4], *m_tStatusLeftIn[4], *m_tStatusLeftOut[4], *m_tStatusRightIn[4], *m_tStatusRightOut[4],
*m_TriggerL[4], *m_TriggerR[4], *m_TriggerL[4], *m_TriggerR[4],
@ -225,6 +230,8 @@ class WiimotePadConfigDialog : public wxDialog
IDB_NC_R, IDB_NC_R,
IDB_NC_U, IDB_NC_U,
IDB_NC_D, IDB_NC_D,
IDB_NC_ROLL_L, IDB_NC_ROLL_R,
IDB_NC_PITCH_U, IDB_NC_PITCH_D,
IDB_NC_SHAKE, IDB_NC_SHAKE,
// Classic Controller // Classic Controller
@ -257,7 +264,7 @@ class WiimotePadConfigDialog : public wxDialog
IDC_RUMBLE, IDC_RUMBLE_STRENGTH, IDC_RUMBLE, IDC_RUMBLE_STRENGTH,
IDC_DEAD_ZONE_LEFT, IDC_DEAD_ZONE_RIGHT, IDC_DEAD_ZONE_LEFT, IDC_DEAD_ZONE_RIGHT,
IDC_STICK_DIAGONAL, IDC_STICK_C2S, IDC_STICK_DIAGONAL, IDC_STICK_C2S,
IDC_TILT_INPUT, IDC_TILT_TYPE_WM, IDC_TILT_TYPE_NC,
IDC_TILT_ROLL, IDC_TILT_ROLL_SWING, IDC_TILT_ROLL, IDC_TILT_ROLL_SWING,
IDC_TILT_PITCH, IDC_TILT_PITCH_SWING, IDC_TILT_PITCH, IDC_TILT_PITCH_SWING,
IDC_TILT_ROLL_INVERT, IDC_TILT_PITCH_INVERT, IDC_TILT_ROLL_INVERT, IDC_TILT_PITCH_INVERT,

View File

@ -63,13 +63,6 @@ std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
InputCommon::CONTROLLER_STATE_NEW PadState[4]; InputCommon::CONTROLLER_STATE_NEW PadState[4];
InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4]; InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];
// Shake emulation
ShakeData::ShakeData() {
Shake = 0;
Roll = 0;
Pitch = 0;
}
// Keyboard input // Keyboard input
KeyboardWiimote g_Wiimote_kbd; KeyboardWiimote g_Wiimote_kbd;
KeyboardNunchuck g_NunchuckExt; KeyboardNunchuck g_NunchuckExt;

View File

@ -171,12 +171,20 @@ struct SIR
int Distance; int Distance;
}; };
class ShakeData struct STiltData
{ {
public: // FakeNoise is used to prevent disconnection
ShakeData(); // when there is no input for a long time
int FakeNoise;
int Shake; int Shake;
int Roll, Pitch; int Roll, Pitch;
STiltData()
{
FakeNoise = 1;
Shake = 0;
Roll = 0;
Pitch = 0;
}
}; };
@ -199,9 +207,10 @@ struct KeyboardWiimote
// Raw X and Y coordinate and processed X and Y coordinates // Raw X and Y coordinate and processed X and Y coordinates
SIR IR; SIR IR;
ShakeData shakeData; STiltData TiltData;
}; };
extern KeyboardWiimote g_Wiimote_kbd; extern KeyboardWiimote g_Wiimote_kbd;
struct KeyboardNunchuck struct KeyboardNunchuck
{ {
enum EKeyboardNunchuck enum EKeyboardNunchuck
@ -214,12 +223,16 @@ struct KeyboardNunchuck
#endif #endif
C, C,
L, R, U, D, L, R, U, D,
ROLL_L, ROLL_R,
PITCH_U, PITCH_D,
SHAKE, SHAKE,
LAST_CONSTANT LAST_CONSTANT
}; };
ShakeData shakeData;
STiltData TiltData;
}; };
extern KeyboardNunchuck g_NunchuckExt; extern KeyboardNunchuck g_NunchuckExt;
struct KeyboardClassicController struct KeyboardClassicController
{ {
enum EKeyboardClassicController enum EKeyboardClassicController
@ -228,7 +241,7 @@ struct KeyboardClassicController
#ifdef _WIN32 #ifdef _WIN32
A = g_NunchuckExt.LAST_CONSTANT, A = g_NunchuckExt.LAST_CONSTANT,
#else #else
A = 25, A = 29,
#endif #endif
B, X, Y, B, X, Y,
P, M, H, P, M, H,
@ -249,7 +262,7 @@ struct KeyboardGH3GLP
#ifdef _WIN32 #ifdef _WIN32
Green = g_ClassicContExt.LAST_CONSTANT, Green = g_ClassicContExt.LAST_CONSTANT,
#else #else
Green = 48, Green = 52,
#endif #endif
Red, Yellow, Blue, Orange, Red, Yellow, Blue, Orange,
Plus, Minus, Whammy, Plus, Minus, Whammy,

View File

@ -89,13 +89,16 @@ void AdjustAngles(int &Roll, int &Pitch)
// Angles to accelerometer values // Angles to accelerometer values
void PitchDegreeToAccelerometer(int _Roll, int _Pitch, int &_x, int &_y, int &_z) void TiltToAccelerometer(int &_x, int &_y, int &_z, STiltData &_TiltData)
{ {
if (_TiltData.Roll == 0 && _TiltData.Pitch == 0)
return;
// We need radiands for the math functions // We need radiands for the math functions
float Roll = InputCommon::Deg2Rad((float)_Roll); float Roll = InputCommon::Deg2Rad((float)_TiltData.Roll);
float Pitch = InputCommon::Deg2Rad((float)_Pitch); float Pitch = InputCommon::Deg2Rad((float)_TiltData.Pitch);
// We need float values // We need float values
float x = 0.0f, y = 0.0f, z = 0.0f; float x = 0.0f, y = 0.0f, z = 1.0f; // Gravity
// In these cases we can use the simple and accurate formula // In these cases we can use the simple and accurate formula
if(g_Config.Tilt.Range.Roll && g_Config.Tilt.Range.Pitch == 0) if(g_Config.Tilt.Range.Roll && g_Config.Tilt.Range.Pitch == 0)
@ -155,14 +158,14 @@ void PitchDegreeToAccelerometer(int _Roll, int _Pitch, int &_x, int &_y, int &_z
// Direct mapping for swing, from analog stick to accelerometer // Direct mapping for swing, from analog stick to accelerometer
if (g_Config.Tilt.Range.Roll == 0) if (g_Config.Tilt.Range.Roll == 0)
{ {
_x -= _Roll; _x -= _TiltData.Roll;
} }
if (g_Config.Tilt.Range.Pitch == 0) if (g_Config.Tilt.Range.Pitch == 0)
{ {
if (!g_Config.bUpright) if (!g_Config.bUpright)
_z -= _Pitch; _z -= _TiltData.Pitch;
else // Upright wiimote else // Upright wiimote
_y += _Pitch; _y += _TiltData.Pitch;
} }
} }

View File

@ -58,13 +58,14 @@ void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONT
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr); void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr);
// Accelerometer // Accelerometer
void PitchDegreeToAccelerometer(int _Roll, int _Pitch, int &_x, int &_y, int &_z);
void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, int&, int&); void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, int&, int&);
float AccelerometerToG(float Current, float Neutral, float G); float AccelerometerToG(float Current, float Neutral, float G);
void Tilt(int &_x, int &_y, int &_z); void ShakeToAccelerometer(int &_x, int &_y, int &_z, STiltData &_TiltData);
void TiltToAccelerometer(int &_x, int &_y, int &_z, STiltData &_TiltData);
void AdjustAngles(int &Roll, int &Pitch); void AdjustAngles(int &Roll, int &Pitch);
// IR data // IR data
void RotateIRDots(int &_x, int &_y, STiltData &_TiltData);
void IRData2Dots(u8 *Data); void IRData2Dots(u8 *Data);
void IRData2DotsBasic(u8 *Data); void IRData2DotsBasic(u8 *Data);
void ReorderIRDots(); void ReorderIRDots();

View File

@ -433,20 +433,14 @@ Y |. .|| Z
*/ */
void StartShake(ShakeData &shakeData) {
if (shakeData.Shake <= 0) shakeData.Shake = 1;
}
// Single shake step of all three directions // Single shake step of all three directions
void SingleShake(int &_x, int &_y, int &_z, ShakeData &shakeData) void ShakeToAccelerometer(int &_x, int &_y, int &_z, STiltData &_TiltData)
{ {
// if (shakeData.Shake == 0) switch(_TiltData.Shake)
// {
// if((wm == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (wm == 1 && IsKey(g_NunchuckExt.SHAKE)))
// Shake[wm] = 1;
// }
switch(shakeData.Shake)
{ {
case 0:
_TiltData.Shake = -1;
break;
case 1: case 1:
case 3: case 3:
_x = g_wm.cal_zero.x / 2; _x = g_wm.cal_zero.x / 2;
@ -475,18 +469,21 @@ void SingleShake(int &_x, int &_y, int &_z, ShakeData &shakeData)
_z = 0x80; _z = 0x80;
break; break;
default: default:
shakeData.Shake = -1; _TiltData.Shake = -1;
break; break;
} }
shakeData.Shake++; _TiltData.Shake++;
//if (Shake[wm] != 0) DEBUG_LOG(WIIMOTE, "Shake: %i - 0x%02x, 0x%02x, 0x%02x", Shake[wm], _x, _y, _z);
if (_TiltData.Shake != 0)
{
DEBUG_LOG(WIIMOTE, "Shake: %i - 0x%02x, 0x%02x, 0x%02x", _TiltData.Shake, _x, _y, _z);
}
} }
/* Tilting by gamepad. We can guess that the game will calculate
/* Tilting Wiimote with gamepad. We can guess that the game will calculate a roll and pitch and use them as measures of the tilting. We are
Wiimote pitch and use it as a measure of the tilting of the Wiimote. We are
interested in this tilting range 90 to -90*/ interested in this tilting range 90 to -90*/
void TiltWiimoteGamepad(int &Roll, int &Pitch) void TiltByGamepad(STiltData &_TiltData, int Type)
{ {
// Return if we have no pads // Return if we have no pads
if (NumGoodPads == 0) return; if (NumGoodPads == 0) return;
@ -508,7 +505,7 @@ void TiltWiimoteGamepad(int &Roll, int &Pitch)
int &PitchRange = g_Config.Tilt.Range.Pitch; int &PitchRange = g_Config.Tilt.Range.Pitch;
// The trigger currently only controls pitch, no roll, no free swing // The trigger currently only controls pitch, no roll, no free swing
if (g_Config.Tilt.Type == g_Config.Tilt.TRIGGER) if (Type == g_Config.Tilt.TRIGGER)
{ {
// Make the range the same dimension as the analog stick // Make the range the same dimension as the analog stick
Tl = Tl / 2; Tl = Tl / 2;
@ -516,13 +513,13 @@ void TiltWiimoteGamepad(int &Roll, int &Pitch)
// Invert // Invert
if (g_Config.Tilt.PitchInvert) { Tl = -Tl; Tr = -Tr; } if (g_Config.Tilt.PitchInvert) { Tl = -Tl; Tr = -Tr; }
// The final value // The final value
Pitch = (float)PitchRange * ((float)(Tl - Tr) / 128.0f); _TiltData.Pitch = (float)PitchRange * ((float)(Tl - Tr) / 128.0f);
} }
/* For the analog stick roll is 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 default set to the Y-axis. By changing the axis mapping and the invert
options this can be altered in any way */ options this can be altered in any way */
else if (g_Config.Tilt.Type == g_Config.Tilt.ANALOG1) else if (Type == g_Config.Tilt.ANALOG1)
{ {
// Adjust the trigger to go between negative and positive values // Adjust the trigger to go between negative and positive values
Lx = Lx - 0x80; Lx = Lx - 0x80;
@ -531,8 +528,8 @@ void TiltWiimoteGamepad(int &Roll, int &Pitch)
if (g_Config.Tilt.RollInvert) Lx = -Lx; // else Tr = -Tr; if (g_Config.Tilt.RollInvert) Lx = -Lx; // else Tr = -Tr;
if (g_Config.Tilt.PitchInvert) Ly = -Ly; // else Tr = -Tr; if (g_Config.Tilt.PitchInvert) Ly = -Ly; // else Tr = -Tr;
// Produce the final value // Produce the final value
Roll = (RollRange) ? (float)RollRange * ((float)Lx / 128.0f) : Lx; _TiltData.Roll = (RollRange) ? (float)RollRange * ((float)Lx / 128.0f) : Lx;
Pitch = (PitchRange) ? (float)PitchRange * ((float)Ly / 128.0f) : Ly; _TiltData.Pitch = (PitchRange) ? (float)PitchRange * ((float)Ly / 128.0f) : Ly;
} }
// Otherwise we are using ANALOG2 // Otherwise we are using ANALOG2
else else
@ -544,105 +541,192 @@ void TiltWiimoteGamepad(int &Roll, int &Pitch)
if (g_Config.Tilt.RollInvert) Rx = -Rx; // else Tr = -Tr; if (g_Config.Tilt.RollInvert) Rx = -Rx; // else Tr = -Tr;
if (g_Config.Tilt.PitchInvert) Ry = -Ry; // else Tr = -Tr; if (g_Config.Tilt.PitchInvert) Ry = -Ry; // else Tr = -Tr;
// Produce the final value // Produce the final value
Roll = (RollRange) ? (float)RollRange * ((float)Rx / 128.0f) : Rx; _TiltData.Roll = (RollRange) ? (float)RollRange * ((float)Rx / 128.0f) : Rx;
Pitch = (PitchRange) ? (float)PitchRange * ((float)Ry / 128.0f) : Ry; _TiltData.Pitch = (PitchRange) ? (float)PitchRange * ((float)Ry / 128.0f) : Ry;
} }
} }
// Tilting Wiimote by keyboard
// Tilting Wiimote with keyboard void TiltByKeyboardWM(STiltData &_TiltData)
void TiltWiimoteKeyboard(int &Roll, int &Pitch)
{ {
// Do roll/pitch or free swing // Do roll/pitch or free swing
if (IsKey(g_Wiimote_kbd.ROLL_L)) if (IsKey(g_Wiimote_kbd.ROLL_L))
{ {
if (g_Config.Tilt.Range.Roll) if (g_Config.Tilt.Range.Roll)
{ {
// Stop at the upper end of the range // Stop at the lower end of the range
if (Roll < g_Config.Tilt.Range.Roll) if (_TiltData.Roll > -g_Config.Tilt.Range.Roll)
Roll += 3; // aim left _TiltData.Roll -= 3; // aim left
} }
else // Free swing else // Free swing
{ {
Roll = -0x80 / 2; _TiltData.Roll = -0x80 / 2;
} }
} }
else if (IsKey(g_Wiimote_kbd.ROLL_R)) else if (IsKey(g_Wiimote_kbd.ROLL_R))
{ {
if (g_Config.Tilt.Range.Roll) if (g_Config.Tilt.Range.Roll)
{ {
// Stop at the lower end of the range // Stop at the upper end of the range
if (Roll > -g_Config.Tilt.Range.Roll) if (_TiltData.Roll < g_Config.Tilt.Range.Roll)
Roll -= 3; // aim right _TiltData.Roll += 3; // aim right
} }
else // Free swing else // Free swing
{ {
Roll = 0x80 / 2; _TiltData.Roll = 0x80 / 2;
} }
} }
else else
{ {
Roll = 0; _TiltData.Roll = 0;
} }
if (IsKey(g_Wiimote_kbd.PITCH_U)) if (IsKey(g_Wiimote_kbd.PITCH_U))
{ {
if (g_Config.Tilt.Range.Pitch) if (g_Config.Tilt.Range.Pitch)
{ {
// Stop at the upper end of the range // Stop at the lower end of the range
if (Pitch < g_Config.Tilt.Range.Pitch) if (_TiltData.Pitch > -g_Config.Tilt.Range.Pitch)
Pitch += 3; // aim up _TiltData.Pitch -= 3; // aim down
} }
else // Free swing else // Free swing
{ {
Pitch = -0x80 / 2; _TiltData.Pitch = -0x80 / 2;
} }
} }
else if (IsKey(g_Wiimote_kbd.PITCH_D)) else if (IsKey(g_Wiimote_kbd.PITCH_D))
{ {
if (g_Config.Tilt.Range.Pitch) if (g_Config.Tilt.Range.Pitch)
{ {
// Stop at the lower end of the range // Stop at the upper end of the range
if (Pitch > -g_Config.Tilt.Range.Pitch) if (_TiltData.Pitch < g_Config.Tilt.Range.Pitch)
Pitch -= 3; // aim down _TiltData.Pitch += 3; // aim up
} }
else // Free swing else // Free swing
{ {
Pitch = 0x80 / 2; _TiltData.Pitch = 0x80 / 2;
} }
} }
else else
{ {
Pitch = 0; _TiltData.Pitch = 0;
}
}
// Tilting Nunchuck by keyboard
void TiltByKeyboardNC(STiltData &_TiltData)
{
// Do roll/pitch or free swing
if (IsKey(g_NunchuckExt.ROLL_L))
{
if (g_Config.Tilt.Range.Roll)
{
// Stop at the lower end of the range
if (_TiltData.Roll > -g_Config.Tilt.Range.Roll)
_TiltData.Roll -= 3; // aim left
}
else // Free swing
{
_TiltData.Roll = -0x80 / 2;
}
}
else if (IsKey(g_NunchuckExt.ROLL_R))
{
if (g_Config.Tilt.Range.Roll)
{
// Stop at the upper end of the range
if (_TiltData.Roll < g_Config.Tilt.Range.Roll)
_TiltData.Roll += 3; // aim right
}
else // Free swing
{
_TiltData.Roll = 0x80 / 2;
}
}
else
{
_TiltData.Roll = 0;
}
if (IsKey(g_NunchuckExt.PITCH_U))
{
if (g_Config.Tilt.Range.Pitch)
{
// Stop at the lower end of the range
if (_TiltData.Pitch > -g_Config.Tilt.Range.Pitch)
_TiltData.Pitch -= 3; // aim up
}
else // Free swing
{
_TiltData.Pitch = -0x80 / 2;
}
}
else if (IsKey(g_NunchuckExt.PITCH_D))
{
if (g_Config.Tilt.Range.Pitch)
{
// Stop at the upper end of the range
if (_TiltData.Pitch < g_Config.Tilt.Range.Pitch)
_TiltData.Pitch += 3; // aim down
}
else // Free swing
{
_TiltData.Pitch = 0x80 / 2;
}
}
else
{
_TiltData.Pitch = 0;
} }
} }
// Tilting Wiimote (Wario Land aiming, Mario Kart steering and other things) // Tilting Wiimote (Wario Land aiming, Mario Kart steering and other things)
void Tilt(int &_x, int &_y, int &_z) void TiltWiimote(int &_x, int &_y, int &_z)
{ {
// Check if it's on // Check if it's on
if (g_Config.Tilt.Type == g_Config.Tilt.OFF) return; if (g_Config.Tilt.TypeWM == g_Config.Tilt.OFF)
return;
// Select input method and return the x, y, x values // Select input method and return the x, y, x values
if (g_Config.Tilt.Type == g_Config.Tilt.KEYBOARD) else if (g_Config.Tilt.TypeWM == g_Config.Tilt.KEYBOARD)
TiltWiimoteKeyboard(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch); TiltByKeyboardWM(g_Wiimote_kbd.TiltData);
else if (g_Config.Tilt.Type == g_Config.Tilt.TRIGGER || g_Config.Tilt.Type == g_Config.Tilt.ANALOG1 || g_Config.Tilt.Type == g_Config.Tilt.ANALOG2) else
TiltWiimoteGamepad(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch); TiltByGamepad(g_Wiimote_kbd.TiltData, g_Config.Tilt.TypeWM);
// Adjust angles, it's only needed if both roll and pitch is used together // Adjust angles, it's only needed if both roll and pitch is used together
if (g_Config.Tilt.Range.Roll != 0 && g_Config.Tilt.Range.Pitch != 0) if (g_Config.Tilt.Range.Roll != 0 && g_Config.Tilt.Range.Pitch != 0)
AdjustAngles(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch); AdjustAngles(g_Wiimote_kbd.TiltData.Roll, g_Wiimote_kbd.TiltData.Pitch);
// Calculate the accelerometer value from this tilt angle // Calculate the accelerometer value from this tilt angle
PitchDegreeToAccelerometer(g_Wiimote_kbd.shakeData.Roll, g_Wiimote_kbd.shakeData.Pitch, _x, _y, _z); TiltToAccelerometer(_x, _y, _z, g_Wiimote_kbd.TiltData);
//DEBUG_LOG(WIIMOTE, "Roll:%i, Pitch:%i, _x:%u, _y:%u, _z:%u", Roll, Pitch, _x, _y, _z); //DEBUG_LOG(WIIMOTE, "Roll:%i, Pitch:%i, _x:%u, _y:%u, _z:%u", g_Wiimote_kbd.TiltData.Roll, g_Wiimote_kbd.TiltData.Pitch, _x, _y, _z);
}
// Tilting Nunchuck (Mad World, Dead Space and other things)
void TiltNunchuck(int &_x, int &_y, int &_z)
{
// Check if it's on
if (g_Config.Tilt.TypeNC == g_Config.Tilt.OFF)
return;
// Select input method and return the x, y, x values
else if (g_Config.Tilt.TypeNC == g_Config.Tilt.KEYBOARD)
TiltByKeyboardNC(g_NunchuckExt.TiltData);
else
TiltByGamepad(g_NunchuckExt.TiltData, g_Config.Tilt.TypeNC);
// Adjust angles, it's only needed if both roll and pitch is used together
if (g_Config.Tilt.Range.Roll != 0 && g_Config.Tilt.Range.Pitch != 0)
AdjustAngles(g_NunchuckExt.TiltData.Roll, g_NunchuckExt.TiltData.Pitch);
// Calculate the accelerometer value from this tilt angle
TiltToAccelerometer(_x, _y, _z, g_NunchuckExt.TiltData);
//DEBUG_LOG(WIIMOTE, "Roll:%i, Pitch:%i, _x:%u, _y:%u, _z:%u", g_NunchuckExt.TiltData.Roll, g_NunchuckExt.TiltData.Pitch, _x, _y, _z);
} }
void FillReportAcc(wm_accel& _acc) void FillReportAcc(wm_accel& _acc)
{ {
// Recorded movements // Recorded movements
// Check for a playback command // Check for a playback command
if(g_RecordingPlaying[0] < 0) if (g_RecordingPlaying[0] < 0)
{ {
g_RecordingPlaying[0] = RecordingCheckKeys(0); g_RecordingPlaying[0] = RecordingCheckKeys(0);
} }
@ -655,26 +739,34 @@ void FillReportAcc(wm_accel& _acc)
} }
// Initial value // Initial value
int acc_x = g_wm.cal_zero.x; _acc.x = g_wm.cal_zero.x;
int acc_y = g_wm.cal_zero.y; _acc.y = g_wm.cal_zero.y;
int acc_z = g_wm.cal_zero.z; _acc.z = g_wm.cal_zero.z;
// Adjust position, also add some noise to prevent disconnection
if (!g_Config.bUpright) if (!g_Config.bUpright)
acc_z += g_wm.cal_g.z; _acc.z += g_wm.cal_g.z + g_Wiimote_kbd.TiltData.FakeNoise;
else // Upright wiimote else // Upright wiimote
acc_y -= g_wm.cal_g.y; _acc.y -= g_wm.cal_g.y + g_Wiimote_kbd.TiltData.FakeNoise;
g_Wiimote_kbd.TiltData.FakeNoise = -g_Wiimote_kbd.TiltData.FakeNoise;
// Check that Dolphin is in focus
if (IsFocus()) if (IsFocus())
{ {
// Check for shake button int acc_x = _acc.x;
if(IsKey(g_Wiimote_kbd.SHAKE)) StartShake(g_Wiimote_kbd.shakeData); int acc_y = _acc.y;
int acc_z = _acc.z;
if (IsKey(g_Wiimote_kbd.SHAKE) && g_Wiimote_kbd.TiltData.Shake == 0)
g_Wiimote_kbd.TiltData.Shake = 1;
// Step the shake simulation one step // Step the shake simulation one step
SingleShake(acc_x, acc_y, acc_z, g_Wiimote_kbd.shakeData); ShakeToAccelerometer(acc_x, acc_y, acc_z, g_Wiimote_kbd.TiltData);
// Tilt Wiimote, allow the shake function to interrupt it // Tilt Wiimote, allow the shake function to interrupt it
if (g_Wiimote_kbd.shakeData.Shake == 0) Tilt(acc_x, acc_y, acc_z); if (g_Wiimote_kbd.TiltData.Shake == 0)
TiltWiimote(acc_x, acc_y, acc_z);
// Boundary check // Boundary check
if (acc_x > 0xFF) acc_x = 0xFF; if (acc_x > 0xFF) acc_x = 0xFF;
else if (acc_x < 0x00) acc_x = 0x00; else if (acc_x < 0x00) acc_x = 0x00;
@ -682,11 +774,11 @@ void FillReportAcc(wm_accel& _acc)
else if (acc_y < 0x00) acc_y = 0x00; else if (acc_y < 0x00) acc_y = 0x00;
if (acc_z > 0xFF) acc_z = 0xFF; if (acc_z > 0xFF) acc_z = 0xFF;
else if (acc_z < 0x00) acc_z = 0x00; else if (acc_z < 0x00) acc_z = 0x00;
}
_acc.x = acc_x; _acc.x = acc_x;
_acc.y = acc_y; _acc.y = acc_y;
_acc.z = acc_z; _acc.z = acc_z;
}
// Debugging for translating Wiimote to Keyboard (or Gamepad) // Debugging for translating Wiimote to Keyboard (or Gamepad)
/* /*
@ -764,9 +856,9 @@ void FillReportAcc(wm_accel& _acc)
} }
// Rotate IR dot when rolling Wiimote // Rotate IR dot when rolling Wiimote
void RotateIRDot(int _Roll, int& _x, int& _y) void RotateIRDot(int &_x, int &_y, STiltData &_TiltData)
{ {
if (g_Config.Tilt.Range.Roll == 0 || _Roll == 0) if (g_Config.Tilt.Range.Roll == 0 || _TiltData.Roll == 0)
return; return;
// The IR camera resolution is 1023x767 // The IR camera resolution is 1023x767
@ -776,8 +868,8 @@ void RotateIRDot(int _Roll, int& _x, int& _y)
float radius = sqrt(pow(dot_x, 2) + pow(dot_y, 2)); float radius = sqrt(pow(dot_x, 2) + pow(dot_y, 2));
float radian = atan2(dot_y, dot_x); float radian = atan2(dot_y, dot_x);
_x = radius * cos(radian + InputCommon::Deg2Rad((float)_Roll)) + 1023.0f / 2; _x = radius * cos(radian + InputCommon::Deg2Rad((float)_TiltData.Roll)) + 1023.0f / 2;
_y = radius * sin(radian + InputCommon::Deg2Rad((float)_Roll)) + 767.0f / 2; _y = radius * sin(radian + InputCommon::Deg2Rad((float)_TiltData.Roll)) + 767.0f / 2;
// Out of sight check // Out of sight check
if (_x < 0 || _x > 1023) _x = 0xFFFF; if (_x < 0 || _x > 1023) _x = 0xFFFF;
@ -824,8 +916,8 @@ void FillReportIR(wm_ir_extended& _ir0, wm_ir_extended& _ir1)
int x0 = 1023 - g_Config.iIRLeft - g_Config.iIRWidth * MouseX - SENSOR_BAR_WIDTH / 2; int x0 = 1023 - g_Config.iIRLeft - g_Config.iIRWidth * MouseX - SENSOR_BAR_WIDTH / 2;
int x1 = x0 + SENSOR_BAR_WIDTH; int x1 = x0 + SENSOR_BAR_WIDTH;
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x0, y0); RotateIRDot(x0, y0, g_Wiimote_kbd.TiltData);
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x1, y1); RotateIRDot(x1, y1, g_Wiimote_kbd.TiltData);
// Converted to IR data // Converted to IR data
_ir0.x = x0 & 0xff; _ir0.xHi = x0 >> 8; _ir0.x = x0 & 0xff; _ir0.xHi = x0 >> 8;
@ -901,8 +993,8 @@ void FillReportIRBasic(wm_ir_basic& _ir0, wm_ir_basic& _ir1)
int x1 = 1023 - g_Config.iIRLeft - g_Config.iIRWidth * MouseX - SENSOR_BAR_WIDTH / 2; int x1 = 1023 - g_Config.iIRLeft - g_Config.iIRWidth * MouseX - SENSOR_BAR_WIDTH / 2;
int x2 = x1 + SENSOR_BAR_WIDTH; int x2 = x1 + SENSOR_BAR_WIDTH;
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x1, y1); RotateIRDot(x1, y1, g_Wiimote_kbd.TiltData);
RotateIRDot(g_Wiimote_kbd.shakeData.Roll, x2, y2); RotateIRDot(x2, y2, g_Wiimote_kbd.TiltData);
/* As with the extented report we settle with emulating two out of four /* As with the extented report we settle with emulating two out of four
possible objects the only difference is that we don't report any size of possible objects the only difference is that we don't report any size of
@ -974,24 +1066,44 @@ void FillReportExtension(wm_extension& _ext)
return; return;
} }
// Use the neutral values
int ext_ax = g_nu.cal_zero.x;
int ext_ay = g_nu.cal_zero.y;
int ext_az = g_nu.cal_zero.z + g_nu.cal_g.z;
if(IsKey(g_NunchuckExt.SHAKE)) StartShake(g_NunchuckExt.shakeData);
// Shake the Nunchuk one frame
SingleShake(ext_ax, ext_ay, ext_az, g_NunchuckExt.shakeData);
_ext.ax = ext_ax;
_ext.ay = ext_ay;
_ext.az = ext_az;
// The default joystick and button values unless we use them // The default joystick and button values unless we use them
_ext.jx = g_nu.jx.center; _ext.jx = g_nu.jx.center;
_ext.jy = g_nu.jy.center; _ext.jy = g_nu.jy.center;
_ext.bt = 0x03; // 0x03 means no button pressed, the button is zero active _ext.bt = 0x03; // 0x03 means no button pressed, the button is zero active
// Use the neutral values
_ext.ax = g_nu.cal_zero.x;
_ext.ay = g_nu.cal_zero.y;
_ext.az = g_nu.cal_zero.z + g_nu.cal_g.z;
if (IsFocus())
{
int acc_x = _ext.ax;
int acc_y = _ext.ay;
int acc_z = _ext.az;
if (IsKey(g_NunchuckExt.SHAKE) && g_NunchuckExt.TiltData.Shake == 0)
g_NunchuckExt.TiltData.Shake = 1;
// Step the shake simulation one step
ShakeToAccelerometer(acc_x, acc_y, acc_z, g_NunchuckExt.TiltData);
// Tilt Nunchuck, allow the shake function to interrupt it
if (g_NunchuckExt.TiltData.Shake == 0)
TiltNunchuck(acc_x, acc_y, acc_z);
// Boundary check
if (acc_x > 0xFF) acc_x = 0xFF;
else if (acc_x < 0x00) acc_x = 0x00;
if (acc_y > 0xFF) acc_y = 0xFF;
else if (acc_y < 0x00) acc_y = 0x00;
if (acc_z > 0xFF) acc_z = 0xFF;
else if (acc_z < 0x00) acc_z = 0x00;
_ext.ax = acc_x;
_ext.ay = acc_y;
_ext.az = acc_z;
// Update the analog stick // Update the analog stick
if (g_Config.Nunchuck.Type == g_Config.Nunchuck.KEYBOARD) if (g_Config.Nunchuck.Type == g_Config.Nunchuck.KEYBOARD)
{ {
@ -1077,6 +1189,8 @@ void FillReportExtension(wm_extension& _ext)
if(IsKey(g_NunchuckExt.C) && IsKey(g_NunchuckExt.Z)) if(IsKey(g_NunchuckExt.C) && IsKey(g_NunchuckExt.Z))
_ext.bt = 0x00; _ext.bt = 0x00;
}
/* Here we encrypt the report */ /* Here we encrypt the report */
// Create a temporary storage for the data // Create a temporary storage for the data
@ -1337,7 +1451,6 @@ void FillReportClassicExtension(wm_classic_extension& _ext)
// { _ext.b2.bA = 0x01; _ext.b2.bB = 0x01; } // { _ext.b2.bA = 0x01; _ext.b2.bB = 0x01; }
} }
// Convert data for reporting // Convert data for reporting
_ext.Lx = (Lx >> 2); _ext.Lx = (Lx >> 2);
_ext.Ly = (Ly >> 2); _ext.Ly = (Ly >> 2);
@ -1355,7 +1468,6 @@ void FillReportClassicExtension(wm_classic_extension& _ext)
_ext.lT2 = (lT >> 3) >> 3; _ext.lT2 = (lT >> 3) >> 3;
_ext.rT = (rT >> 3); _ext.rT = (rT >> 3);
/* Here we encrypt the report */ /* Here we encrypt the report */
// Create a temporary storage for the data // Create a temporary storage for the data