From 1c22cc2f52d0173b7bd1ffabf85a2cecd5c32045 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 31 Dec 2024 11:09:53 +0100 Subject: [PATCH] overlays: add trophy list dialog --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/Cell/Modules/sceNp.cpp | 4 +- rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp | 9 +- rpcs3/Emu/Cell/Modules/sceNpTrophy.h | 6 + rpcs3/Emu/RSX/GL/GLOverlays.cpp | 2 +- .../HomeMenu/overlay_home_menu_main_menu.cpp | 28 ++ .../Trophies/overlay_trophy_list_dialog.cpp | 356 ++++++++++++++++++ .../Trophies/overlay_trophy_list_dialog.h | 54 +++ rpcs3/Emu/RSX/Overlays/overlay_controls.cpp | 53 ++- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 15 +- .../RSX/Overlays/overlay_message_dialog.cpp | 6 +- rpcs3/Emu/RSX/VK/VKOverlays.cpp | 4 +- rpcs3/Emu/localized_string_id.h | 10 + rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 9 + rpcs3/main.cpp | 1 + rpcs3/rpcs3qt/localized_emu.h | 10 + rpcs3/rpcs3qt/trophy_manager_dialog.cpp | 9 +- 18 files changed, 545 insertions(+), 34 deletions(-) create mode 100644 rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 7846a5d5d3..e77399784e 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -528,6 +528,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/HomeMenu/overlay_home_menu_savestate.cpp RSX/Overlays/Network/overlay_recvmessage_dialog.cpp RSX/Overlays/Network/overlay_sendmessage_dialog.cpp + RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp RSX/Overlays/overlays.cpp RSX/Overlays/overlay_animated_icon.cpp RSX/Overlays/overlay_animation.cpp diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 55b8847934..fb9f46a365 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -5214,7 +5214,7 @@ error_code sceNpProfileCallGui(vm::cptr npid, vm::ptr context, vm::cptrtrp_name = std::move(name); + ctxt->trp_name = name; ctxt->read_only = !!(options & SCE_NP_TROPHY_OPTIONS_CREATE_CONTEXT_READ_ONLY); *context = idm::last_id(); + // set current trophy name for trophy list overlay + { + current_trophy_name& current_id = g_fxo->get(); + std::lock_guard lock(current_id.mtx); + current_id.name = std::move(name); + } + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h index 565f7d0b5d..f97050c968 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h @@ -168,3 +168,9 @@ public: virtual s32 ShowTrophyNotification(const SceNpTrophyDetails& trophy, const std::vector& trophyIconBfr) = 0; }; + +struct current_trophy_name +{ + std::mutex mtx; + std::string name; +}; diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 4c1ca8ac09..5a2b8803f4 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -217,7 +217,7 @@ namespace gl gl::texture_view* ui_overlay_renderer::load_simple_image(rsx::overlays::image_info* desc, bool temp_resource, u32 owner_uid) { auto tex = std::make_unique(GL_TEXTURE_2D, desc->w, desc->h, 1, 1, GL_RGBA8); - tex->copy_from(desc->data, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex->copy_from(desc->get_data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); GLenum remap[] = { GL_RED, GL_ALPHA, GL_BLUE, GL_GREEN }; auto view = std::make_unique(tex.get(), remap); 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 059326aff3..d02b3ffbe2 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 @@ -4,9 +4,11 @@ #include "overlay_home_menu_settings.h" #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/overlay_manager.h" #include "Emu/System.h" #include "Emu/system_config.h" +#include "Emu/Cell/Modules/sceNpTrophy.h" extern atomic_t g_user_asked_for_recording; extern atomic_t g_user_asked_for_screenshot; @@ -55,6 +57,32 @@ namespace rsx return page_navigation::stay; }); + // get current trophy name for trophy list overlay + std::string trop_name; + { + current_trophy_name& current_id = g_fxo->get(); + std::lock_guard lock(current_id.mtx); + trop_name = current_id.name; + } + if (!trop_name.empty()) + { + std::unique_ptr trophies = std::make_unique(get_localized_string(localized_string_id::HOME_MENU_TROPHIES)); + add_item(trophies, [trop_name = std::move(trop_name)](pad_button btn) -> page_navigation + { + if (btn != pad_button::cross) return page_navigation::stay; + + rsx_log.notice("User selected trophies in home menu"); + Emu.CallFromMainThread([trop_name = std::move(trop_name)]() + { + if (auto manager = g_fxo->try_get()) + { + manager->create()->show(trop_name); + } + }); + return page_navigation::stay; + }); + } + std::unique_ptr screenshot = std::make_unique(get_localized_string(localized_string_id::HOME_MENU_SCREENSHOT)); add_item(screenshot, [](pad_button btn) -> page_navigation { diff --git a/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp new file mode 100644 index 0000000000..46b471d83f --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp @@ -0,0 +1,356 @@ +#include "stdafx.h" +#include "../overlay_manager.h" +#include "overlay_trophy_list_dialog.h" +#include "Emu/Cell/Modules/sceNpTrophy.h" +#include "Emu/System.h" +#include "Emu/VFS.h" + +namespace rsx +{ + namespace overlays + { + trophy_list_dialog::trophy_list_entry::trophy_list_entry(const std::string& name, const std::string& description, const std::string& trophy_type, const std::string& icon_path, bool hidden, bool locked, bool platinum_relevant) + { + std::unique_ptr image = std::make_unique(); + image->set_size(160, 110); + image->set_padding(36, 36, 11, 11); // Square image, 88x88 + + if (fs::exists(icon_path)) + { + icon_data = std::make_unique(icon_path.c_str(), hidden || locked); + static_cast(image.get())->set_raw_image(icon_data.get()); + } + else + { + // Fallback + // TODO: use proper icon + static_cast(image.get())->set_image_resource(resource_config::standard_image_resource::square); + } + + std::unique_ptr text_stack = std::make_unique(); + std::unique_ptr padding = std::make_unique(); + std::unique_ptr header_text = std::make_unique