From 4cb3baba5cf360a02dff9d6af1a839a570c40999 Mon Sep 17 00:00:00 2001 From: rlnilsen <47765059+rlnilsen@users.noreply.github.com> Date: Fri, 6 Sep 2019 17:09:30 +0200 Subject: Add support for motion controllers via the CemuHook controller input protocol. This is done by: 1) Implementing said protocol in a new controller input class CemuHookUDPServer. 2) Adding functionality in the WiimoteEmu class for pushing that motion input to the emulated Wiimote and MotionPlus. 3) Suitably modifying the UI for configuring an Emulated Wii Remote. --- .../ControllerEmu/ControlGroup/ControlGroup.h | 3 ++ .../ControlGroup/IMUAccelerometer.cpp | 44 ++++++++++++++++++++++ .../ControllerEmu/ControlGroup/IMUAccelerometer.h | 24 ++++++++++++ .../ControllerEmu/ControlGroup/IMUCursor.cpp | 43 +++++++++++++++++++++ .../ControllerEmu/ControlGroup/IMUCursor.h | 26 +++++++++++++ .../ControllerEmu/ControlGroup/IMUGyroscope.cpp | 44 ++++++++++++++++++++++ .../ControllerEmu/ControlGroup/IMUGyroscope.h | 24 ++++++++++++ 7 files changed, 208 insertions(+) create mode 100644 Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp create mode 100644 Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h create mode 100644 Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.cpp create mode 100644 Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.h create mode 100644 Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp create mode 100644 Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup') diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.h index fff118d280..310df90e30 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.h +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.h @@ -40,6 +40,9 @@ enum class GroupType Triggers, Slider, Shake, + IMUAccelerometer, + IMUGyroscope, + IMUCursor }; class ControlGroup diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp new file mode 100644 index 0000000000..e994ceba5d --- /dev/null +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp @@ -0,0 +1,44 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h" + +#include "Common/Common.h" +#include "Common/MathUtil.h" + +#include "Core/HW/WiimoteEmu/WiimoteEmu.h" + +#include "InputCommon/ControlReference/ControlReference.h" +#include "InputCommon/ControllerEmu/Control/Control.h" +#include "InputCommon/ControllerEmu/Control/Input.h" +#include "InputCommon/ControllerEmu/ControllerEmu.h" +#include "InputCommon/ControllerEmu/Setting/NumericSetting.h" + +namespace ControllerEmu +{ +IMUAccelerometer::IMUAccelerometer(std::string name, std::string ui_name) + : ControlGroup(std::move(name), std::move(ui_name), GroupType::IMUAccelerometer) +{ + controls.emplace_back(std::make_unique(Translate, _trans("Left"))); + controls.emplace_back(std::make_unique(Translate, _trans("Right"))); + controls.emplace_back(std::make_unique(Translate, _trans("Forward"))); + controls.emplace_back(std::make_unique(Translate, _trans("Backward"))); + controls.emplace_back(std::make_unique(Translate, _trans("Up"))); + controls.emplace_back(std::make_unique(Translate, _trans("Down"))); +} + +std::optional IMUAccelerometer::GetState() const +{ + StateData state; + state.x = (controls[0]->control_ref->State() - controls[1]->control_ref->State()); + state.y = (controls[3]->control_ref->State() - controls[2]->control_ref->State()); + state.z = (controls[4]->control_ref->State() - controls[5]->control_ref->State()); + + if (controls[0]->control_ref->BoundCount() != 0) + return state; + else + return std::nullopt; +} + +} // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h new file mode 100644 index 0000000000..7ac41ede7a --- /dev/null +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.h @@ -0,0 +1,24 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include + +#include "Common/Matrix.h" +#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h" +#include "InputCommon/ControllerInterface/Device.h" + +namespace ControllerEmu +{ +class IMUAccelerometer : public ControlGroup +{ +public: + using StateData = Common::Vec3; + + IMUAccelerometer(std::string name, std::string ui_name); + + std::optional GetState() const; +}; +} // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.cpp new file mode 100644 index 0000000000..7133a07e59 --- /dev/null +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.cpp @@ -0,0 +1,43 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "InputCommon/ControllerEmu/ControlGroup/IMUCursor.h" + +#include + +#include "Common/Common.h" +#include "Common/MathUtil.h" + +#include "InputCommon/ControlReference/ControlReference.h" +#include "InputCommon/ControllerEmu/Control/Control.h" +#include "InputCommon/ControllerEmu/Control/Input.h" +#include "InputCommon/ControllerEmu/ControllerEmu.h" +#include "InputCommon/ControllerEmu/Setting/NumericSetting.h" + +namespace ControllerEmu +{ +IMUCursor::IMUCursor(std::string name, std::string ui_name) + : ControlGroup(std::move(name), std::move(ui_name), GroupType::IMUCursor) +{ + controls.emplace_back(std::make_unique(Translate, _trans("Recenter"))); + + // Default values are optimized for "Super Mario Galaxy 2". + // This seems to be acceptable for a good number of games. + + AddSetting(&m_yaw_setting, + // i18n: Refers to an amount of rotational movement about the "yaw" axis. + {_trans("Total Yaw"), + // i18n: The symbol/abbreviation for degrees (unit of angular measure). + _trans("°"), + // i18n: Refers to emulated wii remote movements. + _trans("Total rotation about the yaw axis.")}, + 15, 0, 360); +} + +ControlState IMUCursor::GetTotalYaw() const +{ + return m_yaw_setting.GetValue() * MathUtil::TAU / 360; +} + +} // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.h new file mode 100644 index 0000000000..578762fb85 --- /dev/null +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUCursor.h @@ -0,0 +1,26 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include +#include + +#include "InputCommon/ControllerEmu/StickGate.h" +#include "InputCommon/ControllerInterface/Device.h" + +namespace ControllerEmu +{ +class IMUCursor : public ControlGroup +{ +public: + IMUCursor(std::string name, std::string ui_name); + + // Yaw movement in radians. + ControlState GetTotalYaw() const; + +private: + SettingValue m_yaw_setting; +}; +} // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp new file mode 100644 index 0000000000..7bae049fff --- /dev/null +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp @@ -0,0 +1,44 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h" + +#include "Common/Common.h" +#include "Common/MathUtil.h" + +#include "Core/HW/WiimoteEmu/WiimoteEmu.h" + +#include "InputCommon/ControlReference/ControlReference.h" +#include "InputCommon/ControllerEmu/Control/Control.h" +#include "InputCommon/ControllerEmu/Control/Input.h" +#include "InputCommon/ControllerEmu/ControllerEmu.h" +#include "InputCommon/ControllerEmu/Setting/NumericSetting.h" + +namespace ControllerEmu +{ +IMUGyroscope::IMUGyroscope(std::string name, std::string ui_name) + : ControlGroup(std::move(name), std::move(ui_name), GroupType::IMUGyroscope) +{ + controls.emplace_back(std::make_unique(Translate, _trans("Pitch Up"))); + controls.emplace_back(std::make_unique(Translate, _trans("Pitch Down"))); + controls.emplace_back(std::make_unique(Translate, _trans("Roll Left"))); + controls.emplace_back(std::make_unique(Translate, _trans("Roll Right"))); + controls.emplace_back(std::make_unique(Translate, _trans("Yaw Left"))); + controls.emplace_back(std::make_unique(Translate, _trans("Yaw Right"))); +} + +std::optional IMUGyroscope::GetState() const +{ + StateData state; + state.x = (controls[1]->control_ref->State() - controls[0]->control_ref->State()); + state.y = (controls[2]->control_ref->State() - controls[3]->control_ref->State()); + state.z = (controls[4]->control_ref->State() - controls[5]->control_ref->State()); + + if (controls[0]->control_ref->BoundCount() != 0) + return state; + else + return std::nullopt; +} + +} // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h new file mode 100644 index 0000000000..dac30143dc --- /dev/null +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h @@ -0,0 +1,24 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include + +#include "Common/Matrix.h" +#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h" +#include "InputCommon/ControllerInterface/Device.h" + +namespace ControllerEmu +{ +class IMUGyroscope : public ControlGroup +{ +public: + using StateData = Common::Vec3; + + IMUGyroscope(std::string name, std::string ui_name); + + std::optional GetState() const; +}; +} // namespace ControllerEmu -- cgit v1.2.3