gamepad_standard_mappings.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/gamepad/gamepad_standard_mappings.h"
  5. namespace device {
  6. namespace {
  7. const float kButtonAxisDeadzone = 0.01f;
  8. GamepadButton ValueToButton(float value) {
  9. bool pressed = value > GamepadButton::kDefaultButtonPressedThreshold;
  10. bool touched = value > 0.f;
  11. return GamepadButton(pressed, touched, value);
  12. }
  13. } // namespace
  14. GamepadButton AxisToButton(float input) {
  15. float value = (input + 1.f) / 2.f;
  16. return ValueToButton(value);
  17. }
  18. GamepadButton AxisNegativeAsButton(float input) {
  19. float value = input < -kButtonAxisDeadzone ? -input : 0.f;
  20. return ValueToButton(value);
  21. }
  22. GamepadButton AxisPositiveAsButton(float input) {
  23. float value = input > kButtonAxisDeadzone ? input : 0.f;
  24. return ValueToButton(value);
  25. }
  26. GamepadButton ButtonFromButtonAndAxis(GamepadButton button, float axis) {
  27. float value = (axis + 1.f) / 2.f;
  28. return GamepadButton(button.pressed, button.touched, value);
  29. }
  30. GamepadButton NullButton() {
  31. return GamepadButton();
  32. }
  33. void DpadFromAxis(Gamepad* mapped, float dir) {
  34. bool up = false;
  35. bool right = false;
  36. bool down = false;
  37. bool left = false;
  38. // Dpad is mapped as a direction on one axis, where -1 is up and it
  39. // increases clockwise to 1, which is up + left. It's set to a large (> 1.f)
  40. // number when nothing is depressed, except on start up, sometimes it's 0.0
  41. // for no data, rather than the large number.
  42. if (dir != 0.0f) {
  43. up = (dir >= -1.f && dir < -0.7f) || (dir >= .95f && dir <= 1.f);
  44. right = dir >= -.75f && dir < -.1f;
  45. down = dir >= -.2f && dir < .45f;
  46. left = dir >= .4f && dir <= 1.f;
  47. }
  48. mapped->buttons[BUTTON_INDEX_DPAD_UP].pressed = up;
  49. mapped->buttons[BUTTON_INDEX_DPAD_UP].touched = up;
  50. mapped->buttons[BUTTON_INDEX_DPAD_UP].value = up ? 1.f : 0.f;
  51. mapped->buttons[BUTTON_INDEX_DPAD_RIGHT].pressed = right;
  52. mapped->buttons[BUTTON_INDEX_DPAD_RIGHT].touched = right;
  53. mapped->buttons[BUTTON_INDEX_DPAD_RIGHT].value = right ? 1.f : 0.f;
  54. mapped->buttons[BUTTON_INDEX_DPAD_DOWN].pressed = down;
  55. mapped->buttons[BUTTON_INDEX_DPAD_DOWN].touched = down;
  56. mapped->buttons[BUTTON_INDEX_DPAD_DOWN].value = down ? 1.f : 0.f;
  57. mapped->buttons[BUTTON_INDEX_DPAD_LEFT].pressed = left;
  58. mapped->buttons[BUTTON_INDEX_DPAD_LEFT].touched = left;
  59. mapped->buttons[BUTTON_INDEX_DPAD_LEFT].value = left ? 1.f : 0.f;
  60. }
  61. float RenormalizeAndClampAxis(float value, float min, float max) {
  62. value = (2.f * (value - min) / (max - min)) - 1.f;
  63. return value < -1.f ? -1.f : (value > 1.f ? 1.f : value);
  64. }
  65. void MapperSwitchPro(const Gamepad& input, Gamepad* mapped) {
  66. *mapped = input;
  67. mapped->buttons_length = SWITCH_PRO_BUTTON_COUNT;
  68. mapped->axes_length = AXIS_INDEX_COUNT;
  69. }
  70. void MapperSwitchJoyCon(const Gamepad& input, Gamepad* mapped) {
  71. *mapped = input;
  72. mapped->buttons_length = BUTTON_INDEX_COUNT;
  73. mapped->axes_length = 2;
  74. }
  75. void MapperSwitchComposite(const Gamepad& input, Gamepad* mapped) {
  76. // In composite mode, the inputs from two Joy-Cons are combined to form one
  77. // virtual gamepad. Some buttons do not have equivalents in the Standard
  78. // Gamepad and are exposed as extra buttons:
  79. // * Capture button (Joy-Con L): BUTTON_INDEX_COUNT
  80. // * SL (Joy-Con L): BUTTON_INDEX_COUNT + 1
  81. // * SR (Joy-Con L): BUTTON_INDEX_COUNT + 2
  82. // * SL (Joy-Con R): BUTTON_INDEX_COUNT + 3
  83. // * SR (Joy-Con R): BUTTON_INDEX_COUNT + 4
  84. constexpr size_t kSwitchCompositeExtraButtonCount = 5;
  85. *mapped = input;
  86. mapped->buttons_length =
  87. BUTTON_INDEX_COUNT + kSwitchCompositeExtraButtonCount;
  88. mapped->axes_length = AXIS_INDEX_COUNT;
  89. }
  90. } // namespace device