mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-26 12:16:20 +00:00
sort of working save states
This commit is contained in:
parent
5fa1476592
commit
76adf9000e
11 changed files with 74 additions and 31 deletions
|
@ -2008,7 +2008,7 @@ void CEXISlippi::handleUpdateAppRequest()
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
CriticalAlertT("Automatic updates are not available for macOS, please update manually.");
|
CriticalAlertT("Automatic updates are not available for macOS, please update manually.");
|
||||||
#else
|
#else
|
||||||
// main_frame->LowerRenderWindow(); SLIPPITODO: figure out replacement // mainwindow hide render widget
|
Host_LowerWindow();
|
||||||
user->UpdateApp();
|
user->UpdateApp();
|
||||||
Host_Exit();
|
Host_Exit();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -46,3 +46,4 @@ void Host_YieldToUI();
|
||||||
void Host_TitleChanged();
|
void Host_TitleChanged();
|
||||||
void Host_LowerWindow();
|
void Host_LowerWindow();
|
||||||
void Host_Exit();
|
void Host_Exit();
|
||||||
|
void Host_PlaybackSeek();
|
||||||
|
|
|
@ -175,11 +175,11 @@ void SlippiPlaybackStatus::SavestateThread()
|
||||||
INFO_LOG(SLIPPI, "Exiting savestate thread");
|
INFO_LOG(SLIPPI, "Exiting savestate thread");
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlippiPlaybackStatus::SeekToFrame(s32 frameNum)
|
void SlippiPlaybackStatus::SeekToFrame()
|
||||||
{
|
{
|
||||||
if (seekMtx.try_lock()) {
|
if (seekMtx.try_lock()) {
|
||||||
if (frameNum < Slippi::PLAYBACK_FIRST_SAVE || frameNum > lastFrame) {
|
if (targetFrameNum < Slippi::PLAYBACK_FIRST_SAVE || targetFrameNum > lastFrame) {
|
||||||
INFO_LOG(SLIPPI, "Error: Invalid seek to frame: %d", frameNum);
|
INFO_LOG(SLIPPI, "Error: Invalid seek to frame: %d", targetFrameNum);
|
||||||
seekMtx.unlock();
|
seekMtx.unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -193,13 +193,14 @@ void SlippiPlaybackStatus::SeekToFrame(s32 frameNum)
|
||||||
if (prevState != Core::State::Paused)
|
if (prevState != Core::State::Paused)
|
||||||
Core::SetState(Core::State::Paused);
|
Core::SetState(Core::State::Paused);
|
||||||
|
|
||||||
s32 closestStateFrame = frameNum - emod(frameNum - Slippi::PLAYBACK_FIRST_SAVE, FRAME_INTERVAL);
|
s32 closestStateFrame = targetFrameNum - emod(targetFrameNum - Slippi::PLAYBACK_FIRST_SAVE, FRAME_INTERVAL);
|
||||||
bool isLoadingStateOptimal = frameNum < currentPlaybackFrame || closestStateFrame > currentPlaybackFrame;
|
bool isLoadingStateOptimal = targetFrameNum < currentPlaybackFrame || closestStateFrame > currentPlaybackFrame;
|
||||||
if (isLoadingStateOptimal)
|
if (isLoadingStateOptimal)
|
||||||
{
|
{
|
||||||
if (closestStateFrame <= Slippi::PLAYBACK_FIRST_SAVE)
|
if (closestStateFrame <= Slippi::PLAYBACK_FIRST_SAVE)
|
||||||
{
|
{
|
||||||
State::LoadFromBuffer(iState);
|
State::LoadFromBuffer(iState);
|
||||||
|
INFO_LOG(SLIPPI, "loaded a state");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -216,18 +217,17 @@ void SlippiPlaybackStatus::SeekToFrame(s32 frameNum)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fastforward until we get to the frame we want
|
// Fastforward until we get to the frame we want
|
||||||
if (frameNum != closestStateFrame && frameNum != lastFrame)
|
if (targetFrameNum != closestStateFrame && targetFrameNum != lastFrame)
|
||||||
{
|
{
|
||||||
isHardFFW = true;
|
isHardFFW = true;
|
||||||
SConfig::GetInstance().m_OCEnable = true;
|
SConfig::GetInstance().m_OCEnable = true;
|
||||||
SConfig::GetInstance().m_OCFactor = 4.0f;
|
SConfig::GetInstance().m_OCFactor = 4.0f;
|
||||||
|
|
||||||
Core::SetState(Core::State::Running);
|
Core::SetState(Core::State::Running);
|
||||||
cv_waitingForTargetFrame.wait(ffwLock);
|
cv_waitingForTargetFrame.wait(ffwLock);
|
||||||
Core::SetState(Core::State::Paused);
|
Core::SetState(Core::State::Paused);
|
||||||
|
|
||||||
SConfig::GetInstance().m_OCFactor = 1.0f;
|
SConfig::GetInstance().m_OCFactor = 1.0f;
|
||||||
SConfig::GetInstance().m_OCEnable = false;
|
SConfig::GetInstance().m_OCEnable = false;
|
||||||
|
targetFrameNum = INT_MAX;
|
||||||
isHardFFW = false;
|
isHardFFW = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,10 +32,10 @@ public:
|
||||||
void startThreads(void);
|
void startThreads(void);
|
||||||
void resetPlayback(void);
|
void resetPlayback(void);
|
||||||
void prepareSlippiPlayback(s32& frameIndex);
|
void prepareSlippiPlayback(s32& frameIndex);
|
||||||
|
void SeekToFrame();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SavestateThread(void);
|
void SavestateThread(void);
|
||||||
void SeekToFrame(s32 targetFrameNum);
|
|
||||||
void processInitialState();
|
void processInitialState();
|
||||||
void clearWatchSettingsStartEnd();
|
void clearWatchSettingsStartEnd();
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,7 @@ void Host_TitleChanged()
|
||||||
|
|
||||||
void Host_LowerWindow() {}
|
void Host_LowerWindow() {}
|
||||||
void Host_Exit() {}
|
void Host_Exit() {}
|
||||||
|
void Host_PlaybackSeek() {}
|
||||||
|
|
||||||
static std::unique_ptr<Platform> GetPlatform(const optparse::Values& options)
|
static std::unique_ptr<Platform> GetPlatform(const optparse::Values& options)
|
||||||
{
|
{
|
||||||
|
|
|
@ -183,3 +183,8 @@ void Host_Exit()
|
||||||
{
|
{
|
||||||
Host::GetInstance()->RequestExit();
|
Host::GetInstance()->RequestExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Host_PlaybackSeek()
|
||||||
|
{
|
||||||
|
Host::GetInstance()->RequestSeek();
|
||||||
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ signals:
|
||||||
void NotifyMapLoaded();
|
void NotifyMapLoaded();
|
||||||
void RequestLowerWindow();
|
void RequestLowerWindow();
|
||||||
void RequestExit();
|
void RequestExit();
|
||||||
|
void RequestSeek();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Host();
|
Host();
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
#include "Core/State.h"
|
#include "Core/State.h"
|
||||||
|
#include "Core/Slippi/SlippiPlayback.h"
|
||||||
|
|
||||||
#include "DolphinQt/Host.h"
|
#include "DolphinQt/Host.h"
|
||||||
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
||||||
|
@ -41,6 +42,8 @@
|
||||||
#include "VideoCommon/VertexShaderManager.h"
|
#include "VideoCommon/VertexShaderManager.h"
|
||||||
#include "VideoCommon/VideoConfig.h"
|
#include "VideoCommon/VideoConfig.h"
|
||||||
|
|
||||||
|
extern std::unique_ptr<SlippiPlaybackStatus> g_playbackStatus;
|
||||||
|
|
||||||
RenderWidget::RenderWidget(QWidget* parent) : QWidget(parent)
|
RenderWidget::RenderWidget(QWidget* parent) : QWidget(parent)
|
||||||
{
|
{
|
||||||
setWindowTitle(QStringLiteral("Dolphin"));
|
setWindowTitle(QStringLiteral("Dolphin"));
|
||||||
|
@ -63,6 +66,7 @@ RenderWidget::RenderWidget(QWidget* parent) : QWidget(parent)
|
||||||
});
|
});
|
||||||
connect(Host::GetInstance(), &Host::RequestLowerWindow, this, &RenderWidget::LowerWindow);
|
connect(Host::GetInstance(), &Host::RequestLowerWindow, this, &RenderWidget::LowerWindow);
|
||||||
connect(Host::GetInstance(), &Host::RequestExit, this, &RenderWidget::Exit);
|
connect(Host::GetInstance(), &Host::RequestExit, this, &RenderWidget::Exit);
|
||||||
|
connect(Host::GetInstance(), &Host::RequestSeek, this, &RenderWidget::PlaybackSeek);
|
||||||
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [this](Core::State state) {
|
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [this](Core::State state) {
|
||||||
if (state == Core::State::Running)
|
if (state == Core::State::Running)
|
||||||
SetImGuiKeyMap();
|
SetImGuiKeyMap();
|
||||||
|
@ -353,4 +357,9 @@ void RenderWidget::Exit()
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderWidget::PlaybackSeek()
|
||||||
|
{
|
||||||
|
g_playbackStatus->SeekToFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ private:
|
||||||
void dropEvent(QDropEvent* event) override;
|
void dropEvent(QDropEvent* event) override;
|
||||||
void LowerWindow();
|
void LowerWindow();
|
||||||
void Exit();
|
void Exit();
|
||||||
|
void PlaybackSeek();
|
||||||
|
|
||||||
static constexpr int MOUSE_HIDE_DELAY = 3000;
|
static constexpr int MOUSE_HIDE_DELAY = 3000;
|
||||||
QTimer* m_mouse_timer;
|
QTimer* m_mouse_timer;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "Common/Timer.h"
|
#include "Common/Timer.h"
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
|
#include "Core/Host.h"
|
||||||
#include "Core/Slippi/SlippiPlayback.h"
|
#include "Core/Slippi/SlippiPlayback.h"
|
||||||
#include "VideoCommon/OnScreenDisplay.h"
|
#include "VideoCommon/OnScreenDisplay.h"
|
||||||
#include "VideoCommon/IconsFontAwesome4.h"
|
#include "VideoCommon/IconsFontAwesome4.h"
|
||||||
|
@ -45,7 +46,17 @@ struct Message
|
||||||
};
|
};
|
||||||
static std::multimap<MessageType, Message> s_messages;
|
static std::multimap<MessageType, Message> s_messages;
|
||||||
static std::mutex s_messages_mutex;
|
static std::mutex s_messages_mutex;
|
||||||
static int frame = 0;
|
static s32 frame = 0;
|
||||||
|
|
||||||
|
static std::string GetTimeForFrame(s32 currFrame) {
|
||||||
|
int currSeconds = int((currFrame - Slippi::GAME_FIRST_FRAME) / 60);
|
||||||
|
int currMinutes = (int)(currSeconds / 60);
|
||||||
|
int currRemainder = (int)(currSeconds % 60);
|
||||||
|
// Position string (i.e. MM:SS)
|
||||||
|
char currTime[6];
|
||||||
|
sprintf(currTime, "%02d:%02d", currMinutes, currRemainder);
|
||||||
|
return std::string(currTime);
|
||||||
|
}
|
||||||
|
|
||||||
u32 idle_tick = Common::Timer::GetTimeMs();
|
u32 idle_tick = Common::Timer::GetTimeMs();
|
||||||
ImVec2 prev_mouse(0,0);
|
ImVec2 prev_mouse(0,0);
|
||||||
|
@ -217,16 +228,6 @@ bool SliderCustomBehavior(const ImRect& bb, ImGuiID id, int* v, int v_min, int v
|
||||||
bool isActive = g.ActiveId == id;
|
bool isActive = g.ActiveId == id;
|
||||||
static bool isHeld = false;
|
static bool isHeld = false;
|
||||||
const bool hovered = ImGui::ItemHoverable(bb, id);
|
const bool hovered = ImGui::ItemHoverable(bb, id);
|
||||||
if (isHeld) {
|
|
||||||
isHeld = isHeld && isDown;
|
|
||||||
// If no longer held, slider was let go. Trigger mark edited
|
|
||||||
if (!isHeld) {
|
|
||||||
INFO_LOG(SLIPPI, "Do seek here!");
|
|
||||||
ImGui::MarkItemEdited(id); // TODO only mark on mouse up
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
isHeld = hovered && isDown;
|
|
||||||
|
|
||||||
if (!isDown && isActive)
|
if (!isDown && isActive)
|
||||||
ImGui::ClearActiveID();
|
ImGui::ClearActiveID();
|
||||||
|
@ -239,7 +240,6 @@ bool SliderCustomBehavior(const ImRect& bb, ImGuiID id, int* v, int v_min, int v
|
||||||
if (axis == ImGuiAxis_Y)
|
if (axis == ImGuiAxis_Y)
|
||||||
clicked_t = 1.0f - clicked_t;
|
clicked_t = 1.0f - clicked_t;
|
||||||
|
|
||||||
|
|
||||||
if (is_power)
|
if (is_power)
|
||||||
{
|
{
|
||||||
if (clicked_t < linear_zero_pos)
|
if (clicked_t < linear_zero_pos)
|
||||||
|
@ -268,10 +268,21 @@ bool SliderCustomBehavior(const ImRect& bb, ImGuiID id, int* v, int v_min, int v
|
||||||
if (*v != new_value && isDown)
|
if (*v != new_value && isDown)
|
||||||
{
|
{
|
||||||
*v = new_value;
|
*v = new_value;
|
||||||
value_changed = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isHeld) {
|
||||||
|
isHeld = isHeld && isDown;
|
||||||
|
// If no longer held, slider was let go. Trigger mark edited
|
||||||
|
if (!isHeld) {
|
||||||
|
INFO_LOG(SLIPPI, "Seeking to frame %d!", *v);
|
||||||
|
value_changed = true;
|
||||||
|
g_playbackStatus->targetFrameNum = *v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
isHeld = hovered && isDown;
|
||||||
|
|
||||||
float new_grab_t = ImGui::SliderCalcRatioFromValueT<int, float>(ImGuiDataType_S32, new_value, v_min, v_max, power, linear_zero_pos);
|
float new_grab_t = ImGui::SliderCalcRatioFromValueT<int, float>(ImGuiDataType_S32, new_value, v_min, v_max, power, linear_zero_pos);
|
||||||
float curr_grab_t = ImGui::SliderCalcRatioFromValueT<int, float>(ImGuiDataType_S32, *v, v_min, v_max, power, linear_zero_pos);
|
float curr_grab_t = ImGui::SliderCalcRatioFromValueT<int, float>(ImGuiDataType_S32, *v, v_min, v_max, power, linear_zero_pos);
|
||||||
|
|
||||||
|
@ -297,7 +308,7 @@ bool SliderCustomBehavior(const ImRect& bb, ImGuiID id, int* v, int v_min, int v
|
||||||
|
|
||||||
// Darken screen when seeking
|
// Darken screen when seeking
|
||||||
if (isHeld)
|
if (isHeld)
|
||||||
window->DrawList->AddRectFilled(ImVec2(0, 0), ImGui::GetIO().DisplaySize, ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 0.0f, 0.0f, 0.5f)));
|
window->DrawList->AddRectFilled(ImVec2(0, 0), ImGui::GetIO().DisplaySize, ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 0.0f, 0.0f, 0.6f)));
|
||||||
|
|
||||||
window->DrawList->AddRectFilled(ImVec2(0, ImGui::GetWindowHeight() - 36), ImVec2(ImGui::GetWindowWidth(), ImGui::GetWindowHeight()), ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 0.0f, 0.0f, 0.75f * style.Alpha)));
|
window->DrawList->AddRectFilled(ImVec2(0, ImGui::GetWindowHeight() - 36), ImVec2(ImGui::GetWindowWidth(), ImGui::GetWindowHeight()), ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 0.0f, 0.0f, 0.75f * style.Alpha)));
|
||||||
|
|
||||||
|
@ -305,19 +316,21 @@ bool SliderCustomBehavior(const ImRect& bb, ImGuiID id, int* v, int v_min, int v
|
||||||
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(bb.Max.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(1.0f, 1.0f, 1.0f, 0.5f * style.Alpha)), 4);
|
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(bb.Max.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(1.0f, 1.0f, 1.0f, 0.5f * style.Alpha)), 4);
|
||||||
|
|
||||||
// Whiter, more opaque line up to mouse position
|
// Whiter, more opaque line up to mouse position
|
||||||
if (hovered && !isDown)
|
if (hovered && !isHeld)
|
||||||
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(new_grab_bb.Min.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(1.0f, 1.0f, 1.0f, style.Alpha)), 4);
|
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(new_grab_bb.Min.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(1.0f, 1.0f, 1.0f, style.Alpha)), 4);
|
||||||
|
|
||||||
|
if (hovered || isHeld)
|
||||||
|
window->DrawList->AddText(ImVec2(new_grab_bb.GetCenter().x - valuesize.x / 2, bb.Max.y - 30), ImColor(255, 255, 255), GetTimeForFrame(new_value).c_str());
|
||||||
|
|
||||||
// Colored line, circle indicator, and text
|
// Colored line, circle indicator, and text
|
||||||
if (isHeld) {
|
if (isHeld) {
|
||||||
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(new_grab_bb.Min.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 1.0f, 0.0f, style.Alpha)), 4);
|
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(new_grab_bb.Min.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0)), 4);
|
||||||
window->DrawList->AddCircleFilled(ImVec2(new_grab_bb.Min.x, new_grab_bb.Max.y - 6), 6, ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 1.0f, 0.0f, style.Alpha)));
|
window->DrawList->AddCircleFilled(ImVec2(new_grab_bb.Min.x, new_grab_bb.Max.y - 6), 6, ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0)));
|
||||||
window->DrawList->AddText(ImVec2(new_grab_bb.GetCenter().x - valuesize.x / 2, bb.Max.y - 30), ImColor(255, 255, 255), value, label);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Progress bar
|
// Progress bar
|
||||||
if (!isHeld)
|
if (!isHeld)
|
||||||
frame = g_playbackStatus->currentPlaybackFrame;
|
frame = (g_playbackStatus->targetFrameNum == INT_MAX) ? g_playbackStatus->currentPlaybackFrame : g_playbackStatus->targetFrameNum;
|
||||||
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(curr_grab_bb.Min.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 1.0f, 0.0f, style.Alpha)), 4);
|
window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Max.y - 6), ImVec2(curr_grab_bb.Min.x, bb.Max.y - 6), ImGui::ColorConvertFloat4ToU32(ImVec4(0.0f, 1.0f, 0.0f, style.Alpha)), 4);
|
||||||
|
|
||||||
return value_changed;
|
return value_changed;
|
||||||
|
@ -403,7 +416,10 @@ void DrawSlippiPlaybackControls()
|
||||||
{
|
{
|
||||||
ImGui::PushItemWidth(ImGui::GetWindowWidth());
|
ImGui::PushItemWidth(ImGui::GetWindowWidth());
|
||||||
ImGui::SetCursorPos(ImVec2(0.0f, ImGui::GetWindowHeight() - 44));
|
ImGui::SetCursorPos(ImVec2(0.0f, ImGui::GetWindowHeight() - 44));
|
||||||
SliderCustom("", ImVec4(1.0f, 0.0f, 0.0f, 1.0f), &frame, 0, 8000, 1.0, "%d");
|
if (SliderCustom("", ImVec4(1.0f, 0.0f, 0.0f, 1.0f), &frame, Slippi::PLAYBACK_FIRST_SAVE, g_playbackStatus->lastFrame, 1.0, "%d")) {
|
||||||
|
INFO_LOG(SLIPPI, "seek");
|
||||||
|
Host_PlaybackSeek();
|
||||||
|
}
|
||||||
ImGui::SetCursorPos(ImVec2(0.0f, ImGui::GetWindowHeight() - 30));
|
ImGui::SetCursorPos(ImVec2(0.0f, ImGui::GetWindowHeight() - 30));
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f));
|
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f));
|
||||||
if (ButtonCustom(ICON_FA_PLAY, ImVec2(32.0f, 32.0f))) {
|
if (ButtonCustom(ICON_FA_PLAY, ImVec2(32.0f, 32.0f))) {
|
||||||
|
@ -426,6 +442,13 @@ void DrawSlippiPlaybackControls()
|
||||||
if (ButtonCustom(ICON_FA_FAST_FORWARD, ImVec2(32.0f, 32.0f))) {
|
if (ButtonCustom(ICON_FA_FAST_FORWARD, ImVec2(32.0f, 32.0f))) {
|
||||||
INFO_LOG(SLIPPI, "fast_foward");
|
INFO_LOG(SLIPPI, "fast_foward");
|
||||||
}
|
}
|
||||||
|
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
||||||
|
ImGui::SetCursorPos(ImVec2(180.0f, window->DC.CursorPosPrevLine.y + 6.0f));
|
||||||
|
|
||||||
|
auto playbackTime = GetTimeForFrame(g_playbackStatus->currentPlaybackFrame);
|
||||||
|
auto endTime = GetTimeForFrame(g_playbackStatus->lastFrame);
|
||||||
|
auto timeString = playbackTime + " / " + endTime;
|
||||||
|
ImGui::Text(timeString.c_str());
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
|
@ -919,7 +919,9 @@ bool Renderer::InitializeImGui()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::GetIO().Fonts->AddFontDefault();
|
ImFontConfig config;
|
||||||
|
config.MergeMode = true;
|
||||||
|
ImGui::GetIO().Fonts->AddFontFromFileTTF("Roboto-Medium.ttf", 14.0f, 0, ImGui::GetIO().Fonts->GetGlyphRangesDefault());
|
||||||
static const ImWchar icons_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
|
static const ImWchar icons_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
|
||||||
ImFontConfig icons_config; icons_config.MergeMode = true; icons_config.PixelSnapH = true;
|
ImFontConfig icons_config; icons_config.MergeMode = true; icons_config.PixelSnapH = true;
|
||||||
ImGui::GetIO().Fonts->AddFontFromFileTTF(FONT_ICON_FILE_NAME_FA, 20.0f, &icons_config, icons_ranges);
|
ImGui::GetIO().Fonts->AddFontFromFileTTF(FONT_ICON_FILE_NAME_FA, 20.0f, &icons_config, icons_ranges);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue