Browse Source
Merge pull request #9456 from german77/virtual_gamepad
Merge pull request #9456 from german77/virtual_gamepad
input_common: Add virtual gamepadpull/15/merge
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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