Browse Source
Merge pull request #9456 from german77/virtual_gamepad
Merge pull request #9456 from german77/virtual_gamepad
input_common: Add virtual gamepadnce_cpp
committed by
GitHub
7 changed files with 274 additions and 0 deletions
-
82src/core/hid/emulated_controller.cpp
-
9src/core/hid/emulated_controller.h
-
2src/input_common/CMakeLists.txt
-
78src/input_common/drivers/virtual_gamepad.cpp
-
73src/input_common/drivers/virtual_gamepad.h
-
23src/input_common/main.cpp
-
7src/input_common/main.h
@ -0,0 +1,78 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include "input_common/drivers/virtual_gamepad.h"
|
||||
|
|
||||
|
namespace InputCommon { |
||||
|
constexpr std::size_t PlayerIndexCount = 10; |
||||
|
|
||||
|
VirtualGamepad::VirtualGamepad(std::string input_engine_) : InputEngine(std::move(input_engine_)) { |
||||
|
for (std::size_t i = 0; i < PlayerIndexCount; i++) { |
||||
|
PreSetController(GetIdentifier(i)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void VirtualGamepad::SetButtonState(std::size_t player_index, int button_id, bool value) { |
||||
|
if (player_index > PlayerIndexCount) { |
||||
|
return; |
||||
|
} |
||||
|
const auto identifier = GetIdentifier(player_index); |
||||
|
SetButton(identifier, button_id, value); |
||||
|
} |
||||
|
|
||||
|
void VirtualGamepad::SetButtonState(std::size_t player_index, VirtualButton button_id, bool value) { |
||||
|
SetButtonState(player_index, static_cast<int>(button_id), value); |
||||
|
} |
||||
|
|
||||
|
void VirtualGamepad::SetStickPosition(std::size_t player_index, int axis_id, float x_value, |
||||
|
float y_value) { |
||||
|
if (player_index > PlayerIndexCount) { |
||||
|
return; |
||||
|
} |
||||
|
const auto identifier = GetIdentifier(player_index); |
||||
|
SetAxis(identifier, axis_id * 2, x_value); |
||||
|
SetAxis(identifier, (axis_id * 2) + 1, y_value); |
||||
|
} |
||||
|
|
||||
|
void VirtualGamepad::SetStickPosition(std::size_t player_index, VirtualStick axis_id, float x_value, |
||||
|
float y_value) { |
||||
|
SetStickPosition(player_index, static_cast<int>(axis_id), x_value, y_value); |
||||
|
} |
||||
|
|
||||
|
void VirtualGamepad::ResetControllers() { |
||||
|
for (std::size_t i = 0; i < PlayerIndexCount; i++) { |
||||
|
SetStickPosition(i, VirtualStick::Left, 0.0f, 0.0f); |
||||
|
SetStickPosition(i, VirtualStick::Right, 0.0f, 0.0f); |
||||
|
|
||||
|
SetButtonState(i, VirtualButton::ButtonA, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonB, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonX, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonY, false); |
||||
|
SetButtonState(i, VirtualButton::StickL, false); |
||||
|
SetButtonState(i, VirtualButton::StickR, false); |
||||
|
SetButtonState(i, VirtualButton::TriggerL, false); |
||||
|
SetButtonState(i, VirtualButton::TriggerR, false); |
||||
|
SetButtonState(i, VirtualButton::TriggerZL, false); |
||||
|
SetButtonState(i, VirtualButton::TriggerZR, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonPlus, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonMinus, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonLeft, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonUp, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonRight, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonDown, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonSL, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonSR, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonHome, false); |
||||
|
SetButtonState(i, VirtualButton::ButtonCapture, false); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
PadIdentifier VirtualGamepad::GetIdentifier(std::size_t player_index) const { |
||||
|
return { |
||||
|
.guid = Common::UUID{}, |
||||
|
.port = player_index, |
||||
|
.pad = 0, |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
} // namespace InputCommon
|
||||
@ -0,0 +1,73 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "input_common/input_engine.h" |
||||
|
|
||||
|
namespace InputCommon { |
||||
|
|
||||
|
/** |
||||
|
* A virtual controller that is always assigned to the game input |
||||
|
*/ |
||||
|
class VirtualGamepad final : public InputEngine { |
||||
|
public: |
||||
|
enum class VirtualButton { |
||||
|
ButtonA, |
||||
|
ButtonB, |
||||
|
ButtonX, |
||||
|
ButtonY, |
||||
|
StickL, |
||||
|
StickR, |
||||
|
TriggerL, |
||||
|
TriggerR, |
||||
|
TriggerZL, |
||||
|
TriggerZR, |
||||
|
ButtonPlus, |
||||
|
ButtonMinus, |
||||
|
ButtonLeft, |
||||
|
ButtonUp, |
||||
|
ButtonRight, |
||||
|
ButtonDown, |
||||
|
ButtonSL, |
||||
|
ButtonSR, |
||||
|
ButtonHome, |
||||
|
ButtonCapture, |
||||
|
}; |
||||
|
|
||||
|
enum class VirtualStick { |
||||
|
Left = 0, |
||||
|
Right = 1, |
||||
|
}; |
||||
|
|
||||
|
explicit VirtualGamepad(std::string input_engine_); |
||||
|
|
||||
|
/** |
||||
|
* Sets the status of all buttons bound with the key to pressed |
||||
|
* @param player_index the player number that will take this action |
||||
|
* @param button_id the id of the button |
||||
|
* @param value indicates if the button is pressed or not |
||||
|
*/ |
||||
|
void SetButtonState(std::size_t player_index, int button_id, bool value); |
||||
|
void SetButtonState(std::size_t player_index, VirtualButton button_id, bool value); |
||||
|
|
||||
|
/** |
||||
|
* Sets the status of all buttons bound with the key to released |
||||
|
* @param player_index the player number that will take this action |
||||
|
* @param axis_id the id of the axis to move |
||||
|
* @param x_value the position of the stick in the x axis |
||||
|
* @param y_value the position of the stick in the y axis |
||||
|
*/ |
||||
|
void SetStickPosition(std::size_t player_index, int axis_id, float x_value, float y_value); |
||||
|
void SetStickPosition(std::size_t player_index, VirtualStick axis_id, float x_value, |
||||
|
float y_value); |
||||
|
|
||||
|
/// Restores all inputs into the neutral position |
||||
|
void ResetControllers(); |
||||
|
|
||||
|
private: |
||||
|
/// Returns the correct identifier corresponding to the player index |
||||
|
PadIdentifier GetIdentifier(std::size_t player_index) const; |
||||
|
}; |
||||
|
|
||||
|
} // namespace InputCommon |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue