Compare commits

..

No commits in common. "c0943bd084663d428e9b21fc30418f95a0c1e412" and "a8ab212931567dc49825f3d8697f8f12f32ed717" have entirely different histories.

5 changed files with 50 additions and 75 deletions

View file

@ -18,7 +18,7 @@ set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
set(SAVETOOL_PROJECT_VERSION 1.4.1) set(SAVETOOL_PROJECT_VERSION 1.4.0)
find_package(Corrade REQUIRED Main Containers Utility) find_package(Corrade REQUIRED Main Containers Utility)
find_package(Magnum REQUIRED GL Sdl2Application) find_package(Magnum REQUIRED GL Sdl2Application)

View file

@ -128,6 +128,15 @@ SaveTool::SaveTool(const Arguments& arguments):
initialiseConfiguration(); initialiseConfiguration();
switch(_framelimit) {
case Framelimit::Vsync:
setSwapInterval(1);
break;
case Framelimit::HalfVsync:
setSwapInterval(2);
break;
}
LOG_INFO("Initialising update checker."); LOG_INFO("Initialising update checker.");
curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_init(CURL_GLOBAL_DEFAULT);
if(_checkUpdatesOnStartup) { if(_checkUpdatesOnStartup) {
@ -145,8 +154,6 @@ SaveTool::SaveTool(const Arguments& arguments):
_uiState = UiState::Initialising; _uiState = UiState::Initialising;
_initThread = std::thread{[this]{ initialiseManager(); }}; _initThread = std::thread{[this]{ initialiseManager(); }};
} }
_timeline.start();
} }
SaveTool::~SaveTool() { SaveTool::~SaveTool() {
@ -163,8 +170,17 @@ SaveTool::~SaveTool() {
_conf.setValue("advanced_mode"_s, _advancedMode); _conf.setValue("advanced_mode"_s, _advancedMode);
_conf.setValue("startup_update_check"_s, _checkUpdatesOnStartup); _conf.setValue("startup_update_check"_s, _checkUpdatesOnStartup);
_conf.setValue("skip_disclaimer"_s, _skipDisclaimer); _conf.setValue("skip_disclaimer"_s, _skipDisclaimer);
_conf.setValue("swap_interval"_s, _swapInterval);
_conf.setValue("fps_cap"_s, _fpsCap); switch(_framelimit) {
case Framelimit::Vsync:
_conf.setValue("frame_limit"_s, "vsync"_s);
break;
case Framelimit::HalfVsync:
_conf.setValue("frame_limit"_s, "half_vsync"_s);
break;
default:
_conf.setValue("frame_limit"_s, "vsync"_s);
}
_conf.save(); _conf.save();
@ -181,14 +197,7 @@ void SaveTool::drawEvent() {
drawImGui(); drawImGui();
swapBuffers(); swapBuffers();
if(_swapInterval == 0 && _fpsCap < 301.0f) {
while(_timeline.currentFrameDuration() < (1.0f / _fpsCap));
}
redraw(); redraw();
_timeline.nextFrame();
} }
void SaveTool::viewportEvent(ViewportEvent& event) { void SaveTool::viewportEvent(ViewportEvent& event) {

View file

@ -23,11 +23,7 @@
#include <Corrade/Containers/String.h> #include <Corrade/Containers/String.h>
#include <Corrade/Utility/Configuration.h> #include <Corrade/Utility/Configuration.h>
#include <Corrade/Utility/Resource.h> #include <Corrade/Utility/Resource.h>
#ifdef SAVETOOL_DEBUG_BUILD
#include <Corrade/Utility/Tweakable.h>
#endif
#include <Magnum/Timeline.h>
#include <Magnum/Platform/Sdl2Application.h> #include <Magnum/Platform/Sdl2Application.h>
#include <Magnum/ImGuiIntegration/Context.h> #include <Magnum/ImGuiIntegration/Context.h>
@ -43,6 +39,8 @@
#include "../ToastQueue/ToastQueue.h" #include "../ToastQueue/ToastQueue.h"
#ifdef SAVETOOL_DEBUG_BUILD #ifdef SAVETOOL_DEBUG_BUILD
#include <Corrade/Utility/Tweakable.h>
#define tw CORRADE_TWEAKABLE #define tw CORRADE_TWEAKABLE
#endif #endif
@ -176,7 +174,7 @@ class SaveTool: public Platform::Sdl2Application, public efsw::FileWatchListener
// Also, func should be a lambda if there are any default arguments, like ImGui::Button(), etc... // Also, func should be a lambda if there are any default arguments, like ImGui::Button(), etc...
template<typename... Args> template<typename... Args>
void drawUnsafeText(const char* text, Args... args) { // Alternative to the above, for ImGui::Text*() variants. void drawUnsafeText(Containers::StringView text, Args... args) { // Alternative to the above, for ImGui::Text*() variants.
if(_gameState != GameState::NotRunning) { if(_gameState != GameState::NotRunning) {
ImGui::TextDisabled(text, std::forward<Args>(args)...); ImGui::TextDisabled(text, std::forward<Args>(args)...);
} }
@ -262,8 +260,10 @@ class SaveTool: public Platform::Sdl2Application, public efsw::FileWatchListener
}; };
Containers::StaticArray<2, efsw::WatchID> _watchIDs; Containers::StaticArray<2, efsw::WatchID> _watchIDs;
int _swapInterval = 1; enum class Framelimit: UnsignedByte {
float _fpsCap = 60.0f; Vsync,
HalfVsync
} _framelimit{Framelimit::Vsync};
bool _skipDisclaimer{false}; bool _skipDisclaimer{false};
bool _checkUpdatesOnStartup{true}; bool _checkUpdatesOnStartup{true};
@ -292,6 +292,4 @@ class SaveTool: public Platform::Sdl2Application, public efsw::FileWatchListener
bool _cheatMode{false}; bool _cheatMode{false};
bool _advancedMode{false}; bool _advancedMode{false};
Timeline _timeline;
}; };

View file

@ -79,31 +79,17 @@ void SaveTool::initialiseConfiguration() {
_conf.setValue("skip_disclaimer"_s, _skipDisclaimer); _conf.setValue("skip_disclaimer"_s, _skipDisclaimer);
} }
if(_conf.hasValue("swap_interval"_s)) {
_swapInterval = _conf.value<int>("swap_interval"_s);
}
else {
_conf.setValue("swap_interval"_s, 1);
}
if(_conf.hasValue("fps_cap"_s)) {
_fpsCap = _conf.value<float>("fps_cap");
}
else {
_conf.setValue("fps_cap", 60.0f);
}
if(_conf.hasValue("frame_limit"_s)) { if(_conf.hasValue("frame_limit"_s)) {
std::string frame_limit = _conf.value("frame_limit"_s); std::string frame_limit = _conf.value("frame_limit"_s);
if(frame_limit == "half_vsync"_s) { if(frame_limit == "half_vsync"_s) {
_swapInterval = 2; _framelimit = Framelimit::HalfVsync;
}
else {
_framelimit = Framelimit::Vsync;
} }
_conf.removeValue("frame_limit"_s);
} }
else {
setSwapInterval(_swapInterval); _conf.setValue("frame_limit"_s, "vsync"_s);
if(_swapInterval == 0) {
setMinimalLoopPeriod(0);
} }
_conf.save(); _conf.save();

