Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Adding stick radius setting
because that makes it easier to adjust it

Adding visual aid for the hardware range because that makes it easier to adjust the radius relative to it
  • Loading branch information
john-peterson committed Jun 6, 2013
1 parent 7aae9cc commit b6e1127
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 8 deletions.
48 changes: 44 additions & 4 deletions Source/Core/DolphinWX/Src/InputConfigDiagBitmaps.cpp
Expand Up @@ -89,13 +89,53 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event))
dc.DrawRectangle( 0, 31 - z*31, 64, 2);
}

// circle for visual aid for diagonal adjustment
// octagon for visual aid for diagonal adjustment
dc.SetPen(*wxLIGHT_GREY_PEN);
dc.SetBrush(*wxWHITE_BRUSH);
if ( GROUP_TYPE_STICK == (*g)->control_group->type )
{
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawCircle( 32, 32, 32);
// outline and fill colors
wxBrush LightGrayBrush(_T("#dddddd"));
wxPen LightGrayPen(_T("#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.0 / 127.0) * 100;
diagonal = (55.0 / 127.0) * 100.0;
}
else if ((*g)->control_group->name == "C-Stick")
{
max = (74.0 / 127.0) * 100;
diagonal = (46.0 / 127.0) * 100;
}
else
{
max = (82.0 / 127.0) * 100;
diagonal = (58.0 / 127.0) * 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
{
Expand All @@ -106,7 +146,7 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event))
{
// deadzone circle
dc.SetBrush(*wxLIGHT_GREY_BRUSH);
dc.DrawCircle( 32, 32, ((*g)->control_group)->settings[0]->value * 32 );
dc.DrawCircle( 32, 32, ((*g)->control_group)->settings[SETTING_DEADZONE]->value * 32 );
}

// raw dot
Expand Down
1 change: 1 addition & 0 deletions Source/Core/InputCommon/Src/ControllerEmu.cpp
Expand Up @@ -226,6 +226,7 @@ ControllerEmu::AnalogStick::AnalogStick(const char* const _name) : ControlGroup(

controls.push_back(new Input(_trans("Modifier")));

settings.push_back(new Setting(_trans("Radius"), 0.7f, 0, 100));
settings.push_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.push_back(new Setting(_trans("Square Stick"), 0));

Expand Down
19 changes: 15 additions & 4 deletions Source/Core/InputCommon/Src/ControllerEmu.h
Expand Up @@ -35,6 +35,13 @@ enum
GROUP_TYPE_SLIDER,
};

enum
{
SETTING_RADIUS,
SETTING_DEADZONE,
SETTING_SQUARE,
};

const char * const named_directions[] =
{
"Up",
Expand Down Expand Up @@ -126,8 +133,9 @@ class ControllerEmu
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 deadzone = settings[0]->value;
ControlState square = settings[1]->value;
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
Expand All @@ -138,11 +146,11 @@ class ControllerEmu
}

// deadzone / square stick code
if (deadzone || square)
if (radius != 1 || deadzone || square)
{
// this section might be all wrong, but its working good enough, I think

ControlState ang = atan2(yy, xx);
ControlState ang = atan2(yy, xx);
ControlState ang_sin = sin(ang);
ControlState ang_cos = cos(ang);

Expand All @@ -163,6 +171,9 @@ class ControllerEmu
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));
}
Expand Down

0 comments on commit b6e1127

Please sign in to comment.