summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu/StickGate.cpp
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2018-12-21 16:11:00 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2018-12-27 18:31:46 -0600
commitda9bcf83efeb1ede43e1c2ac08e6869ce8a2c15a (patch)
tree9418d35e0e0233bf26f91871002888dd9570bf79 /Source/Core/InputCommon/ControllerEmu/StickGate.cpp
parentceb28a2302e23b2484bca63626605d3fd56a1f11 (diff)
InputCommon: Simplified StickGate interface and moved class into its own file. Changed default input radius to perform no resizing. Tweaked the indicator colors a bit to improve visibility. Cleaned up some math and code.
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/StickGate.cpp')
-rw-r--r--Source/Core/InputCommon/ControllerEmu/StickGate.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/StickGate.cpp b/Source/Core/InputCommon/ControllerEmu/StickGate.cpp
new file mode 100644
index 0000000000..c0c2a668a3
--- /dev/null
+++ b/Source/Core/InputCommon/ControllerEmu/StickGate.cpp
@@ -0,0 +1,47 @@
+// Copyright 2018 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "InputCommon/ControllerEmu/StickGate.h"
+
+#include <cmath>
+
+#include "Common/MathUtil.h"
+
+namespace ControllerEmu
+{
+OctagonStickGate::OctagonStickGate(ControlState radius) : m_radius(radius)
+{
+}
+
+ControlState OctagonStickGate::GetRadiusAtAngle(double ang) const
+{
+ constexpr int sides = 8;
+ constexpr double sum_int_angles = (sides - 2) * MathUtil::PI;
+ constexpr double half_int_angle = sum_int_angles / sides / 2;
+
+ ang = std::fmod(ang, MathUtil::TAU / sides);
+ // Solve ASA triangle using The Law of Sines:
+ return m_radius / std::sin(MathUtil::PI - ang - half_int_angle) * std::sin(half_int_angle);
+}
+
+RoundStickGate::RoundStickGate(ControlState radius) : m_radius(radius)
+{
+}
+
+ControlState RoundStickGate::GetRadiusAtAngle(double) const
+{
+ return m_radius;
+}
+
+SquareStickGate::SquareStickGate(ControlState half_width) : m_half_width(half_width)
+{
+}
+
+ControlState SquareStickGate::GetRadiusAtAngle(double ang) const
+{
+ constexpr double section_ang = MathUtil::TAU / 4;
+ return m_half_width / std::cos(std::fmod(ang + section_ang / 2, section_ang) - section_ang / 2);
+}
+
+} // namespace ControllerEmu