summaryrefslogtreecommitdiff
path: root/src/input_common
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common')
-rw-r--r--src/input_common/CMakeLists.txt2
-rwxr-xr-xsrc/input_common/analog_from_button.cpp58
-rwxr-xr-xsrc/input_common/analog_from_button.h31
-rw-r--r--src/input_common/main.cpp18
-rw-r--r--src/input_common/main.h4
5 files changed, 113 insertions, 0 deletions
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index ac1ad45a9..9f4422269 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -1,9 +1,11 @@
1set(SRCS 1set(SRCS
2 analog_from_button.cpp
2 keyboard.cpp 3 keyboard.cpp
3 main.cpp 4 main.cpp
4 ) 5 )
5 6
6set(HEADERS 7set(HEADERS
8 analog_from_button.h
7 keyboard.h 9 keyboard.h
8 main.h 10 main.h
9 ) 11 )
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
diff --git a/src/input_common/analog_from_button.h b/src/input_common/analog_from_button.h
new file mode 100755
index 000000000..bbd583dd9
--- /dev/null
+++ b/src/input_common/analog_from_button.h
@@ -0,0 +1,31 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <memory>
8#include "core/frontend/input.h"
9
10namespace InputCommon {
11
12/**
13 * An analog device factory that takes direction button devices and combines them into a analog
14 * device.
15 */
16class AnalogFromButton final : public Input::Factory<Input::AnalogDevice> {
17public:
18 /**
19 * Creates an analog device from direction button devices
20 * @param params contains parameters for creating the device:
21 * - "up": a serialized ParamPackage for creating a button device for up direction
22 * - "down": a serialized ParamPackage for creating a button device for down direction
23 * - "left": a serialized ParamPackage for creating a button device for left direction
24 * - "right": a serialized ParamPackage for creating a button device for right direction
25 * - "modifier": a serialized ParamPackage for creating a button device as the modifier
26 * - "modifier_scale": a float for the multiplier the modifier gives to the position
27 */
28 std::unique_ptr<Input::AnalogDevice> Create(const Common::ParamPackage& params) override;
29};
30
31} // namespace InputCommon
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index ff25220b4..8455fdc17 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -4,6 +4,7 @@
4 4
5#include <memory> 5#include <memory>
6#include "common/param_package.h" 6#include "common/param_package.h"
7#include "input_common/analog_from_button.h"
7#include "input_common/keyboard.h" 8#include "input_common/keyboard.h"
8#include "input_common/main.h" 9#include "input_common/main.h"
9 10
@@ -14,11 +15,14 @@ static std::shared_ptr<Keyboard> keyboard;
14void Init() { 15void Init() {
15 keyboard = std::make_shared<InputCommon::Keyboard>(); 16 keyboard = std::make_shared<InputCommon::Keyboard>();
16 Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard); 17 Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard);
18 Input::RegisterFactory<Input::AnalogDevice>("analog_from_button",
19 std::make_shared<InputCommon::AnalogFromButton>());
17} 20}
18 21
19void Shutdown() { 22void Shutdown() {
20 Input::UnregisterFactory<Input::ButtonDevice>("keyboard"); 23 Input::UnregisterFactory<Input::ButtonDevice>("keyboard");
21 keyboard.reset(); 24 keyboard.reset();
25 Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
22} 26}
23 27
24Keyboard* GetKeyboard() { 28Keyboard* GetKeyboard() {
@@ -32,4 +36,18 @@ std::string GenerateKeyboardParam(int key_code) {
32 return param.Serialize(); 36 return param.Serialize();
33} 37}
34 38
39std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
40 int key_modifier, float modifier_scale) {
41 Common::ParamPackage circle_pad_param{
42 {"engine", "analog_from_button"},
43 {"up", GenerateKeyboardParam(key_up)},
44 {"down", GenerateKeyboardParam(key_down)},
45 {"left", GenerateKeyboardParam(key_left)},
46 {"right", GenerateKeyboardParam(key_right)},
47 {"modifier", GenerateKeyboardParam(key_modifier)},
48 {"modifier_scale", std::to_string(modifier_scale)},
49 };
50 return circle_pad_param.Serialize();
51}
52
35} // namespace InputCommon 53} // namespace InputCommon
diff --git a/src/input_common/main.h b/src/input_common/main.h
index a490dd829..140bbd014 100644
--- a/src/input_common/main.h
+++ b/src/input_common/main.h
@@ -22,4 +22,8 @@ Keyboard* GetKeyboard();
22/// Generates a serialized param package for creating a keyboard button device 22/// Generates a serialized param package for creating a keyboard button device
23std::string GenerateKeyboardParam(int key_code); 23std::string GenerateKeyboardParam(int key_code);
24 24
25/// Generates a serialized param package for creating an analog device taking input from keyboard
26std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
27 int key_modifier, float modifier_scale);
28
25} // namespace InputCommon 29} // namespace InputCommon