early-access version 3299

This commit is contained in:
pineappleEA 2023-01-08 00:07:19 +01:00
parent f8e172869d
commit 6024631e28
9 changed files with 76 additions and 27 deletions

View file

@ -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

View file

@ -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() {}

View file

@ -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;
} }

View file

@ -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() {

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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");
} }

View file

@ -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);