yuzu: Add motion preview to controller input

This commit is contained in:
Narr the Reg
2023-05-05 12:29:26 -06:00
parent 2506594c50
commit 46e835f2d6
7 changed files with 151 additions and 4 deletions

View File

@ -180,6 +180,10 @@ void PlayerControlPreview::ControllerUpdate(Core::HID::ControllerTriggerType typ
battery_values = controller->GetBatteryValues();
needs_redraw = true;
break;
case Core::HID::ControllerTriggerType::Motion:
motion_values = controller->GetMotions();
needs_redraw = true;
break;
default:
break;
}
@ -313,6 +317,15 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
DrawRawJoystick(p, center + QPointF(-140, 90), QPointF(0, 0));
}
{
// Draw motion cubes
using namespace Settings::NativeMotion;
p.setPen(colors.outline);
p.setBrush(colors.transparent);
Draw3dCube(p, center + QPointF(-140, 90),
motion_values[Settings::NativeMotion::MotionLeft].euler, 20.0f);
}
using namespace Settings::NativeButton;
// D-pad constants
@ -435,6 +448,15 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
DrawRawJoystick(p, QPointF(0, 0), center + QPointF(140, 90));
}
{
// Draw motion cubes
using namespace Settings::NativeMotion;
p.setPen(colors.outline);
p.setBrush(colors.transparent);
Draw3dCube(p, center + QPointF(140, 90),
motion_values[Settings::NativeMotion::MotionRight].euler, 20.0f);
}
using namespace Settings::NativeButton;
// Face buttons constants
@ -555,6 +577,17 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
DrawRawJoystick(p, center + QPointF(-180, 90), center + QPointF(180, 90));
}
{
// Draw motion cubes
using namespace Settings::NativeMotion;
p.setPen(colors.outline);
p.setBrush(colors.transparent);
Draw3dCube(p, center + QPointF(-180, -5),
motion_values[Settings::NativeMotion::MotionLeft].euler, 20.0f);
Draw3dCube(p, center + QPointF(180, -5),
motion_values[Settings::NativeMotion::MotionRight].euler, 20.0f);
}
using namespace Settings::NativeButton;
// Face buttons constants
@ -647,6 +680,15 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
DrawRawJoystick(p, center + QPointF(-50, 0), center + QPointF(50, 0));
}
{
// Draw motion cubes
using namespace Settings::NativeMotion;
p.setPen(colors.outline);
p.setBrush(colors.transparent);
Draw3dCube(p, center + QPointF(0, -115),
motion_values[Settings::NativeMotion::MotionLeft].euler, 15.0f);
}
using namespace Settings::NativeButton;
// Face buttons constants
@ -750,6 +792,15 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
DrawRawJoystick(p, center + QPointF(-50, 105), center + QPointF(50, 105));
}
{
// Draw motion cubes
using namespace Settings::NativeMotion;
p.setPen(colors.button);
p.setBrush(colors.transparent);
Draw3dCube(p, center + QPointF(0, -100),
motion_values[Settings::NativeMotion::MotionLeft].euler, 15.0f);
}
using namespace Settings::NativeButton;
// Face buttons constants
@ -2871,6 +2922,46 @@ void PlayerControlPreview::DrawArrow(QPainter& p, const QPointF center, const Di
DrawPolygon(p, arrow_symbol);
}
// Draw motion functions
void PlayerControlPreview::Draw3dCube(QPainter& p, QPointF center, const Common::Vec3f& euler,
float size) {
std::array<Common::Vec3f, 8> cube{
Common::Vec3f{-1, -1, -1},
{-1, 1, -1},
{1, 1, -1},
{1, -1, -1},
{-1, -1, 1},
{-1, 1, 1},
{1, 1, 1},
{1, -1, 1},
};
for (Common::Vec3f& point : cube) {
point.RotateFromOrigin(euler.x, euler.y, euler.z);
point *= size;
}
const std::array<QPointF, 4> front_face{
center + QPointF{cube[0].x, cube[0].y},
center + QPointF{cube[1].x, cube[1].y},
center + QPointF{cube[2].x, cube[2].y},
center + QPointF{cube[3].x, cube[3].y},
};
const std::array<QPointF, 4> back_face{
center + QPointF{cube[4].x, cube[4].y},
center + QPointF{cube[5].x, cube[5].y},
center + QPointF{cube[6].x, cube[6].y},
center + QPointF{cube[7].x, cube[7].y},
};
DrawPolygon(p, front_face);
DrawPolygon(p, back_face);
p.drawLine(center + QPointF{cube[0].x, cube[0].y}, center + QPointF{cube[4].x, cube[4].y});
p.drawLine(center + QPointF{cube[1].x, cube[1].y}, center + QPointF{cube[5].x, cube[5].y});
p.drawLine(center + QPointF{cube[2].x, cube[2].y}, center + QPointF{cube[6].x, cube[6].y});
p.drawLine(center + QPointF{cube[3].x, cube[3].y}, center + QPointF{cube[7].x, cube[7].y});
}
template <size_t N>
void PlayerControlPreview::DrawPolygon(QPainter& p, const std::array<QPointF, N>& polygon) {
p.drawPolygon(polygon.data(), static_cast<int>(polygon.size()));