View file

@ -55,49 +55,31 @@ void SaveTool::drawMainMenu() {
ImGui::Separator(); ImGui::Separator();
if(ImGui::BeginMenu(ICON_FA_COG " Settings")) { if(ImGui::BeginMenu(ICON_FA_COG " Settings")) {
ImGui::BeginGroup(); drawAlignedText("Frame limiter:");
drawAlignedText("Vertical sync:");
if(_swapInterval == 0) {
drawAlignedText("FPS cap:");
}
ImGui::EndGroup();
ImGui::SameLine(); ImGui::SameLine();
ImGui::BeginGroup(); static auto selection = static_cast<UnsignedByte>(_framelimit);
static const char* framelimit_labels[2] = {
static const char* framelimit_labels[] = { "V-sync",
"Off", "Half V-sync"
"Every VBLANK",
"Every second VBLANK",
"Every third VBLANK",
}; };
ImGui::PushItemWidth(300.0f); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
if(ImGui::BeginCombo("##FrameLimit", framelimit_labels[selection])) {
if(ImGui::BeginCombo("##FrameLimit", framelimit_labels[_swapInterval])) { if(ImGui::Selectable(framelimit_labels[0], _framelimit == Framelimit::Vsync)) {
for(int i = 0; i <= 3; i++) { selection = 0;
if(ImGui::Selectable(framelimit_labels[i], _swapInterval == i)) { _framelimit = Framelimit::Vsync;
_swapInterval = i; setSwapInterval(1);
setSwapInterval(i); }
if(i == 0) { if(ImGui::Selectable(framelimit_labels[1], _framelimit == Framelimit::HalfVsync)) {
setMinimalLoopPeriod(0); selection = 1;
} _framelimit = Framelimit::HalfVsync;
} setSwapInterval(2);
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
if(_swapInterval == 0) {
ImGui::SliderFloat("##FpsCapSlider", &_fpsCap, 15.0f, 301.0f,
_fpsCap != 301.0f ? "%.0f" : "Uncapped", ImGuiSliderFlags_AlwaysClamp);
}
ImGui::PopItemWidth();
ImGui::EndGroup();
ImGui::Checkbox("Cheat mode", &_cheatMode); ImGui::Checkbox("Cheat mode", &_cheatMode);
ImGui::SameLine(); ImGui::SameLine();
ImGui::AlignTextToFramePadding(); ImGui::AlignTextToFramePadding();