Skip to content

Commit cc8ccbd

Browse files
committed
Bug 1648865 - Convert Gamepad trigger axis values to button values. r=baku
Differential Revision: https://phabricator.services.mozilla.com/D81428
1 parent d60afdf commit cc8ccbd

File tree

1 file changed

+102
-51
lines changed

1 file changed

+102
-51
lines changed

dom/gamepad/GamepadRemapping.cpp

Lines changed: 102 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,25 @@ enum CanonicalAxisIndex {
4747
AXIS_INDEX_COUNT
4848
};
4949

50+
const float BUTTON_THRESHOLD_VALUE = 0.1f;
51+
5052
float NormalizeTouch(long aValue, long aMin, long aMax) {
5153
return (2.f * (aValue - aMin) / static_cast<float>(aMax - aMin)) - 1.f;
5254
}
5355

5456
bool AxisNegativeAsButton(float input) {
5557
const float value = (input < -0.5f) ? 1.f : 0.f;
56-
return value > 0.1f;
58+
return value > BUTTON_THRESHOLD_VALUE;
5759
}
5860

5961
bool AxisPositiveAsButton(float input) {
6062
const float value = (input > 0.5f) ? 1.f : 0.f;
61-
return value > 0.1f;
63+
return value > BUTTON_THRESHOLD_VALUE;
64+
}
65+
66+
double AxisToButtonValue(double aValue) {
67+
// Mapping axis value range from (-1, +1) to (0, +1).
68+
return (aValue + 1.0f) * 0.5f;
6269
}
6370

