diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp
index ebf5d45598..45770e961c 100644
--- a/Source/Core/Core/ConfigManager.cpp
+++ b/Source/Core/Core/ConfigManager.cpp
@@ -150,6 +150,7 @@ void SConfig::SaveSettings()
SaveCoreSettings(ini);
SaveMovieSettings(ini);
SaveDSPSettings(ini);
+ SaveInputSettings(ini);
SaveFifoPlayerSettings(ini);
ini.Save(File::GetUserPath(F_DOLPHINCONFIG_IDX));
@@ -329,6 +330,13 @@ void SConfig::SaveDSPSettings(IniFile& ini)
dsp->Set("CaptureLog", m_DSPCaptureLog);
}
+void SConfig::SaveInputSettings(IniFile& ini)
+{
+ IniFile::Section* input = ini.GetOrCreateSection("Input");
+
+ input->Set("BackgroundInput", m_BackgroundInput);
+}
+
void SConfig::SaveFifoPlayerSettings(IniFile& ini)
{
IniFile::Section* fifoplayer = ini.GetOrCreateSection("FifoPlayer");
@@ -350,6 +358,7 @@ void SConfig::LoadSettings()
LoadCoreSettings(ini);
LoadMovieSettings(ini);
LoadDSPSettings(ini);
+ LoadInputSettings(ini);
LoadFifoPlayerSettings(ini);
m_SYSCONF = new SysConf();
@@ -556,6 +565,13 @@ void SConfig::LoadDSPSettings(IniFile& ini)
dsp->Get("CaptureLog", &m_DSPCaptureLog, false);
}
+void SConfig::LoadInputSettings(IniFile& ini)
+{
+ IniFile::Section* input = ini.GetOrCreateSection("Input");
+
+ input->Get("BackgroundInput", &m_BackgroundInput, false);
+}
+
void SConfig::LoadFifoPlayerSettings(IniFile& ini)
{
IniFile::Section* fifoplayer = ini.GetOrCreateSection("FifoPlayer");
diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h
index 45139caa71..e867a304d8 100644
--- a/Source/Core/Core/ConfigManager.h
+++ b/Source/Core/Core/ConfigManager.h
@@ -97,6 +97,9 @@ struct SConfig : NonCopyable
int m_Volume;
std::string sBackend;
+ // Input settings
+ bool m_BackgroundInput;
+
SysConf* m_SYSCONF;
// save settings
@@ -122,6 +125,7 @@ private:
void SaveGameListSettings(IniFile& ini);
void SaveCoreSettings(IniFile& ini);
void SaveDSPSettings(IniFile& ini);
+ void SaveInputSettings(IniFile& ini);
void SaveMovieSettings(IniFile& ini);
void SaveFifoPlayerSettings(IniFile& ini);
@@ -132,6 +136,7 @@ private:
void LoadGameListSettings(IniFile& ini);
void LoadCoreSettings(IniFile& ini);
void LoadDSPSettings(IniFile& ini);
+ void LoadInputSettings(IniFile& ini);
void LoadMovieSettings(IniFile& ini);
void LoadFifoPlayerSettings(IniFile& ini);
diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj
index d6fc66049d..66926be20f 100644
--- a/Source/Core/Core/Core.vcxproj
+++ b/Source/Core/Core/Core.vcxproj
@@ -1,4 +1,4 @@
-
+
@@ -357,7 +357,6 @@
-
diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters
index 05e4529aee..789f44a418 100644
--- a/Source/Core/Core/Core.vcxproj.filters
+++ b/Source/Core/Core/Core.vcxproj.filters
@@ -1,4 +1,4 @@
-
+
@@ -1005,9 +1005,6 @@
HW %28Flipper/Hollywood%29\Wiimote\Emu
-
- HW %28Flipper/Hollywood%29\Wiimote\Emu
-
HW %28Flipper/Hollywood%29\Wiimote\Emu
diff --git a/Source/Core/Core/HW/GCPadEmu.cpp b/Source/Core/Core/HW/GCPadEmu.cpp
index c79e6c057a..0d9c0a4856 100644
--- a/Source/Core/Core/HW/GCPadEmu.cpp
+++ b/Source/Core/Core/HW/GCPadEmu.cpp
@@ -79,7 +79,7 @@ GCPad::GCPad(const unsigned int index) : m_index(index)
// options
groups.emplace_back(m_options = new ControlGroup(_trans("Options")));
- m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Background Input"), false));
+ m_options->settings.emplace_back(new ControlGroup::BackgroundInputSetting(_trans("Background Input")));
}
std::string GCPad::GetName() const
@@ -89,34 +89,31 @@ std::string GCPad::GetName() const
void GCPad::GetInput(GCPadStatus* const pad)
{
- // if window has focus or background input enabled
- if (Host_RendererHasFocus() || m_options[0].settings[0]->value)
- {
- // buttons
- m_buttons->GetState(&pad->button, button_bitmasks);
+ double x, y, triggers[2];
- // set analog A/B analog to full or w/e, prolly not needed
- if (pad->button & PAD_BUTTON_A) pad->analogA = 0xFF;
- if (pad->button & PAD_BUTTON_B) pad->analogB = 0xFF;
+ // buttons
+ m_buttons->GetState(&pad->button, button_bitmasks);
- // dpad
- m_dpad->GetState(&pad->button, dpad_bitmasks);
+ // set analog A/B analog to full or w/e, prolly not needed
+ if (pad->button & PAD_BUTTON_A) pad->analogA = 0xFF;
+ if (pad->button & PAD_BUTTON_B) pad->analogB = 0xFF;
- // sticks
- m_main_stick->GetState(&pad->stickX, &pad->stickY, 0x80, 127);
- m_c_stick->GetState(&pad->substickX, &pad->substickY, 0x80, 127);
+ // dpad
+ m_dpad->GetState(&pad->button, dpad_bitmasks);
- // triggers
- m_triggers->GetState(&pad->button, trigger_bitmasks, &pad->triggerLeft, 0xFF);
- }
- else
- {
- // center sticks
- pad->stickX = 0x80;
- pad->stickY = 0x80;
- pad->substickX = 0x80;
- pad->substickY = 0x80;
- }
+ // sticks
+ m_main_stick->GetState(&x, &y);
+ pad->stickX = 0x7F + (x * 0x80);
+ pad->stickY = 0x7F + (y * 0x80);
+
+ m_c_stick->GetState(&x, &y);
+ pad->substickX = 0x7F + (x * 0x80);
+ pad->substickY = 0x7F + (y * 0x80);
+
+ // triggers
+ m_triggers->GetState(&pad->button, trigger_bitmasks, triggers);
+ pad->triggerLeft = triggers[0] * 0xFF;
+ pad->triggerRight = triggers[1] * 0xFF;
}
void GCPad::SetMotor(const u8 on)
@@ -126,17 +123,12 @@ void GCPad::SetMotor(const u8 on)
if (state < 0.5)
force = -force;
- // only rumble if window has focus or background input is enabled
- if (Host_RendererHasFocus() || m_options[0].settings[0]->value)
- m_rumble->controls[0]->control_ref->State(force);
- else
- m_rumble->controls[0]->control_ref->State(0);
+ m_rumble->controls[0]->control_ref->State(force);
}
void GCPad::SetOutput(const u8 on)
{
- // only rumble if window has focus or background input is enabled
- m_rumble->controls[0]->control_ref->State(on && (Host_RendererHasFocus() || m_options[0].settings[0]->value));
+ m_rumble->controls[0]->control_ref->State(on);
}
void GCPad::LoadDefaults(const ControllerInterface& ciface)
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.cpp
index 40b22c4466..07a20e36f4 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.cpp
@@ -42,7 +42,7 @@ void Attachment::Reset()
}
-void ControllerEmu::Extension::GetState(u8* const data, const bool focus)
+void ControllerEmu::Extension::GetState(u8* const data)
{
- ((WiimoteEmu::Attachment*)attachments[active_extension].get())->GetState(data, focus);
+ ((WiimoteEmu::Attachment*)attachments[active_extension].get())->GetState(data);
}
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.h b/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.h
index 01b783603b..1cce7a7630 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.h
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Attachment.h
@@ -15,7 +15,7 @@ class Attachment : public ControllerEmu
public:
Attachment(const char* const _name, WiimoteEmu::ExtensionReg& _reg);
- virtual void GetState(u8* const data, const bool focus = true) {}
+ virtual void GetState(u8* const data) {}
void Reset();
std::string GetName() const override;
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.cpp
index 915d051c94..80673c8f6a 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.cpp
@@ -80,7 +80,7 @@ Classic::Classic(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Classic"),
memcpy(&id, classic_id, sizeof(classic_id));
}
-void Classic::GetState(u8* const data, const bool focus)
+void Classic::GetState(u8* const data)
{
wm_classic_extension* const ccdata = (wm_classic_extension*)data;
ccdata->bt = 0;
@@ -89,41 +89,46 @@ void Classic::GetState(u8* const data, const bool focus)
// left stick
{
- u8 x, y;
- m_left_stick->GetState(&x, &y, 0x20, focus ? 0x1F /*0x15*/ : 0);
+ double x, y;
+ m_left_stick->GetState(&x, &y);
- ccdata->lx = x;
- ccdata->ly = y;
+ ccdata->lx = (x * 0x1F) + 0x20;
+ ccdata->ly = (y * 0x1F) + 0x20;
}
// right stick
{
- u8 x, y;
- m_right_stick->GetState(&x, &y, 0x10, focus ? 0x0F /*0x0C*/ : 0);
+ double x, y;
+ u8 x_, y_;
+ m_right_stick->GetState(&x, &y);
- ccdata->rx1 = x;
- ccdata->rx2 = x >> 1;
- ccdata->rx3 = x >> 3;
- ccdata->ry = y;
+ x_ = (x * 0x1F) + 0x20;
+ y_ = (y * 0x1F) + 0x20;
+
+ ccdata->rx1 = x_;
+ ccdata->rx2 = x_ >> 1;
+ ccdata->rx3 = x_ >> 3;
+ ccdata->ry = y_;
}
//triggers
{
- u8 trigs[2];
- m_triggers->GetState(&ccdata->bt, classic_trigger_bitmasks, trigs, focus ? 0x1F : 0);
+ double trigs[2] = { 0, 0 };
+ u8 lt, rt;
+ m_triggers->GetState(&ccdata->bt, classic_trigger_bitmasks, trigs);
- ccdata->lt1 = trigs[0];
- ccdata->lt2 = trigs[0] >> 3;
- ccdata->rt = trigs[1];
+ lt = trigs[0] * 0x1F;
+ rt = trigs[1] * 0x1F;
+
+ ccdata->lt1 = lt;
+ ccdata->lt2 = lt >> 3;
+ ccdata->rt = rt;
}
- if (focus)
- {
- // buttons
- m_buttons->GetState(&ccdata->bt, classic_button_bitmasks);
- // dpad
- m_dpad->GetState(&ccdata->bt, classic_dpad_bitmasks);
- }
+ // buttons
+ m_buttons->GetState(&ccdata->bt, classic_button_bitmasks);
+ // dpad
+ m_dpad->GetState(&ccdata->bt, classic_dpad_bitmasks);
// flip button bits
ccdata->bt ^= 0xFFFF;
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.h b/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.h
index 6094ecbe6d..6b4701d9bb 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.h
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Classic.h
@@ -13,7 +13,7 @@ class Classic : public Attachment
{
public:
Classic(WiimoteEmu::ExtensionReg& _reg);
- void GetState(u8* const data, const bool focus) override;
+ void GetState(u8* const data) override;
enum
{
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.cpp
index 35a1fe8e87..b648f14839 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.cpp
@@ -51,7 +51,7 @@ Drums::Drums(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Drums"), _reg)
memcpy(&id, drums_id, sizeof(drums_id));
}
-void Drums::GetState(u8* const data, const bool focus)
+void Drums::GetState(u8* const data)
{
wm_drums_extension* const ddata = (wm_drums_extension*)data;
ddata->bt = 0;
@@ -60,24 +60,21 @@ void Drums::GetState(u8* const data, const bool focus)
// stick
{
- u8 x, y;
- m_stick->GetState(&x, &y, 0x20, focus ? 0x1F /*0x15*/ : 0);
+ double x, y;
+ m_stick->GetState(&x, &y);
- ddata->sx = x;
- ddata->sy = y;
+ ddata->sx = (x * 0x1F) + 0x20;
+ ddata->sx = (y * 0x1F) + 0x20;
}
// TODO: softness maybe
data[2] = 0xFF;
data[3] = 0xFF;
- if (focus)
- {
- // buttons
- m_buttons->GetState(&ddata->bt, drum_button_bitmasks);
- // pads
- m_pads->GetState(&ddata->bt, drum_pad_bitmasks);
- }
+ // buttons
+ m_buttons->GetState(&ddata->bt, drum_button_bitmasks);
+ // pads
+ m_pads->GetState(&ddata->bt, drum_pad_bitmasks);
// flip button bits
ddata->bt ^= 0xFFFF;
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.h b/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.h
index 8c2bbc17bc..e1de04c2e9 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.h
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Drums.h
@@ -13,7 +13,7 @@ class Drums : public Attachment
{
public:
Drums(WiimoteEmu::ExtensionReg& _reg);
- void GetState(u8* const data, const bool focus) override;
+ void GetState(u8* const data) override;
enum
{
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.cpp
index 51c3224e31..7f1440bdc6 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.cpp
@@ -64,7 +64,7 @@ Guitar::Guitar(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Guitar"), _r
memcpy(&id, guitar_id, sizeof(guitar_id));
}
-void Guitar::GetState(u8* const data, const bool focus)
+void Guitar::GetState(u8* const data)
{
wm_guitar_extension* const gdata = (wm_guitar_extension*)data;
gdata->bt = 0;
@@ -73,30 +73,27 @@ void Guitar::GetState(u8* const data, const bool focus)
// stick
{
- u8 x, y;
- m_stick->GetState(&x, &y, 0x20, focus ? 0x1F /*0x15*/ : 0);
+ double x, y;
+ m_stick->GetState(&x, &y);
- gdata->sx = x;
- gdata->sy = y;
+ gdata->sx = (x * 0x1F) + 0x20;
+ gdata->sy = (y * 0x1F) + 0x20;
}
// TODO: touch bar, probably not
gdata->tb = 0x0F; // not touched
// whammy bar
- u8 whammy;
- m_whammy->GetState(&whammy, 0x1F);
- gdata->whammy = whammy;
+ double whammy;
+ m_whammy->GetState(&whammy);
+ gdata->whammy = whammy * 0x1F;
- if (focus)
- {
- // buttons
- m_buttons->GetState(&gdata->bt, guitar_button_bitmasks);
- // frets
- m_frets->GetState(&gdata->bt, guitar_fret_bitmasks);
- // strum
- m_strum->GetState(&gdata->bt, guitar_strum_bitmasks);
- }
+ // buttons
+ m_buttons->GetState(&gdata->bt, guitar_button_bitmasks);
+ // frets
+ m_frets->GetState(&gdata->bt, guitar_fret_bitmasks);
+ // strum
+ m_strum->GetState(&gdata->bt, guitar_strum_bitmasks);
// flip button bits
gdata->bt ^= 0xFFFF;
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.h b/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.h
index 379096c11e..bf25fe9d1d 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.h
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Guitar.h
@@ -13,7 +13,7 @@ class Guitar : public Attachment
{
public:
Guitar(WiimoteEmu::ExtensionReg& _reg);
- void GetState(u8* const data, const bool focus) override;
+ void GetState(u8* const data) override;
enum
{
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp
index 0bd5b65f83..578c3b9126 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp
@@ -4,9 +4,6 @@
#include "Core/HW/WiimoteEmu/Attachment/Nunchuk.h"
-#include "InputCommon/UDPWiimote.h"
-#include "InputCommon/UDPWrapper.h"
-
namespace WiimoteEmu
{
@@ -31,8 +28,7 @@ static const u8 nunchuk_button_bitmasks[] =
Nunchuk::BUTTON_Z,
};
-Nunchuk::Nunchuk(UDPWrapper *wrp, WiimoteEmu::ExtensionReg& _reg)
- : Attachment(_trans("Nunchuk"), _reg) , m_udpWrap(wrp)
+Nunchuk::Nunchuk(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Nunchuk"), _reg)
{
// buttons
groups.emplace_back(m_buttons = new Buttons("Buttons"));
@@ -64,23 +60,23 @@ Nunchuk::Nunchuk(UDPWrapper *wrp, WiimoteEmu::ExtensionReg& _reg)
memset(m_shake_step, 0, sizeof(m_shake_step));
}
-void Nunchuk::GetState(u8* const data, const bool focus)
+void Nunchuk::GetState(u8* const data)
{
wm_extension* const ncdata = (wm_extension*)data;
ncdata->bt = 0;
// stick
- ControlState state[2];
- m_stick->GetState(&state[0], &state[1], 0, 1);
+ double state[2];
+ m_stick->GetState(&state[0], &state[1]);
nu_cal &cal = *(nu_cal*)®.calibration;
nu_js cal_js[2];
- cal_js[0] = *&cal.jx;
- cal_js[1] = *&cal.jy;
+ cal_js[0] = cal.jx;
+ cal_js[1] = cal.jy;
for (int i = 0; i < 2; i++) {
- ControlState &s = *&state[i];
- nu_js c = *&cal_js[i];
+ double &s = state[i];
+ nu_js c = cal_js[i];
if (s < 0)
s = s * abs(c.min - c.center) + c.center;
else if (s > 0)
@@ -100,59 +96,21 @@ void Nunchuk::GetState(u8* const data, const bool focus)
ncdata->jx = cal.jx.center + 1;
}
- if (!focus)
- {
- ncdata->jx = cal.jx.center;
- ncdata->jy = cal.jy.center;
- }
-
AccelData accel;
// tilt
- EmulateTilt(&accel, m_tilt, focus);
+ EmulateTilt(&accel, m_tilt);
- if (focus)
- {
- // swing
- EmulateSwing(&accel, m_swing);
- // shake
- EmulateShake(&accel, m_shake, m_shake_step);
- // buttons
- m_buttons->GetState(&ncdata->bt, nunchuk_button_bitmasks);
- }
+ // swing
+ EmulateSwing(&accel, m_swing);
+ // shake
+ EmulateShake(&accel, m_shake, m_shake_step);
+ // buttons
+ m_buttons->GetState(&ncdata->bt, nunchuk_button_bitmasks);
// flip the button bits :/
ncdata->bt ^= 0x03;
- if (m_udpWrap->inst)
- {
- if (m_udpWrap->updNun)
- {
- u8 mask;
- float x, y;
- m_udpWrap->inst->getNunchuck(&x, &y, &mask);
- // buttons
- if (mask & UDPWM_NC)
- ncdata->bt &= ~WiimoteEmu::Nunchuk::BUTTON_C;
- if (mask & UDPWM_NZ)
- ncdata->bt &= ~WiimoteEmu::Nunchuk::BUTTON_Z;
- // stick
- if (ncdata->jx == 0x80 && ncdata->jy == 0x80)
- {
- ncdata->jx = u8(0x80 + x*127);
- ncdata->jy = u8(0x80 + y*127);
- }
- }
- if (m_udpWrap->updNunAccel)
- {
- float x, y, z;
- m_udpWrap->inst->getNunchuckAccel(&x, &y, &z);
- accel.x = x;
- accel.y = y;
- accel.z = z;
- }
- }
-
FillRawAccelFromGForceData(*(wm_accel*)&ncdata->ax, *(accel_cal*)®.calibration, accel);
}
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.h b/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.h
index 83a7540c46..dbb91e3f2d 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.h
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.h
@@ -6,17 +6,15 @@
#include "Core/HW/WiimoteEmu/Attachment/Attachment.h"
-class UDPWrapper;
-
namespace WiimoteEmu
{
class Nunchuk : public Attachment
{
public:
- Nunchuk(UDPWrapper * wrp, WiimoteEmu::ExtensionReg& _reg);
+ Nunchuk(WiimoteEmu::ExtensionReg& _reg);
- virtual void GetState(u8* const data, const bool focus) override;
+ virtual void GetState(u8* const data) override;
enum
{
@@ -36,8 +34,6 @@ private:
AnalogStick* m_stick;
u8 m_shake_step[3];
-
- UDPWrapper* const m_udpWrap;
};
}
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.cpp
index 650d5b6720..b21c5cb1ea 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.cpp
@@ -55,63 +55,68 @@ Turntable::Turntable(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Turnta
memcpy(&id, turntable_id, sizeof(turntable_id));
}
-void Turntable::GetState(u8* const data, const bool focus)
+void Turntable::GetState(u8* const data)
{
wm_turntable_extension* const ttdata = (wm_turntable_extension*)data;
ttdata->bt = 0;
// stick
{
- u8 x, y;
- m_stick->GetState(&x, &y, 0x20, focus ? 0x1F /*0x15*/ : 0);
+ double x, y;
+ m_stick->GetState(&x, &y);
- ttdata->sx = x;
- ttdata->sy = y;
+ ttdata->sx = (x * 0x1F) + 0x20;
+ ttdata->sy = (y * 0x1F) + 0x20;
}
// left table
{
- s8 tt = 0;
- m_left_table->GetState(&tt, focus ? 0x1F : 0);
+ double tt;
+ s8 tt_;
+ m_left_table->GetState(&tt);
- ttdata->ltable1 = tt;
- ttdata->ltable2 = tt >> 5;
+ tt_ = tt * 0x1F;
+
+ ttdata->ltable1 = tt_;
+ ttdata->ltable2 = tt_ >> 5;
}
// right table
{
- s8 tt = 0;
- m_right_table->GetState(&tt, focus ? 0x1F : 0);
+ double tt;
+ s8 tt_;
+ m_right_table->GetState(&tt);
- ttdata->rtable1 = tt;
- ttdata->rtable2 = tt >> 1;
- ttdata->rtable3 = tt >> 3;
- ttdata->rtable4 = tt >> 5;
+ tt_ = tt * 0x1F;
+
+ ttdata->rtable1 = tt_;
+ ttdata->rtable2 = tt_ >> 1;
+ ttdata->rtable3 = tt_ >> 3;
+ ttdata->rtable4 = tt_ >> 5;
}
// effect dial
{
- u8 dial = 0;
- m_effect_dial->GetState(&dial, focus ? 0xF : 0);
+ double dial;
+ u8 dial_;
+ m_effect_dial->GetState(&dial);
- ttdata->dial1 = dial;
- ttdata->dial2 = dial >> 3;
+ dial_ = dial * 0x0F;
+
+ ttdata->dial1 = dial_;
+ ttdata->dial2 = dial_ >> 3;
}
// crossfade slider
{
- s8 cfs = 0;
- m_crossfade->GetState(&cfs, focus ? 7 : 0);
- cfs += 8;
+ double cfs;
+ m_crossfade->GetState(&cfs);
- ttdata->slider = cfs;
+ ttdata->slider = (cfs * 0x07) + 0x08;
}
- if (focus)
- {
- // buttons
- m_buttons->GetState(&ttdata->bt, turntable_button_bitmasks);
- }
+ // buttons
+ m_buttons->GetState(&ttdata->bt, turntable_button_bitmasks);
// flip button bits :/
ttdata->bt ^= (
diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.h b/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.h
index 48b3658ce1..a3259a3883 100644
--- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.h
+++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Turntable.h
@@ -13,7 +13,7 @@ class Turntable : public Attachment
{
public:
Turntable(WiimoteEmu::ExtensionReg& _reg);
- void GetState(u8* const data, const bool focus) override;
+ void GetState(u8* const data) override;
enum
{
diff --git a/Source/Core/Core/HW/WiimoteEmu/UDPTLayer.h b/Source/Core/Core/HW/WiimoteEmu/UDPTLayer.h
deleted file mode 100644
index 52ff2b7f79..0000000000
--- a/Source/Core/Core/HW/WiimoteEmu/UDPTLayer.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2013 Dolphin Emulator Project
-// Licensed under GPLv2
-// Refer to the license.txt file included.
-
-//UDP Wiimote Translation Layer
-
-#pragma once
-
-#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
-#include "InputCommon/UDPWiimote.h"
-
-namespace UDPTLayer
-{
- static void GetButtons(UDPWrapper * m , wm_core * butt)
- {
- if (!(m->inst)) return;
- if (!(m->updButt)) return;
- u32 mask = m->inst->getButtons();
- *butt |= (mask & UDPWM_BA) ? WiimoteEmu::Wiimote::BUTTON_A : 0;
- *butt |= (mask & UDPWM_BB) ? WiimoteEmu::Wiimote::BUTTON_B : 0;
- *butt |= (mask & UDPWM_B1) ? WiimoteEmu::Wiimote::BUTTON_ONE : 0;
- *butt |= (mask & UDPWM_B2) ? WiimoteEmu::Wiimote::BUTTON_TWO : 0;
- *butt |= (mask & UDPWM_BP) ? WiimoteEmu::Wiimote::BUTTON_PLUS : 0;
- *butt |= (mask & UDPWM_BM) ? WiimoteEmu::Wiimote::BUTTON_MINUS : 0;
- *butt |= (mask & UDPWM_BH) ? WiimoteEmu::Wiimote::BUTTON_HOME : 0;
- *butt |= (mask & UDPWM_BU) ? WiimoteEmu::Wiimote::PAD_UP : 0;
- *butt |= (mask & UDPWM_BD) ? WiimoteEmu::Wiimote::PAD_DOWN : 0;
- *butt |= (mask & UDPWM_BL) ? WiimoteEmu::Wiimote::PAD_LEFT : 0;
- *butt |= (mask & UDPWM_BR) ? WiimoteEmu::Wiimote::PAD_RIGHT : 0;
- }
-
- static void GetAcceleration(UDPWrapper * m , WiimoteEmu::AccelData * const data)
- {
- if (!(m->inst)) return;
- if (!(m->updAccel)) return;
- float x, y, z;
- m->inst->getAccel(&x, &y, &z);
- data->x = x;
- data->y = y;
- data->z = z;
- }
-
- static void GetIR( UDPWrapper * m, float * x, float * y, float * z)
- {
- if (!(m->inst)) return;
- if (!(m->updIR)) return;
- if ((*x >= -0.999) && (*x <= 0.999) && (*y >= -0.999) && (*y <= 0.999)) return; //the received values are used ONLY when the normal pointer is offscreen
- float _x, _y;
- m->inst->getIR(&_x, &_y);
- *x = _x * 2 - 1;
- *y = -(_y * 2 - 1);
- *z = 0;
- }
-}
diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp
index 6c6943d2f3..7cfcd50f23 100644
--- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp
+++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp
@@ -13,7 +13,6 @@
#include "Core/NetPlayClient.h"
#include "Core/HW/WiimoteEmu/MatrixMath.h"
-#include "Core/HW/WiimoteEmu/UDPTLayer.h"
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
#include "Core/HW/WiimoteEmu/Attachment/Classic.h"
@@ -119,11 +118,14 @@ void EmulateShake(AccelData* const accel
void EmulateTilt(AccelData* const accel
, ControllerEmu::Tilt* const tilt_group
- , const bool focus, const bool sideways, const bool upright)
+ , const bool sideways, const bool upright)
{
- float roll, pitch;
+ double roll, pitch;
// 180 degrees
- tilt_group->GetState(&roll, &pitch, 0, focus ? PI : 0);
+ tilt_group->GetState(&roll, &pitch);
+
+ roll *= PI;
+ pitch *= PI;
unsigned int ud = 0, lr = 0, fb = 0;
@@ -145,7 +147,7 @@ void EmulateTilt(AccelData* const accel
if (!sideways && upright)
sgn[ud] *= -1;
- (&accel->x)[ud] = (sin((PI / 2) - std::max(fabsf(roll), fabsf(pitch))))*sgn[ud];
+ (&accel->x)[ud] = (sin((PI / 2) - std::max(fabs(roll), fabs(pitch))))*sgn[ud];
(&accel->x)[lr] = -sin(roll)*sgn[lr];
(&accel->x)[fb] = sin(pitch)*sgn[fb];
}
@@ -156,8 +158,8 @@ void EmulateSwing(AccelData* const accel
, ControllerEmu::Force* const swing_group
, const bool sideways, const bool upright)
{
- float swing[3];
- swing_group->GetState(swing, 0, SWING_INTENSITY);
+ double swing[3];
+ swing_group->GetState(swing);
s8 g_dir[3] = {-1, -1, -1};
u8 axis_map[3];
@@ -175,7 +177,7 @@ void EmulateSwing(AccelData* const accel
g_dir[axis_map[0]] *= -1;
for (unsigned int i=0; i<3; ++i)
- (&accel->x)[axis_map[i]] += swing[i] * g_dir[i];
+ (&accel->x)[axis_map[i]] += swing[i] * g_dir[i] * SWING_INTENSITY;
}
const u16 button_bitmasks[] =
@@ -266,9 +268,6 @@ Wiimote::Wiimote( const unsigned int index )
for (auto& named_button : named_buttons)
m_buttons->controls.emplace_back(new ControlGroup::Input( named_button));
- // udp
- groups.emplace_back(m_udp = new UDPWrapper(m_index, _trans("UDP Wiimote")));
-
// ir
groups.emplace_back(m_ir = new Cursor(_trans("IR")));
@@ -287,7 +286,7 @@ Wiimote::Wiimote( const unsigned int index )
// extension
groups.emplace_back(m_extension = new Extension(_trans("Extension")));
m_extension->attachments.emplace_back(new WiimoteEmu::None(m_reg_ext));
- m_extension->attachments.emplace_back(new WiimoteEmu::Nunchuk(m_udp, m_reg_ext));
+ m_extension->attachments.emplace_back(new WiimoteEmu::Nunchuk(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Classic(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Guitar(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Drums(m_reg_ext));
@@ -306,7 +305,7 @@ Wiimote::Wiimote( const unsigned int index )
// options
groups.emplace_back( m_options = new ControlGroup(_trans("Options")));
- m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Background Input"), false));
+ m_options->settings.emplace_back(new ControlGroup::BackgroundInputSetting(_trans("Background Input")));
m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Sideways Wiimote"), false));
m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Upright Wiimote"), false));
@@ -322,26 +321,17 @@ std::string Wiimote::GetName() const
return std::string("Wiimote") + char('1'+m_index);
}
-// if windows is focused or background input is enabled
-#define HAS_FOCUS (Host_RendererHasFocus() || (m_options->settings[0]->value != 0))
-
bool Wiimote::Step()
{
- const bool has_focus = HAS_FOCUS;
-
// TODO: change this a bit
m_motion_plus_present = m_extension->settings[0]->value != 0;
- // no rumble if no focus
- if (false == has_focus)
- m_rumble_on = false;
-
m_rumble->controls[0]->control_ref->State(m_rumble_on);
// when a movie is active, this button status update is disabled (moved), because movies only record data reports.
if (!(Movie::IsPlayingInput() || Movie::IsRecordingInput()) || NetPlay::IsNetPlayRunning())
{
- UpdateButtonsStatus(has_focus);
+ UpdateButtonsStatus();
}
// check if there is a read data request
@@ -381,17 +371,13 @@ bool Wiimote::Step()
return false;
}
-void Wiimote::UpdateButtonsStatus(bool has_focus)
+void Wiimote::UpdateButtonsStatus()
{
// update buttons in status struct
m_status.buttons = 0;
- if (has_focus)
- {
- const bool is_sideways = m_options->settings[1]->value != 0;
- m_buttons->GetState(&m_status.buttons, button_bitmasks);
- m_dpad->GetState(&m_status.buttons, is_sideways ? dpad_sideways_bitmasks : dpad_bitmasks);
- UDPTLayer::GetButtons(m_udp, &m_status.buttons);
- }
+ const bool is_sideways = m_options->settings[1]->value != 0;
+ m_buttons->GetState(&m_status.buttons, button_bitmasks);
+ m_dpad->GetState(&m_status.buttons, is_sideways ? dpad_sideways_bitmasks : dpad_bitmasks);
}
void Wiimote::GetCoreData(u8* const data)
@@ -399,7 +385,7 @@ void Wiimote::GetCoreData(u8* const data)
// when a movie is active, the button update happens here instead of Wiimote::Step, to avoid potential desync issues.
if (Movie::IsPlayingInput() || Movie::IsRecordingInput() || NetPlay::IsNetPlayRunning())
{
- UpdateButtonsStatus(HAS_FOCUS);
+ UpdateButtonsStatus();
}
*(wm_core*)data |= m_status.buttons;
@@ -407,21 +393,16 @@ void Wiimote::GetCoreData(u8* const data)
void Wiimote::GetAccelData(u8* const data)
{
- const bool has_focus = HAS_FOCUS;
const bool is_sideways = m_options->settings[1]->value != 0;
const bool is_upright = m_options->settings[2]->value != 0;
// ----TILT----
- EmulateTilt(&m_accel, m_tilt, has_focus, is_sideways, is_upright);
+ EmulateTilt(&m_accel, m_tilt, is_sideways, is_upright);
// ----SWING----
// ----SHAKE----
- if (has_focus)
- {
- EmulateSwing(&m_accel, m_swing, is_sideways, is_upright);
- EmulateShake(&m_accel, m_shake, m_shake_step);
- UDPTLayer::GetAcceleration(m_udp, &m_accel);
- }
+ EmulateSwing(&m_accel, m_swing, is_sideways, is_upright);
+ EmulateShake(&m_accel, m_shake, m_shake_step);
FillRawAccelFromGForceData(*(wm_accel*)data, *(accel_cal*)&m_eeprom[0x16], m_accel);
}
@@ -435,94 +416,89 @@ inline void LowPassFilter(double & var, double newval, double period)
void Wiimote::GetIRData(u8* const data, bool use_accel)
{
- const bool has_focus = HAS_FOCUS;
-
u16 x[4], y[4];
memset(x, 0xFF, sizeof(x));
- if (has_focus)
- {
- float xx = 10000, yy = 0, zz = 0;
- double nsin,ncos;
+ double xx = 10000, yy = 0, zz = 0;
+ double nsin,ncos;
- if (use_accel)
+ if (use_accel)
+ {
+ double ax,az,len;
+ ax=m_accel.x;
+ az=m_accel.z;
+ len=sqrt(ax*ax+az*az);
+ if (len)
{
- double ax,az,len;
- ax=m_accel.x;
- az=m_accel.z;
- len=sqrt(ax*ax+az*az);
- if (len)
- {
- ax/=len;
- az/=len; //normalizing the vector
- nsin=ax;
- ncos=az;
- }
- else
- {
- nsin=0;
- ncos=1;
- }
- // PanicAlert("%d %d %d\nx:%f\nz:%f\nsin:%f\ncos:%f",accel->x,accel->y,accel->z,ax,az,sin,cos);
- // PanicAlert("%d %d %d\n%d %d %d\n%d %d %d",accel->x,accel->y,accel->z,calib->zero_g.x,calib->zero_g.y,calib->zero_g.z, calib->one_g.x,calib->one_g.y,calib->one_g.z);
+ ax/=len;
+ az/=len; //normalizing the vector
+ nsin=ax;
+ ncos=az;
}
else
{
- nsin=0; //m_tilt stuff here (can't figure it out yet....)
+ nsin=0;
ncos=1;
}
+ // PanicAlert("%d %d %d\nx:%f\nz:%f\nsin:%f\ncos:%f",accel->x,accel->y,accel->z,ax,az,sin,cos);
+ // PanicAlert("%d %d %d\n%d %d %d\n%d %d %d",accel->x,accel->y,accel->z,calib->zero_g.x,calib->zero_g.y,calib->zero_g.z, calib->one_g.x,calib->one_g.y,calib->one_g.z);
+ }
+ else
+ {
+ nsin=0; //m_tilt stuff here (can't figure it out yet....)
+ ncos=1;
+ }
- LowPassFilter(ir_sin,nsin,1.0f/60);
- LowPassFilter(ir_cos,ncos,1.0f/60);
+ LowPassFilter(ir_sin,nsin,1.0f/60);
+ LowPassFilter(ir_cos,ncos,1.0f/60);
- m_ir->GetState(&xx, &yy, &zz, true);
- UDPTLayer::GetIR(m_udp, &xx, &yy, &zz);
+ m_ir->GetState(&xx, &yy, &zz, true);
- Vertex v[4];
+ Vertex v[4];
- static const int camWidth=1024;
- static const int camHeight=768;
- static const double bndup=-0.315447;
- static const double bnddown=0.85;
- static const double bndleft=0.443364;
- static const double bndright=-0.443364;
- static const double dist1=100.f/camWidth; //this seems the optimal distance for zelda
- static const double dist2=1.2f*dist1;
+ static const int camWidth=1024;
+ static const int camHeight=768;
+ static const double bndup=-0.315447;
+ static const double bnddown=0.85;
+ static const double bndleft=0.443364;
+ static const double bndright=-0.443364;
+ static const double dist1=100.f/camWidth; //this seems the optimal distance for zelda
+ static const double dist2=1.2f*dist1;
- for (auto& vtx : v)
- {
- vtx.x=xx*(bndright-bndleft)/2+(bndleft+bndright)/2;
- if (m_sensor_bar_on_top) vtx.y=yy*(bndup-bnddown)/2+(bndup+bnddown)/2;
- else vtx.y=yy*(bndup-bnddown)/2-(bndup+bnddown)/2;
- vtx.z=0;
- }
+ for (auto& vtx : v)
+ {
+ vtx.x=xx*(bndright-bndleft)/2+(bndleft+bndright)/2;
+ if (m_sensor_bar_on_top) vtx.y=yy*(bndup-bnddown)/2+(bndup+bnddown)/2;
+ else vtx.y=yy*(bndup-bnddown)/2-(bndup+bnddown)/2;
+ vtx.z=0;
+ }
- v[0].x-=(zz*0.5+1)*dist1;
- v[1].x+=(zz*0.5+1)*dist1;
- v[2].x-=(zz*0.5+1)*dist2;
- v[3].x+=(zz*0.5+1)*dist2;
+ v[0].x-=(zz*0.5+1)*dist1;
+ v[1].x+=(zz*0.5+1)*dist1;
+ v[2].x-=(zz*0.5+1)*dist2;
+ v[3].x+=(zz*0.5+1)*dist2;
#define printmatrix(m) PanicAlert("%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n",m[0][0],m[0][1],m[0][2],m[0][3],m[1][0],m[1][1],m[1][2],m[1][3],m[2][0],m[2][1],m[2][2],m[2][3],m[3][0],m[3][1],m[3][2],m[3][3])
- Matrix rot,tot;
- static Matrix scale;
- MatrixScale(scale,1,camWidth/camHeight,1);
- //MatrixIdentity(scale);
- MatrixRotationByZ(rot,ir_sin,ir_cos);
- //MatrixIdentity(rot);
- MatrixMultiply(tot,scale,rot);
+ Matrix rot,tot;
+ static Matrix scale;
+ MatrixScale(scale,1,camWidth/camHeight,1);
+ //MatrixIdentity(scale);
+ MatrixRotationByZ(rot,ir_sin,ir_cos);
+ //MatrixIdentity(rot);
+ MatrixMultiply(tot,scale,rot);
- for (int i=0; i<4; i++)
- {
- MatrixTransformVertex(tot,v[i]);
- if ((v[i].x<-1)||(v[i].x>1)||(v[i].y<-1)||(v[i].y>1))
- continue;
- x[i] = (u16)lround((v[i].x+1)/2*(camWidth-1));
- y[i] = (u16)lround((v[i].y+1)/2*(camHeight-1));
- }
- // PanicAlert("%f %f\n%f %f\n%f %f\n%f %f\n%d %d\n%d %d\n%d %d\n%d %d",
- // v[0].x,v[0].y,v[1].x,v[1].y,v[2].x,v[2].y,v[3].x,v[3].y,
- // x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[38]);
+ for (int i=0; i<4; i++)
+ {
+ MatrixTransformVertex(tot,v[i]);
+ if ((v[i].x<-1)||(v[i].x>1)||(v[i].y<-1)||(v[i].y>1))
+ continue;
+ x[i] = (u16)lround((v[i].x+1)/2*(camWidth-1));
+ y[i] = (u16)lround((v[i].y+1)/2*(camHeight-1));
}
+ // PanicAlert("%f %f\n%f %f\n%f %f\n%f %f\n%d %d\n%d %d\n%d %d\n%d %d",
+ // v[0].x,v[0].y,v[1].x,v[1].y,v[2].x,v[2].y,v[3].x,v[3].y,
+ // x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[38]);
+
// Fill report with valid data when full handshake was done
if (m_reg_ir.data[0x30])
// ir mode
@@ -582,7 +558,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel)
void Wiimote::GetExtData(u8* const data)
{
- m_extension->GetState(data, HAS_FOCUS);
+ m_extension->GetState(data);
// i dont think anything accesses the extension data like this, but ill support it. Indeed, commercial games don't do this.
// i think it should be unencrpyted in the register, encrypted when read.
diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h
index d3495399d1..43133ab5af 100644
--- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h
+++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h
@@ -12,7 +12,6 @@
#include "Core/HW/WiimoteEmu/Encryption.h"
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
#include "InputCommon/ControllerEmu.h"
-#include "InputCommon/UDPWrapper.h"
// Registry sizes
#define WIIMOTE_EEPROM_SIZE (16*1024)
@@ -78,7 +77,7 @@ void EmulateShake(AccelData* const accel_data
void EmulateTilt(AccelData* const accel
, ControllerEmu::Tilt* const tilt_group
- , const bool focus, const bool sideways = false, const bool upright = false);
+ , const bool sideways = false, const bool upright = false);
void EmulateSwing(AccelData* const accel
, ControllerEmu::Force* const tilt_group
@@ -129,7 +128,7 @@ protected:
bool Step();
void HidOutputReport(const wm_report* const sr, const bool send_ack = true);
void HandleExtensionSwap();
- void UpdateButtonsStatus(bool has_focus);
+ void UpdateButtonsStatus();
void GetCoreData(u8* const data);
void GetAccelData(u8* const data);
@@ -175,8 +174,6 @@ private:
double ir_sin, ir_cos; //for the low pass filter
- UDPWrapper* m_udp;
-
bool m_rumble_on;
bool m_speaker_mute;
bool m_motion_plus_present;
diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt
index db4b9b16dd..dff065c84f 100644
--- a/Source/Core/DolphinWX/CMakeLists.txt
+++ b/Source/Core/DolphinWX/CMakeLists.txt
@@ -89,7 +89,6 @@ if(wxWidgets_FOUND)
PHackSettings.cpp
PatchAddEdit.cpp
TASInputDlg.cpp
- UDPConfigDiag.cpp
VideoConfigDiag.cpp
WXInputBase.cpp
WiimoteConfigDiag.cpp
diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj b/Source/Core/DolphinWX/DolphinWX.vcxproj
index 440d9ff8be..a402328cc9 100644
--- a/Source/Core/DolphinWX/DolphinWX.vcxproj
+++ b/Source/Core/DolphinWX/DolphinWX.vcxproj
@@ -1,4 +1,4 @@
-
+
@@ -95,7 +95,6 @@
Create
-
@@ -144,7 +143,6 @@
-
@@ -230,4 +228,4 @@
-
\ No newline at end of file
+
diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj.filters b/Source/Core/DolphinWX/DolphinWX.vcxproj.filters
index 9c9a656f26..654a1bf36c 100644
--- a/Source/Core/DolphinWX/DolphinWX.vcxproj.filters
+++ b/Source/Core/DolphinWX/DolphinWX.vcxproj.filters
@@ -1,4 +1,4 @@
-
+
@@ -152,9 +152,6 @@
GUI
-
- GUI
-
GUI
@@ -280,9 +277,6 @@
GUI
-
- GUI
-
GUI
@@ -302,4 +296,4 @@
Resources
-
\ No newline at end of file
+
diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp
index d0f379b78a..12fcb5f3bf 100644
--- a/Source/Core/DolphinWX/Frame.cpp
+++ b/Source/Core/DolphinWX/Frame.cpp
@@ -753,24 +753,15 @@ void CFrame::OnRenderWindowSizeRequest(int width, int height)
bool CFrame::RendererHasFocus()
{
- if (m_RenderParent == nullptr)
- return false;
-#ifdef _WIN32
- if (m_RenderParent->GetParent()->GetHWND() == GetForegroundWindow())
- return true;
-#else
- wxWindow *window = wxWindow::FindFocus();
- if (window == nullptr)
- return false;
- // Why these different cases?
- if (m_RenderParent == window ||
- m_RenderParent == window->GetParent() ||
- m_RenderParent->GetParent() == window->GetParent())
- {
- return true;
- }
-#endif
- return false;
+ // RendererHasFocus should return true any time any one of our
+ // windows has the focus, including any dialogs or other windows.
+ //
+ // wxGetActiveWindow() returns the current wxWindow which has
+ // focus. If it's not one of our windows, then it will return
+ // null.
+
+ wxWindow *focusWindow = wxGetActiveWindow();
+ return (focusWindow != nullptr);
}
void CFrame::OnGameListCtrl_ItemActivated(wxListEvent& WXUNUSED (event))
diff --git a/Source/Core/DolphinWX/InputConfigDiag.cpp b/Source/Core/DolphinWX/InputConfigDiag.cpp
index 2990fdba6b..6e0fcbd5ef 100644
--- a/Source/Core/DolphinWX/InputConfigDiag.cpp
+++ b/Source/Core/DolphinWX/InputConfigDiag.cpp
@@ -45,7 +45,6 @@
#include "Common/MsgHandler.h"
#include "Core/HW/Wiimote.h"
#include "DolphinWX/InputConfigDiag.h"
-#include "DolphinWX/UDPConfigDiag.h"
#include "DolphinWX/WxUtils.h"
#include "InputCommon/ControllerEmu.h"
#include "InputCommon/InputConfig.h"
@@ -53,18 +52,10 @@
#include "InputCommon/ControllerInterface/Device.h"
#include "InputCommon/ControllerInterface/ExpressionParser.h"
-class UDPWrapper;
class wxWindow;
using namespace ciface::ExpressionParser;
-void GamepadPage::ConfigUDPWii(wxCommandEvent &event)
-{
- UDPWrapper* const wrp = ((UDPConfigButton*)event.GetEventObject())->wrapper;
- UDPConfigDiag diag(this, wrp);
- diag.ShowModal();
-}
-
void GamepadPage::ConfigExtension(wxCommandEvent& event)
{
ControllerEmu::Extension* const ex = ((ExtensionButton*)event.GetEventObject())->extension;
@@ -113,32 +104,32 @@ void PadSettingExtension::UpdateValue()
extension->switch_extension = ((wxChoice*)wxcontrol)->GetSelection();
}
-PadSettingCheckBox::PadSettingCheckBox(wxWindow* const parent, ControlState& _value, const std::string& label)
- : PadSetting(new wxCheckBox(parent, -1, wxGetTranslation(StrToWxStr(label))))
- , value(_value)
+PadSettingCheckBox::PadSettingCheckBox(wxWindow* const parent, ControllerEmu::ControlGroup::Setting* const _setting)
+ : PadSetting(new wxCheckBox(parent, -1, wxGetTranslation(StrToWxStr(_setting->name))))
+ , setting(_setting)
{
UpdateGUI();
}
void PadSettingCheckBox::UpdateGUI()
{
- ((wxCheckBox*)wxcontrol)->SetValue(value > 0);
+ ((wxCheckBox*)wxcontrol)->SetValue(setting->GetValue());
}
void PadSettingCheckBox::UpdateValue()
{
// 0.01 so its saved to the ini file as just 1. :(
- value = 0.01 * ((wxCheckBox*)wxcontrol)->GetValue();
+ setting->SetValue(0.01 * ((wxCheckBox*)wxcontrol)->GetValue());
}
void PadSettingSpin::UpdateGUI()
{
- ((wxSpinCtrl*)wxcontrol)->SetValue((int)(value * 100));
+ ((wxSpinCtrl*)wxcontrol)->SetValue((int)(setting->GetValue() * 100));
}
void PadSettingSpin::UpdateValue()
{
- value = float(((wxSpinCtrl*)wxcontrol)->GetValue()) / 100;
+ setting->SetValue(float(((wxSpinCtrl*)wxcontrol)->GetValue()) / 100);
}
ControlDialog::ControlDialog(GamepadPage* const parent, InputPlugin& plugin, ControllerInterface::ControlReference* const ref)
@@ -883,19 +874,12 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
Add(configure_btn, 0, wxALL|wxEXPAND, 3);
}
break;
- case GROUP_TYPE_UDPWII:
- {
- wxButton* const btn = new UDPConfigButton(parent, (UDPWrapper*)group);
- btn->Bind(wxEVT_BUTTON, &GamepadPage::ConfigUDPWii, eventsink);
- Add(btn, 0, wxALL|wxEXPAND, 3);
- }
- break;
default:
{
//options
for (auto& groupSetting : group->settings)
{
- PadSettingCheckBox* setting_cbox = new PadSettingCheckBox(parent, groupSetting->value, groupSetting->name);
+ PadSettingCheckBox* setting_cbox = new PadSettingCheckBox(parent, groupSetting.get());
setting_cbox->wxcontrol->Bind(wxEVT_CHECKBOX, &GamepadPage::AdjustSetting, eventsink);
options.push_back(setting_cbox);
diff --git a/Source/Core/DolphinWX/InputConfigDiag.h b/Source/Core/DolphinWX/InputConfigDiag.h
index 64a3ceabe6..12223bed9c 100644
--- a/Source/Core/DolphinWX/InputConfigDiag.h
+++ b/Source/Core/DolphinWX/InputConfigDiag.h
@@ -29,7 +29,6 @@
#include "InputCommon/ControllerInterface/Device.h"
class InputPlugin;
-class UDPWrapper;
class wxComboBox;
class wxCommandEvent;
class wxEvent;
@@ -70,25 +69,25 @@ public:
class PadSettingSpin : public PadSetting
{
public:
- PadSettingSpin(wxWindow* const parent, ControllerEmu::ControlGroup::Setting* const setting)
- : PadSetting(new wxSpinCtrl(parent, -1, wxEmptyString, wxDefaultPosition
- , wxSize(54, -1), 0, setting->low, setting->high, (int)(setting->value * 100)))
- , value(setting->value) {}
+ PadSettingSpin(wxWindow* const parent, ControllerEmu::ControlGroup::Setting* const _setting)
+ : PadSetting(new wxSpinCtrl(parent, -1, wxEmptyString, wxDefaultPosition,
+ wxSize(54, -1), 0, _setting->low, _setting->high, (int)(_setting->value * 100)))
+ , setting(_setting) {}
void UpdateGUI() override;
void UpdateValue() override;
- ControlState& value;
+ ControllerEmu::ControlGroup::Setting* const setting;
};
class PadSettingCheckBox : public PadSetting
{
public:
- PadSettingCheckBox(wxWindow* const parent, ControlState& _value, const std::string& label);
+ PadSettingCheckBox(wxWindow* const parent, ControllerEmu::ControlGroup::Setting* const setting);
void UpdateGUI() override;
void UpdateValue() override;
- ControlState& value;
+ ControllerEmu::ControlGroup::Setting* const setting;
};
class GamepadPage;
@@ -147,16 +146,6 @@ public:
ControllerInterface::ControlReference* const control_reference;
};
-class UDPConfigButton : public wxButton
-{
-public:
- UDPWrapper* const wrapper;
- UDPConfigButton(wxWindow* const parent, UDPWrapper * udp)
- : wxButton(parent, -1, _("Configure"), wxDefaultPosition)
- , wrapper(udp)
- {}
-};
-
class ControlGroupBox : public wxBoxSizer
{
public:
@@ -200,8 +189,6 @@ public:
void ConfigExtension(wxCommandEvent& event);
- void ConfigUDPWii(wxCommandEvent& event);
-
void SetDevice(wxCommandEvent& event);
void ClearAll(wxCommandEvent& event);
diff --git a/Source/Core/DolphinWX/InputConfigDiagBitmaps.cpp b/Source/Core/DolphinWX/InputConfigDiagBitmaps.cpp
index 998758d50b..72faac4150 100644
--- a/Source/Core/DolphinWX/InputConfigDiagBitmaps.cpp
+++ b/Source/Core/DolphinWX/InputConfigDiagBitmaps.cpp
@@ -29,6 +29,360 @@
class wxTimerEvent;
+static void DrawCenteredRectangle(wxDC &dc, int x, int y, int w, int h)
+{
+ x -= w / 2;
+ y -= h / 2;
+ dc.DrawRectangle(x, y, w, h);
+}
+
+#define VIS_BITMAP_SIZE 64
+
+#define VIS_NORMALIZE(a) ((a / 2.0) + 0.5)
+#define VIS_COORD(a) ((VIS_NORMALIZE(a)) * VIS_BITMAP_SIZE)
+
+#define COORD_VIS_SIZE 4
+
+static void DrawCoordinate(wxDC &dc, double x, double y)
+{
+ int xc = VIS_COORD(x);
+ int yc = VIS_COORD(y);
+ DrawCenteredRectangle(dc, xc, yc, COORD_VIS_SIZE, COORD_VIS_SIZE);
+}
+
+static void DrawControlGroupBox(wxDC &dc, ControlGroupBox *g)
+{
+ switch (g->control_group->type)
+ {
+ case GROUP_TYPE_TILT :
+ case GROUP_TYPE_STICK :
+ case GROUP_TYPE_CURSOR :
+ {
+ // this is starting to be a mess combining all these in one case
+
+ double x = 0, y = 0, z = 0;
+
+ switch (g->control_group->type)
+ {
+ case GROUP_TYPE_STICK :
+ ((ControllerEmu::AnalogStick*)g->control_group)->GetState(&x, &y);
+ break;
+ case GROUP_TYPE_TILT :
+ ((ControllerEmu::Tilt*)g->control_group)->GetState(&x, &y);
+ break;
+ case GROUP_TYPE_CURSOR :
+ ((ControllerEmu::Cursor*)g->control_group)->GetState(&x, &y, &z);
+ break;
+ }
+
+ // ir cursor forward movement
+ if (GROUP_TYPE_CURSOR == g->control_group->type)
+ {
+ if (z)
+ {
+ dc.SetPen(*wxRED_PEN);
+ dc.SetBrush(*wxRED_BRUSH);
+ }
+ else
+ {
+ dc.SetPen(*wxGREY_PEN);
+ dc.SetBrush(*wxGREY_BRUSH);
+ }
+ dc.DrawRectangle(0, 31 - z*31, 64, 2);
+ }
+
+ // octagon for visual aid for diagonal adjustment
+ dc.SetPen(*wxLIGHT_GREY_PEN);
+ dc.SetBrush(*wxWHITE_BRUSH);
+ if (GROUP_TYPE_STICK == g->control_group->type)
+ {
+ // outline and fill colors
+ wxBrush LightGrayBrush("#dddddd");
+ wxPen LightGrayPen("#bfbfbf");
+ dc.SetBrush(LightGrayBrush);
+ dc.SetPen(LightGrayPen);
+
+ // polygon offset
+ float max
+ , diagonal
+ , box = 64
+ , d_of = box / 256.0
+ , x_of = box / 2.0;
+
+ if (g->control_group->name == "Main Stick")
+ {
+ max = (87.0f / 127.0f) * 100;
+ diagonal = (55.0f / 127.0f) * 100.0;
+ }
+ else if (g->control_group->name == "C-Stick")
+ {
+ max = (74.0f / 127.0f) * 100;
+ diagonal = (46.0f / 127.0f) * 100;
+ }
+ else
+ {
+ max = (82.0f / 127.0f) * 100;
+ diagonal = (58.0f / 127.0f) * 100;
+ }
+
+ // polygon corners
+ wxPoint Points[8];
+ Points[0].x = (int)(0.0 * d_of + x_of); Points[0].y = (int)(max * d_of + x_of);
+ Points[1].x = (int)(diagonal * d_of + x_of); Points[1].y = (int)(diagonal * d_of + x_of);
+ Points[2].x = (int)(max * d_of + x_of); Points[2].y = (int)(0.0 * d_of + x_of);
+ Points[3].x = (int)(diagonal * d_of + x_of); Points[3].y = (int)(-diagonal * d_of + x_of);
+ Points[4].x = (int)(0.0 * d_of + x_of); Points[4].y = (int)(-max * d_of + x_of);
+ Points[5].x = (int)(-diagonal * d_of + x_of); Points[5].y = (int)(-diagonal * d_of + x_of);
+ Points[6].x = (int)(-max * d_of + x_of); Points[6].y = (int)(0.0 * d_of + x_of);
+ Points[7].x = (int)(-diagonal * d_of + x_of); Points[7].y = (int)(diagonal * d_of + x_of);
+
+ // draw polygon
+ dc.DrawPolygon(8, Points);
+ }
+ else
+ {
+ dc.DrawRectangle(16, 16, 32, 32);
+ }
+
+ if (GROUP_TYPE_CURSOR != g->control_group->type)
+ {
+ // deadzone circle
+ dc.SetBrush(*wxLIGHT_GREY_BRUSH);
+ dc.DrawCircle(32, 32, g->control_group->settings[SETTING_DEADZONE]->value * 32);
+ }
+
+ // raw dot
+ {
+ float xx, yy;
+ xx = g->control_group->controls[3]->control_ref->State();
+ xx -= g->control_group->controls[2]->control_ref->State();
+ yy = g->control_group->controls[1]->control_ref->State();
+ yy -= g->control_group->controls[0]->control_ref->State();
+
+ dc.SetPen(*wxGREY_PEN);
+ dc.SetBrush(*wxGREY_BRUSH);
+ DrawCoordinate(dc, xx, yy);
+ }
+
+ // adjusted dot
+ if (x != 0 && y != 0)
+ {
+ dc.SetPen(*wxRED_PEN);
+ dc.SetBrush(*wxRED_BRUSH);
+ // XXX: The adjusted values flip the Y axis to be in the format
+ // the Wii expects. Should this be in WiimoteEmu.cpp instead?
+ DrawCoordinate(dc, x, -y);
+ }
+ }
+ break;
+ case GROUP_TYPE_FORCE :
+ {
+ double raw_dot[3];
+ double adj_dot[3];
+ const float deadzone = g->control_group->settings[0]->value;
+
+ // adjusted
+ ((ControllerEmu::Force*)g->control_group)->GetState(adj_dot);
+
+ // raw
+ for (unsigned int i=0; i<3; ++i)
+ {
+ raw_dot[i] = (g->control_group->controls[i*2 + 1]->control_ref->State() -
+ g->control_group->controls[i*2]->control_ref->State());
+ }
+
+ // deadzone rect for forward/backward visual
+ dc.SetBrush(*wxLIGHT_GREY_BRUSH);
+ dc.SetPen(*wxLIGHT_GREY_PEN);
+ int deadzone_height = deadzone * VIS_BITMAP_SIZE;
+ DrawCenteredRectangle(dc, 0, VIS_BITMAP_SIZE / 2, VIS_BITMAP_SIZE, deadzone_height);
+
+#define LINE_HEIGHT 2
+ int line_y;
+
+ // raw forward/background line
+ dc.SetPen(*wxGREY_PEN);
+ dc.SetBrush(*wxGREY_BRUSH);
+ line_y = VIS_COORD(raw_dot[2]);
+ DrawCenteredRectangle(dc, VIS_BITMAP_SIZE / 2, line_y, VIS_BITMAP_SIZE, LINE_HEIGHT);
+
+ // adjusted forward/background line
+ if (adj_dot[2] != 0.0)
+ {
+ dc.SetPen(*wxRED_PEN);
+ dc.SetBrush(*wxRED_BRUSH);
+ line_y = VIS_COORD(adj_dot[2]);
+ DrawCenteredRectangle(dc, VIS_BITMAP_SIZE / 2, line_y, VIS_BITMAP_SIZE, LINE_HEIGHT);
+ }
+
+#define DEADZONE_RECT_SIZE 32
+
+ // empty deadzone square
+ dc.SetBrush(*wxWHITE_BRUSH);
+ dc.SetPen(*wxLIGHT_GREY_PEN);
+ DrawCenteredRectangle(dc, VIS_BITMAP_SIZE / 2, VIS_BITMAP_SIZE / 2, DEADZONE_RECT_SIZE, DEADZONE_RECT_SIZE);
+
+ // deadzone square
+ dc.SetBrush(*wxLIGHT_GREY_BRUSH);
+ int dz_size = (deadzone * DEADZONE_RECT_SIZE);
+ DrawCenteredRectangle(dc, VIS_BITMAP_SIZE / 2, VIS_BITMAP_SIZE / 2, dz_size, dz_size);
+
+ // raw dot
+ dc.SetPen(*wxGREY_PEN);
+ dc.SetBrush(*wxGREY_BRUSH);
+ DrawCoordinate(dc, raw_dot[1], raw_dot[0]);
+
+ // adjusted dot
+ if (adj_dot[1] != 0 && adj_dot[0] != 0)
+ {
+ dc.SetPen(*wxRED_PEN);
+ dc.SetBrush(*wxRED_BRUSH);
+ DrawCoordinate(dc, adj_dot[1], adj_dot[0]);
+ }
+
+ }
+ break;
+ case GROUP_TYPE_BUTTONS :
+ {
+ const unsigned int button_count = ((unsigned int)g->control_group->controls.size());
+
+ // draw the shit
+ dc.SetPen(*wxGREY_PEN);
+
+ unsigned int * const bitmasks = new unsigned int[ button_count ];
+ for (unsigned int n = 0; ncontrol_group)->GetState(&buttons, bitmasks);
+
+ for (unsigned int n = 0; ncontrol_group->controls[n]->control_ref->State() * 128;
+ dc.SetBrush(wxBrush(wxColour(amt, amt, amt)));
+ }
+ dc.DrawRectangle(n * 12, 0, 14, 12);
+
+ // text
+ const std::string name = g->control_group->controls[n]->name;
+ // bit of hax so ZL, ZR show up as L, R
+ dc.DrawText(StrToWxStr(std::string(1, (name[1] && name[1] < 'a') ? name[1] : name[0])), n*12 + 2, 1);
+ }
+
+ delete[] bitmasks;
+
+ }
+ break;
+ case GROUP_TYPE_TRIGGERS :
+ {
+ const unsigned int trigger_count = ((unsigned int)(g->control_group->controls.size()));
+
+ // draw the shit
+ dc.SetPen(*wxGREY_PEN);
+ ControlState deadzone = g->control_group->settings[0]->value;
+
+ double* const trigs = new double[trigger_count];
+ ((ControllerEmu::Triggers*)g->control_group)->GetState(trigs);
+
+ for (unsigned int n = 0; n < trigger_count; ++n)
+ {
+ ControlState trig_r = g->control_group->controls[n]->control_ref->State();
+
+ // outline
+ dc.SetPen(*wxGREY_PEN);
+ dc.SetBrush(*wxWHITE_BRUSH);
+ dc.DrawRectangle(0, n*12, 64, 14);
+
+ // raw
+ dc.SetBrush(*wxGREY_BRUSH);
+ dc.DrawRectangle(0, n*12, trig_r*64, 14);
+
+ // deadzone affected
+ dc.SetBrush(*wxRED_BRUSH);
+ dc.DrawRectangle(0, n*12, trigs[n]*64, 14);
+
+ // text
+ dc.DrawText(StrToWxStr(g->control_group->controls[n]->name), 3, n*12 + 1);
+ }
+
+ delete[] trigs;
+
+ // deadzone box
+ dc.SetPen(*wxLIGHT_GREY_PEN);
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);
+ dc.DrawRectangle(0, 0, deadzone*64, trigger_count*14);
+
+ }
+ break;
+ case GROUP_TYPE_MIXED_TRIGGERS :
+ {
+ const unsigned int trigger_count = ((unsigned int)(g->control_group->controls.size() / 2));
+
+ // draw the shit
+ dc.SetPen(*wxGREY_PEN);
+ ControlState thresh = g->control_group->settings[0]->value;
+
+ for (unsigned int n = 0; n < trigger_count; ++n)
+ {
+ dc.SetBrush(*wxRED_BRUSH);
+ ControlState trig_d = g->control_group->controls[n]->control_ref->State();
+
+ ControlState trig_a = trig_d > thresh ? 1
+ : g->control_group->controls[n+trigger_count]->control_ref->State();
+
+ dc.DrawRectangle(0, n*12, 64+20, 14);
+ if (trig_d <= thresh)
+ dc.SetBrush(*wxWHITE_BRUSH);
+ dc.DrawRectangle(trig_a*64, n*12, 64+20, 14);
+ dc.DrawRectangle(64, n*12, 32, 14);
+
+ // text
+ dc.DrawText(StrToWxStr(g->control_group->controls[n+trigger_count]->name), 3, n*12 + 1);
+ dc.DrawText(StrToWxStr(std::string(1, g->control_group->controls[n]->name[0])), 64 + 3, n*12 + 1);
+ }
+
+ // threshold box
+ dc.SetPen(*wxLIGHT_GREY_PEN);
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);
+ dc.DrawRectangle(thresh*64, 0, 128, trigger_count*14);
+
+ }
+ break;
+ case GROUP_TYPE_SLIDER:
+ {
+ const ControlState deadzone = g->control_group->settings[0]->value;
+
+ ControlState state = g->control_group->controls[1]->control_ref->State() - g->control_group->controls[0]->control_ref->State();
+ dc.SetPen(*wxGREY_PEN);
+ dc.SetBrush(*wxGREY_BRUSH);
+ dc.DrawRectangle(31 + state * 30, 0, 2, 14);
+
+ double adj_state;
+ ((ControllerEmu::Slider*)g->control_group)->GetState(&adj_state);
+ if (state)
+ {
+ dc.SetPen(*wxRED_PEN);
+ dc.SetBrush(*wxRED_BRUSH);
+ dc.DrawRectangle(31 + adj_state * 30, 0, 2, 14);
+ }
+
+ // deadzone box
+ dc.SetPen(*wxLIGHT_GREY_PEN);
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);
+ dc.DrawRectangle(32 - deadzone * 32, 0, deadzone * 64, 14);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event))
{
wxFont small_font(6, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD);
@@ -59,335 +413,7 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event))
if (64 == bitmap.GetHeight())
dc.DrawText(StrToWxStr(g->control_group->name).Upper(), 4, 2);
- switch (g->control_group->type)
- {
- case GROUP_TYPE_TILT :
- case GROUP_TYPE_STICK :
- case GROUP_TYPE_CURSOR :
- {
- // this is starting to be a mess combining all these in one case
-
- float x = 0, y = 0, z = 0;
- float xx, yy;
-
- switch (g->control_group->type)
- {
- case GROUP_TYPE_STICK :
- ((ControllerEmu::AnalogStick*)g->control_group)->GetState(&x, &y, 32.0, 32-1.5);
- break;
- case GROUP_TYPE_TILT :
- ((ControllerEmu::Tilt*)g->control_group)->GetState(&x, &y, 32.0, 32-1.5);
- break;
- case GROUP_TYPE_CURSOR :
- ((ControllerEmu::Cursor*)g->control_group)->GetState(&x, &y, &z);
- x *= (32-1.5); x+= 32;
- y *= (32-1.5); y+= 32;
- break;
- }
-
- xx = g->control_group->controls[3]->control_ref->State();
- xx -= g->control_group->controls[2]->control_ref->State();
- yy = g->control_group->controls[1]->control_ref->State();
- yy -= g->control_group->controls[0]->control_ref->State();
- xx *= 32 - 1; xx += 32;
- yy *= 32 - 1; yy += 32;
-
- // draw the shit
-
- // ir cursor forward movement
- if (GROUP_TYPE_CURSOR == g->control_group->type)
- {
- if (z)
- {
- dc.SetPen(*wxRED_PEN);
- dc.SetBrush(*wxRED_BRUSH);
- }
- else
- {
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxGREY_BRUSH);
- }
- dc.DrawRectangle(0, 31 - z*31, 64, 2);
- }
-
- // octagon for visual aid for diagonal adjustment
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.SetBrush(*wxWHITE_BRUSH);
- if (GROUP_TYPE_STICK == g->control_group->type)
- {
- // outline and fill colors
- wxBrush LightGrayBrush("#dddddd");
- wxPen LightGrayPen("#bfbfbf");
- dc.SetBrush(LightGrayBrush);
- dc.SetPen(LightGrayPen);
-
- // polygon offset
- float max
- , diagonal
- , box = 64
- , d_of = box / 256.0
- , x_of = box / 2.0;
-
- if (g->control_group->name == "Main Stick")
- {
- max = (87.0f / 127.0f) * 100;
- diagonal = (55.0f / 127.0f) * 100.0;
- }
- else if (g->control_group->name == "C-Stick")
- {
- max = (74.0f / 127.0f) * 100;
- diagonal = (46.0f / 127.0f) * 100;
- }
- else
- {
- max = (82.0f / 127.0f) * 100;
- diagonal = (58.0f / 127.0f) * 100;
- }
-
- // polygon corners
- wxPoint Points[8];
- Points[0].x = (int)(0.0 * d_of + x_of); Points[0].y = (int)(max * d_of + x_of);
- Points[1].x = (int)(diagonal * d_of + x_of); Points[1].y = (int)(diagonal * d_of + x_of);
- Points[2].x = (int)(max * d_of + x_of); Points[2].y = (int)(0.0 * d_of + x_of);
- Points[3].x = (int)(diagonal * d_of + x_of); Points[3].y = (int)(-diagonal * d_of + x_of);
- Points[4].x = (int)(0.0 * d_of + x_of); Points[4].y = (int)(-max * d_of + x_of);
- Points[5].x = (int)(-diagonal * d_of + x_of); Points[5].y = (int)(-diagonal * d_of + x_of);
- Points[6].x = (int)(-max * d_of + x_of); Points[6].y = (int)(0.0 * d_of + x_of);
- Points[7].x = (int)(-diagonal * d_of + x_of); Points[7].y = (int)(diagonal * d_of + x_of);
-
- // draw polygon
- dc.DrawPolygon(8, Points);
- }
- else
- {
- dc.DrawRectangle(16, 16, 32, 32);
- }
-
- if (GROUP_TYPE_CURSOR != g->control_group->type)
- {
- // deadzone circle
- dc.SetBrush(*wxLIGHT_GREY_BRUSH);
- dc.DrawCircle(32, 32, g->control_group->settings[SETTING_DEADZONE]->value * 32);
- }
-
- // raw dot
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxGREY_BRUSH);
- // i like the dot better than the cross i think
- dc.DrawRectangle(xx - 2, yy - 2, 4, 4);
- //dc.DrawRectangle(xx-1, 64-yy-4, 2, 8);
- //dc.DrawRectangle(xx-4, 64-yy-1, 8, 2);
-
- // adjusted dot
- if (x!=32 || y!=32)
- {
- dc.SetPen(*wxRED_PEN);
- dc.SetBrush(*wxRED_BRUSH);
- dc.DrawRectangle(x-2, 64-y-2, 4, 4);
- // i like the dot better than the cross i think
- //dc.DrawRectangle(x-1, 64-y-4, 2, 8);
- //dc.DrawRectangle(x-4, 64-y-1, 8, 2);
- }
-
- }
- break;
- case GROUP_TYPE_FORCE :
- {
- float raw_dot[3];
- float adj_dot[3];
- const float deadzone = 32 * g->control_group->settings[0]->value;
-
- // adjusted
- ((ControllerEmu::Force*)g->control_group)->GetState(adj_dot, 32.0, 32-1.5);
-
- // raw
- for (unsigned int i=0; i<3; ++i)
- {
- raw_dot[i] = g->control_group->controls[i*2 + 1]->control_ref->State()
- - g->control_group->controls[i*2]->control_ref->State();
- raw_dot[i] *= 32 - 1; raw_dot[i] += 32;
- }
-
- // deadzone rect for forward/backward visual
- dc.SetBrush(*wxLIGHT_GREY_BRUSH);
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.DrawRectangle(0, 32 - deadzone, 64, deadzone * 2);
-
- // raw forward/background line
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxGREY_BRUSH);
- dc.DrawRectangle(0, raw_dot[2] - 1, 64, 2);
-
- // adjusted forward/background line
- if (adj_dot[2]!=32)
- {
- dc.SetPen(*wxRED_PEN);
- dc.SetBrush(*wxRED_BRUSH);
- dc.DrawRectangle(0, adj_dot[2] - 1, 64, 2);
- }
-
- // a rectangle, for looks i guess
- dc.SetBrush(*wxWHITE_BRUSH);
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.DrawRectangle(16, 16, 32, 32);
-
- // deadzone square
- dc.SetBrush(*wxLIGHT_GREY_BRUSH);
- dc.DrawRectangle(32 - deadzone, 32 - deadzone, deadzone * 2, deadzone * 2);
-
- // raw dot
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxGREY_BRUSH);
- dc.DrawRectangle(raw_dot[1] - 2, raw_dot[0] - 2, 4, 4);
-
- // adjusted dot
- if (adj_dot[1]!=32 || adj_dot[0]!=32)
- {
- dc.SetPen(*wxRED_PEN);
- dc.SetBrush(*wxRED_BRUSH);
- dc.DrawRectangle(adj_dot[1]-2, adj_dot[0]-2, 4, 4);
- }
-
- }
- break;
- case GROUP_TYPE_BUTTONS :
- {
- const unsigned int button_count = ((unsigned int)g->control_group->controls.size());
-
- // draw the shit
- dc.SetPen(*wxGREY_PEN);
-
- unsigned int * const bitmasks = new unsigned int[ button_count ];
- for (unsigned int n = 0; ncontrol_group)->GetState(&buttons, bitmasks);
-
- for (unsigned int n = 0; ncontrol_group->controls[n]->control_ref->State() * 128;
- dc.SetBrush(wxBrush(wxColour(amt, amt, amt)));
- }
- dc.DrawRectangle(n * 12, 0, 14, 12);
-
- // text
- const std::string name = g->control_group->controls[n]->name;
- // bit of hax so ZL, ZR show up as L, R
- dc.DrawText(StrToWxStr(std::string(1, (name[1] && name[1] < 'a') ? name[1] : name[0])), n*12 + 2, 1);
- }
-
- delete[] bitmasks;
-
- }
- break;
- case GROUP_TYPE_TRIGGERS :
- {
- const unsigned int trigger_count = ((unsigned int)(g->control_group->controls.size()));
-
- // draw the shit
- dc.SetPen(*wxGREY_PEN);
- ControlState deadzone = g->control_group->settings[0]->value;
-
- unsigned int* const trigs = new unsigned int[trigger_count];
- ((ControllerEmu::Triggers*)g->control_group)->GetState(trigs, 64);
-
- for (unsigned int n = 0; n < trigger_count; ++n)
- {
- ControlState trig_r = g->control_group->controls[n]->control_ref->State();
-
- // outline
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxWHITE_BRUSH);
- dc.DrawRectangle(0, n*12, 64, 14);
-
- // raw
- dc.SetBrush(*wxGREY_BRUSH);
- dc.DrawRectangle(0, n*12, trig_r*64, 14);
-
- // deadzone affected
- dc.SetBrush(*wxRED_BRUSH);
- dc.DrawRectangle(0, n*12, trigs[n], 14);
-
- // text
- dc.DrawText(StrToWxStr(g->control_group->controls[n]->name), 3, n*12 + 1);
- }
-
- delete[] trigs;
-
- // deadzone box
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
- dc.DrawRectangle(0, 0, deadzone*64, trigger_count*14);
-
- }
- break;
- case GROUP_TYPE_MIXED_TRIGGERS :
- {
- const unsigned int trigger_count = ((unsigned int)(g->control_group->controls.size() / 2));
-
- // draw the shit
- dc.SetPen(*wxGREY_PEN);
- ControlState thresh = g->control_group->settings[0]->value;
-
- for (unsigned int n = 0; n < trigger_count; ++n)
- {
- dc.SetBrush(*wxRED_BRUSH);
- ControlState trig_d = g->control_group->controls[n]->control_ref->State();
-
- ControlState trig_a = trig_d > thresh ? 1
- : g->control_group->controls[n+trigger_count]->control_ref->State();
-
- dc.DrawRectangle(0, n*12, 64+20, 14);
- if (trig_d <= thresh)
- dc.SetBrush(*wxWHITE_BRUSH);
- dc.DrawRectangle(trig_a*64, n*12, 64+20, 14);
- dc.DrawRectangle(64, n*12, 32, 14);
-
- // text
- dc.DrawText(StrToWxStr(g->control_group->controls[n+trigger_count]->name), 3, n*12 + 1);
- dc.DrawText(StrToWxStr(std::string(1, g->control_group->controls[n]->name[0])), 64 + 3, n*12 + 1);
- }
-
- // threshold box
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
- dc.DrawRectangle(thresh*64, 0, 128, trigger_count*14);
-
- }
- break;
- case GROUP_TYPE_SLIDER:
- {
- const ControlState deadzone = g->control_group->settings[0]->value;
-
- ControlState state = g->control_group->controls[1]->control_ref->State() - g->control_group->controls[0]->control_ref->State();
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxGREY_BRUSH);
- dc.DrawRectangle(31 + state * 30, 0, 2, 14);
-
- ((ControllerEmu::Slider*)g->control_group)->GetState(&state, 1);
- if (state)
- {
- dc.SetPen(*wxRED_PEN);
- dc.SetBrush(*wxRED_BRUSH);
- dc.DrawRectangle(31 + state * 30, 0, 2, 14);
- }
-
- // deadzone box
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
- dc.DrawRectangle(32 - deadzone * 32, 0, deadzone * 64, 14);
- }
- break;
- default :
- break;
- }
+ DrawControlGroupBox(dc, g);
// box outline
// Windows XP color
diff --git a/Source/Core/DolphinWX/UDPConfigDiag.cpp b/Source/Core/DolphinWX/UDPConfigDiag.cpp
deleted file mode 100644
index d1ed2da02e..0000000000
--- a/Source/Core/DolphinWX/UDPConfigDiag.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "DolphinWX/UDPConfigDiag.h"
-#include "DolphinWX/WxUtils.h"
-#include "InputCommon/UDPWrapper.h"
-
-class wxWindow;
-
-UDPConfigDiag::UDPConfigDiag(wxWindow * const parent, UDPWrapper * _wrp) :
- wxDialog(parent, -1, _("UDP Wiimote")),
- wrp(_wrp)
-{
- wxBoxSizer *const outer_sizer = new wxBoxSizer(wxVERTICAL);
- wxBoxSizer *const sizer1 = new wxBoxSizer(wxVERTICAL);
- wxStaticBoxSizer *const sizer2 = new wxStaticBoxSizer(wxVERTICAL, this, _("Update"));
-
- outer_sizer->Add(sizer1, 0, wxTOP | wxLEFT | wxRIGHT | wxEXPAND, 5);
- outer_sizer->Add(sizer2, 1, wxLEFT | wxRIGHT | wxEXPAND, 10);
-
- enable = new wxCheckBox(this, wxID_ANY, _("Enable"));
- butt = new wxCheckBox(this, wxID_ANY, _("Buttons"));
- accel = new wxCheckBox(this, wxID_ANY, _("Acceleration"));
- point = new wxCheckBox(this, wxID_ANY, _("IR Pointer"));
- nun = new wxCheckBox(this, wxID_ANY, _("Nunchuk"));
- nunaccel = new wxCheckBox(this, wxID_ANY, _("Nunchuk Acceleration"));
-
- wxBoxSizer *const port_sizer = new wxBoxSizer(wxHORIZONTAL);
- port_sizer->Add(new wxStaticText(this, wxID_ANY, _("UDP Port:")), 0, wxALIGN_CENTER);
- port_tbox = new wxTextCtrl(this, wxID_ANY, StrToWxStr(wrp->port));
- port_sizer->Add(port_tbox, 1, wxLEFT | wxEXPAND, 5);
-
- enable->Bind(wxEVT_CHECKBOX, &UDPConfigDiag::ChangeState, this);
- butt->Bind(wxEVT_CHECKBOX, &UDPConfigDiag::ChangeUpdateFlags, this);
- accel->Bind(wxEVT_CHECKBOX, &UDPConfigDiag::ChangeUpdateFlags, this);
- point->Bind(wxEVT_CHECKBOX, &UDPConfigDiag::ChangeUpdateFlags, this);
- nun->Bind(wxEVT_CHECKBOX, &UDPConfigDiag::ChangeUpdateFlags, this);
- nunaccel->Bind(wxEVT_CHECKBOX, &UDPConfigDiag::ChangeUpdateFlags, this);
- port_tbox->Bind(wxEVT_TEXT, &UDPConfigDiag::ChangeState, this);
-
- enable->SetValue(wrp->udpEn);
- butt->SetValue(wrp->updButt);
- accel->SetValue(wrp->updAccel);
- point->SetValue(wrp->updIR);
- nun->SetValue(wrp->updNun);
- nunaccel->SetValue(wrp->updNunAccel);
-
- sizer1->Add(enable, 1, wxALL | wxEXPAND, 5);
- sizer1->Add(port_sizer, 1, wxBOTTOM | wxLEFT| wxRIGHT | wxEXPAND, 5);
-
- sizer2->Add(butt, 1, wxALL | wxEXPAND, 5);
- sizer2->Add(accel, 1, wxALL | wxEXPAND, 5);
- sizer2->Add(point, 1, wxALL | wxEXPAND, 5);
- sizer2->Add(nun, 1, wxALL | wxEXPAND, 5);
- sizer2->Add(nunaccel, 1, wxALL | wxEXPAND, 5);
-
- outer_sizer->Add(CreateButtonSizer(wxOK), 0, wxALL | wxALIGN_RIGHT, 5);
-
- SetSizerAndFit(outer_sizer);
- Center();
- SetFocus();
-}
-
-void UDPConfigDiag::ChangeUpdateFlags(wxCommandEvent & WXUNUSED(event))
-{
- wrp->updAccel=accel->GetValue();
- wrp->updButt=butt->GetValue();
- wrp->updIR=point->GetValue();
- wrp->updNun=nun->GetValue();
- wrp->updNunAccel=nunaccel->GetValue();
-}
-
-void UDPConfigDiag::ChangeState(wxCommandEvent & WXUNUSED(event))
-{
- wrp->udpEn = enable->GetValue();
- wrp->port = WxStrToStr(port_tbox->GetValue());
- wrp->Refresh();
-}
diff --git a/Source/Core/DolphinWX/UDPConfigDiag.h b/Source/Core/DolphinWX/UDPConfigDiag.h
deleted file mode 100644
index 5638599487..0000000000
--- a/Source/Core/DolphinWX/UDPConfigDiag.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#pragma once
-
-#include
-
-class UDPWrapper;
-class wxCheckBox;
-class wxCommandEvent;
-class wxTextCtrl;
-class wxWindow;
-
-class UDPConfigDiag : public wxDialog
-{
-public:
- UDPConfigDiag(wxWindow * const parent, UDPWrapper * _wrp);
-private:
- UDPWrapper * wrp;
- void ChangeUpdateFlags(wxCommandEvent & event);
- void ChangeState(wxCommandEvent & event);
- void OKPressed(wxCommandEvent & event);
- wxCheckBox * enable;
- wxCheckBox * butt;
- wxCheckBox * accel;
- wxCheckBox * point;
- wxCheckBox * nun;
- wxCheckBox * nunaccel;
- wxTextCtrl * port_tbox;
-};
diff --git a/Source/Core/InputCommon/CMakeLists.txt b/Source/Core/InputCommon/CMakeLists.txt
index ac6e9c6e28..6b771c38e1 100644
--- a/Source/Core/InputCommon/CMakeLists.txt
+++ b/Source/Core/InputCommon/CMakeLists.txt
@@ -1,7 +1,5 @@
set(SRCS ControllerEmu.cpp
InputConfig.cpp
- UDPWiimote.cpp
- UDPWrapper.cpp
ControllerInterface/ControllerInterface.cpp
ControllerInterface/Device.cpp
ControllerInterface/ExpressionParser.cpp)
diff --git a/Source/Core/InputCommon/ControllerEmu.cpp b/Source/Core/InputCommon/ControllerEmu.cpp
index dae3d32e56..6e2bf8aa73 100644
--- a/Source/Core/InputCommon/ControllerEmu.cpp
+++ b/Source/Core/InputCommon/ControllerEmu.cpp
@@ -4,10 +4,6 @@
#include "InputCommon/ControllerEmu.h"
-#if defined(HAVE_X11) && HAVE_X11
-#include
-#endif
-
void ControllerEmu::UpdateReferences(ControllerInterface& devi)
{
for (auto& ctrlGroup : groups)
@@ -47,6 +43,8 @@ void ControllerEmu::ControlGroup::LoadConfig(IniFile::Section *sec, const std::s
// settings
for (auto& s : settings)
{
+ if (s->is_virtual)
+ continue;
sec->Get(group + s->name, &s->value, s->default_value * 100);
s->value /= 100;
}
@@ -103,7 +101,11 @@ void ControllerEmu::ControlGroup::SaveConfig(IniFile::Section *sec, const std::s
std::string group(base + name); group += "/";
for (auto& s : settings)
+ {
+ if (s->is_virtual)
+ continue;
sec->Set(group + s->name, s->value*100.0f, s->default_value*100.0f);
+ }
for (auto& c : controls)
{
@@ -144,8 +146,6 @@ ControllerEmu::AnalogStick::AnalogStick(const char* const _name) : ControlGroup(
settings.emplace_back(new Setting(_trans("Radius"), 0.7f, 0, 100));
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
- settings.emplace_back(new Setting(_trans("Square Stick"), 0));
-
}
ControllerEmu::Buttons::Buttons(const std::string& _name) : ControlGroup(_name, GROUP_TYPE_BUTTONS)
@@ -185,8 +185,7 @@ ControllerEmu::Force::Force(const std::string& _name) : ControlGroup(_name, GROU
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
}
-ControllerEmu::Tilt::Tilt(const std::string& _name)
- : ControlGroup(_name, GROUP_TYPE_TILT)
+ControllerEmu::Tilt::Tilt(const std::string& _name) : ControlGroup(_name, GROUP_TYPE_TILT)
{
memset(m_tilt, 0, sizeof(m_tilt));
diff --git a/Source/Core/InputCommon/ControllerEmu.h b/Source/Core/InputCommon/ControllerEmu.h
index eec79ab4e2..bc3974936f 100644
--- a/Source/Core/InputCommon/ControllerEmu.h
+++ b/Source/Core/InputCommon/ControllerEmu.h
@@ -14,6 +14,7 @@
#include
#include "Common/IniFile.h"
+#include "Core/ConfigManager.h"
#include "InputCommon/GCPadStatus.h"
#include "InputCommon/ControllerInterface/ControllerInterface.h"
@@ -30,7 +31,6 @@ enum
GROUP_TYPE_TILT,
GROUP_TYPE_CURSOR,
GROUP_TYPE_TRIGGERS,
- GROUP_TYPE_UDPWII,
GROUP_TYPE_SLIDER,
};
@@ -38,7 +38,6 @@ enum
{
SETTING_RADIUS,
SETTING_DEADZONE,
- SETTING_SQUARE,
};
const char* const named_directions[] =
@@ -96,12 +95,43 @@ public:
, value(def_value)
, default_value(def_value)
, low(_low)
- , high(_high){}
+ , high(_high)
+ , is_virtual(false) {}
const std::string name;
ControlState value;
const ControlState default_value;
const unsigned int low, high;
+ bool is_virtual;
+
+ virtual void SetValue(ControlState new_value)
+ {
+ value = new_value;
+ }
+
+ virtual ControlState GetValue()
+ {
+ return value;
+ }
+ };
+
+ class BackgroundInputSetting : public Setting
+ {
+ public:
+ BackgroundInputSetting(const std::string &_name) : Setting(_name, false)
+ {
+ is_virtual = true;
+ }
+
+ void SetValue(ControlState new_value) override
+ {
+ SConfig::GetInstance().m_BackgroundInput = new_value;
+ }
+
+ ControlState GetValue() override
+ {
+ return SConfig::GetInstance().m_BackgroundInput;
+ }
};
ControlGroup(const std::string& _name, const unsigned int _type = GROUP_TYPE_OTHER) : name(_name), type(_type) {}
@@ -121,66 +151,41 @@ public:
class AnalogStick : public ControlGroup
{
public:
+ AnalogStick(const char* const _name);
- template
- void GetState(C* const x, C* const y, const unsigned int base, const unsigned int range)
+ void GetState(double* const x, double* const y)
{
- // this is all a mess
-
ControlState yy = controls[0]->control_ref->State() - controls[1]->control_ref->State();
ControlState xx = controls[3]->control_ref->State() - controls[2]->control_ref->State();
ControlState radius = settings[SETTING_RADIUS]->value;
ControlState deadzone = settings[SETTING_DEADZONE]->value;
- ControlState square = settings[SETTING_SQUARE]->value;
ControlState m = controls[4]->control_ref->State();
- // modifier code
+ ControlState ang = atan2(yy, xx);
+ ControlState ang_sin = sin(ang);
+ ControlState ang_cos = cos(ang);
+
+ ControlState dist = sqrt(xx*xx + yy*yy);
+
+ // dead zone code
+ dist = std::max(0.0f, dist - deadzone);
+ dist /= (1 - deadzone);
+
+ // radius
+ dist *= radius;
+
+ // The modifier halves the distance by 50%, which is useful
+ // for keyboard controls.
if (m)
- {
- yy = (fabsf(yy)>deadzone) * sign(yy) * (m + deadzone/2);
- xx = (fabsf(xx)>deadzone) * sign(xx) * (m + deadzone/2);
- }
+ dist *= 0.5;
- // deadzone / square stick code
- if (radius != 1 || deadzone || square)
- {
- // this section might be all wrong, but its working good enough, I think
+ yy = std::max(-1.0f, std::min(1.0f, ang_sin * dist));
+ xx = std::max(-1.0f, std::min(1.0f, ang_cos * dist));
- ControlState ang = atan2(yy, xx);
- ControlState ang_sin = sin(ang);
- ControlState ang_cos = cos(ang);
-
- // the amt a full square stick would have at current angle
- ControlState square_full = std::min(ang_sin ? 1/fabsf(ang_sin) : 2, ang_cos ? 1/fabsf(ang_cos) : 2);
-
- // the amt a full stick would have that was ( user setting squareness) at current angle
- // I think this is more like a pointed circle rather than a rounded square like it should be
- ControlState stick_full = (1 + (square_full - 1) * square);
-
- ControlState dist = sqrt(xx*xx + yy*yy);
-
- // dead zone code
- dist = std::max(0.0f, dist - deadzone * stick_full);
- dist /= (1 - deadzone);
-
- // square stick code
- ControlState amt = dist / stick_full;
- dist -= ((square_full - 1) * amt * square);
-
- // radius
- dist *= radius;
-
- yy = std::max(-1.0f, std::min(1.0f, ang_sin * dist));
- xx = std::max(-1.0f, std::min(1.0f, ang_cos * dist));
- }
-
- *y = C(yy * range + base);
- *x = C(xx * range + base);
+ *y = yy;
+ *x = xx;
}
-
- AnalogStick(const char* const _name);
-
};
class Buttons : public ControlGroup
@@ -205,64 +210,55 @@ public:
class MixedTriggers : public ControlGroup
{
public:
+ MixedTriggers(const std::string& _name);
- template
- void GetState(C* const digital, const C* bitmasks, S* analog, const unsigned int range)
+ void GetState(u16 *const digital, const u16* bitmasks, double* analog)
{
const unsigned int trig_count = ((unsigned int) (controls.size() / 2));
for (unsigned int i=0; icontrol_ref->State() > settings[0]->value) //threshold
{
- *analog = range;
+ *analog = 1.0;
*digital |= *bitmasks;
}
else
{
- *analog = S(controls[i+trig_count]->control_ref->State() * range);
+ *analog = controls[i+trig_count]->control_ref->State();
}
}
}
-
- MixedTriggers(const std::string& _name);
-
};
class Triggers : public ControlGroup
{
public:
+ Triggers(const std::string& _name);
- template
- void GetState(S* analog, const unsigned int range)
+ void GetState(double* analog)
{
const unsigned int trig_count = ((unsigned int) (controls.size()));
const ControlState deadzone = settings[0]->value;
for (unsigned int i=0; icontrol_ref->State() - deadzone, 0.0f) / (1 - deadzone) * range);
+ *analog = std::max(controls[i]->control_ref->State() - deadzone, 0.0f) / (1 - deadzone);
}
-
- Triggers(const std::string& _name);
-
};
class Slider : public ControlGroup
{
public:
+ Slider(const std::string& _name);
- template
- void GetState(S* const slider, const unsigned int range, const unsigned int base = 0)
+ void GetState(double* const slider)
{
const float deadzone = settings[0]->value;
const float state = controls[1]->control_ref->State() - controls[0]->control_ref->State();
if (fabsf(state) > deadzone)
- *slider = (S)((state - (deadzone * sign(state))) / (1 - deadzone) * range + base);
+ *slider = (state - (deadzone * sign(state))) / (1 - deadzone);
else
*slider = 0;
}
-
- Slider(const std::string& _name);
-
};
class Force : public ControlGroup
@@ -270,8 +266,7 @@ public:
public:
Force(const std::string& _name);
- template
- void GetState(C* axis, const u8 base, const R range)
+ void GetState(double* axis)
{
const float deadzone = settings[0]->value;
for (unsigned int i=0; i<6; i+=2)
@@ -282,7 +277,7 @@ public:
tmpf = ((state - (deadzone * sign(state))) / (1 - deadzone));
float &ax = m_swing[i >> 1];
- *axis++ = (C)((tmpf - ax) * range + base);
+ *axis++ = (tmpf - ax);
ax = tmpf;
}
}
@@ -296,8 +291,7 @@ public:
public:
Tilt(const std::string& _name);
- template
- void GetState(C* const x, C* const y, const unsigned int base, const R range, const bool step = true)
+ void GetState(double* const x, double* const y, const bool step = true)
{
// this is all a mess
@@ -309,42 +303,35 @@ public:
auto const angle = settings[2]->value / 1.8f;
ControlState m = controls[4]->control_ref->State();
- // modifier code
- if (m)
- {
- yy = (fabsf(yy)>deadzone) * sign(yy) * (m + deadzone/2);
- xx = (fabsf(xx)>deadzone) * sign(xx) * (m + deadzone/2);
- }
-
// deadzone / circle stick code
- if (deadzone || circle)
- {
- // this section might be all wrong, but its working good enough, I think
+ // this section might be all wrong, but its working good enough, I think
- ControlState ang = atan2(yy, xx);
- ControlState ang_sin = sin(ang);
- ControlState ang_cos = cos(ang);
+ ControlState ang = atan2(yy, xx);
+ ControlState ang_sin = sin(ang);
+ ControlState ang_cos = cos(ang);
- // the amt a full square stick would have at current angle
- ControlState square_full = std::min(ang_sin ? 1/fabsf(ang_sin) : 2, ang_cos ? 1/fabsf(ang_cos) : 2);
+ // the amt a full square stick would have at current angle
+ ControlState square_full = std::min(ang_sin ? 1/fabsf(ang_sin) : 2, ang_cos ? 1/fabsf(ang_cos) : 2);
- // the amt a full stick would have that was (user setting circular) at current angle
- // I think this is more like a pointed circle rather than a rounded square like it should be
- ControlState stick_full = (square_full * (1 - circle)) + (circle);
+ // the amt a full stick would have that was (user setting circular) at current angle
+ // I think this is more like a pointed circle rather than a rounded square like it should be
+ ControlState stick_full = (square_full * (1 - circle)) + (circle);
- ControlState dist = sqrt(xx*xx + yy*yy);
+ ControlState dist = sqrt(xx*xx + yy*yy);
- // dead zone code
- dist = std::max(0.0f, dist - deadzone * stick_full);
- dist /= (1 - deadzone);
+ // dead zone code
+ dist = std::max(0.0f, dist - deadzone * stick_full);
+ dist /= (1 - deadzone);
- // circle stick code
- ControlState amt = dist / stick_full;
- dist += (square_full - 1) * amt * circle;
+ // circle stick code
+ ControlState amt = dist / stick_full;
+ dist += (square_full - 1) * amt * circle;
- yy = std::max(-1.0f, std::min(1.0f, ang_sin * dist));
- xx = std::max(-1.0f, std::min(1.0f, ang_cos * dist));
- }
+ if (m)
+ dist *= 0.5;
+
+ yy = std::max(-1.0f, std::min(1.0f, ang_sin * dist));
+ xx = std::max(-1.0f, std::min(1.0f, ang_cos * dist));
// this is kinda silly here
// gui being open will make this happen 2x as fast, o well
@@ -363,8 +350,8 @@ public:
m_tilt[1] = std::max(m_tilt[1] - 0.1f, yy);
}
- *y = C(m_tilt[1] * angle * range + base);
- *x = C(m_tilt[0] * angle * range + base);
+ *y = m_tilt[1] * angle;
+ *x = m_tilt[0] * angle;
}
private:
@@ -376,8 +363,7 @@ public:
public:
Cursor(const std::string& _name);
- template
- void GetState(C* const x, C* const y, C* const z, const bool adjusted = false)
+ void GetState(double* const x, double* const y, double* const z, const bool adjusted = false)
{
const float zz = controls[4]->control_ref->State() - controls[5]->control_ref->State();
@@ -425,7 +411,7 @@ public:
~Extension() {}
- void GetState(u8* const data, const bool focus = true);
+ void GetState(u8* const data);
std::vector> attachments;
diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp
index e1383efc9d..61057c8162 100644
--- a/Source/Core/InputCommon/ControllerInterface/Device.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp
@@ -5,6 +5,12 @@
#include
#include
+// For InputGateOn()
+// This is a really bad layering violation, but it's the cleanest
+// place I could find to put it.
+#include "Core/ConfigManager.h"
+#include "Core/Host.h"
+
#include "InputCommon/ControllerInterface/Device.h"
namespace ciface
@@ -74,6 +80,16 @@ void Device::ClearInputState()
// kinda slow but, w/e, should only happen when user unplugs a device while playing
}
+bool Device::Control::InputGateOn()
+{
+ if (SConfig::GetInstance().m_BackgroundInput)
+ return true;
+ else if (Host_RendererHasFocus())
+ return true;
+ else
+ return false;
+}
+
//
// DeviceQualifier :: ToString
//
diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h
index a096bcb8b9..6e1868a4ba 100644
--- a/Source/Core/InputCommon/ControllerInterface/Device.h
+++ b/Source/Core/InputCommon/ControllerInterface/Device.h
@@ -42,6 +42,8 @@ public:
virtual std::string GetName() const = 0;
virtual ~Control() {}
+ bool InputGateOn();
+
virtual Input* ToInput() { return nullptr; }
virtual Output* ToOutput() { return nullptr; }
};
@@ -59,6 +61,16 @@ public:
virtual ControlState GetState() const = 0;
+ bool ShouldHaveInput();
+
+ ControlState GetGatedState()
+ {
+ if (InputGateOn())
+ return GetState();
+ else
+ return 0.0;
+ }
+
Input* ToInput() override { return this; }
};
@@ -74,6 +86,12 @@ public:
virtual void SetState(ControlState state) = 0;
+ void SetGatedState(ControlState state)
+ {
+ if (InputGateOn())
+ SetState(state);
+ }
+
Output* ToOutput() override { return this; }
};
diff --git a/Source/Core/InputCommon/ControllerInterface/ExpressionParser.cpp b/Source/Core/InputCommon/ControllerInterface/ExpressionParser.cpp
index 2261a5df98..da740bbb7e 100644
--- a/Source/Core/InputCommon/ControllerInterface/ExpressionParser.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/ExpressionParser.cpp
@@ -228,12 +228,12 @@ public:
virtual ControlState GetValue() override
{
- return control->ToInput()->GetState();
+ return control->ToInput()->GetGatedState();
}
virtual void SetValue(ControlState value) override
{
- control->ToOutput()->SetState(value);
+ control->ToOutput()->SetGatedState(value);
}
virtual int CountNumControls() override
diff --git a/Source/Core/InputCommon/InputCommon.vcxproj b/Source/Core/InputCommon/InputCommon.vcxproj
index 5902db1277..85d5bff6db 100644
--- a/Source/Core/InputCommon/InputCommon.vcxproj
+++ b/Source/Core/InputCommon/InputCommon.vcxproj
@@ -1,4 +1,4 @@
-
+
@@ -48,8 +48,6 @@
Create
-
-
@@ -64,8 +62,6 @@
-
-
@@ -78,4 +74,4 @@
-
\ No newline at end of file
+
diff --git a/Source/Core/InputCommon/InputCommon.vcxproj.filters b/Source/Core/InputCommon/InputCommon.vcxproj.filters
index 729f7e1866..e249ed3f79 100644
--- a/Source/Core/InputCommon/InputCommon.vcxproj.filters
+++ b/Source/Core/InputCommon/InputCommon.vcxproj.filters
@@ -1,4 +1,4 @@
-
+
@@ -17,8 +17,6 @@
-
-
ControllerInterface\DInput
@@ -49,8 +47,6 @@
-
-
ControllerInterface\DInput
@@ -80,4 +76,4 @@
-
\ No newline at end of file
+
diff --git a/Source/Core/InputCommon/UDPWiimote.cpp b/Source/Core/InputCommon/UDPWiimote.cpp
deleted file mode 100644
index e929e62461..0000000000
--- a/Source/Core/InputCommon/UDPWiimote.cpp
+++ /dev/null
@@ -1,439 +0,0 @@
-// Copyright 2013 Dolphin Emulator Project
-// Licensed under GPLv2
-// Refer to the license.txt file included.
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "Common/Thread.h"
-#include "Common/Timer.h"
-
-#include "InputCommon/UDPWiimote.h"
-
-#ifdef _WIN32
-
-#include
-#include
-#define sock_t SOCKET
-#define ERRNO WSAGetLastError()
-#undef EWOULDBLOCK
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#define BAD_SOCK INVALID_SOCKET
-#define close(x) closesocket(x)
-#define cleanup do {noinst--; if (noinst==0) WSACleanup();} while (0)
-#define blockingoff(sock) ioctlsocket(sock, FIONBIO, &iMode)
-#define dataz char*
-#ifdef _MSC_VER
-#pragma comment (lib, "Ws2_32.lib")
-#endif
-
-#else
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#define BAD_SOCK -1
-#define ERRNO errno
-#define cleanup noinst--
-#define blockingoff(sock) fcntl(sock, F_SETFL, O_NONBLOCK)
-#define dataz void*
-#define sock_t int
-
-#endif
-
-
-struct UDPWiimote::_d
-{
- std::thread thread;
- std::list sockfds;
- std::mutex termLock, mutex, nameMutex;
- volatile bool exit;
- sock_t bipv4_fd, bipv6_fd;
-};
-
-int UDPWiimote::noinst = 0;
-
-UDPWiimote::UDPWiimote(const std::string& _port, const std::string& name, int _index) :
- port(_port), displayName(name), d(new _d),
- waX(0), waY(0), waZ(1), naX(0), naY(0), naZ(-1), nunX(0), nunY(0),
- pointerX(1001.0f / 2), pointerY(0), nunMask(0), wiimoteMask(0), index(_index), int_port(atoi(_port.c_str()))
-{
-
- static bool sranded=false;
- if (!sranded)
- {
- srand((unsigned int)time(nullptr));
- sranded=true;
- }
- bcastMagic=rand() & 0xFFFF;
-
- #ifdef _WIN32
- u_long iMode = 1;
- #endif
- struct addrinfo hints, *servinfo, *p;
- int rv;
-
- #ifdef _WIN32
- if (noinst==0)
- {
- WORD sockVersion;
- WSADATA wsaData;
- sockVersion = MAKEWORD(2, 2);
- WSAStartup(sockVersion, &wsaData);
- }
- #endif
-
- noinst++;
-
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_INET;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_flags = AI_PASSIVE; // use my IP
-
- if (!int_port)
- {
- cleanup;
- err=-1;
- return;
- }
-
- if ((rv = getaddrinfo(nullptr, _port.c_str(), &hints, &servinfo)) != 0)
- {
- cleanup;
- err=-1;
- return;
- }
-
- // loop through all the results and bind to everything we can
- for (p = servinfo; p != nullptr; p = p->ai_next)
- {
- sock_t sock;
- if ((sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == BAD_SOCK)
- {
- continue;
- }
-
- if (bind(sock, p->ai_addr, (int)p->ai_addrlen) == -1)
- {
- close(sock);
- continue;
- }
- d->sockfds.push_back(sock);
- }
-
- if (d->sockfds.empty())
- {
- cleanup;
- err=-2;
- return;
- }
-
- freeaddrinfo(servinfo);
- err=0;
- d->exit=false;
- initBroadcastIPv4();
- initBroadcastIPv6();
-
- std::lock_guard lk(d->termLock);
- d->thread = std::thread(std::mem_fn(&UDPWiimote::mainThread), this);
-
- return;
-}
-
-void UDPWiimote::mainThread()
-{
- std::unique_lock lk(d->termLock);
-
- Common::Timer time;
- fd_set fds;
- struct timeval timeout;
- timeout.tv_sec=0;
- timeout.tv_usec=0;
- time.Update();
- do
- {
- int maxfd=0;
- FD_ZERO(&fds);
- for (auto& fd : d->sockfds)
- {
- FD_SET(fd,&fds);
-#ifndef _WIN32
- if (fd>=maxfd)
- maxfd=(fd)+1;
-#endif
- }
-
- u64 tleft=timeout.tv_sec*1000+timeout.tv_usec/1000;
- u64 telapsed=time.GetTimeDifference();
- time.Update();
- if (tleft<=telapsed)
- {
- timeout.tv_sec=1;
- timeout.tv_usec=500000;
- broadcastPresence();
- }
- else
- {
- tleft-=telapsed;
- timeout.tv_sec=(long)(tleft/1000);
- timeout.tv_usec=(tleft%1000)*1000;
- }
-
- lk.unlock(); //VERY hacky. don't like it
- if (d->exit) return;
- int rt=select(maxfd,&fds,nullptr,nullptr,&timeout);
- if (d->exit) return;
- lk.lock();
- if (d->exit) return;
-
- if (rt)
- {
- for (sock_t fd : d->sockfds)
- {
- if (FD_ISSET(fd,&fds))
- {
- u8 bf[64];
- int size=60;
- size_t addr_len;
- struct sockaddr_storage their_addr;
- addr_len = sizeof their_addr;
- if ((size = recvfrom(fd,
- (dataz)bf,
- size , 0,(struct sockaddr *)&their_addr, (socklen_t*)&addr_len)) == -1)
- {
- ERROR_LOG(WIIMOTE,"UDPWii Packet error");
- }
- else
- {
- std::lock_guard lkm(d->mutex);
- if (pharsePacket(bf,size)==0)
- {
- //NOTICE_LOG(WIIMOTE,"UDPWII New pack");
- }
- else
- {
- //NOTICE_LOG(WIIMOTE,"UDPWII Wrong pack format... ignoring");
- }
- }
- }
- }
- }
- } while (!(d->exit));
-}
-
-UDPWiimote::~UDPWiimote()
-{
- d->exit = true;
- {
- std::lock_guard lk(d->termLock);
- d->thread.join();
- }
- for (auto& elem : d->sockfds)
- close(elem);
- close(d->bipv4_fd);
- close(d->bipv6_fd);
- cleanup;
- delete d;
-}
-
-#define ACCEL_FLAG (1 << 0)
-#define BUTT_FLAG (1 << 1)
-#define IR_FLAG (1 << 2)
-#define NUN_FLAG (1 << 3)
-#define NUNACCEL_FLAG (1 << 4)
-
-int UDPWiimote::pharsePacket(u8 * bf, size_t size)
-{
- if (size < 3)
- return -1;
-
- if (bf[0] != 0xde)
- return -1;
- //if (bf[1]==0)
- // time=0;
- //if (bf[1]