diff --git a/Source/Core/InputCommon/Src/ControllerEmu.cpp b/Source/Core/InputCommon/Src/ControllerEmu.cpp index 44013bea40..a2c8630d22 100644 --- a/Source/Core/InputCommon/Src/ControllerEmu.cpp +++ b/Source/Core/InputCommon/Src/ControllerEmu.cpp @@ -259,6 +259,14 @@ ControllerEmu::Triggers::Triggers( const char* const _name ) : ControlGroup( _na settings.push_back( new Setting("Dead Zone", 0, 0, 50 ) ); } +ControllerEmu::Slider::Slider(const char* const _name) : ControlGroup(_name, GROUP_TYPE_SLIDER) +{ + controls.push_back(new Input("Left")); + controls.push_back(new Input("Right")); + + settings.push_back(new Setting("Dead Zone", 0, 0, 50)); +} + ControllerEmu::Force::Force( const char* const _name ) : ControlGroup( _name, GROUP_TYPE_FORCE ) { memset(m_swing, 0, sizeof(m_swing)); diff --git a/Source/Core/InputCommon/Src/ControllerEmu.h b/Source/Core/InputCommon/Src/ControllerEmu.h index 8753742f64..635befa53e 100644 --- a/Source/Core/InputCommon/Src/ControllerEmu.h +++ b/Source/Core/InputCommon/Src/ControllerEmu.h @@ -45,7 +45,8 @@ enum GROUP_TYPE_TILT, GROUP_TYPE_CURSOR, GROUP_TYPE_TRIGGERS, - GROUP_TYPE_UDPWII + GROUP_TYPE_UDPWII, + GROUP_TYPE_SLIDER, }; const char * const named_directions[] = @@ -247,6 +248,26 @@ public: }; + class Slider : public ControlGroup + { + public: + + template + void GetState(S* const slider, const unsigned int range, const unsigned int base = 0) + { + 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); + else + *slider = 0; + } + + Slider(const char* const _name); + + }; + class Force : public ControlGroup { public: diff --git a/Source/Core/InputUICommon/Src/ConfigDiag.cpp b/Source/Core/InputUICommon/Src/ConfigDiag.cpp index 6082e89e47..473cc96520 100644 --- a/Source/Core/InputUICommon/Src/ConfigDiag.cpp +++ b/Source/Core/InputUICommon/Src/ConfigDiag.cpp @@ -788,14 +788,17 @@ ControlGroupBox::ControlGroupBox( ControllerEmu::ControlGroup* const group, wxWi break; case GROUP_TYPE_MIXED_TRIGGERS: case GROUP_TYPE_TRIGGERS: + case GROUP_TYPE_SLIDER: { - int height = (int)(6 * group->controls.size()); - int width = 64+12+1; - if (GROUP_TYPE_TRIGGERS == group->type) - { - height *= 2; - width = 64; - } + int height = (int)(12 * group->controls.size()); + int width = 64; + + if (GROUP_TYPE_MIXED_TRIGGERS == group->type) + width = 64+12+1; + + if (GROUP_TYPE_TRIGGERS != group->type) + height /= 2; + wxBitmap bitmap(width, height+1); dc.SelectObject(bitmap); dc.Clear(); @@ -867,19 +870,24 @@ ControlGroupBox::ControlGroupBox( ControllerEmu::ControlGroup* const group, wxWi ControlGroupsSizer::ControlGroupsSizer( ControllerEmu* const controller, wxWindow* const parent, wxWindow* const eventsink, std::vector* groups ) : wxBoxSizer( wxHORIZONTAL ) { + size_t col_size = 0; wxBoxSizer* stacked_groups = NULL; for ( unsigned int i = 0; i < controller->groups.size(); ++i ) { ControlGroupBox* control_group = new ControlGroupBox( controller->groups[i], parent, eventsink ); - if ( control_group->control_buttons.size() > 1 ) + const size_t grp_size = controller->groups[i]->controls.size() + controller->groups[i]->settings.size(); + col_size += grp_size; + if (col_size > 8 || NULL == stacked_groups) { if ( stacked_groups ) Add( stacked_groups, 0, /*wxEXPAND|*/wxBOTTOM|wxRIGHT, 5 ); stacked_groups = new wxBoxSizer( wxVERTICAL ); stacked_groups->Add( control_group, 0, wxEXPAND ); + + col_size = grp_size; } else stacked_groups->Add( control_group, 0, wxEXPAND ); @@ -890,7 +898,6 @@ ControlGroupsSizer::ControlGroupsSizer( ControllerEmu* const controller, wxWindo if ( stacked_groups ) Add( stacked_groups, 0, /*wxEXPAND|*/wxBOTTOM|wxRIGHT, 5 ); - } GamepadPage::GamepadPage( wxWindow* parent, InputPlugin& plugin, const unsigned int pad_num, InputConfigDialog* const config_dialog ) diff --git a/Source/Core/InputUICommon/Src/ConfigDiagBitmaps.cpp b/Source/Core/InputUICommon/Src/ConfigDiagBitmaps.cpp index 9531fef326..69de5241f6 100644 --- a/Source/Core/InputUICommon/Src/ConfigDiagBitmaps.cpp +++ b/Source/Core/InputUICommon/Src/ConfigDiagBitmaps.cpp @@ -308,6 +308,29 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event)) } 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; } diff --git a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Guitar.cpp b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Guitar.cpp index ebb938b4e6..5dc1ba1e37 100644 --- a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Guitar.cpp +++ b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Guitar.cpp @@ -39,23 +39,23 @@ Guitar::Guitar() : Attachment( "Guitar" ) for ( unsigned int i = 0; i < sizeof(guitar_fret_names)/sizeof(*guitar_fret_names); ++i ) m_frets->controls.push_back( new ControlGroup::Input( guitar_fret_names[i] ) ); - // stick - groups.push_back( m_stick = new AnalogStick( "Stick" ) ); - // strum groups.push_back( m_strum = new Buttons( "Strum" ) ); m_strum->controls.push_back( new ControlGroup::Input("Up") ); m_strum->controls.push_back( new ControlGroup::Input("Down") ); - // whammy - groups.push_back( m_whammy = new Triggers( "Whammy" ) ); - m_whammy->controls.push_back( new ControlGroup::Input("Bar") ); - // buttons groups.push_back( m_buttons = new Buttons( "Buttons" ) ); m_buttons->controls.push_back( new ControlGroup::Input("-") ); m_buttons->controls.push_back( new ControlGroup::Input("+") ); + // stick + groups.push_back( m_stick = new AnalogStick( "Stick" ) ); + + // whammy + groups.push_back( m_whammy = new Triggers( "Whammy" ) ); + m_whammy->controls.push_back( new ControlGroup::Input("Bar") ); + // set up register // id memcpy( ®[0xfa], guitar_id, sizeof(guitar_id) ); diff --git a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.cpp b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.cpp index 5cb88aef0e..eacfd194fe 100644 --- a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.cpp +++ b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.cpp @@ -29,21 +29,23 @@ static const char* const turntable_button_names[] = Turntable::Turntable() : Attachment("Turntable") { // buttons - // TODO: separate buttons into Left and Right groups.push_back(m_buttons = new Buttons("Buttons")); for (unsigned int i = 0; i < sizeof(turntable_button_names)/sizeof(*turntable_button_names); ++i) m_buttons->controls.push_back(new ControlGroup::Input( turntable_button_names[i])); + // turntables + groups.push_back(m_left_table = new Slider("Table Left")); + groups.push_back(m_right_table = new Slider("Table Right")); + // stick groups.push_back(m_stick = new AnalogStick("Stick")); - // TODO: + // effect dial groups.push_back(m_effect_dial = new Triggers("Effect")); m_effect_dial->controls.push_back(new ControlGroup::Input("Dial")); - //m_left_turntable - //m_right_turntable - //m_crossfade_slider + // crossfade + groups.push_back(m_crossfade = new Slider("Crossfade")); // set up register // id @@ -65,20 +67,18 @@ void Turntable::GetState(u8* const data, const bool focus) } // left table - // TODO: { s8 tt = 0; - //m_left_turntable->GetState(&tt .....); + m_left_table->GetState(&tt, focus ? 0x1F : 0); ttdata->ltable1 = tt; ttdata->ltable2 = tt << 5; } // right table - // TODO: { s8 tt = 0; - //m_right_turntable->GetState(&tt .....); + m_right_table->GetState(&tt, focus ? 0x1F : 0); ttdata->rtable1 = tt; ttdata->rtable2 = tt << 1; @@ -96,10 +96,9 @@ void Turntable::GetState(u8* const data, const bool focus) } // crossfade slider - // TODO: { u8 cfs = 0; - //m_crossfade_slider->GetState(&cfs .....); + m_crossfade->GetState(&cfs, 8, 7); ttdata->slider = cfs; } diff --git a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.h b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.h index 6d0afe924f..18d8124105 100644 --- a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.h +++ b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteEmu/Attachment/Turntable.h @@ -29,13 +29,8 @@ private: Buttons* m_buttons; MixedTriggers* m_triggers; AnalogStick* m_stick; - Triggers *m_effect_dial; - - // TODO: - //m_left_turntable - //m_right_turntable - //m_crossfade_slider + Slider *m_left_table, *m_right_table, *m_crossfade; };