input-rec: display recording related information with imgui

This commit is contained in:
Tyler Wilding 2022-06-15 20:48:28 -04:00 committed by refractionpcsx2
parent 142a1a392f
commit b4db00b979
3 changed files with 57 additions and 1 deletions

View File

@ -388,7 +388,6 @@ void MainWindow::connectSignals()
connect(m_ui.actionInputRecStop, &QAction::triggered, this, &MainWindow::onInputRecStopActionTriggered);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionInputRecConsoleLogs, "Logging", "EnableInputRecordingLogs", false);
SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionInputRecControllerLogs, "Logging", "EnableControllerLogs", false);
connect(m_ui.actionInputRecControllerLogs, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged);
connect(m_ui.actionInputRecOpenViewer, &QAction::triggered, this, &MainWindow::onInputRecOpenViewer);
// These need to be queued connections to stop crashing due to menus opening/closing and switching focus.

View File

@ -48,6 +48,7 @@
#include "Frontend/InputManager.h"
#include "VMManager.h"
#endif
#include <pcsx2/Recording/InputRecording.h>
namespace ImGuiManager
{

View File

@ -46,6 +46,7 @@
#include "Frontend/ImGuiFullscreen.h"
#include "Frontend/InputManager.h"
#include "VMManager.h"
#include "pcsx2/Recording/InputRecording.h"
#endif
namespace ImGuiManager
@ -55,6 +56,7 @@ namespace ImGuiManager
#ifdef PCSX2_CORE
static void DrawSettingsOverlay();
static void DrawInputsOverlay();
static void DrawInputRecordingOverlay();
#endif
} // namespace ImGuiManager
@ -452,10 +454,64 @@ void ImGuiManager::DrawInputsOverlay()
#endif
#ifdef PCSX2_CORE
void ImGuiManager::DrawInputRecordingOverlay()
{
const float scale = ImGuiManager::GetGlobalScale();
const float shadow_offset = std::ceil(1.0f * scale);
const float margin = std::ceil(10.0f * scale);
const float spacing = std::ceil(5.0f * scale);
float position_y = margin;
ImFont* const fixed_font = ImGuiManager::GetFixedFont();
ImFont* const standard_font = ImGuiManager::GetStandardFont();
ImDrawList* dl = ImGui::GetBackgroundDrawList();
std::string text;
ImVec2 text_size;
bool first = true;
text.reserve(128);
#define DRAW_LINE(font, text, color) \
do \
{ \
text_size = font->CalcTextSizeA(font->FontSize, std::numeric_limits<float>::max(), -1.0f, (text), nullptr, nullptr); \
dl->AddText(font, font->FontSize, \
ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x + shadow_offset, position_y + shadow_offset), \
IM_COL32(0, 0, 0, 100), (text)); \
dl->AddText(font, font->FontSize, ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x, position_y), color, (text)); \
position_y += text_size.y + spacing; \
} while (0)
// TODO - is there a way to forcibly update the imgui frame without requiring to wait until the next vsync?
// TODO - icon list that would be nice to add
// - 'video' when screen capturing
if (g_InputRecording.isActive())
{
// Status Indicators
if (g_InputRecording.getControls().isRecording())
{
DRAW_LINE(standard_font, fmt::format("{} Recording", ICON_FA_CIRCLE).c_str(), IM_COL32(255, 0, 0, 255));
}
else
{
DRAW_LINE(standard_font, fmt::format("{} Replaying", ICON_FA_PLAY).c_str(), IM_COL32(97, 240, 84, 255));
}
// Input Recording Metadata
DRAW_LINE(fixed_font, fmt::format("Input Recording Active: {}", g_InputRecording.getData().getFilename()).c_str(), IM_COL32(117, 255, 241, 255));
DRAW_LINE(fixed_font, fmt::format("Frame: {}/{} ({})", g_InputRecording.getFrameCounter() + 1, g_InputRecording.getData().getTotalFrames(), g_FrameCount).c_str(), IM_COL32(117, 255, 241, 255));
DRAW_LINE(fixed_font, fmt::format("Undo Count: {}", g_InputRecording.getData().getUndoCount()).c_str(), IM_COL32(117, 255, 241, 255));
}
#undef DRAW_LINE
}
#endif
void ImGuiManager::RenderOverlays()
{
DrawPerformanceOverlay();
#ifdef PCSX2_CORE
DrawInputRecordingOverlay();
DrawSettingsOverlay();
DrawInputsOverlay();
#endif