InputSourceGameController.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * InputSourceGameController.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include <SDL_events.h>
  12. #include <SDL_gamecontroller.h>
  13. #include "../../lib/Point.h"
  14. #include "../gui/Shortcut.h"
  15. constexpr int AXIS_DEAD_ZOOM = 6000;
  16. constexpr int AXIS_MAX_ZOOM = 32000;
  17. constexpr int AXIS_MOVE_SPEED = 500;
  18. constexpr int TRIGGER_PRESS_THRESHOLD = 8000;
  19. enum class AxisType
  20. {
  21. CURSOR_MOTION,
  22. MAP_SCROLL,
  23. NONE
  24. };
  25. /// Class that handles game controller input from SDL events
  26. class InputSourceGameController
  27. {
  28. static void gameControllerDeleter(SDL_GameController * gameController);
  29. using GameControllerPtr = std::unique_ptr<SDL_GameController, decltype(&gameControllerDeleter)>;
  30. std::map<int, GameControllerPtr> gameControllerMap;
  31. std::set<SDL_GameControllerAxis> pressedAxes;
  32. std::chrono::steady_clock::time_point lastCheckTime;
  33. int cursorAxisValueX;
  34. int cursorAxisValueY;
  35. float cursorPlanDisX;
  36. float cursorPlanDisY;
  37. bool scrollAxisMoved;
  38. Point scrollStart;
  39. Point scrollCurrent;
  40. int scrollAxisValueX;
  41. int scrollAxisValueY;
  42. float scrollPlanDisX;
  43. float scrollPlanDisY;
  44. void openGameController(int index);
  45. int getJoystickIndex(SDL_GameController * controller);
  46. int getRealAxisValue(int value);
  47. void dispatchAxisShortcuts(const std::vector<EShortcut> & shortcutsVector, SDL_GameControllerAxis axisID, int axisValue);
  48. void tryToConvertCursor();
  49. void doCursorMove(int deltaX, int deltaY);
  50. int getMoveDis(float planDis);
  51. void handleCursorUpdate(int32_t deltaTimeMs);
  52. void handleScrollUpdate(int32_t deltaTimeMs);
  53. bool isScrollAxisReleased();
  54. public:
  55. InputSourceGameController();
  56. void tryOpenAllGameControllers();
  57. void handleEventDeviceAdded(const SDL_ControllerDeviceEvent & device);
  58. void handleEventDeviceRemoved(const SDL_ControllerDeviceEvent & device);
  59. void handleEventDeviceRemapped(const SDL_ControllerDeviceEvent & device);
  60. void handleEventAxisMotion(const SDL_ControllerAxisEvent & axis);
  61. void handleEventButtonDown(const SDL_ControllerButtonEvent & button);
  62. void handleEventButtonUp(const SDL_ControllerButtonEvent & button);
  63. void handleUpdate();
  64. };