mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-01 22:30:42 -07:00
rawinput: distinguish between circular and linear analog input (#665)
## Link to GitHub Issue or related Pull Request, if one exists n/a ## Description of change Currently, all analogs are treated as circular values that wrap around. This works for knobs and turntables, but can get weird for linear values (like tilt sensors and sliders) especially once analog options are enabled, such as sensitivity. This PR groups analogs into 3 buckets: circular, linear (centered), and linear (positive). Linear types get different algorithms applied to it when options are set (e.g., sensitivity caps out at 0, 1 instead of wrapping around). In linear mode: * Sensitivity value applies an exponential response curve (power curve) to the original value. * Multiplier/divisor serves as a linear cut-off. * Relative mode works as you expect, but of course, values don't wrap around. * Invert and deadzone work as you expect (since they applied to the controller input anyway) * Smoothing is removed from the UI and has no effect. * Delay is unaffected. Also, fix a small bug with -/+ button not working for analog `Delay` option. ## Testing WIP
This commit is contained in:
@@ -38,11 +38,12 @@ std::vector<Analog> &games::bc::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Busou Shinki: Armored Princess Battle Conductor");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Stick X",
|
||||
"Stick Y"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Stick X", AnalogType::LinearCentered },
|
||||
{ "Stick Y", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -45,13 +45,14 @@ std::vector<Analog> &games::ccj::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Chase Chase Jokers");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Joystick X",
|
||||
"Joystick Y",
|
||||
"Trackball DX",
|
||||
"Trackball DY"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Joystick X", AnalogType::LinearCentered },
|
||||
{ "Joystick Y", AnalogType::LinearCentered },
|
||||
{ "Trackball DX", AnalogType::LinearCentered },
|
||||
{ "Trackball DY", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -55,13 +55,14 @@ std::vector<Analog> &games::ddr::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Dance Dance Revolution");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"P1 Left-Right (Axis Fix)",
|
||||
"P1 Up-Down (Axis Fix)",
|
||||
"P2 Left-Right (Axis Fix)",
|
||||
"P2 Up-Down (Axis Fix)"
|
||||
);
|
||||
using namespace GameAPI::Analogs;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "P1 Left-Right (Axis Fix)", AnalogType::LinearCentered },
|
||||
{ "P1 Up-Down (Axis Fix)", AnalogType::LinearCentered },
|
||||
{ "P2 Left-Right (Axis Fix)", AnalogType::LinearCentered },
|
||||
{ "P2 Up-Down (Axis Fix)", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
return analogs;
|
||||
}
|
||||
|
||||
@@ -35,13 +35,14 @@ std::vector<Analog> &games::ftt::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("FutureTomTom");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Pad 1",
|
||||
"Pad 2",
|
||||
"Pad 3",
|
||||
"Pad 4"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Pad 1", AnalogType::LinearPositive },
|
||||
{ "Pad 2", AnalogType::LinearPositive },
|
||||
{ "Pad 3", AnalogType::LinearPositive },
|
||||
{ "Pad 4", AnalogType::LinearPositive }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -86,19 +86,21 @@ std::vector<Button> &games::gitadora::get_buttons() {
|
||||
std::vector<Analog> &games::gitadora::get_analogs() {
|
||||
static std::vector<Analog> analogs;
|
||||
|
||||
using namespace GameAPI::Analogs;
|
||||
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("GitaDora");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(&analogs,
|
||||
"Guitar P1 Wail X",
|
||||
"Guitar P1 Wail Y",
|
||||
"Guitar P1 Wail Z",
|
||||
"Guitar P1 Knob",
|
||||
"Guitar P2 Wail X",
|
||||
"Guitar P2 Wail Y",
|
||||
"Guitar P2 Wail Z",
|
||||
"Guitar P2 Knob"
|
||||
);
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{"Guitar P1 Wail X", AnalogType::LinearCentered},
|
||||
{"Guitar P1 Wail Y", AnalogType::LinearCentered},
|
||||
{"Guitar P1 Wail Z", AnalogType::LinearCentered},
|
||||
{"Guitar P1 Knob", AnalogType::Circular},
|
||||
{"Guitar P2 Wail X", AnalogType::LinearCentered},
|
||||
{"Guitar P2 Wail Y", AnalogType::LinearCentered},
|
||||
{"Guitar P2 Wail Z", AnalogType::LinearCentered},
|
||||
{"Guitar P2 Knob", AnalogType::Circular}
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -63,16 +63,17 @@ std::vector<Analog> &games::iidx::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Beatmania IIDX");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Turntable P1",
|
||||
"Turntable P2",
|
||||
"VEFX",
|
||||
"Low-EQ",
|
||||
"Hi-EQ",
|
||||
"Filter",
|
||||
"Play Volume"
|
||||
);
|
||||
using namespace GameAPI::Analogs;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Turntable P1", AnalogType::Circular },
|
||||
{ "Turntable P2", AnalogType::Circular },
|
||||
{ "VEFX", AnalogType::LinearPositive },
|
||||
{ "Low-EQ", AnalogType::LinearPositive },
|
||||
{ "Hi-EQ", AnalogType::LinearPositive },
|
||||
{ "Filter", AnalogType::LinearPositive },
|
||||
{ "Play Volume", AnalogType::LinearPositive }
|
||||
});
|
||||
}
|
||||
return analogs;
|
||||
}
|
||||
|
||||
@@ -36,11 +36,11 @@ std::vector<Analog> &games::mga::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Metal Gear");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Joy X",
|
||||
"Joy Y"
|
||||
);
|
||||
using namespace GameAPI::Analogs;
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Joy X", AnalogType::LinearCentered },
|
||||
{ "Joy Y", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -165,37 +165,38 @@ std::vector<Analog> &games::nost::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Nostalgia");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Key 1",
|
||||
"Key 2",
|
||||
"Key 3",
|
||||
"Key 4",
|
||||
"Key 5",
|
||||
"Key 6",
|
||||
"Key 7",
|
||||
"Key 8",
|
||||
"Key 9",
|
||||
"Key 10",
|
||||
"Key 11",
|
||||
"Key 12",
|
||||
"Key 13",
|
||||
"Key 14",
|
||||
"Key 15",
|
||||
"Key 16",
|
||||
"Key 17",
|
||||
"Key 18",
|
||||
"Key 19",
|
||||
"Key 20",
|
||||
"Key 21",
|
||||
"Key 22",
|
||||
"Key 23",
|
||||
"Key 24",
|
||||
"Key 25",
|
||||
"Key 26",
|
||||
"Key 27",
|
||||
"Key 28"
|
||||
);
|
||||
using namespace GameAPI::Analogs;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Key 1", AnalogType::LinearPositive },
|
||||
{ "Key 2", AnalogType::LinearPositive },
|
||||
{ "Key 3", AnalogType::LinearPositive },
|
||||
{ "Key 4", AnalogType::LinearPositive },
|
||||
{ "Key 5", AnalogType::LinearPositive },
|
||||
{ "Key 6", AnalogType::LinearPositive },
|
||||
{ "Key 7", AnalogType::LinearPositive },
|
||||
{ "Key 8", AnalogType::LinearPositive },
|
||||
{ "Key 9", AnalogType::LinearPositive },
|
||||
{ "Key 10", AnalogType::LinearPositive },
|
||||
{ "Key 11", AnalogType::LinearPositive },
|
||||
{ "Key 12", AnalogType::LinearPositive },
|
||||
{ "Key 13", AnalogType::LinearPositive },
|
||||
{ "Key 14", AnalogType::LinearPositive },
|
||||
{ "Key 15", AnalogType::LinearPositive },
|
||||
{ "Key 16", AnalogType::LinearPositive },
|
||||
{ "Key 17", AnalogType::LinearPositive },
|
||||
{ "Key 18", AnalogType::LinearPositive },
|
||||
{ "Key 19", AnalogType::LinearPositive },
|
||||
{ "Key 20", AnalogType::LinearPositive },
|
||||
{ "Key 21", AnalogType::LinearPositive },
|
||||
{ "Key 22", AnalogType::LinearPositive },
|
||||
{ "Key 23", AnalogType::LinearPositive },
|
||||
{ "Key 24", AnalogType::LinearPositive },
|
||||
{ "Key 25", AnalogType::LinearPositive },
|
||||
{ "Key 26", AnalogType::LinearPositive },
|
||||
{ "Key 27", AnalogType::LinearPositive },
|
||||
{ "Key 28", AnalogType::LinearPositive }
|
||||
});
|
||||
}
|
||||
return analogs;
|
||||
}
|
||||
|
||||
@@ -51,11 +51,12 @@ std::vector<Analog> &games::pc::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Polaris Chord");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Fader-L",
|
||||
"Fader-R"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Fader-L", AnalogType::LinearCentered },
|
||||
{ "Fader-R", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -35,12 +35,13 @@ std::vector<Analog> &games::rf3d::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Road Fighters 3D");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Wheel",
|
||||
"Accelerate",
|
||||
"Brake"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Wheel", AnalogType::LinearCentered },
|
||||
{ "Accelerate", AnalogType::LinearPositive },
|
||||
{ "Brake", AnalogType::LinearPositive }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -31,13 +31,14 @@ std::vector<Analog> &games::sc::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Steel Chronicle");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Left Stick X",
|
||||
"Left Stick Y",
|
||||
"Right Stick X",
|
||||
"Right Stick Y"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Left Stick X", AnalogType::LinearCentered },
|
||||
{ "Left Stick Y", AnalogType::LinearCentered },
|
||||
{ "Right Stick X", AnalogType::LinearCentered },
|
||||
{ "Right Stick Y", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -31,11 +31,12 @@ std::vector<Analog> &games::silentscope::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Silent Scope: Bone Eater");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Gun X",
|
||||
"Gun Y"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Gun X", AnalogType::LinearCentered },
|
||||
{ "Gun Y", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
@@ -50,13 +50,14 @@ std::vector<Analog> &games::we::get_analogs() {
|
||||
if (analogs.empty()) {
|
||||
analogs = GameAPI::Analogs::getAnalogs("Winning Eleven");
|
||||
|
||||
GameAPI::Analogs::sortAnalogs(
|
||||
&analogs,
|
||||
"Pad Stick Left X",
|
||||
"Pad Stick Left Y",
|
||||
"Pad Stick Right X",
|
||||
"Pad Stick Right Y"
|
||||
);
|
||||
using GameAPI::Analogs::AnalogType;
|
||||
|
||||
GameAPI::Analogs::sortAnalogsWithType(&analogs, {
|
||||
{ "Pad Stick Left X", AnalogType::LinearCentered },
|
||||
{ "Pad Stick Left Y", AnalogType::LinearCentered },
|
||||
{ "Pad Stick Right X", AnalogType::LinearCentered },
|
||||
{ "Pad Stick Right Y", AnalogType::LinearCentered }
|
||||
});
|
||||
}
|
||||
|
||||
return analogs;
|
||||
|
||||
Reference in New Issue
Block a user