early-access version 3299
This commit is contained in:
parent
f8e172869d
commit
6024631e28
9 changed files with 76 additions and 27 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3298.
|
This is the source code for early-access 3299.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -304,9 +304,6 @@ class InputDevice {
|
||||||
public:
|
public:
|
||||||
virtual ~InputDevice() = default;
|
virtual ~InputDevice() = default;
|
||||||
|
|
||||||
// Request input device to update if necessary
|
|
||||||
virtual void SoftUpdate() {}
|
|
||||||
|
|
||||||
// Force input device to update data regardless of the current state
|
// Force input device to update data regardless of the current state
|
||||||
virtual void ForceUpdate() {}
|
virtual void ForceUpdate() {}
|
||||||
|
|
||||||
|
|
|
@ -1583,16 +1583,6 @@ AnalogSticks EmulatedController::GetSticks() const {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some drivers like stick from buttons need constant refreshing
|
|
||||||
for (auto& device : stick_devices) {
|
|
||||||
if (!device) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
lock.unlock();
|
|
||||||
device->SoftUpdate();
|
|
||||||
lock.lock();
|
|
||||||
}
|
|
||||||
|
|
||||||
return controller.analog_stick_state;
|
return controller.analog_stick_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,10 +156,12 @@ void Tas::RecordInput(u64 buttons, TasAnalog left_axis, TasAnalog right_axis) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<TasState, size_t, size_t> Tas::GetStatus() const {
|
std::tuple<TasState, size_t, std::array<size_t, PLAYER_NUMBER>> Tas::GetStatus() const {
|
||||||
TasState state;
|
TasState state;
|
||||||
|
std::array<size_t, PLAYER_NUMBER> lengths{0};
|
||||||
if (is_recording) {
|
if (is_recording) {
|
||||||
return {TasState::Recording, 0, record_commands.size()};
|
lengths[0] = record_commands.size();
|
||||||
|
return {TasState::Recording, record_commands.size(), lengths};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_running) {
|
if (is_running) {
|
||||||
|
@ -168,7 +170,11 @@ std::tuple<TasState, size_t, size_t> Tas::GetStatus() const {
|
||||||
state = TasState::Stopped;
|
state = TasState::Stopped;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {state, current_command, script_length};
|
for (size_t i = 0; i < PLAYER_NUMBER; i++) {
|
||||||
|
lengths[i] = commands[i].size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {state, current_command, lengths};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tas::UpdateThread() {
|
void Tas::UpdateThread() {
|
||||||
|
|
|
@ -124,7 +124,7 @@ public:
|
||||||
* Current playback progress ;
|
* Current playback progress ;
|
||||||
* Total length of script file currently loaded or being recorded
|
* Total length of script file currently loaded or being recorded
|
||||||
*/
|
*/
|
||||||
std::tuple<TasState, size_t, size_t> GetStatus() const;
|
std::tuple<TasState, size_t, std::array<size_t, PLAYER_NUMBER>> GetStatus() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class TasAxis : u8;
|
enum class TasAxis : u8;
|
||||||
|
|
|
@ -13,11 +13,11 @@ class Stick final : public Common::Input::InputDevice {
|
||||||
public:
|
public:
|
||||||
using Button = std::unique_ptr<Common::Input::InputDevice>;
|
using Button = std::unique_ptr<Common::Input::InputDevice>;
|
||||||
|
|
||||||
Stick(Button up_, Button down_, Button left_, Button right_, Button modifier_,
|
Stick(Button up_, Button down_, Button left_, Button right_, Button modifier_, Button updater_,
|
||||||
float modifier_scale_, float modifier_angle_)
|
float modifier_scale_, float modifier_angle_)
|
||||||
: up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
|
: up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
|
||||||
right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_),
|
right(std::move(right_)), modifier(std::move(modifier_)), updater(std::move(updater_)),
|
||||||
modifier_angle(modifier_angle_) {
|
modifier_scale(modifier_scale_), modifier_angle(modifier_angle_) {
|
||||||
up->SetCallback({
|
up->SetCallback({
|
||||||
.on_change =
|
.on_change =
|
||||||
[this](const Common::Input::CallbackStatus& callback_) {
|
[this](const Common::Input::CallbackStatus& callback_) {
|
||||||
|
@ -48,6 +48,9 @@ public:
|
||||||
UpdateModButtonStatus(callback_);
|
UpdateModButtonStatus(callback_);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
updater->SetCallback({
|
||||||
|
.on_change = [this](const Common::Input::CallbackStatus& callback_) { SoftUpdate(); },
|
||||||
|
});
|
||||||
last_x_axis_value = 0.0f;
|
last_x_axis_value = 0.0f;
|
||||||
last_y_axis_value = 0.0f;
|
last_y_axis_value = 0.0f;
|
||||||
}
|
}
|
||||||
|
@ -248,7 +251,7 @@ public:
|
||||||
modifier->ForceUpdate();
|
modifier->ForceUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftUpdate() override {
|
void SoftUpdate() {
|
||||||
Common::Input::CallbackStatus status{
|
Common::Input::CallbackStatus status{
|
||||||
.type = Common::Input::InputType::Stick,
|
.type = Common::Input::InputType::Stick,
|
||||||
.stick_status = GetStatus(),
|
.stick_status = GetStatus(),
|
||||||
|
@ -308,6 +311,7 @@ private:
|
||||||
Button left;
|
Button left;
|
||||||
Button right;
|
Button right;
|
||||||
Button modifier;
|
Button modifier;
|
||||||
|
Button updater;
|
||||||
float modifier_scale{};
|
float modifier_scale{};
|
||||||
float modifier_angle{};
|
float modifier_angle{};
|
||||||
float angle{};
|
float angle{};
|
||||||
|
@ -331,11 +335,12 @@ std::unique_ptr<Common::Input::InputDevice> StickFromButton::Create(
|
||||||
auto left = Common::Input::CreateInputDeviceFromString(params.Get("left", null_engine));
|
auto left = Common::Input::CreateInputDeviceFromString(params.Get("left", null_engine));
|
||||||
auto right = Common::Input::CreateInputDeviceFromString(params.Get("right", null_engine));
|
auto right = Common::Input::CreateInputDeviceFromString(params.Get("right", null_engine));
|
||||||
auto modifier = Common::Input::CreateInputDeviceFromString(params.Get("modifier", null_engine));
|
auto modifier = Common::Input::CreateInputDeviceFromString(params.Get("modifier", null_engine));
|
||||||
|
auto updater = Common::Input::CreateInputDeviceFromString("engine:updater,button:0");
|
||||||
auto modifier_scale = params.Get("modifier_scale", 0.5f);
|
auto modifier_scale = params.Get("modifier_scale", 0.5f);
|
||||||
auto modifier_angle = params.Get("modifier_angle", 5.5f);
|
auto modifier_angle = params.Get("modifier_angle", 5.5f);
|
||||||
return std::make_unique<Stick>(std::move(up), std::move(down), std::move(left),
|
return std::make_unique<Stick>(std::move(up), std::move(down), std::move(left),
|
||||||
std::move(right), std::move(modifier), modifier_scale,
|
std::move(right), std::move(modifier), std::move(updater),
|
||||||
modifier_angle);
|
modifier_scale, modifier_angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace InputCommon
|
} // namespace InputCommon
|
||||||
|
|
|
@ -29,6 +29,28 @@
|
||||||
|
|
||||||
namespace InputCommon {
|
namespace InputCommon {
|
||||||
|
|
||||||
|
/// Dummy engine to get periodic updates
|
||||||
|
class UpdateEngine final : public InputEngine {
|
||||||
|
public:
|
||||||
|
explicit UpdateEngine(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
|
||||||
|
PreSetController(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PumpEvents() {
|
||||||
|
SetButton(identifier, 0, last_state);
|
||||||
|
last_state = !last_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr PadIdentifier identifier = {
|
||||||
|
.guid = Common::UUID{},
|
||||||
|
.port = 0,
|
||||||
|
.pad = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool last_state{};
|
||||||
|
};
|
||||||
|
|
||||||
struct InputSubsystem::Impl {
|
struct InputSubsystem::Impl {
|
||||||
template <typename Engine>
|
template <typename Engine>
|
||||||
void RegisterEngine(std::string name, std::shared_ptr<Engine>& engine) {
|
void RegisterEngine(std::string name, std::shared_ptr<Engine>& engine) {
|
||||||
|
@ -46,6 +68,7 @@ struct InputSubsystem::Impl {
|
||||||
void Initialize() {
|
void Initialize() {
|
||||||
mapping_factory = std::make_shared<MappingFactory>();
|
mapping_factory = std::make_shared<MappingFactory>();
|
||||||
|
|
||||||
|
RegisterEngine("updater", update_engine);
|
||||||
RegisterEngine("keyboard", keyboard);
|
RegisterEngine("keyboard", keyboard);
|
||||||
RegisterEngine("mouse", mouse);
|
RegisterEngine("mouse", mouse);
|
||||||
RegisterEngine("touch", touch_screen);
|
RegisterEngine("touch", touch_screen);
|
||||||
|
@ -76,6 +99,7 @@ struct InputSubsystem::Impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown() {
|
void Shutdown() {
|
||||||
|
UnregisterEngine(update_engine);
|
||||||
UnregisterEngine(keyboard);
|
UnregisterEngine(keyboard);
|
||||||
UnregisterEngine(mouse);
|
UnregisterEngine(mouse);
|
||||||
UnregisterEngine(touch_screen);
|
UnregisterEngine(touch_screen);
|
||||||
|
@ -265,6 +289,7 @@ struct InputSubsystem::Impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PumpEvents() const {
|
void PumpEvents() const {
|
||||||
|
update_engine->PumpEvents();
|
||||||
#ifdef HAVE_SDL2
|
#ifdef HAVE_SDL2
|
||||||
sdl->PumpEvents();
|
sdl->PumpEvents();
|
||||||
#endif
|
#endif
|
||||||
|
@ -276,6 +301,7 @@ struct InputSubsystem::Impl {
|
||||||
|
|
||||||
std::shared_ptr<MappingFactory> mapping_factory;
|
std::shared_ptr<MappingFactory> mapping_factory;
|
||||||
|
|
||||||
|
std::shared_ptr<UpdateEngine> update_engine;
|
||||||
std::shared_ptr<Keyboard> keyboard;
|
std::shared_ptr<Keyboard> keyboard;
|
||||||
std::shared_ptr<Mouse> mouse;
|
std::shared_ptr<Mouse> mouse;
|
||||||
std::shared_ptr<TouchScreen> touch_screen;
|
std::shared_ptr<TouchScreen> touch_screen;
|
||||||
|
|
|
@ -3729,15 +3729,36 @@ void GMainWindow::UpdateWindowTitle(std::string_view title_name, std::string_vie
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GMainWindow::CreateTASFramesString(
|
||||||
|
std::array<size_t, InputCommon::TasInput::PLAYER_NUMBER> frames) const {
|
||||||
|
std::string string = "";
|
||||||
|
size_t maxPlayerIndex = 0;
|
||||||
|
for (size_t i = 0; i < frames.size(); i++) {
|
||||||
|
if (frames[i] != 0) {
|
||||||
|
if (maxPlayerIndex != 0)
|
||||||
|
string += ", ";
|
||||||
|
while (maxPlayerIndex++ != i)
|
||||||
|
string += "0, ";
|
||||||
|
string += std::to_string(frames[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
QString GMainWindow::GetTasStateDescription() const {
|
QString GMainWindow::GetTasStateDescription() const {
|
||||||
auto [tas_status, current_tas_frame, total_tas_frames] = input_subsystem->GetTas()->GetStatus();
|
auto [tas_status, current_tas_frame, total_tas_frames] = input_subsystem->GetTas()->GetStatus();
|
||||||
|
std::string tas_frames_string = CreateTASFramesString(total_tas_frames);
|
||||||
switch (tas_status) {
|
switch (tas_status) {
|
||||||
case InputCommon::TasInput::TasState::Running:
|
case InputCommon::TasInput::TasState::Running:
|
||||||
return tr("TAS state: Running %1/%2").arg(current_tas_frame).arg(total_tas_frames);
|
return tr("TAS state: Running %1/%2")
|
||||||
|
.arg(current_tas_frame)
|
||||||
|
.arg(QString::fromStdString(tas_frames_string));
|
||||||
case InputCommon::TasInput::TasState::Recording:
|
case InputCommon::TasInput::TasState::Recording:
|
||||||
return tr("TAS state: Recording %1").arg(total_tas_frames);
|
return tr("TAS state: Recording %1").arg(total_tas_frames[0]);
|
||||||
case InputCommon::TasInput::TasState::Stopped:
|
case InputCommon::TasInput::TasState::Stopped:
|
||||||
return tr("TAS state: Idle %1/%2").arg(current_tas_frame).arg(total_tas_frames);
|
return tr("TAS state: Idle %1/%2")
|
||||||
|
.arg(current_tas_frame)
|
||||||
|
.arg(QString::fromStdString(tas_frames_string));
|
||||||
default:
|
default:
|
||||||
return tr("TAS State: Invalid");
|
return tr("TAS State: Invalid");
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "common/announce_multiplayer_room.h"
|
#include "common/announce_multiplayer_room.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "input_common/drivers/tas_input.h"
|
||||||
#include "yuzu/compatibility_list.h"
|
#include "yuzu/compatibility_list.h"
|
||||||
#include "yuzu/hotkeys.h"
|
#include "yuzu/hotkeys.h"
|
||||||
|
|
||||||
|
@ -266,6 +267,9 @@ private:
|
||||||
void changeEvent(QEvent* event) override;
|
void changeEvent(QEvent* event) override;
|
||||||
void closeEvent(QCloseEvent* event) override;
|
void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
|
std::string CreateTASFramesString(
|
||||||
|
std::array<size_t, InputCommon::TasInput::PLAYER_NUMBER> frames) const;
|
||||||
|
|
||||||
#ifdef __unix__
|
#ifdef __unix__
|
||||||
void SetupSigInterrupts();
|
void SetupSigInterrupts();
|
||||||
static void HandleSigInterrupt(int);
|
static void HandleSigInterrupt(int);
|
||||||
|
|
Loading…
Reference in a new issue