analog_from_button.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Copyright 2017 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "input_common/analog_from_button.h"
  5. namespace InputCommon {
  6. class Analog final : public Input::AnalogDevice {
  7. public:
  8. using Button = std::unique_ptr<Input::ButtonDevice>;
  9. Analog(Button up_, Button down_, Button left_, Button right_, Button modifier_,
  10. float modifier_scale_)
  11. : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
  12. right(std::move(right_)), modifier(std::move(modifier_)),
  13. modifier_scale(modifier_scale_) {}
  14. std::tuple<float, float> GetStatus() const override {
  15. constexpr float SQRT_HALF = 0.707106781f;
  16. int x = 0, y = 0;
  17. if (right->GetStatus())
  18. ++x;
  19. if (left->GetStatus())
  20. --x;
  21. if (up->GetStatus())
  22. ++y;
  23. if (down->GetStatus())
  24. --y;
  25. float coef = modifier->GetStatus() ? modifier_scale : 1.0f;
  26. return std::make_tuple(x * coef * (y == 0 ? 1.0f : SQRT_HALF),
  27. y * coef * (x == 0 ? 1.0f : SQRT_HALF));
  28. }
  29. private:
  30. Button up;
  31. Button down;
  32. Button left;
  33. Button right;
  34. Button modifier;
  35. float modifier_scale;
  36. };
  37. std::unique_ptr<Input::AnalogDevice> AnalogFromButton::Create(const Common::ParamPackage& params) {
  38. const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize();
  39. auto up = Input::CreateDevice<Input::ButtonDevice>(params.Get("up", null_engine));
  40. auto down = Input::CreateDevice<Input::ButtonDevice>(params.Get("down", null_engine));
  41. auto left = Input::CreateDevice<Input::ButtonDevice>(params.Get("left", null_engine));
  42. auto right = Input::CreateDevice<Input::ButtonDevice>(params.Get("right", null_engine));
  43. auto modifier = Input::CreateDevice<Input::ButtonDevice>(params.Get("modifier", null_engine));
  44. auto modifier_scale = params.Get("modifier_scale", 0.5f);
  45. return std::make_unique<Analog>(std::move(up), std::move(down), std::move(left),
  46. std::move(right), std::move(modifier), modifier_scale);
  47. }
  48. } // namespace InputCommon