summaryrefslogtreecommitdiff
path: root/src/input_common/analog_from_button.cpp
diff options
context:
space:
mode:
authorGravatar wwylele2017-01-21 13:04:00 +0200
committerGravatar wwylele2017-03-01 23:30:57 +0200
commita6bd7917cbc06f9b8f5a7ae24e75db776dc1cd6a (patch)
tree2ed60e602d520f80f57f88f879c4f50363432c17 /src/input_common/analog_from_button.cpp
parentInputCommon: add Keyboard (diff)
downloadyuzu-a6bd7917cbc06f9b8f5a7ae24e75db776dc1cd6a.tar.gz
yuzu-a6bd7917cbc06f9b8f5a7ae24e75db776dc1cd6a.tar.xz
yuzu-a6bd7917cbc06f9b8f5a7ae24e75db776dc1cd6a.zip
InputCommon: add AnalogFromButton
Diffstat (limited to 'src/input_common/analog_from_button.cpp')
-rwxr-xr-xsrc/input_common/analog_from_button.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/input_common/analog_from_button.cpp b/src/input_common/analog_from_button.cpp
new file mode 100755
index 000000000..e1a260762
--- /dev/null
+++ b/src/input_common/analog_from_button.cpp
@@ -0,0 +1,58 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "input_common/analog_from_button.h"
6
7namespace InputCommon {
8
9class Analog final : public Input::AnalogDevice {
10public:
11 using Button = std::unique_ptr<Input::ButtonDevice>;
12
13 Analog(Button up_, Button down_, Button left_, Button right_, Button modifier_,
14 float modifier_scale_)
15 : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
16 right(std::move(right_)), modifier(std::move(modifier_)),
17 modifier_scale(modifier_scale_) {}
18
19 std::tuple<float, float> GetStatus() const override {
20 constexpr float SQRT_HALF = 0.707106781f;
21 int x = 0, y = 0;
22
23 if (right->GetStatus())
24 ++x;
25 if (left->GetStatus())
26 --x;
27 if (up->GetStatus())
28 ++y;
29 if (down->GetStatus())
30 --y;
31
32 float coef = modifier->GetStatus() ? modifier_scale : 1.0f;
33 return std::make_tuple(x * coef * (y == 0 ? 1.0f : SQRT_HALF),
34 y * coef * (x == 0 ? 1.0f : SQRT_HALF));
35 }
36
37private:
38 Button up;
39 Button down;
40 Button left;
41 Button right;
42 Button modifier;
43 float modifier_scale;
44};
45
46std::unique_ptr<Input::AnalogDevice> AnalogFromButton::Create(const Common::ParamPackage& params) {
47 const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize();
48 auto up = Input::CreateDevice<Input::ButtonDevice>(params.Get("up", null_engine));
49 auto down = Input::CreateDevice<Input::ButtonDevice>(params.Get("down", null_engine));
50 auto left = Input::CreateDevice<Input::ButtonDevice>(params.Get("left", null_engine));
51 auto right = Input::CreateDevice<Input::ButtonDevice>(params.Get("right", null_engine));
52 auto modifier = Input::CreateDevice<Input::ButtonDevice>(params.Get("modifier", null_engine));
53 auto modifier_scale = params.Get("modifier_scale", 0.5f);
54 return std::make_unique<Analog>(std::move(up), std::move(down), std::move(left),
55 std::move(right), std::move(modifier), modifier_scale);
56}
57
58} // namespace InputCommon