From 64c8eead3c796a567507b8aeb2924f43f1f63ea5 Mon Sep 17 00:00:00 2001 From: Joshua de Reeper Date: Thu, 14 May 2026 15:12:23 +0200 Subject: [PATCH 01/11] Add New Menu and Strings --- bin/Icons/ui/home/256/usb-solid.png | Bin 0 -> 4441 bytes bin/Icons/ui/home/32/usb-solid.png | Bin 0 -> 509 bytes .../RSX/Overlays/HomeMenu/overlay_home_icons.cpp | 2 ++ .../RSX/Overlays/HomeMenu/overlay_home_icons.h | 1 + .../HomeMenu/overlay_home_menu_settings.cpp | 8 ++++++++ .../HomeMenu/overlay_home_menu_settings.h | 5 +++++ rpcs3/Emu/localized_string_id.h | 1 + rpcs3/rpcs3qt/localized_emu.h | 1 + 8 files changed, 18 insertions(+) create mode 100644 bin/Icons/ui/home/256/usb-solid.png create mode 100644 bin/Icons/ui/home/32/usb-solid.png diff --git a/bin/Icons/ui/home/256/usb-solid.png b/bin/Icons/ui/home/256/usb-solid.png new file mode 100644 index 0000000000000000000000000000000000000000..0409972e1353efca4b430de423f95aabba82e7e8 GIT binary patch literal 4441 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, y, width, height, use_separators, nullptr)); add_page(home_menu::fa_icon::settings_sliders, std::make_shared(x, y, width, height, use_separators, nullptr)); add_page(home_menu::fa_icon::settings_gauge, std::make_shared(x, y, width, height, use_separators, nullptr)); + add_page(home_menu::fa_icon::usb, std::make_shared(x, y, width, height, use_separators, nullptr)); add_page(home_menu::fa_icon::bug, std::make_shared(x, y, width, height, use_separators, nullptr)); // Select the first item @@ -263,6 +264,13 @@ namespace rsx apply_layout(); } + home_menu_settings_usb_devices::home_menu_settings_usb_devices(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent) + : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_USB_DEVICES)) + { + + apply_layout(); + } + home_menu_settings_debug::home_menu_settings_debug(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent) : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_DEBUG)) { diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h index ba8b730d44..15a2ba969e 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h @@ -344,6 +344,11 @@ namespace rsx home_menu_settings_performance_overlay(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent); }; + struct home_menu_settings_usb_devices : public home_menu_settings_page + { + home_menu_settings_usb_devices(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent); + }; + struct home_menu_settings_debug : public home_menu_settings_page { home_menu_settings_debug(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent); diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index c411f6e480..791c00afef 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -275,6 +275,7 @@ enum class localized_string_id HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_FONT_SIZE, HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_OPACITY, HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_USE_WINDOW_SPACE, + HOME_MENU_SETTINGS_USB_DEVICES, HOME_MENU_SETTINGS_DEBUG, HOME_MENU_SETTINGS_DEBUG_OVERLAY, HOME_MENU_SETTINGS_DEBUG_INPUT_OVERLAY, diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index ba4960aa73..3482d7b812 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -295,6 +295,7 @@ private: case localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_FONT_SIZE: return tr("Font Size", "Performance Overlay"); case localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_OPACITY: return tr("Opacity", "Performance Overlay"); case localized_string_id::HOME_MENU_SETTINGS_PERFORMANCE_OVERLAY_USE_WINDOW_SPACE: return tr("Use Window Space", "Performance Overlay"); + case localized_string_id::HOME_MENU_SETTINGS_USB_DEVICES: return tr("USB Devices"); case localized_string_id::HOME_MENU_SETTINGS_DEBUG: return tr("Debug"); case localized_string_id::HOME_MENU_SETTINGS_DEBUG_OVERLAY: return tr("Debug Overlay", "Debug"); case localized_string_id::HOME_MENU_SETTINGS_DEBUG_INPUT_OVERLAY: return tr("Input Debug Overlay", "Debug"); From 1d2561e97e5861f7fd2a39aa946aa1512d97dedc Mon Sep 17 00:00:00 2001 From: Joshua de Reeper Date: Sun, 17 May 2026 13:42:47 +0200 Subject: [PATCH 02/11] Start Skylander Overlay --- rpcs3/Emu/CMakeLists.txt | 1 + .../HomeMenu/overlay_home_menu_main_menu.cpp | 16 ++ .../HomeMenu/overlay_home_menu_settings.cpp | 8 - .../HomeMenu/overlay_home_menu_settings.h | 5 - .../USBDevices/overlay_skylander_dialog.cpp | 142 ++++++++++++++++++ .../USBDevices/overlay_skylander_dialog.h | 35 +++++ rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 8 files changed, 202 insertions(+), 13 deletions(-) create mode 100644 rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 045fa30769..6d1c5b954f 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -510,6 +510,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/Network/overlay_recvmessage_dialog.cpp RSX/Overlays/Network/overlay_sendmessage_dialog.cpp RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp + RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp RSX/Overlays/overlays.cpp RSX/Overlays/overlay_animated_icon.cpp RSX/Overlays/overlay_animation.cpp diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp index 8f27e4172d..1e2f3909f8 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp @@ -5,6 +5,7 @@ #include "overlay_home_menu_savestate.h" #include "Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.h" #include "Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.h" +#include "Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.h" #include "Emu/RSX/Overlays/overlay_manager.h" #include "Emu/System.h" #include "Emu/system_config.h" @@ -96,6 +97,21 @@ namespace rsx }); } + add_item(home_menu::fa_icon::usb, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_USB_DEVICES), [](pad_button btn) -> page_navigation + { + if (btn != pad_button::cross) return page_navigation::stay; + + rsx_log.notice("User selected devices in home menu"); + Emu.CallFromMainThread([]() + { + if (auto manager = g_fxo->try_get()) + { + manager->create()->show(); + } + }); + return page_navigation::stay; + }); + add_item(home_menu::fa_icon::screenshot, get_localized_string(localized_string_id::HOME_MENU_SCREENSHOT), [](pad_button btn) -> page_navigation { if (btn != pad_button::cross) return page_navigation::stay; 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 f6082a4206..d8e60b7592 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -19,7 +19,6 @@ namespace rsx add_page(home_menu::fa_icon::settings, std::make_shared(x, y, width, height, use_separators, nullptr)); add_page(home_menu::fa_icon::settings_sliders, std::make_shared(x, y, width, height, use_separators, nullptr)); add_page(home_menu::fa_icon::settings_gauge, std::make_shared(x, y, width, height, use_separators, nullptr)); - add_page(home_menu::fa_icon::usb, std::make_shared(x, y, width, height, use_separators, nullptr)); add_page(home_menu::fa_icon::bug, std::make_shared(x, y, width, height, use_separators, nullptr)); // Select the first item @@ -264,13 +263,6 @@ namespace rsx apply_layout(); } - home_menu_settings_usb_devices::home_menu_settings_usb_devices(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent) - : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_USB_DEVICES)) - { - - apply_layout(); - } - home_menu_settings_debug::home_menu_settings_debug(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent) : home_menu_settings_page(x, y, width, height, use_separators, parent, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_DEBUG)) { diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h index 15a2ba969e..ba8b730d44 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.h @@ -344,11 +344,6 @@ namespace rsx home_menu_settings_performance_overlay(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent); }; - struct home_menu_settings_usb_devices : public home_menu_settings_page - { - home_menu_settings_usb_devices(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent); - }; - struct home_menu_settings_debug : public home_menu_settings_page { home_menu_settings_debug(s16 x, s16 y, u16 width, u16 height, bool use_separators, home_menu_page* parent); diff --git a/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp b/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp new file mode 100644 index 0000000000..fb239cf022 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp @@ -0,0 +1,142 @@ +#include "stdafx.h" +#include "../overlay_manager.h" +#include "overlay_skylander_dialog.h" +#include "Emu/System.h" +#include "Emu/VFS.h" + +namespace rsx +{ + namespace overlays + { + static constexpr u16 trophy_list_y = 85; + static constexpr u16 trophy_list_h = 540; + + skylander_dialog::skylander_dialog() + { + m_allow_input_on_pause = true; + + m_dim_background = std::make_unique(); + m_dim_background->set_size(virtual_width, virtual_height); + m_dim_background->back_color.a = 0.9f; + + m_description = std::make_unique