early-access version 2478
This commit is contained in:
parent
acd76bdc3e
commit
2b28da9e5f
12 changed files with 157 additions and 49 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 2476.
|
This is the source code for early-access 2478.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ Common::Input::BatteryStatus TransformToBattery(const Common::Input::CallbackSta
|
||||||
if (value > 0.8f) {
|
if (value > 0.8f) {
|
||||||
battery = Common::Input::BatteryLevel::Full;
|
battery = Common::Input::BatteryLevel::Full;
|
||||||
}
|
}
|
||||||
if (value >= 1.0f) {
|
if (value >= 0.95f) {
|
||||||
battery = Common::Input::BatteryLevel::Charging;
|
battery = Common::Input::BatteryLevel::Charging;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -181,11 +181,10 @@ public:
|
||||||
case SDL_JOYSTICK_POWER_EMPTY:
|
case SDL_JOYSTICK_POWER_EMPTY:
|
||||||
return BatteryLevel::Empty;
|
return BatteryLevel::Empty;
|
||||||
case SDL_JOYSTICK_POWER_LOW:
|
case SDL_JOYSTICK_POWER_LOW:
|
||||||
return BatteryLevel::Critical;
|
|
||||||
case SDL_JOYSTICK_POWER_MEDIUM:
|
|
||||||
return BatteryLevel::Low;
|
return BatteryLevel::Low;
|
||||||
case SDL_JOYSTICK_POWER_FULL:
|
case SDL_JOYSTICK_POWER_MEDIUM:
|
||||||
return BatteryLevel::Medium;
|
return BatteryLevel::Medium;
|
||||||
|
case SDL_JOYSTICK_POWER_FULL:
|
||||||
case SDL_JOYSTICK_POWER_MAX:
|
case SDL_JOYSTICK_POWER_MAX:
|
||||||
return BatteryLevel::Full;
|
return BatteryLevel::Full;
|
||||||
case SDL_JOYSTICK_POWER_UNKNOWN:
|
case SDL_JOYSTICK_POWER_UNKNOWN:
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/frontend/framebuffer_layout.h"
|
|
||||||
#include "input_common/helpers/touch_from_buttons.h"
|
#include "input_common/helpers/touch_from_buttons.h"
|
||||||
|
|
||||||
namespace InputCommon {
|
namespace InputCommon {
|
||||||
|
|
|
@ -257,7 +257,7 @@ void QtControllerSelectorDialog::LoadConfiguration() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtControllerSelectorDialog::CallConfigureVibrationDialog() {
|
void QtControllerSelectorDialog::CallConfigureVibrationDialog() {
|
||||||
ConfigureVibration dialog(this);
|
ConfigureVibration dialog(this, system.HIDCore());
|
||||||
|
|
||||||
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
|
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
|
||||||
Qt::WindowSystemMenuHint);
|
Qt::WindowSystemMenuHint);
|
||||||
|
|
|
@ -169,7 +169,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(ui->vibrationButton, &QPushButton::clicked,
|
connect(ui->vibrationButton, &QPushButton::clicked,
|
||||||
[this] { CallConfigureDialog<ConfigureVibration>(*this); });
|
[this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); });
|
||||||
|
|
||||||
connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {
|
connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {
|
||||||
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
|
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
|
||||||
|
|
|
@ -70,7 +70,6 @@ void PlayerControlPreview::UpdateColors() {
|
||||||
colors.slider_arrow = QColor(14, 15, 18);
|
colors.slider_arrow = QColor(14, 15, 18);
|
||||||
colors.font2 = QColor(255, 255, 255);
|
colors.font2 = QColor(255, 255, 255);
|
||||||
colors.indicator = QColor(170, 238, 255);
|
colors.indicator = QColor(170, 238, 255);
|
||||||
colors.indicator2 = QColor(100, 255, 100);
|
|
||||||
colors.deadzone = QColor(204, 136, 136);
|
colors.deadzone = QColor(204, 136, 136);
|
||||||
colors.slider_button = colors.button;
|
colors.slider_button = colors.button;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +87,6 @@ void PlayerControlPreview::UpdateColors() {
|
||||||
colors.slider_arrow = QColor(65, 68, 73);
|
colors.slider_arrow = QColor(65, 68, 73);
|
||||||
colors.font2 = QColor(0, 0, 0);
|
colors.font2 = QColor(0, 0, 0);
|
||||||
colors.indicator = QColor(0, 0, 200);
|
colors.indicator = QColor(0, 0, 200);
|
||||||
colors.indicator2 = QColor(0, 150, 0);
|
|
||||||
colors.deadzone = QColor(170, 0, 0);
|
colors.deadzone = QColor(170, 0, 0);
|
||||||
colors.slider_button = QColor(153, 149, 149);
|
colors.slider_button = QColor(153, 149, 149);
|
||||||
}
|
}
|
||||||
|
@ -101,6 +99,8 @@ void PlayerControlPreview::UpdateColors() {
|
||||||
colors.font = QColor(255, 255, 255);
|
colors.font = QColor(255, 255, 255);
|
||||||
colors.led_on = QColor(255, 255, 0);
|
colors.led_on = QColor(255, 255, 0);
|
||||||
colors.led_off = QColor(170, 238, 255);
|
colors.led_off = QColor(170, 238, 255);
|
||||||
|
colors.indicator2 = QColor(59, 165, 93);
|
||||||
|
colors.charging = QColor(250, 168, 26);
|
||||||
|
|
||||||
colors.left = colors.primary;
|
colors.left = colors.primary;
|
||||||
colors.right = colors.primary;
|
colors.right = colors.primary;
|
||||||
|
@ -357,7 +357,7 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
|
||||||
DrawCircle(p, center + QPoint(26, 71), 5);
|
DrawCircle(p, center + QPoint(26, 71), 5);
|
||||||
|
|
||||||
// Draw battery
|
// Draw battery
|
||||||
DrawBattery(p, center + QPoint(-170, -140),
|
DrawBattery(p, center + QPoint(-160, -140),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,7 +484,7 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
|
||||||
DrawSymbol(p, center + QPoint(-26, 66), Symbol::House, 5);
|
DrawSymbol(p, center + QPoint(-26, 66), Symbol::House, 5);
|
||||||
|
|
||||||
// Draw battery
|
// Draw battery
|
||||||
DrawBattery(p, center + QPoint(110, -140),
|
DrawBattery(p, center + QPoint(120, -140),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,9 +621,9 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
|
||||||
DrawSymbol(p, center + QPoint(50, 60), Symbol::House, 4.2f);
|
DrawSymbol(p, center + QPoint(50, 60), Symbol::House, 4.2f);
|
||||||
|
|
||||||
// Draw battery
|
// Draw battery
|
||||||
DrawBattery(p, center + QPoint(-100, -160),
|
DrawBattery(p, center + QPoint(-200, -10),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
||||||
DrawBattery(p, center + QPoint(40, -160),
|
DrawBattery(p, center + QPoint(160, -10),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -694,12 +694,12 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
|
||||||
|
|
||||||
// ZL and ZR buttons
|
// ZL and ZR buttons
|
||||||
p.setPen(colors.outline);
|
p.setPen(colors.outline);
|
||||||
DrawTriggerButton(p, center + QPoint(-210, -130), Direction::Left, button_values[ZL]);
|
DrawTriggerButton(p, center + QPoint(-210, -120), Direction::Left, button_values[ZL]);
|
||||||
DrawTriggerButton(p, center + QPoint(210, -130), Direction::Right, button_values[ZR]);
|
DrawTriggerButton(p, center + QPoint(210, -120), Direction::Right, button_values[ZR]);
|
||||||
p.setPen(colors.transparent);
|
p.setPen(colors.transparent);
|
||||||
p.setBrush(colors.font);
|
p.setBrush(colors.font);
|
||||||
DrawSymbol(p, center + QPoint(-210, -130), Symbol::ZL, 1.5f);
|
DrawSymbol(p, center + QPoint(-210, -120), Symbol::ZL, 1.5f);
|
||||||
DrawSymbol(p, center + QPoint(210, -130), Symbol::ZR, 1.5f);
|
DrawSymbol(p, center + QPoint(210, -120), Symbol::ZR, 1.5f);
|
||||||
|
|
||||||
// Minus and Plus button
|
// Minus and Plus button
|
||||||
p.setPen(colors.outline);
|
p.setPen(colors.outline);
|
||||||
|
@ -725,9 +725,9 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
|
||||||
DrawSymbol(p, center + QPoint(161, 37), Symbol::House, 2.75f);
|
DrawSymbol(p, center + QPoint(161, 37), Symbol::House, 2.75f);
|
||||||
|
|
||||||
// Draw battery
|
// Draw battery
|
||||||
DrawBattery(p, center + QPoint(-200, 110),
|
DrawBattery(p, center + QPoint(-188, 95),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
||||||
DrawBattery(p, center + QPoint(130, 110),
|
DrawBattery(p, center + QPoint(150, 95),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -781,12 +781,12 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
|
||||||
|
|
||||||
// ZL and ZR buttons
|
// ZL and ZR buttons
|
||||||
p.setPen(colors.outline);
|
p.setPen(colors.outline);
|
||||||
DrawTriggerButton(p, center + QPoint(-210, -130), Direction::Left, button_values[ZL]);
|
DrawTriggerButton(p, center + QPoint(-210, -120), Direction::Left, button_values[ZL]);
|
||||||
DrawTriggerButton(p, center + QPoint(210, -130), Direction::Right, button_values[ZR]);
|
DrawTriggerButton(p, center + QPoint(210, -120), Direction::Right, button_values[ZR]);
|
||||||
p.setPen(colors.transparent);
|
p.setPen(colors.transparent);
|
||||||
p.setBrush(colors.font);
|
p.setBrush(colors.font);
|
||||||
DrawSymbol(p, center + QPoint(-210, -130), Symbol::ZL, 1.5f);
|
DrawSymbol(p, center + QPoint(-210, -120), Symbol::ZL, 1.5f);
|
||||||
DrawSymbol(p, center + QPoint(210, -130), Symbol::ZR, 1.5f);
|
DrawSymbol(p, center + QPoint(210, -120), Symbol::ZR, 1.5f);
|
||||||
|
|
||||||
// Minus and Plus buttons
|
// Minus and Plus buttons
|
||||||
p.setPen(colors.outline);
|
p.setPen(colors.outline);
|
||||||
|
@ -818,7 +818,7 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
|
||||||
DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f);
|
DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f);
|
||||||
|
|
||||||
// Draw battery
|
// Draw battery
|
||||||
DrawBattery(p, center + QPoint(-30, -160),
|
DrawBattery(p, center + QPoint(-20, -160),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -875,7 +875,7 @@ void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) {
|
||||||
DrawCircleButton(p, center + QPoint(0, -44), button_values[Plus], 8);
|
DrawCircleButton(p, center + QPoint(0, -44), button_values[Plus], 8);
|
||||||
|
|
||||||
// Draw battery
|
// Draw battery
|
||||||
DrawBattery(p, center + QPoint(-30, -165),
|
DrawBattery(p, center + QPoint(-20, 110),
|
||||||
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1030,6 +1030,10 @@ constexpr std::array<float, 30 * 2> symbol_c = {
|
||||||
-2.37f, 5.64f, -0.65f, 6.44f, 1.25f, 6.47f, 3.06f, 5.89f, 4.63f, 4.92f, 4.63f, 6.83f,
|
-2.37f, 5.64f, -0.65f, 6.44f, 1.25f, 6.47f, 3.06f, 5.89f, 4.63f, 4.92f, 4.63f, 6.83f,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr std::array<float, 6 * 2> symbol_charging = {
|
||||||
|
6.5f, -1.0f, 1.0f, -1.0f, 1.0f, -3.0f, -6.5f, 1.0f, -1.0f, 1.0f, -1.0f, 3.0f,
|
||||||
|
};
|
||||||
|
|
||||||
constexpr std::array<float, 12 * 2> house = {
|
constexpr std::array<float, 12 * 2> house = {
|
||||||
-1.3f, 0.0f, -0.93f, 0.0f, -0.93f, 1.15f, 0.93f, 1.15f, 0.93f, 0.0f, 1.3f, 0.0f,
|
-1.3f, 0.0f, -0.93f, 0.0f, -0.93f, 1.15f, 0.93f, 1.15f, 0.93f, 0.0f, 1.3f, 0.0f,
|
||||||
0.0f, -1.2f, -1.3f, 0.0f, -0.43f, 0.0f, -0.43f, .73f, 0.43f, .73f, 0.43f, 0.0f,
|
0.0f, -1.2f, -1.3f, 0.0f, -0.43f, 0.0f, -0.43f, .73f, 0.43f, .73f, 0.43f, 0.0f,
|
||||||
|
@ -2674,36 +2678,43 @@ void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center,
|
||||||
if (battery == Common::Input::BatteryLevel::None) {
|
if (battery == Common::Input::BatteryLevel::None) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
p.setPen(colors.outline);
|
// Draw outline
|
||||||
|
p.setPen(QPen(colors.button, 5));
|
||||||
p.setBrush(colors.transparent);
|
p.setBrush(colors.transparent);
|
||||||
p.drawRect(center.x(), center.y(), 56, 20);
|
p.drawRoundedRect(center.x(), center.y(), 34, 16, 2, 2);
|
||||||
p.drawRect(center.x() + 56, center.y() + 6, 3, 8);
|
|
||||||
p.setBrush(colors.deadzone);
|
p.setPen(QPen(colors.button, 3));
|
||||||
|
p.drawRect(center.x() + 35, center.y() + 4.5f, 4, 7);
|
||||||
|
|
||||||
|
// Draw Battery shape
|
||||||
|
p.setPen(QPen(colors.indicator2, 3));
|
||||||
|
p.setBrush(colors.transparent);
|
||||||
|
p.drawRoundedRect(center.x(), center.y(), 34, 16, 2, 2);
|
||||||
|
|
||||||
|
p.setPen(QPen(colors.indicator2, 1));
|
||||||
|
p.setBrush(colors.indicator2);
|
||||||
|
p.drawRect(center.x() + 35, center.y() + 4.5f, 4, 7);
|
||||||
switch (battery) {
|
switch (battery) {
|
||||||
case Common::Input::BatteryLevel::Charging:
|
case Common::Input::BatteryLevel::Charging:
|
||||||
p.setBrush(colors.indicator2);
|
p.drawRect(center.x(), center.y(), 34, 16);
|
||||||
p.drawText(center + QPoint(2, 14), tr("Charging"));
|
p.setPen(colors.slider);
|
||||||
|
p.setBrush(colors.charging);
|
||||||
|
DrawSymbol(p, center + QPointF(17.0f, 8.0f), Symbol::Charging, 2.1f);
|
||||||
break;
|
break;
|
||||||
case Common::Input::BatteryLevel::Full:
|
case Common::Input::BatteryLevel::Full:
|
||||||
p.drawRect(center.x() + 42, center.y(), 14, 20);
|
p.drawRect(center.x(), center.y(), 34, 16);
|
||||||
p.drawRect(center.x() + 28, center.y(), 14, 20);
|
|
||||||
p.drawRect(center.x() + 14, center.y(), 14, 20);
|
|
||||||
p.drawRect(center.x(), center.y(), 14, 20);
|
|
||||||
break;
|
break;
|
||||||
case Common::Input::BatteryLevel::Medium:
|
case Common::Input::BatteryLevel::Medium:
|
||||||
p.drawRect(center.x() + 28, center.y(), 14, 20);
|
p.drawRect(center.x(), center.y(), 25, 16);
|
||||||
p.drawRect(center.x() + 14, center.y(), 14, 20);
|
|
||||||
p.drawRect(center.x(), center.y(), 14, 20);
|
|
||||||
break;
|
break;
|
||||||
case Common::Input::BatteryLevel::Low:
|
case Common::Input::BatteryLevel::Low:
|
||||||
p.drawRect(center.x() + 14, center.y(), 14, 20);
|
p.drawRect(center.x(), center.y(), 17, 16);
|
||||||
p.drawRect(center.x(), center.y(), 14, 20);
|
|
||||||
break;
|
break;
|
||||||
case Common::Input::BatteryLevel::Critical:
|
case Common::Input::BatteryLevel::Critical:
|
||||||
p.drawRect(center.x(), center.y(), 14, 20);
|
p.drawRect(center.x(), center.y(), 6, 16);
|
||||||
break;
|
break;
|
||||||
case Common::Input::BatteryLevel::Empty:
|
case Common::Input::BatteryLevel::Empty:
|
||||||
p.drawRect(center.x(), center.y(), 5, 20);
|
p.drawRect(center.x(), center.y(), 3, 16);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -2724,6 +2735,7 @@ void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol
|
||||||
std::array<QPointF, symbol_sl.size() / 2> sl_icon;
|
std::array<QPointF, symbol_sl.size() / 2> sl_icon;
|
||||||
std::array<QPointF, symbol_zr.size() / 2> zr_icon;
|
std::array<QPointF, symbol_zr.size() / 2> zr_icon;
|
||||||
std::array<QPointF, symbol_sr.size() / 2> sr_icon;
|
std::array<QPointF, symbol_sr.size() / 2> sr_icon;
|
||||||
|
std::array<QPointF, symbol_charging.size() / 2> charging_icon;
|
||||||
switch (symbol) {
|
switch (symbol) {
|
||||||
case Symbol::House:
|
case Symbol::House:
|
||||||
for (std::size_t point = 0; point < house.size() / 2; ++point) {
|
for (std::size_t point = 0; point < house.size() / 2; ++point) {
|
||||||
|
@ -2809,6 +2821,13 @@ void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol
|
||||||
}
|
}
|
||||||
p.drawPolygon(sr_icon.data(), static_cast<int>(sr_icon.size()));
|
p.drawPolygon(sr_icon.data(), static_cast<int>(sr_icon.size()));
|
||||||
break;
|
break;
|
||||||
|
case Symbol::Charging:
|
||||||
|
for (std::size_t point = 0; point < symbol_charging.size() / 2; ++point) {
|
||||||
|
charging_icon[point] = center + QPointF(symbol_charging[point * 2] * icon_size,
|
||||||
|
symbol_charging[point * 2 + 1] * icon_size);
|
||||||
|
}
|
||||||
|
p.drawPolygon(charging_icon.data(), static_cast<int>(charging_icon.size()));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,7 @@ private:
|
||||||
ZL,
|
ZL,
|
||||||
ZR,
|
ZR,
|
||||||
SR,
|
SR,
|
||||||
|
Charging,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ColorMapping {
|
struct ColorMapping {
|
||||||
|
@ -94,6 +95,7 @@ private:
|
||||||
QColor slider_button{};
|
QColor slider_button{};
|
||||||
QColor slider_arrow{};
|
QColor slider_arrow{};
|
||||||
QColor deadzone{};
|
QColor deadzone{};
|
||||||
|
QColor charging{};
|
||||||
};
|
};
|
||||||
|
|
||||||
void UpdateColors();
|
void UpdateColors();
|
||||||
|
|
|
@ -9,11 +9,14 @@
|
||||||
|
|
||||||
#include "common/param_package.h"
|
#include "common/param_package.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
|
#include "core/hid/emulated_controller.h"
|
||||||
|
#include "core/hid/hid_core.h"
|
||||||
|
#include "core/hid/hid_types.h"
|
||||||
#include "ui_configure_vibration.h"
|
#include "ui_configure_vibration.h"
|
||||||
#include "yuzu/configuration/configure_vibration.h"
|
#include "yuzu/configuration/configure_vibration.h"
|
||||||
|
|
||||||
ConfigureVibration::ConfigureVibration(QWidget* parent)
|
ConfigureVibration::ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_)
|
||||||
: QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) {
|
: QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()), hid_core{hid_core_} {
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
vibration_groupboxes = {
|
vibration_groupboxes = {
|
||||||
|
@ -31,6 +34,13 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)
|
||||||
const auto& players = Settings::values.players.GetValue();
|
const auto& players = Settings::values.players.GetValue();
|
||||||
|
|
||||||
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
|
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
|
||||||
|
auto controller = hid_core.GetEmulatedControllerByIndex(i);
|
||||||
|
Core::HID::ControllerUpdateCallback engine_callback{
|
||||||
|
.on_change = [this,
|
||||||
|
i](Core::HID::ControllerTriggerType type) { VibrateController(type, i); },
|
||||||
|
.is_npad_service = false,
|
||||||
|
};
|
||||||
|
controller_callback_key[i] = controller->SetCallback(engine_callback);
|
||||||
vibration_groupboxes[i]->setChecked(players[i].vibration_enabled);
|
vibration_groupboxes[i]->setChecked(players[i].vibration_enabled);
|
||||||
vibration_spinboxes[i]->setValue(players[i].vibration_strength);
|
vibration_spinboxes[i]->setValue(players[i].vibration_strength);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +55,14 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)
|
||||||
RetranslateUI();
|
RetranslateUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureVibration::~ConfigureVibration() = default;
|
ConfigureVibration::~ConfigureVibration() {
|
||||||
|
StopVibrations();
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
|
||||||
|
auto controller = hid_core.GetEmulatedControllerByIndex(i);
|
||||||
|
controller->DeleteCallback(controller_callback_key[i]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void ConfigureVibration::ApplyConfiguration() {
|
void ConfigureVibration::ApplyConfiguration() {
|
||||||
auto& players = Settings::values.players.GetValue();
|
auto& players = Settings::values.players.GetValue();
|
||||||
|
@ -70,3 +87,54 @@ void ConfigureVibration::changeEvent(QEvent* event) {
|
||||||
void ConfigureVibration::RetranslateUI() {
|
void ConfigureVibration::RetranslateUI() {
|
||||||
ui->retranslateUi(this);
|
ui->retranslateUi(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type,
|
||||||
|
std::size_t player_index) {
|
||||||
|
if (type != Core::HID::ControllerTriggerType::Button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& player = Settings::values.players.GetValue()[player_index];
|
||||||
|
auto controller = hid_core.GetEmulatedControllerByIndex(player_index);
|
||||||
|
const int vibration_strenght = vibration_spinboxes[player_index]->value();
|
||||||
|
const auto& buttons = controller->GetButtonsValues();
|
||||||
|
|
||||||
|
bool button_is_pressed = false;
|
||||||
|
for (std::size_t i = 0; i < buttons.size(); ++i) {
|
||||||
|
if (buttons[i].value) {
|
||||||
|
button_is_pressed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!button_is_pressed) {
|
||||||
|
StopVibrations();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int old_vibration_enabled = player.vibration_enabled;
|
||||||
|
const bool old_vibration_strenght = player.vibration_strength;
|
||||||
|
player.vibration_enabled = true;
|
||||||
|
player.vibration_strength = vibration_strenght;
|
||||||
|
|
||||||
|
const Core::HID::VibrationValue vibration{
|
||||||
|
.low_amplitude = 1.0f,
|
||||||
|
.low_frequency = 160.0f,
|
||||||
|
.high_amplitude = 1.0f,
|
||||||
|
.high_frequency = 320.0f,
|
||||||
|
};
|
||||||
|
controller->SetVibration(0, vibration);
|
||||||
|
controller->SetVibration(1, vibration);
|
||||||
|
|
||||||
|
// Restore previous values
|
||||||
|
player.vibration_enabled = old_vibration_enabled;
|
||||||
|
player.vibration_strength = old_vibration_strenght;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureVibration::StopVibrations() {
|
||||||
|
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
|
||||||
|
auto controller = hid_core.GetEmulatedControllerByIndex(i);
|
||||||
|
controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE);
|
||||||
|
controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,11 +15,16 @@ namespace Ui {
|
||||||
class ConfigureVibration;
|
class ConfigureVibration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Core::HID {
|
||||||
|
enum class ControllerTriggerType;
|
||||||
|
class HIDCore;
|
||||||
|
} // namespace Core::HID
|
||||||
|
|
||||||
class ConfigureVibration : public QDialog {
|
class ConfigureVibration : public QDialog {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ConfigureVibration(QWidget* parent);
|
explicit ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_);
|
||||||
~ConfigureVibration() override;
|
~ConfigureVibration() override;
|
||||||
|
|
||||||
void ApplyConfiguration();
|
void ApplyConfiguration();
|
||||||
|
@ -27,14 +32,21 @@ public:
|
||||||
private:
|
private:
|
||||||
void changeEvent(QEvent* event) override;
|
void changeEvent(QEvent* event) override;
|
||||||
void RetranslateUI();
|
void RetranslateUI();
|
||||||
|
void VibrateController(Core::HID::ControllerTriggerType type, std::size_t player_index);
|
||||||
|
void StopVibrations();
|
||||||
|
|
||||||
std::unique_ptr<Ui::ConfigureVibration> ui;
|
std::unique_ptr<Ui::ConfigureVibration> ui;
|
||||||
|
|
||||||
static constexpr std::size_t NUM_PLAYERS = 8;
|
static constexpr std::size_t NUM_PLAYERS = 8;
|
||||||
|
|
||||||
// Groupboxes encapsulating the vibration strength spinbox.
|
/// Groupboxes encapsulating the vibration strength spinbox.
|
||||||
std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes;
|
std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes;
|
||||||
|
|
||||||
// Spinboxes representing the vibration strength percentage.
|
/// Spinboxes representing the vibration strength percentage.
|
||||||
std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes;
|
std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes;
|
||||||
|
|
||||||
|
/// Callback index to stop the controllers events
|
||||||
|
std::array<int, NUM_PLAYERS> controller_callback_key;
|
||||||
|
|
||||||
|
Core::HID::HIDCore& hid_core;
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,6 +17,13 @@
|
||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout">
|
||||||
|
<item row="0" column="0" colspan="4">
|
||||||
|
<widget class="QLabel" name="label_1">
|
||||||
|
<property name="text">
|
||||||
|
<string>Press any controller button to vibrate the controller.</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="vibrationStrengthGroup">
|
<widget class="QGroupBox" name="vibrationStrengthGroup">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
|
|
|
@ -1052,8 +1052,10 @@ void GMainWindow::SetDefaultUIGeometry() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::RestoreUIState() {
|
void GMainWindow::RestoreUIState() {
|
||||||
|
setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
|
||||||
restoreGeometry(UISettings::values.geometry);
|
restoreGeometry(UISettings::values.geometry);
|
||||||
restoreState(UISettings::values.state);
|
restoreState(UISettings::values.state);
|
||||||
|
render_window->setWindowFlags(render_window->windowFlags() & ~Qt::FramelessWindowHint);
|
||||||
render_window->restoreGeometry(UISettings::values.renderwindow_geometry);
|
render_window->restoreGeometry(UISettings::values.renderwindow_geometry);
|
||||||
#if MICROPROFILE_ENABLED
|
#if MICROPROFILE_ENABLED
|
||||||
microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry);
|
microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry);
|
||||||
|
|
Loading…
Reference in a new issue