From 5491fbee5b2dc6007847c3f92cc26b5246626e26 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 22 Nov 2024 16:35:00 +0100 Subject: [PATCH 1/9] Fix warning --- rpcs3/Emu/scoped_progress_dialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/scoped_progress_dialog.cpp b/rpcs3/Emu/scoped_progress_dialog.cpp index 35606b4600..ababe3d190 100644 --- a/rpcs3/Emu/scoped_progress_dialog.cpp +++ b/rpcs3/Emu/scoped_progress_dialog.cpp @@ -91,8 +91,8 @@ scoped_progress_dialog::scoped_progress_dialog(std::string text) noexcept scoped_progress_dialog& scoped_progress_dialog::operator=(std::string text) noexcept { - // Exchange text atomically - g_progr_text_queue[m_text_index].exchange(make_single_value(std::move(text))); + // Set text atomically + g_progr_text_queue[m_text_index].store(make_single_value(std::move(text))); return *this; } From 657ab4261c72d4e0bef4547d52008c17a5378a72 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 27 Nov 2024 20:38:07 +0100 Subject: [PATCH 2/9] Fix some static analysis warnings --- rpcs3/rpcs3qt/flow_layout.cpp | 21 ++++++++++++--------- rpcs3/rpcs3qt/gui_save.h | 7 +------ rpcs3/rpcs3qt/user_account.h | 6 +++--- rpcs3/util/types.hpp | 6 +++--- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/rpcs3/rpcs3qt/flow_layout.cpp b/rpcs3/rpcs3qt/flow_layout.cpp index 579ae59404..02fcbd1a34 100644 --- a/rpcs3/rpcs3qt/flow_layout.cpp +++ b/rpcs3/rpcs3qt/flow_layout.cpp @@ -79,10 +79,13 @@ flow_layout::~flow_layout() void flow_layout::clear() { - while (QLayoutItem* item = takeAt(0)) + for (QLayoutItem* item : m_item_list) { - delete item->widget(); - delete item; + if (item) + { + delete item->widget(); + delete item; + } } m_item_list.clear(); m_positions.clear(); @@ -185,8 +188,8 @@ int flow_layout::doLayout(const QRect& rect, bool testOnly) const int x = effectiveRect.x(); int y = effectiveRect.y(); int lineHeight = 0; - int rows = 0; - int cols = 0; + int row_count = 0; + int col_count = 0; if (m_dynamic_spacing) { @@ -259,8 +262,8 @@ int flow_layout::doLayout(const QRect& rect, bool testOnly) const pos.row = row; pos.col = col++; - rows = std::max(rows, pos.row + 1); - cols = std::max(cols, pos.col + 1); + row_count = std::max(row_count, pos.row + 1); + col_count = std::max(col_count, pos.col + 1); if (!testOnly) item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); @@ -269,8 +272,8 @@ int flow_layout::doLayout(const QRect& rect, bool testOnly) const lineHeight = qMax(lineHeight, item->sizeHint().height()); } - m_rows = rows; - m_cols = cols; + m_rows = row_count; + m_cols = col_count; return y + lineHeight - rect.y() + bottom; } diff --git a/rpcs3/rpcs3qt/gui_save.h b/rpcs3/rpcs3qt/gui_save.h index 66970172f6..cbeec7b5a6 100644 --- a/rpcs3/rpcs3qt/gui_save.h +++ b/rpcs3/rpcs3qt/gui_save.h @@ -11,16 +11,11 @@ struct gui_save gui_save() { - key = ""; - name = ""; - def = QVariant(); } gui_save(const QString& k, const QString& n, const QVariant& d) + : key(k), name(n), def(d) { - key = k; - name = n; - def = d; } bool operator==(const gui_save& rhs) const noexcept diff --git a/rpcs3/rpcs3qt/user_account.h b/rpcs3/rpcs3qt/user_account.h index 46991f7565..dd2e1a3d3c 100644 --- a/rpcs3/rpcs3qt/user_account.h +++ b/rpcs3/rpcs3qt/user_account.h @@ -14,9 +14,9 @@ class user_account public: explicit user_account(const std::string& user_id = "00000001"); - std::string GetUserId() const { return m_user_id; } - std::string GetUserDir() const { return m_user_dir; } - std::string GetUsername() const { return m_username; } + const std::string& GetUserId() const { return m_user_id; } + const std::string& GetUserDir() const { return m_user_dir; } + const std::string& GetUsername() const { return m_username; } static std::map GetUserAccounts(const std::string& base_dir); diff --git a/rpcs3/util/types.hpp b/rpcs3/util/types.hpp index 42c900898f..f01e558e92 100644 --- a/rpcs3/util/types.hpp +++ b/rpcs3/util/types.hpp @@ -989,14 +989,14 @@ template requires (std::is_integral_v; constexpr bool is_to_signed = std::is_signed_v; - constexpr auto from_mask = is_from_signed > is_to_signed ? UnFrom{umax} >> 1 : UnFrom{umax}; - constexpr auto to_mask = is_to_signed > is_from_signed ? UnTo{umax} >> 1 : UnTo{umax}; + constexpr auto from_mask = (is_from_signed && !is_to_signed) ? UnFrom{umax} >> 1 : UnFrom{umax}; + constexpr auto to_mask = (is_to_signed && !is_from_signed) ? UnTo{umax} >> 1 : UnTo{umax}; constexpr auto mask = ~(from_mask & to_mask); // Signed to unsigned always require test // Otherwise, this is bit-wise narrowing or conversion between types of different signedness of the same size - if constexpr (is_from_signed > is_to_signed || to_mask < from_mask) + if constexpr ((is_from_signed && !is_to_signed) || to_mask < from_mask) { // Try to optimize test if both are of the same signedness if (is_from_signed != is_to_signed ? !!(value & mask) : static_cast(value) != value) [[unlikely]] From 141ac0d09f813324e72d2587d31763aec4f0d2b6 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Dec 2024 20:44:34 +0100 Subject: [PATCH 3/9] Update FAudio to 24.12 --- 3rdparty/FAudio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/FAudio b/3rdparty/FAudio index 74d45e615c..b7c2e109ea 160000 --- a/3rdparty/FAudio +++ b/3rdparty/FAudio @@ -1 +1 @@ -Subproject commit 74d45e615c2e7510c7e0f2ccb91dc6d7ccae4bec +Subproject commit b7c2e109ea86b82109244c9c4569ce9ad0c884df From 29a3c36e2696f80f00b77ca5815ab9e8513f31c4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Dec 2024 20:44:51 +0100 Subject: [PATCH 4/9] Update OpenAL to 1.24.1 --- 3rdparty/OpenAL/openal-soft | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/OpenAL/openal-soft b/3rdparty/OpenAL/openal-soft index d3875f333f..90191edd20 160000 --- a/3rdparty/OpenAL/openal-soft +++ b/3rdparty/OpenAL/openal-soft @@ -1 +1 @@ -Subproject commit d3875f333fb6abe2f39d82caca329414871ae53b +Subproject commit 90191edd20bb877c5cbddfdac7ec0fe49ad93727 From 8793e6ded735fc585d937d75e3334682fd0519df Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Dec 2024 20:45:11 +0100 Subject: [PATCH 5/9] Update 7zip to 24.09 --- 3rdparty/7zip/7zip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/7zip/7zip b/3rdparty/7zip/7zip index e008ce3976..e5431fa6f5 160000 --- a/3rdparty/7zip/7zip +++ b/3rdparty/7zip/7zip @@ -1 +1 @@ -Subproject commit e008ce3976c087bfd21344af8f00a23cf69d4174 +Subproject commit e5431fa6f5505e385c6f9367260717e9c47dc2ee From cd47113ed8e3b1148fcc0712751f7fb7b3a7ed2b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Dec 2024 20:45:25 +0100 Subject: [PATCH 6/9] Update curl to 8.11.1 --- 3rdparty/curl/curl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/curl/curl b/3rdparty/curl/curl index b1ef0e1a01..75a2079d5c 160000 --- a/3rdparty/curl/curl +++ b/3rdparty/curl/curl @@ -1 +1 @@ -Subproject commit b1ef0e1a01c0bb6ee5367bd9c186a603bde3615a +Subproject commit 75a2079d5c28debb2eaa848ca9430f1fe0d7844c From 73a62b4bf6a66f4bdd145997dc9212d6abe47cb3 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Dec 2024 20:45:36 +0100 Subject: [PATCH 7/9] Update SDL to 2.30.10 --- 3rdparty/libsdl-org/SDL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index c98c4fbff6..9c821dc21c 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit c98c4fbff6d8f3016a3ce6685bf8f43433c3efcc +Subproject commit 9c821dc21ccbd69b2bda421fdb35cb4ae2da8f5e From f3ef4f3658c1dcbac1100243a5e08aafe9fcb7f5 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Dec 2024 22:27:35 +0100 Subject: [PATCH 8/9] cellCamera: try to fix internal state on stop When stopping, the camera is supposed to be open still. Add an expected state to check the camera signal does what it should. --- rpcs3/Emu/Cell/Modules/cellCamera.cpp | 14 +++--- rpcs3/Emu/Io/Null/null_camera_handler.h | 10 ++-- rpcs3/Emu/Io/camera_handler_base.h | 23 ++++++--- rpcs3/rpcs3qt/qt_camera_handler.cpp | 67 ++++++++++++++++++------- rpcs3/rpcs3qt/qt_camera_handler.h | 5 +- 5 files changed, 78 insertions(+), 41 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellCamera.cpp b/rpcs3/Emu/Cell/Modules/cellCamera.cpp index 89ab8ef9f9..64135ca5fa 100644 --- a/rpcs3/Emu/Cell/Modules/cellCamera.cpp +++ b/rpcs3/Emu/Cell/Modules/cellCamera.cpp @@ -784,26 +784,26 @@ s32 cellCameraIsAttached(s32 dev_num) if (g_cfg.io.camera == camera_handler::null) { - return false; + return 0; } auto& g_camera = g_fxo->get(); if (!g_camera.init) { - return false; + return 0; } if (!check_dev_num(dev_num)) { - return false; + return 0; } vm::var type; if (cellCameraGetType(dev_num, type) != CELL_OK) { - return false; + return 0; } std::lock_guard lock(g_camera.mutex); @@ -821,12 +821,12 @@ s32 cellCameraIsAttached(s32 dev_num) } } - return is_attached; + return is_attached ? 1 : 0; } s32 cellCameraIsOpen(s32 dev_num) { - cellCamera.notice("cellCameraIsOpen(dev_num=%d)", dev_num); + cellCamera.trace("cellCameraIsOpen(dev_num=%d)", dev_num); if (g_cfg.io.camera == camera_handler::null) { @@ -852,7 +852,7 @@ s32 cellCameraIsOpen(s32 dev_num) s32 cellCameraIsStarted(s32 dev_num) { - cellCamera.notice("cellCameraIsStarted(dev_num=%d)", dev_num); + cellCamera.trace("cellCameraIsStarted(dev_num=%d)", dev_num); if (g_cfg.io.camera == camera_handler::null) { diff --git a/rpcs3/Emu/Io/Null/null_camera_handler.h b/rpcs3/Emu/Io/Null/null_camera_handler.h index 61e26a8d96..a250facd75 100644 --- a/rpcs3/Emu/Io/Null/null_camera_handler.h +++ b/rpcs3/Emu/Io/Null/null_camera_handler.h @@ -7,10 +7,10 @@ class null_camera_handler final : public camera_handler_base public: null_camera_handler() : camera_handler_base() {} - void open_camera() override { m_state = camera_handler_state::open; } - void close_camera() override { m_state = camera_handler_state::closed; } - void start_camera() override { m_state = camera_handler_state::running; } - void stop_camera() override { m_state = camera_handler_state::open; } + void open_camera() override { set_state(camera_handler_state::open); } + void close_camera() override { set_state(camera_handler_state::closed); } + void start_camera() override { set_state(camera_handler_state::running); } + void stop_camera() override { set_state(camera_handler_state::open); } void set_format(s32 format, u32 bytesize) override { @@ -45,6 +45,6 @@ public: height = 0; frame_number = 0; bytes_read = 0; - return m_state; + return get_state(); } }; diff --git a/rpcs3/Emu/Io/camera_handler_base.h b/rpcs3/Emu/Io/camera_handler_base.h index 531fa3abe3..49ce4dc635 100644 --- a/rpcs3/Emu/Io/camera_handler_base.h +++ b/rpcs3/Emu/Io/camera_handler_base.h @@ -30,22 +30,29 @@ public: virtual u64 frame_number() const = 0; // Convenience function to check if there's a new frame. virtual camera_handler_state get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read) = 0; - camera_handler_state get_state() const { return m_state.load(); }; + camera_handler_state get_state() const { return m_state.load(); } + void set_state(camera_handler_state state) { m_state = m_state_expected = state; } - bool mirrored() const { return m_mirrored; }; - s32 format() const { return m_format; }; - u32 bytesize() const { return m_bytesize; }; - u32 width() const { return m_width; }; - u32 height() const { return m_height; }; - u32 frame_rate() const { return m_frame_rate; }; + camera_handler_state get_expected_state() const { return m_state_expected.load(); } + void set_expected_state(camera_handler_state state) { m_state_expected = state; } + + bool mirrored() const { return m_mirrored; } + s32 format() const { return m_format; } + u32 bytesize() const { return m_bytesize; } + u32 width() const { return m_width; } + u32 height() const { return m_height; } + u32 frame_rate() const { return m_frame_rate; } protected: std::mutex m_mutex; - atomic_t m_state = camera_handler_state::closed; bool m_mirrored = false; s32 m_format = 2; // CELL_CAMERA_RAW8 u32 m_bytesize = 0; u32 m_width = 640; u32 m_height = 480; u32 m_frame_rate = 30; + +private: + atomic_t m_state = camera_handler_state::closed; + atomic_t m_state_expected = camera_handler_state::closed; }; diff --git a/rpcs3/rpcs3qt/qt_camera_handler.cpp b/rpcs3/rpcs3qt/qt_camera_handler.cpp index f0d11f937c..88d8c15963 100644 --- a/rpcs3/rpcs3qt/qt_camera_handler.cpp +++ b/rpcs3/rpcs3qt/qt_camera_handler.cpp @@ -47,6 +47,7 @@ void qt_camera_handler::set_camera(const QCameraDevice& camera_info) { if (camera_info.isNull()) { + set_expected_state(camera_handler_state::closed); reset(); return; } @@ -57,9 +58,9 @@ void qt_camera_handler::set_camera(const QCameraDevice& camera_info) camera_log.success("Using camera: id=\"%s\", description=\"%s\", front_facing=%d", camera_info.id().toStdString(), camera_info.description(), front_facing); // Create camera and video surface - m_media_capture_session.reset(new QMediaCaptureSession(nullptr)); - m_video_sink.reset(new qt_camera_video_sink(front_facing, nullptr)); - m_camera.reset(new QCamera(camera_info)); + m_media_capture_session = std::make_unique(nullptr); + m_video_sink = std::make_unique(front_facing, nullptr); + m_camera = std::make_unique(camera_info); connect(m_camera.get(), &QCamera::activeChanged, this, &qt_camera_handler::handle_camera_active); connect(m_camera.get(), &QCamera::errorOccurred, this, &qt_camera_handler::handle_camera_error); @@ -76,14 +77,37 @@ void qt_camera_handler::handle_camera_active(bool is_active) { camera_log.notice("Camera active status changed to %d", is_active); - if (is_active) + // Check if the camera does what it's supposed to do. + const camera_handler_state expected_state = get_expected_state(); + + switch (expected_state) { - m_state = camera_handler_state::running; - } - else + case camera_handler_state::closed: + case camera_handler_state::open: { - m_state = camera_handler_state::closed; + if (is_active) + { + // This is not supposed to happen and indicates an unexpected QCamera issue + camera_log.error("Camera started unexpectedly"); + set_state(camera_handler_state::running); + return; + } + break; } + case camera_handler_state::running: + { + if (!is_active) + { + // This is not supposed to happen and indicates an unexpected QCamera issue + camera_log.error("Camera stopped unexpectedly"); + set_state(camera_handler_state::open); + return; + } + break; + } + } + + set_state(expected_state); } void qt_camera_handler::handle_camera_error(QCamera::Error error, const QString& errorString) @@ -100,7 +124,11 @@ void qt_camera_handler::open_camera() { camera_log.notice("Switching camera from %s to %s", m_camera_id, camera_id); camera_log.notice("Stopping old camera..."); - if (m_camera) m_camera->stop(); + if (m_camera) + { + set_expected_state(camera_handler_state::open); + m_camera->stop(); + } m_camera_id = camera_id; } @@ -129,7 +157,7 @@ void qt_camera_handler::open_camera() { if (m_camera_id.empty()) camera_log.notice("Camera disabled"); else camera_log.error("No camera found"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return; } @@ -148,7 +176,7 @@ void qt_camera_handler::open_camera() // Update camera and view finder settings update_camera_settings(); - m_state = camera_handler_state::open; + set_state(camera_handler_state::open); } void qt_camera_handler::close_camera() @@ -159,11 +187,12 @@ void qt_camera_handler::close_camera() { if (m_camera_id.empty()) camera_log.notice("Camera disabled"); else camera_log.error("No camera found"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return; } // Unload/close camera + set_expected_state(camera_handler_state::closed); m_camera->stop(); } @@ -175,7 +204,7 @@ void qt_camera_handler::start_camera() { if (m_camera_id.empty()) camera_log.notice("Camera disabled"); else camera_log.error("No camera found"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return; } @@ -206,6 +235,7 @@ void qt_camera_handler::start_camera() #endif // Start camera. We will start receiving frames now. + set_expected_state(camera_handler_state::running); m_camera->start(); } @@ -217,7 +247,7 @@ void qt_camera_handler::stop_camera() { if (m_camera_id.empty()) camera_log.notice("Camera disabled"); else camera_log.error("No camera found"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return; } @@ -228,6 +258,7 @@ void qt_camera_handler::stop_camera() } // Stop camera. The camera will still be drawing power. + set_expected_state(camera_handler_state::open); m_camera->stop(); } @@ -284,26 +315,26 @@ camera_handler_base::camera_handler_state qt_camera_handler::get_image(u8* buf, m_camera_id != camera_id) { camera_log.notice("Switching cameras"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return camera_handler_state::closed; } if (m_camera_id.empty()) { camera_log.notice("Camera disabled"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return camera_handler_state::closed; } if (!m_camera || !m_video_sink) { camera_log.fatal("Error: camera invalid"); - m_state = camera_handler_state::closed; + set_state(camera_handler_state::closed); return camera_handler_state::closed; } // Backup current state. State may change through events. - const camera_handler_state current_state = m_state; + const camera_handler_state current_state = get_state(); if (current_state == camera_handler_state::running) { diff --git a/rpcs3/rpcs3qt/qt_camera_handler.h b/rpcs3/rpcs3qt/qt_camera_handler.h index d828bd6c84..0759d739c6 100644 --- a/rpcs3/rpcs3qt/qt_camera_handler.h +++ b/rpcs3/rpcs3qt/qt_camera_handler.h @@ -17,8 +17,6 @@ public: qt_camera_handler(); virtual ~qt_camera_handler(); - void set_camera(const QCameraDevice& camera_info); - void open_camera() override; void close_camera() override; void start_camera() override; @@ -31,11 +29,12 @@ public: camera_handler_state get_image(u8* buf, u64 size, u32& width, u32& height, u64& frame_number, u64& bytes_read) override; private: + void set_camera(const QCameraDevice& camera_info); void reset(); void update_camera_settings(); std::string m_camera_id; - std::shared_ptr m_camera; + std::unique_ptr m_camera; std::unique_ptr m_media_capture_session; std::unique_ptr m_video_sink; From e18ae5abd6f3283d879ea111381ae2e81ab1bc59 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 18 Dec 2024 00:11:59 +0100 Subject: [PATCH 9/9] cellGem: expose rotation cone to settings --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 6 +++--- .../RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp | 1 + rpcs3/Emu/localized_string_id.h | 1 + rpcs3/Emu/system_config.h | 1 + rpcs3/rpcs3qt/localized_emu.h | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index df621efef3..ff596cbc34 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -956,9 +956,9 @@ static inline void pos_to_gem_state(u32 gem_num, gem_config::gem_controller& con static constexpr f32 PI = 3.14159265f; const auto degree_to_rad = [](f32 degree) -> f32 { return degree * PI / 180.0f; }; - static constexpr f32 CONE = 10.0f / 2.0f; - const f32 roll = -degree_to_rad((image_y - half_height) / half_height * CONE); // This is actually the pitch - const f32 pitch = -degree_to_rad((image_x - half_width) / half_width * CONE); // This is actually the yaw + const f32 max_angle_per_side = g_cfg.io.fake_move_rotation_cone / 2.0f; + const f32 roll = -degree_to_rad((image_y - half_height) / half_height * max_angle_per_side); // This is actually the pitch + const f32 pitch = -degree_to_rad((image_x - half_width) / half_width * max_angle_per_side); // This is actually the yaw const f32 yaw = degree_to_rad(0.0f); const f32 cr = std::cos(roll * 0.5f); const f32 sr = std::sin(roll * 0.5f); diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index 50d690d56a..0639e41ea7 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -83,6 +83,7 @@ namespace rsx add_dropdown(&g_cfg.io.pad_mode, localized_string_id::HOME_MENU_SETTINGS_INPUT_PAD_MODE); add_unsigned_slider(&g_cfg.io.pad_sleep, localized_string_id::HOME_MENU_SETTINGS_INPUT_PAD_SLEEP, " µs", 100); + add_unsigned_slider(&g_cfg.io.fake_move_rotation_cone, localized_string_id::HOME_MENU_SETTINGS_INPUT_FAKE_MOVE_ROTATION_CONE, "°", 1); apply_layout(); } diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index 7476d58a59..4a380422b9 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -223,6 +223,7 @@ enum class localized_string_id HOME_MENU_SETTINGS_INPUT_CAMERA_FLIP, HOME_MENU_SETTINGS_INPUT_PAD_MODE, HOME_MENU_SETTINGS_INPUT_PAD_SLEEP, + HOME_MENU_SETTINGS_INPUT_FAKE_MOVE_ROTATION_CONE, HOME_MENU_SETTINGS_ADVANCED, HOME_MENU_SETTINGS_ADVANCED_PREFERRED_SPU_THREADS, HOME_MENU_SETTINGS_ADVANCED_MAX_CPU_PREEMPTIONS, diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 2bf582277c..04a4ce5399 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -283,6 +283,7 @@ struct cfg_root : cfg::node cfg::string midi_devices{this, "Emulated Midi devices", "ßßß@@@ßßß@@@ßßß@@@"}; cfg::_bool load_sdl_mappings{ this, "Load SDL GameController Mappings", true }; cfg::_bool debug_overlay{ this, "IO Debug overlay", false, true }; + cfg::uint<1, 180> fake_move_rotation_cone{ this, "Fake Move Rotation Cone", 10, true }; } io{ this }; diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index 2f6c4d19ae..7b4dbd72f9 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -244,6 +244,7 @@ private: case localized_string_id::HOME_MENU_SETTINGS_INPUT_CAMERA_FLIP: return tr("Camera Flip", "Input"); case localized_string_id::HOME_MENU_SETTINGS_INPUT_PAD_MODE: return tr("Pad Handler Mode", "Input"); case localized_string_id::HOME_MENU_SETTINGS_INPUT_PAD_SLEEP: return tr("Pad Handler Sleep", "Input"); + case localized_string_id::HOME_MENU_SETTINGS_INPUT_FAKE_MOVE_ROTATION_CONE: return tr("Fake PS Move Rotation Cone", "Input"); case localized_string_id::HOME_MENU_SETTINGS_ADVANCED: return tr("Advanced"); case localized_string_id::HOME_MENU_SETTINGS_ADVANCED_PREFERRED_SPU_THREADS: return tr("Preferred SPU Threads", "Advanced"); case localized_string_id::HOME_MENU_SETTINGS_ADVANCED_MAX_CPU_PREEMPTIONS: return tr("Max Power Saving CPU-Preemptions", "Advanced");