mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 06:09:50 -06:00
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.
This commit is contained in:
@ -40,6 +40,9 @@ enum class GroupType
|
||||
Triggers,
|
||||
Slider,
|
||||
Shake,
|
||||
IMUAccelerometer,
|
||||
IMUGyroscope,
|
||||
IMUCursor
|
||||
};
|
||||
|
||||
class ControlGroup
|
||||
|
@ -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<Input>(Translate, _trans("Left")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Right")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Forward")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Backward")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Up")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Down")));
|
||||
}
|
||||
|
||||
std::optional<IMUAccelerometer::StateData> 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
|
@ -0,0 +1,24 @@
|
||||
// Copyright 2019 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#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<StateData> GetState() const;
|
||||
};
|
||||
} // namespace ControllerEmu
|
@ -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 <string>
|
||||
|
||||
#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<Input>(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
|
@ -0,0 +1,26 @@
|
||||
// Copyright 2019 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
|
||||
#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<double> m_yaw_setting;
|
||||
};
|
||||
} // namespace ControllerEmu
|
@ -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<Input>(Translate, _trans("Pitch Up")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Pitch Down")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Roll Left")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Roll Right")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Yaw Left")));
|
||||
controls.emplace_back(std::make_unique<Input>(Translate, _trans("Yaw Right")));
|
||||
}
|
||||
|
||||
std::optional<IMUGyroscope::StateData> 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
|
@ -0,0 +1,24 @@
|
||||
// Copyright 2019 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#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<StateData> GetState() const;
|
||||
};
|
||||
} // namespace ControllerEmu
|
Reference in New Issue
Block a user