6471
void FetchDpadFromAxis(uint32_t aIndex, double dir) {
@@ -173,14 +180,18 @@ class ADT1Remapper final : public GamepadRemapper {
173180
case 2:
174181
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
175182
break;
176-
case 3:
183+
case 3: {
184+
const double value = AxisToButtonValue(aValue);
177185
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
178-
aValue > 0.1f);
186+
value > BUTTON_THRESHOLD_VALUE, value);
179187
break;
180-
case 4:
188+
}
189+
case 4: {
190+
const double value = AxisToButtonValue(aValue);
181191
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
182-
aValue > 0.1f);
192+
value > BUTTON_THRESHOLD_VALUE, value);
183193
break;
194+
}
184195
case 5:
185196
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
186197
break;
@@ -329,12 +340,16 @@ class StadiaControllerRemapper final : public GamepadRemapper {
329340
case 3:
330341
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
331342
break;
332-
case 4:
333-
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER, aValue);
343+
case 4: {
344+
const double value = AxisToButtonValue(aValue);
345+
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER, value > BUTTON_THRESHOLD_VALUE, value);
334346
break;
335-
case 5:
336-
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER, aValue);
347+
}
348+
case 5: {
349+
const double value = AxisToButtonValue(aValue);
350+
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER, value > BUTTON_THRESHOLD_VALUE, value);
337351
break;
352+
}
338353
default:
339354
NS_WARNING(
340355
nsPrintfCString(
@@ -405,7 +420,7 @@ class Playstation3Remapper final : public GamepadRemapper {
405420
default:
406421
NS_WARNING(
407422
nsPrintfCString(
408-
"Axis idx '%d' doesn't support in Dualshock4Remapper().", aAxis)
423+
"Axis idx '%d' doesn't support in Playstation3Remapper().", aAxis)
409424
.get());
410425
break;
411426
}
@@ -575,14 +590,18 @@ class Dualshock4Remapper final : public GamepadRemapper {
575590
case 2:
576591
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
577592
break;
578-
case 3:
593+
case 3: {
594+
const double value = AxisToButtonValue(aValue);
579595
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
580-
aValue > 0.1f);
581-
break;
582-
case 4:
596+
value > BUTTON_THRESHOLD_VALUE, value);
597+
break;
598+
}
599+
case 4: {
600+
const double value = AxisToButtonValue(aValue);
583601
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
584-
aValue > 0.1f);
585-
break;
602+
value > BUTTON_THRESHOLD_VALUE, value);
603+
break;
604+
}
586605
case 5:
587606
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
588607
break;
@@ -832,14 +851,18 @@ class NvShieldRemapper final : public GamepadRemapper {
832851
case 2:
833852
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
834853
break;
835-
case 3:
854+
case 3: {
855+
const double value = AxisToButtonValue(aValue);
836856
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
837-
aValue > 0.1f);
857+
value > BUTTON_THRESHOLD_VALUE, value);
838858
break;
839-
case 4:
859+
}
860+
case 4: {
861+
const double value = AxisToButtonValue(aValue);
840862
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
841-
aValue > 0.1f);
863+
value > BUTTON_THRESHOLD_VALUE, value);
842864
break;
865+
}
843866
case 5:
844867
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
845868
break;
@@ -924,14 +947,18 @@ class NvShield2017Remapper final : public GamepadRemapper {
924947
case 2:
925948
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
926949
break;
927-
case 3:
950+
case 3: {
951+
const double value = AxisToButtonValue(aValue);
928952
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
929-
aValue > 0.1f);
953+
value > BUTTON_THRESHOLD_VALUE, value);
930954
break;
931-
case 4:
955+
}
956+
case 4: {
957+
const double value = AxisToButtonValue(aValue);
932958
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
933-
aValue > 0.1f);
959+
value > BUTTON_THRESHOLD_VALUE, value);
934960
break;
961+
}
935962
case 5:
936963
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
937964
break;
@@ -1089,14 +1116,18 @@ class XSkillsRemapper final : public GamepadRemapper {
10891116
case 2:
10901117
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
10911118
break;
1092-
case 3:
1119+
case 3: {
1120+
const double value = AxisToButtonValue(aValue);
10931121
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1094-
aValue > 0.1f);
1122+
value > BUTTON_THRESHOLD_VALUE, value);
10951123
break;
1096-
case 4:
1124+
}
1125+
case 4: {
1126+
const double value = AxisToButtonValue(aValue);
10971127
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1098-
aValue > 0.1f);
1128+
value > BUTTON_THRESHOLD_VALUE, value);
10991129
break;
1130+
}
11001131
case 5:
11011132
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
11021133
break;
@@ -1230,7 +1261,7 @@ class BoomN64PsxRemapper final : public GamepadRemapper {
12301261
};
12311262
};
12321263

