2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-15 08:46:10 +00:00

Make window size and position persistent

This commit is contained in:
2023-10-27 14:32:36 -07:00
parent c0e405cd55
commit a6392ab822
7 changed files with 87 additions and 4 deletions

View File

@@ -20,6 +20,12 @@ CVar::CVar(std::string_view name, std::string_view value, std::string_view help,
init(flags);
}
CVar::CVar(std::string_view name, const zeus::CVector2i& value, std::string_view help, EFlags flags)
: CVar(name, help, EType::Vec2i) {
fromVec2i(value);
init(flags);
}
CVar::CVar(std::string_view name, const zeus::CVector2f& value, std::string_view help, EFlags flags)
: CVar(name, help, EType::Vec2f) {
fromVec2f(value);
@@ -84,6 +90,23 @@ std::string CVar::help() const {
return m_help + (m_defaultValue.empty() ? "" : "\ndefault: " + m_defaultValue) + (isReadOnly() ? " [ReadOnly]" : "");
}
zeus::CVector2i CVar::toVec2i(bool* isValid) const {
if (m_type != EType::Vec2i) {
if (isValid != nullptr)
*isValid = false;
return {};
}
if (isValid != nullptr)
*isValid = true;
std::array<int, 2> f;
std::sscanf(m_value.c_str(), "%i %i", &f[0], &f[1]);
return {f[0], f[1]};
}
zeus::CVector2f CVar::toVec2f(bool* isValid) const {
if (m_type != EType::Vec2f) {
if (isValid != nullptr)
@@ -242,6 +265,15 @@ std::string CVar::toLiteral(bool* isValid) const {
return m_value;
}
bool CVar::fromVec2i(const zeus::CVector2i& val) {
if (!safeToModify(EType::Vec2i))
return false;
m_value.assign(fmt::format(FMT_STRING("{} {}"), val.x, val.y));
m_flags |= EFlags::Modified;
return true;
}
bool CVar::fromVec2f(const zeus::CVector2f& val) {
if (!safeToModify(EType::Vec2f))
return false;
@@ -433,6 +465,20 @@ void CVar::dispatch() {
}
}
bool isInt(std::string_view v) {
char* p;
std::strtol(v.data(), &p, 10);
return p != nullptr && *p == 0;
}
bool isInt(const std::vector<std::string>& v) {
for (auto& s : v) {
if (!isInt(s))
return false;
}
return true;
}
bool isReal(std::string_view v) {
char* p;
std::strtod(v.data(), &p);
@@ -468,6 +514,8 @@ bool CVar::isValidInput(std::string_view input) const {
}
case EType::Literal:
return true;
case EType::Vec2i:
return parts.size() == 2 && isInt(parts);
case EType::Vec2f:
case EType::Vec2d:
return parts.size() == 2 && isReal(parts);

View File

@@ -8,7 +8,7 @@
#include <vector>
namespace metaforce {
namespace StoreCVar {
enum class EType : uint32_t { Boolean, Signed, Unsigned, Real, Literal, Vec2f, Vec2d, Vec3f, Vec3d, Vec4f, Vec4d };
enum class EType : uint32_t { Boolean, Signed, Unsigned, Real, Literal, Vec2i, Vec2f, Vec2d, Vec3f, Vec3d, Vec4f, Vec4d };
enum class EFlags {
None = 0,
System = (1 << 0),
@@ -53,6 +53,7 @@ public:
using EFlags = StoreCVar::EFlags;
CVar(std::string_view name, std::string_view value, std::string_view help, EFlags flags);
CVar(std::string_view name, const zeus::CVector2i& value, std::string_view help, EFlags flags);
CVar(std::string_view name, const zeus::CVector2f& value, std::string_view help, EFlags flags);
CVar(std::string_view name, const zeus::CVector2d& value, std::string_view help, EFlags flags);
CVar(std::string_view name, const zeus::CVector3f& value, std::string_view help, EFlags flags);
@@ -72,6 +73,7 @@ public:
template <typename T>
inline bool toValue(T& value) const;
zeus::CVector2i toVec2i(bool* isValid = nullptr) const;
zeus::CVector2f toVec2f(bool* isValid = nullptr) const;
zeus::CVector2d toVec2d(bool* isValid = nullptr) const;
zeus::CVector3f toVec3f(bool* isValid = nullptr) const;
@@ -88,6 +90,7 @@ public:
inline bool fromValue(T value) {
return false;
}
bool fromVec2i(const zeus::CVector2i& val);
bool fromVec2f(const zeus::CVector2f& val);
bool fromVec2d(const zeus::CVector2d& val);
bool fromVec3f(const zeus::CVector3f& val);
@@ -101,6 +104,7 @@ public:
bool fromLiteral(std::string_view val);
bool fromLiteralToType(std::string_view val);
bool isVec2i() const { return m_type == EType::Vec2i; }
bool isVec2f() const { return m_type == EType::Vec2f; }
bool isVec2d() const { return m_type == EType::Vec2d; }
bool isVec3f() const { return m_type == EType::Vec3f; }

View File

@@ -19,6 +19,10 @@ CVarCommons::CVarCommons(CVarManager& manager) : m_mgr(manager) {
CVar::EFlags::System | CVar::EFlags::Archive | CVar::EFlags::ModifyRestart);
m_variableDt = m_mgr.findOrMakeCVar("variableDt", "Enable variable delta time (experimental)", false,
(CVar::EFlags::System | CVar::EFlags::Archive | CVar::EFlags::ModifyRestart));
m_windowSize = m_mgr.findOrMakeCVar("windowSize", "Stores the last known window size", zeus::CVector2i(1280, 960),
(CVar::EFlags::System | CVar::EFlags::Archive));
m_windowPos = m_mgr.findOrMakeCVar("windowPos", "Stores the last known window position", zeus::CVector2i(-1, -1),
(CVar::EFlags::System | CVar::EFlags::Archive));
m_debugOverlayPlayerInfo = m_mgr.findOrMakeCVar(
"debugOverlay.playerInfo"sv, "Displays information about the player, such as location and orientation"sv, false,
@@ -58,8 +62,8 @@ CVarCommons::CVarCommons(CVarManager& manager) : m_mgr(manager) {
m_mgr.findOrMakeCVar("debugOverlay.drawCallInfo"sv, "Displays the current number of draw calls per frame"sv,
false, CVar::EFlags::Game | CVar::EFlags::Archive | CVar::EFlags::ReadOnly);
m_debugOverlayBufferInfo =
m_mgr.findOrMakeCVar("debugOverlay.bufferInfo"sv, "Displays the current buffer memory usage per frame"sv,
false, CVar::EFlags::Game | CVar::EFlags::Archive | CVar::EFlags::ReadOnly);
m_mgr.findOrMakeCVar("debugOverlay.bufferInfo"sv, "Displays the current buffer memory usage per frame"sv, false,
CVar::EFlags::Game | CVar::EFlags::Archive | CVar::EFlags::ReadOnly);
m_debugOverlayShowInput = m_mgr.findOrMakeCVar("debugOverlay.showInput"sv, "Displays controller input"sv, false,
CVar::EFlags::Game | CVar::EFlags::Archive | CVar::EFlags::ReadOnly);
m_debugOverlayCorner =

View File

@@ -27,6 +27,8 @@ struct CVarCommons {
CVar* m_texAnisotropy = nullptr;
CVar* m_deepColor = nullptr;
CVar* m_variableDt = nullptr;
CVar* m_windowSize = nullptr;
CVar* m_windowPos = nullptr;
CVar* m_debugOverlayPlayerInfo = nullptr;
CVar* m_debugOverlayWorldInfo = nullptr;
@@ -68,6 +70,8 @@ struct CVarCommons {
void setSamples(uint32_t v) { m_drawSamples->fromInteger(std::max(uint32_t(1), v)); }
uint32_t getAnisotropy() const { return std::max(1u, uint32_t(m_texAnisotropy->toUnsigned())); }
zeus::CVector2i getWindowSize() const { return m_windowSize->toVec2i(); }
zeus::CVector2i getWindowPos() const { return m_windowPos->toVec2i(); }
void setAnisotropy(uint32_t v) { m_texAnisotropy->fromInteger(std::max(1u, v)); }

View File

@@ -37,6 +37,10 @@ public:
CVarManager(FileStoreManager& store, bool useBinary = false);
~CVarManager();
CVar* newCVar(std::string_view name, std::string_view help, const zeus::CVector2i& value, CVar::EFlags flags) {
return _newCVar<const zeus::CVector2i>(name, help, value, flags);
}
CVar* newCVar(std::string_view name, std::string_view help, const zeus::CVector2f& value, CVar::EFlags flags) {
return _newCVar<const zeus::CVector2f>(name, help, value, flags);
}