Implement slider bar present on GHWT and GH5 controllers
This commit is contained in:
parent
096399d371
commit
ef84e19d55
|
@ -260,7 +260,7 @@ struct wm_guitar_extension
|
||||||
u8 sy : 6;
|
u8 sy : 6;
|
||||||
u8 pad2 : 2; // 1 on gh3, 0 on ghwt
|
u8 pad2 : 2; // 1 on gh3, 0 on ghwt
|
||||||
|
|
||||||
u8 tb : 5; // not used in gh3
|
u8 sb : 5; // not used in gh3
|
||||||
u8 pad3 : 3; // always 0
|
u8 pad3 : 3; // always 0
|
||||||
|
|
||||||
u8 whammy : 5;
|
u8 whammy : 5;
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#include "Common/Common.h"
|
#include "Common/Common.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
||||||
|
@ -15,10 +17,22 @@
|
||||||
#include "InputCommon/ControllerEmu/ControlGroup/AnalogStick.h"
|
#include "InputCommon/ControllerEmu/ControlGroup/AnalogStick.h"
|
||||||
#include "InputCommon/ControllerEmu/ControlGroup/Buttons.h"
|
#include "InputCommon/ControllerEmu/ControlGroup/Buttons.h"
|
||||||
#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h"
|
#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h"
|
||||||
|
#include "InputCommon/ControllerEmu/ControlGroup/Slider.h"
|
||||||
#include "InputCommon/ControllerEmu/ControlGroup/Triggers.h"
|
#include "InputCommon/ControllerEmu/ControlGroup/Triggers.h"
|
||||||
|
|
||||||
namespace WiimoteEmu
|
namespace WiimoteEmu
|
||||||
{
|
{
|
||||||
|
static const std::map<const ControlState, const u8> s_slider_bar_control_codes{
|
||||||
|
// values determined using a PS3 Guitar Hero 5 controller, which maps the touchbar to Zr on
|
||||||
|
// Windows
|
||||||
|
{0.0, 0x0F}, // not touching
|
||||||
|
{-0.4375, 0x04}, // top fret
|
||||||
|
{-0.097656, 0x0A}, // second fret
|
||||||
|
{0.203125, 0x12}, // third fret
|
||||||
|
{0.578125, 0x17}, // fourth fret
|
||||||
|
{1.0, 0x1F} // bottom fret
|
||||||
|
};
|
||||||
|
|
||||||
constexpr std::array<u8, 6> guitar_id{{0x00, 0x00, 0xa4, 0x20, 0x01, 0x03}};
|
constexpr std::array<u8, 6> guitar_id{{0x00, 0x00, 0xa4, 0x20, 0x01, 0x03}};
|
||||||
|
|
||||||
constexpr std::array<u16, 5> guitar_fret_bitmasks{{
|
constexpr std::array<u16, 5> guitar_fret_bitmasks{{
|
||||||
|
@ -63,6 +77,9 @@ Guitar::Guitar(ExtensionReg& reg) : Attachment(_trans("Guitar"), reg)
|
||||||
groups.emplace_back(m_whammy = new ControllerEmu::Triggers(_trans("Whammy")));
|
groups.emplace_back(m_whammy = new ControllerEmu::Triggers(_trans("Whammy")));
|
||||||
m_whammy->controls.emplace_back(new ControllerEmu::Input(_trans("Bar")));
|
m_whammy->controls.emplace_back(new ControllerEmu::Input(_trans("Bar")));
|
||||||
|
|
||||||
|
// slider bar
|
||||||
|
groups.emplace_back(m_slider_bar = new ControllerEmu::Slider(_trans("Slider Bar")));
|
||||||
|
|
||||||
// set up register
|
// set up register
|
||||||
m_id = guitar_id;
|
m_id = guitar_id;
|
||||||
}
|
}
|
||||||
|
@ -83,8 +100,18 @@ void Guitar::GetState(u8* const data)
|
||||||
gdata->sy = static_cast<u8>((y * 0x1F) + 0x20);
|
gdata->sy = static_cast<u8>((y * 0x1F) + 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: touch bar, probably not
|
// slider bar
|
||||||
gdata->tb = 0x0F; // not touched
|
if (m_slider_bar->controls[0]->control_ref->BoundCount())
|
||||||
|
{
|
||||||
|
ControlState slider_bar;
|
||||||
|
m_slider_bar->GetState(&slider_bar);
|
||||||
|
gdata->sb = s_slider_bar_control_codes.lower_bound(slider_bar)->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if user has not mapped controls for slider bar, tell game it's untouched
|
||||||
|
gdata->sb = 0x0F;
|
||||||
|
}
|
||||||
|
|
||||||
// whammy bar
|
// whammy bar
|
||||||
ControlState whammy;
|
ControlState whammy;
|
||||||
|
@ -125,6 +152,8 @@ ControllerEmu::ControlGroup* Guitar::GetGroup(GuitarGroup group)
|
||||||
return m_whammy;
|
return m_whammy;
|
||||||
case GuitarGroup::Stick:
|
case GuitarGroup::Stick:
|
||||||
return m_stick;
|
return m_stick;
|
||||||
|
case GuitarGroup::SliderBar:
|
||||||
|
return m_slider_bar;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -12,6 +12,7 @@ class AnalogStick;
|
||||||
class Buttons;
|
class Buttons;
|
||||||
class ControlGroup;
|
class ControlGroup;
|
||||||
class Triggers;
|
class Triggers;
|
||||||
|
class Slider;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace WiimoteEmu
|
namespace WiimoteEmu
|
||||||
|
@ -48,5 +49,6 @@ private:
|
||||||
ControllerEmu::Buttons* m_strum;
|
ControllerEmu::Buttons* m_strum;
|
||||||
ControllerEmu::Triggers* m_whammy;
|
ControllerEmu::Triggers* m_whammy;
|
||||||
ControllerEmu::AnalogStick* m_stick;
|
ControllerEmu::AnalogStick* m_stick;
|
||||||
|
ControllerEmu::Slider* m_slider_bar;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,8 @@ enum class GuitarGroup
|
||||||
Frets,
|
Frets,
|
||||||
Strum,
|
Strum,
|
||||||
Whammy,
|
Whammy,
|
||||||
Stick
|
Stick,
|
||||||
|
SliderBar
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DrumsGroup
|
enum class DrumsGroup
|
||||||
|
|
|
@ -20,11 +20,15 @@ GuitarInputConfigDialog::GuitarInputConfigDialog(wxWindow* const parent, InputCo
|
||||||
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::Buttons), this, this);
|
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::Buttons), this, this);
|
||||||
auto* const group_left_strum = new ControlGroupBox(
|
auto* const group_left_strum = new ControlGroupBox(
|
||||||
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::Strum), this, this);
|
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::Strum), this, this);
|
||||||
|
auto* const group_slider_bar = new ControlGroupBox(
|
||||||
|
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::SliderBar), this, this);
|
||||||
|
|
||||||
auto* const buttons_strum_sizer = new wxBoxSizer(wxVERTICAL);
|
auto* const buttons_strum_slider_bar_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
buttons_strum_sizer->Add(group_box_buttons, 0, wxEXPAND);
|
buttons_strum_slider_bar_sizer->Add(group_box_buttons, 0, wxEXPAND);
|
||||||
buttons_strum_sizer->AddSpacer(space5);
|
buttons_strum_slider_bar_sizer->AddSpacer(space5);
|
||||||
buttons_strum_sizer->Add(group_left_strum, 0, wxEXPAND);
|
buttons_strum_slider_bar_sizer->Add(group_left_strum, 0, wxEXPAND);
|
||||||
|
buttons_strum_slider_bar_sizer->AddSpacer(space5);
|
||||||
|
buttons_strum_slider_bar_sizer->Add(group_slider_bar, 0, wxEXPAND);
|
||||||
|
|
||||||
auto* const group_box_frets = new ControlGroupBox(
|
auto* const group_box_frets = new ControlGroupBox(
|
||||||
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::Frets), this, this);
|
Wiimote::GetGuitarGroup(port_num, WiimoteEmu::GuitarGroup::Frets), this, this);
|
||||||
|
@ -41,7 +45,7 @@ GuitarInputConfigDialog::GuitarInputConfigDialog(wxWindow* const parent, InputCo
|
||||||
|
|
||||||
auto* const controls_sizer = new wxBoxSizer(wxHORIZONTAL);
|
auto* const controls_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
controls_sizer->AddSpacer(space5);
|
controls_sizer->AddSpacer(space5);
|
||||||
controls_sizer->Add(buttons_strum_sizer, 0, wxEXPAND);
|
controls_sizer->Add(buttons_strum_slider_bar_sizer, 0, wxEXPAND);
|
||||||
controls_sizer->AddSpacer(space5);
|
controls_sizer->AddSpacer(space5);
|
||||||
controls_sizer->Add(frets_whammy_sizer, 0, wxEXPAND);
|
controls_sizer->Add(frets_whammy_sizer, 0, wxEXPAND);
|
||||||
controls_sizer->AddSpacer(space5);
|
controls_sizer->AddSpacer(space5);
|
||||||
|
|
Loading…
Reference in New Issue