1233-
class AnalogGamepadRemapper final : public GamepadRemapper {
1264+
class StadiaControllerOldFirmwareRemapper final : public GamepadRemapper {
12341265
public:
12351266
virtual uint32_t GetAxisCount() const override { return AXIS_INDEX_COUNT; }
12361267

@@ -1256,14 +1287,18 @@ class AnalogGamepadRemapper final : public GamepadRemapper {
12561287
case 2:
12571288
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
12581289
break;
1259-
case 3:
1290+
case 3: {
1291+
const double value = AxisToButtonValue(aValue);
12601292
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1261-
aValue > 0.1f);
1293+
value > BUTTON_THRESHOLD_VALUE, value);
12621294
break;
1263-
case 4:
1295+
}
1296+
case 4: {
1297+
const double value = AxisToButtonValue(aValue);
12641298
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1265-
aValue > 0.1f);
1299+
value > BUTTON_THRESHOLD_VALUE, value);
12661300
break;
1301+
}
12671302
case 5:
12681303
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
12691304
break;
@@ -1352,14 +1387,18 @@ class RazerServalRemapper final : public GamepadRemapper {
13521387
case 2:
13531388
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
13541389
break;
1355-
case 3:
1390+
case 3: {
1391+
const double value = AxisToButtonValue(aValue);
13561392
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1357-
aValue > 0.1f);
1393+
value > BUTTON_THRESHOLD_VALUE, value);
13581394
break;
1359-
case 4:
1395+
}
1396+
case 4: {
1397+
const double value = AxisToButtonValue(aValue);
13601398
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1361-
aValue > 0.1f);
1399+
value > BUTTON_THRESHOLD_VALUE, value);
13621400
break;
1401+
}
13631402
case 5:
13641403
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
13651404
break;
@@ -1435,14 +1474,18 @@ class MogaProRemapper final : public GamepadRemapper {
14351474
case 2:
14361475
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
14371476
break;
1438-
case 3:
1477+
case 3: {
1478+
const double value = AxisToButtonValue(aValue);
14391479
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1440-
aValue > 0.1f);
1480+
value > BUTTON_THRESHOLD_VALUE, value);
14411481
break;
1442-
case 4:
1482+
}
1483+
case 4: {
1484+
const double value = AxisToButtonValue(aValue);
14431485
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1444-
aValue > 0.1f);
1486+
value > BUTTON_THRESHOLD_VALUE, value);
14451487
break;
1488+
}
14461489
case 5:
14471490
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
14481491
break;
@@ -1512,20 +1555,24 @@ class OnLiveWirelessRemapper final : public GamepadRemapper {
15121555
case 1:
15131556
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_LEFT_STICK_Y, aValue);
15141557
break;
1515-
case 2:
1558+
case 2: {
1559+
const double value = AxisToButtonValue(aValue);
15161560
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1517-
aValue > 0.1f);
1561+
value > BUTTON_THRESHOLD_VALUE, value);
15181562
break;
1563+
}
15191564
case 3:
15201565
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
15211566
break;
15221567
case 4:
15231568
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
15241569
break;
1525-
case 5:
1570+
case 5: {
1571+
const double value = AxisToButtonValue(aValue);
15261572
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1527-
aValue > 0.1f);
1573+
value > BUTTON_THRESHOLD_VALUE, value);
15281574
break;
1575+
}
15291576
case 9:
15301577
FetchDpadFromAxis(aIndex, aValue);
15311578
break;
@@ -1597,20 +1644,24 @@ class OUYARemapper final : public GamepadRemapper {
15971644
case 1:
15981645
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_LEFT_STICK_Y, aValue);
15991646
break;
1600-
case 2:
1647+
case 2: {
1648+
const double value = AxisToButtonValue(aValue);
16011649
service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
1602-
aValue > 0.1f);
1650+
value > BUTTON_THRESHOLD_VALUE, value);
16031651
break;
1652+
}
16041653
case 3:
16051654
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
16061655
break;
16071656
case 4:
16081657
service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
16091658
break;
1610-
case 5:
1659+
case 5: {
1660+
const double value = AxisToButtonValue(aValue);
16111661
service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
1612-
aValue > 0.1f);
1662+
value > BUTTON_THRESHOLD_VALUE, value);
16131663
break;
1664+
}
16141665
default:
16151666
NS_WARNING(
16161667
nsPrintfCString("Axis idx '%d' doesn't support in OUYARemapper().",
@@ -1672,7 +1723,7 @@ already_AddRefed<GamepadRemapper> GetGamepadRemapper(const uint16_t aVendorId,
16721723
{GamepadId::kPadixProduct2060, new IBuffaloRemapper()},
16731724
{GamepadId::kPlayComProduct0005, new XSkillsRemapper()},
16741725
{GamepadId::kPrototypeVendorProduct0667, new BoomN64PsxRemapper()},
1675-
{GamepadId::kPrototypeVendorProduct9401, new AnalogGamepadRemapper()},
1726+
{GamepadId::kPrototypeVendorProduct9401, new StadiaControllerOldFirmwareRemapper()},
16761727
{GamepadId::kRazer1532Product0900, new RazerServalRemapper()},
16771728
{GamepadId::kSonyProduct0268, new Playstation3Remapper()},
16781729
{GamepadId::kSonyProduct05c4, new Dualshock4Remapper()},

0 commit comments

Comments
 (0)