Magpie/Runtime/Config.cpp
2022-05-29 16:48:29 +08:00

106 lines
3 KiB
C++

#include "pch.h"
#include "Config.h"
#include "Logger.h"
enum class FlagMasks : UINT {
NoCursor = 0x1,
AdjustCursorSpeed = 0x2,
SaveEffectSources = 0x4,
SimulateExclusiveFullscreen = 0x8,
DisableLowLatency = 0x10,
BreakpointMode = 0x20,
DisableWindowResizing = 0x40,
DisableDirectFlip = 0x80,
Is3DMode = 0x100,
CropTitleBarOfUWP = 0x200,
DisableEffectCache = 0x400,
DisableVSync = 0x800,
WarningsAreErrors = 0x1000,
ShowFPS = 0x2000
};
bool Config::Initialize(float cursorZoomFactor, UINT cursorInterpolationMode, int adapterIdx, UINT multiMonitorUsage, const RECT& cropBorders, UINT flags) {
_cursorZoomFactor = cursorZoomFactor;
_cursorInterpolationMode = cursorInterpolationMode;
_adapterIdx = adapterIdx;
_multiMonitorUsage = multiMonitorUsage;
_cropBorders = cropBorders;
_isNoCursor = flags & (UINT)FlagMasks::NoCursor;
_isAdjustCursorSpeed = flags & (UINT)FlagMasks::AdjustCursorSpeed;
_isSaveEffectSources = flags & (UINT)FlagMasks::SaveEffectSources;
_isSimulateExclusiveFullscreen = flags & (UINT)FlagMasks::SimulateExclusiveFullscreen;
_isDisableLowLatency = flags & (UINT)FlagMasks::DisableLowLatency;
_isBreakpointMode = flags & (UINT)FlagMasks::BreakpointMode;
_isDisableWindowResizing = flags & (UINT)FlagMasks::DisableWindowResizing;
_isDisableDirectFlip = flags & (UINT)FlagMasks::DisableDirectFlip;
_is3DMode = flags & (UINT)FlagMasks::Is3DMode;
_isCropTitleBarOfUWP = flags & (UINT)FlagMasks::CropTitleBarOfUWP;
_isDisableEffectCache = flags & (UINT)FlagMasks::DisableEffectCache;
_isDisableVSync = flags & (UINT)FlagMasks::DisableVSync;
_isTreatWarningsAsErrors = flags & (UINT)FlagMasks::WarningsAreErrors;
_isShowFPS = flags & (UINT)FlagMasks::ShowFPS;
Logger::Get().Info(fmt::format(R"(运行时配置:
IsAdjustCursorSpeed: {}
IsDisableLowLatency: {}
IsBreakpointMode: {}
IsDisableWindowResizing: {}
IsDisableDirectFlip: {}
Is3DMode: {}
AdapterIdx: {}
IsCropTitleBarOfUWP: {}
GetMultiMonitorUsage: {}
IsNoCursor: {}
IsDisableEffectCache: {}
IsDisableVSync: {}
IsSimulateExclusiveFullscreen: {}
CursorInterpolationMode: {}
CropBorders: [{}, {}, {}, {}]
IsShowFPS: {})",
IsAdjustCursorSpeed(),
IsDisableLowLatency(),
IsBreakpointMode(),
IsDisableWindowResizing(),
IsDisableDirectFlip(),
Is3DMode(),
GetAdapterIdx(),
IsCropTitleBarOfUWP(),
GetMultiMonitorUsage(),
IsNoCursor(),
IsDisableEffectCache(),
IsDisableVSync(),
IsSimulateExclusiveFullscreen(),
GetCursorInterpolationMode(),
cropBorders.left, cropBorders.top, cropBorders.right, cropBorders.bottom,
IsShowFPS()
));
return true;
}
void Config::SetShowFPS(bool value) noexcept {
if (value == _isShowFPS) {
return;
}
_isShowFPS = value;
for (const auto& cb : _showFPSCbs) {
_queuedCbs.push_front(cb);
}
}
void Config::OnBeginFrame() {
// 最多处理 3 次,以避免陷入回调循环
for (int i = 0; i < 3 && !_queuedCbs.empty(); ++i) {
std::deque<std::function<void()>> cbs = std::move(_queuedCbs);
_queuedCbs.clear();
for (auto& cb : cbs) {
cb();
}
}
}