From 7895b739ee2be1f429d4660e27e69f3805921d25 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Sat, 24 Feb 2024 12:06:59 -0500 Subject: [PATCH] Display active leaderboard data on screen Up to four leaderboards are displayed in a window in the bottom right of the screen (vertically above challenge icons, if there are any). As per RetroAchievements standards, the markers only display the current leaderboard values with no further context necessary. --- Source/Core/VideoCommon/OnScreenUI.cpp | 99 ++++++++++++++------------ Source/Core/VideoCommon/OnScreenUI.h | 2 +- 2 files changed, 54 insertions(+), 47 deletions(-) diff --git a/Source/Core/VideoCommon/OnScreenUI.cpp b/Source/Core/VideoCommon/OnScreenUI.cpp index 4d0213a1a4..715f218b05 100644 --- a/Source/Core/VideoCommon/OnScreenUI.cpp +++ b/Source/Core/VideoCommon/OnScreenUI.cpp @@ -332,63 +332,70 @@ void OnScreenUI::DrawDebugText() } #ifdef USE_RETRO_ACHIEVEMENTS -void OnScreenUI::DrawChallenges() +void OnScreenUI::DrawChallengesAndLeaderboards() { std::lock_guard lg{AchievementManager::GetInstance().GetLock()}; const auto& challenge_icons = AchievementManager::GetInstance().GetChallengeIcons(); - if (challenge_icons.empty()) - return; - - const std::string window_name = "Challenges"; - - u32 sum_of_icon_heights = 0; - u32 max_icon_width = 0; - for (const auto& [name, icon] : challenge_icons) + const auto& leaderboard_progress = AchievementManager::GetInstance().GetActiveLeaderboards(); + float leaderboard_y = ImGui::GetIO().DisplaySize.y; + if (!challenge_icons.empty()) { - // These *should* all be the same square size but you never know. - if (icon->width > max_icon_width) - max_icon_width = icon->width; - sum_of_icon_heights += icon->height; - } - ImGui::SetNextWindowPos( - ImVec2(ImGui::GetIO().DisplaySize.x - 20.f * m_backbuffer_scale - max_icon_width, - ImGui::GetIO().DisplaySize.y - 20.f * m_backbuffer_scale - sum_of_icon_heights)); - ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f)); - if (ImGui::Begin(window_name.c_str(), nullptr, - ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoInputs | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoNav | - ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing)) - { - for (const auto& [name, icon] : challenge_icons) + ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x, ImGui::GetIO().DisplaySize.y), 0, + ImVec2(1.0, 1.0)); + ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f)); + if (ImGui::Begin("Challenges", nullptr, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoInputs | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoNav | + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing)) { - if (m_challenge_texture_map.find(name) != m_challenge_texture_map.end()) - continue; - const u32 width = icon->width; - const u32 height = icon->height; - TextureConfig tex_config(width, height, 1, 1, 1, AbstractTextureFormat::RGBA8, 0, - AbstractTextureType::Texture_2DArray); - auto res = m_challenge_texture_map.insert_or_assign(name, g_gfx->CreateTexture(tex_config)); - res.first->second->Load(0, width, height, width, icon->rgba_data.data(), - sizeof(u32) * width * height); - } - for (auto& [name, texture] : m_challenge_texture_map) - { - auto icon_itr = challenge_icons.find(name); - if (icon_itr == challenge_icons.end()) + for (const auto& [name, icon] : challenge_icons) { - m_challenge_texture_map.erase(name); - continue; + if (m_challenge_texture_map.find(name) != m_challenge_texture_map.end()) + continue; + const u32 width = icon->width; + const u32 height = icon->height; + TextureConfig tex_config(width, height, 1, 1, 1, AbstractTextureFormat::RGBA8, 0, + AbstractTextureType::Texture_2DArray); + auto res = m_challenge_texture_map.insert_or_assign(name, g_gfx->CreateTexture(tex_config)); + res.first->second->Load(0, width, height, width, icon->rgba_data.data(), + sizeof(u32) * width * height); } - if (texture) + for (auto& [name, texture] : m_challenge_texture_map) { - ImGui::Image(texture.get(), ImVec2(static_cast(icon_itr->second->width), - static_cast(icon_itr->second->height))); + auto icon_itr = challenge_icons.find(name); + if (icon_itr == challenge_icons.end()) + { + m_challenge_texture_map.erase(name); + continue; + } + if (texture) + { + ImGui::Image(texture.get(), ImVec2(static_cast(icon_itr->second->width), + static_cast(icon_itr->second->height))); + } } + leaderboard_y -= ImGui::GetWindowHeight(); } + ImGui::End(); } - ImGui::End(); + if (!leaderboard_progress.empty()) + { + ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x, leaderboard_y), 0, + ImVec2(1.0, 1.0)); + ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f)); + if (ImGui::Begin("Leaderboards", nullptr, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoInputs | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoNav | + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing)) + { + for (const auto& value : leaderboard_progress) + ImGui::Text(value.data()); + } + ImGui::End(); + } } #endif // USE_RETRO_ACHIEVEMENTS @@ -400,7 +407,7 @@ void OnScreenUI::Finalize() DrawDebugText(); OSD::DrawMessages(); #ifdef USE_RETRO_ACHIEVEMENTS - DrawChallenges(); + DrawChallengesAndLeaderboards(); #endif // USE_RETRO_ACHIEVEMENTS ImGui::Render(); } diff --git a/Source/Core/VideoCommon/OnScreenUI.h b/Source/Core/VideoCommon/OnScreenUI.h index 9b7aa0d3f8..1acef96901 100644 --- a/Source/Core/VideoCommon/OnScreenUI.h +++ b/Source/Core/VideoCommon/OnScreenUI.h @@ -62,7 +62,7 @@ public: private: void DrawDebugText(); #ifdef USE_RETRO_ACHIEVEMENTS - void DrawChallenges(); + void DrawChallengesAndLeaderboards(); #endif // USE_RETRO_ACHIEVEMENTS // ImGui resources.