Merge pull request #4145 from tenthmile/WiiOrientationModifier
Emulated Wiimote Orientation Modifier
This commit is contained in:
commit
62d7a698da
|
@ -293,6 +293,16 @@ Wiimote::Wiimote(const unsigned int index)
|
||||||
m_options->numeric_settings.emplace_back(
|
m_options->numeric_settings.emplace_back(
|
||||||
std::make_unique<ControlGroup::NumericSetting>(_trans("Battery"), 95.0 / 100, 0, 255));
|
std::make_unique<ControlGroup::NumericSetting>(_trans("Battery"), 95.0 / 100, 0, 255));
|
||||||
|
|
||||||
|
// hotkeys
|
||||||
|
groups.emplace_back(m_hotkeys = new ModifySettingsButton(_trans("Hotkeys")));
|
||||||
|
// hotkeys to temporarily modify the Wiimote orientation (sideways, upright)
|
||||||
|
// this setting modifier is toggled
|
||||||
|
m_hotkeys->AddInput(_trans("Sideways Toggle"), true);
|
||||||
|
m_hotkeys->AddInput(_trans("Upright Toggle"), true);
|
||||||
|
// this setting modifier is not toggled
|
||||||
|
m_hotkeys->AddInput(_trans("Sideways Hold"), false);
|
||||||
|
m_hotkeys->AddInput(_trans("Upright Hold"), false);
|
||||||
|
|
||||||
// TODO: This value should probably be re-read if SYSCONF gets changed
|
// TODO: This value should probably be re-read if SYSCONF gets changed
|
||||||
m_sensor_bar_on_top = SConfig::GetInstance().m_SYSCONF->GetData<u8>("BT.BAR") != 0;
|
m_sensor_bar_on_top = SConfig::GetInstance().m_SYSCONF->GetData<u8>("BT.BAR") != 0;
|
||||||
|
|
||||||
|
@ -361,7 +371,10 @@ void Wiimote::UpdateButtonsStatus()
|
||||||
{
|
{
|
||||||
// update buttons in status struct
|
// update buttons in status struct
|
||||||
m_status.buttons.hex = 0;
|
m_status.buttons.hex = 0;
|
||||||
const bool is_sideways = m_options->boolean_settings[1]->GetValue();
|
const bool sideways_modifier_toggle = m_hotkeys->getSettingsModifier()[0];
|
||||||
|
const bool sideways_modifier_switch = m_hotkeys->getSettingsModifier()[2];
|
||||||
|
const bool is_sideways = m_options->boolean_settings[1]->GetValue() ^ sideways_modifier_toggle ^
|
||||||
|
sideways_modifier_switch;
|
||||||
m_buttons->GetState(&m_status.buttons.hex, button_bitmasks);
|
m_buttons->GetState(&m_status.buttons.hex, button_bitmasks);
|
||||||
m_dpad->GetState(&m_status.buttons.hex, is_sideways ? dpad_sideways_bitmasks : dpad_bitmasks);
|
m_dpad->GetState(&m_status.buttons.hex, is_sideways ? dpad_sideways_bitmasks : dpad_bitmasks);
|
||||||
}
|
}
|
||||||
|
@ -380,8 +393,14 @@ void Wiimote::GetButtonData(u8* const data)
|
||||||
|
|
||||||
void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf)
|
void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf)
|
||||||
{
|
{
|
||||||
const bool is_sideways = m_options->boolean_settings[1]->GetValue();
|
const bool sideways_modifier_toggle = m_hotkeys->getSettingsModifier()[0];
|
||||||
const bool is_upright = m_options->boolean_settings[2]->GetValue();
|
const bool upright_modifier_toggle = m_hotkeys->getSettingsModifier()[1];
|
||||||
|
const bool sideways_modifier_switch = m_hotkeys->getSettingsModifier()[2];
|
||||||
|
const bool upright_modifier_switch = m_hotkeys->getSettingsModifier()[3];
|
||||||
|
const bool is_sideways = m_options->boolean_settings[1]->GetValue() ^ sideways_modifier_toggle ^
|
||||||
|
sideways_modifier_switch;
|
||||||
|
const bool is_upright = m_options->boolean_settings[2]->GetValue() ^ upright_modifier_toggle ^
|
||||||
|
upright_modifier_switch;
|
||||||
|
|
||||||
EmulateTilt(&m_accel, m_tilt, is_sideways, is_upright);
|
EmulateTilt(&m_accel, m_tilt, is_sideways, is_upright);
|
||||||
EmulateSwing(&m_accel, m_swing, is_sideways, is_upright);
|
EmulateSwing(&m_accel, m_swing, is_sideways, is_upright);
|
||||||
|
@ -651,6 +670,9 @@ void Wiimote::Update()
|
||||||
|
|
||||||
auto lock = ControllerEmu::GetStateLock();
|
auto lock = ControllerEmu::GetStateLock();
|
||||||
|
|
||||||
|
// hotkey/settings modifier
|
||||||
|
m_hotkeys->GetState(); // data is later accessed in UpdateButtonsStatus and GetAccelData
|
||||||
|
|
||||||
// core buttons
|
// core buttons
|
||||||
if (rptf.core)
|
if (rptf.core)
|
||||||
GetButtonData(data + rptf.core);
|
GetButtonData(data + rptf.core);
|
||||||
|
|
|
@ -156,6 +156,7 @@ private:
|
||||||
ControlGroup* m_rumble;
|
ControlGroup* m_rumble;
|
||||||
Extension* m_extension;
|
Extension* m_extension;
|
||||||
ControlGroup* m_options;
|
ControlGroup* m_options;
|
||||||
|
ModifySettingsButton* m_hotkeys;
|
||||||
|
|
||||||
// Wiimote accel data
|
// Wiimote accel data
|
||||||
AccelData m_accel;
|
AccelData m_accel;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "InputCommon/ControllerEmu.h"
|
#include "InputCommon/ControllerEmu.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "Common/Common.h"
|
#include "Common/Common.h"
|
||||||
|
#include "VideoCommon/OnScreenDisplay.h"
|
||||||
|
|
||||||
// This should be called before calling GetState() or State() on a control reference
|
// This should be called before calling GetState() or State() on a control reference
|
||||||
// to prevent a race condition.
|
// to prevent a race condition.
|
||||||
|
@ -191,6 +192,51 @@ ControllerEmu::Buttons::Buttons(const std::string& _name) : ControlGroup(_name,
|
||||||
numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Threshold"), 0.5));
|
numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Threshold"), 0.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ControllerEmu::ModifySettingsButton::ModifySettingsButton(std::string button_name)
|
||||||
|
: Buttons(std::move(button_name))
|
||||||
|
{
|
||||||
|
numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Threshold"), 0.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ControllerEmu::ModifySettingsButton::AddInput(std::string button_name, bool toggle)
|
||||||
|
{
|
||||||
|
controls.emplace_back(new ControlGroup::Input(std::move(button_name)));
|
||||||
|
threshold_exceeded.emplace_back(false);
|
||||||
|
associated_settings.emplace_back(false);
|
||||||
|
associated_settings_toggle.emplace_back(toggle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ControllerEmu::ModifySettingsButton::GetState()
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < controls.size(); ++i)
|
||||||
|
{
|
||||||
|
ControlState state = controls[i]->control_ref->State();
|
||||||
|
|
||||||
|
if (!associated_settings_toggle[i])
|
||||||
|
{
|
||||||
|
// not toggled
|
||||||
|
associated_settings[i] = state > numeric_settings[0]->GetValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// toggle (loading savestates does not en-/disable toggle)
|
||||||
|
// after we passed the threshold, we en-/disable. but after that, we don't change it
|
||||||
|
// anymore
|
||||||
|
if (!threshold_exceeded[i] && state > numeric_settings[0]->GetValue())
|
||||||
|
{
|
||||||
|
associated_settings[i] = !associated_settings[i];
|
||||||
|
if (associated_settings[i])
|
||||||
|
OSD::AddMessage(controls[i]->name + ": " + _trans("on"));
|
||||||
|
else
|
||||||
|
OSD::AddMessage(controls[i]->name + ": " + _trans("off"));
|
||||||
|
threshold_exceeded[i] = true;
|
||||||
|
}
|
||||||
|
if (state < numeric_settings[0]->GetValue())
|
||||||
|
threshold_exceeded[i] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ControllerEmu::MixedTriggers::MixedTriggers(const std::string& _name)
|
ControllerEmu::MixedTriggers::MixedTriggers(const std::string& _name)
|
||||||
: ControlGroup(_name, GROUP_TYPE_MIXED_TRIGGERS)
|
: ControlGroup(_name, GROUP_TYPE_MIXED_TRIGGERS)
|
||||||
{
|
{
|
||||||
|
|
|
@ -217,6 +217,22 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ModifySettingsButton : public Buttons
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ModifySettingsButton(std::string button_name);
|
||||||
|
void AddInput(std::string button_name, bool toggle = false);
|
||||||
|
|
||||||
|
void GetState();
|
||||||
|
|
||||||
|
const std::vector<bool>& isSettingToggled() const { return associated_settings_toggle; }
|
||||||
|
const std::vector<bool>& getSettingsModifier() const { return associated_settings; }
|
||||||
|
private:
|
||||||
|
std::vector<bool> threshold_exceeded; // internal calculation (if "state" was above threshold)
|
||||||
|
std::vector<bool> associated_settings_toggle; // is setting toggled or hold?
|
||||||
|
std::vector<bool> associated_settings; // result
|
||||||
|
};
|
||||||
|
|
||||||
class MixedTriggers : public ControlGroup
|
class MixedTriggers : public ControlGroup
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue