mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
d819d6da05
Some checks failed
Lint / 📝 Optional Checks (push) Has been cancelled
Build / 🖥️ Windows (push) Has been cancelled
Build / 🐧 Linux (push) Has been cancelled
Build / 🍎 MacOS (push) Has been cancelled
Inform Pages Repo / Generate Documentation (push) Has been cancelled
Lint / 📝 Formatting (push) Has been cancelled
Lint / 📝 Required Checks (push) Has been cancelled
Fixes https://github.com/open-goal/jak-project/issues/3563 These users have the following spamming in logs: > OpenGL error 0x502 S8246 T824C: GL_INVALID_OPERATION error generated. Source and destination dimensions must be identical with the current filtering modes. And the solution is to correctly set their game-size. The way this change accomplishes that is by confirming whether or not the set `game-size` is a valid resolution informed by SDL, if not, it defaults to the monitor's currently set display mode's resolution. This also moves the selected display id, and the display mode into the C++ settings -- closer to where it's actually managed and used. I'm tempted to do this eventually for the resolutions as well but that stuff is much more burdensome. This hopefully simplifies debugging, reduces startup flickering, and removes back-and-forth complexity. Hopefully this makes debugging display related problems easier. It also adds a bunch more logging to the related code.
159 lines
5.3 KiB
C++
159 lines
5.3 KiB
C++
#include "settings.h"
|
|
|
|
#include "common/log/log.h"
|
|
#include "common/util/json_util.h"
|
|
|
|
#include "game/runtime.h"
|
|
|
|
namespace game_settings {
|
|
|
|
void to_json(json& j, const DebugSettings& obj) {
|
|
json_serialize(version);
|
|
json_serialize(show_imgui);
|
|
json_serialize(imgui_font_size);
|
|
json_serialize(monospaced_font);
|
|
json_serialize(alternate_style);
|
|
json_serialize(ignore_hide_imgui);
|
|
json_serialize(text_filters);
|
|
json_serialize(text_check_range);
|
|
json_serialize(text_max_range);
|
|
json_serialize(hide_imgui_key);
|
|
}
|
|
|
|
void from_json(const json& j, DebugSettings& obj) {
|
|
json_deserialize_if_exists(version);
|
|
json_deserialize_if_exists(show_imgui);
|
|
json_deserialize_if_exists(imgui_font_size);
|
|
json_deserialize_if_exists(monospaced_font);
|
|
json_deserialize_if_exists(alternate_style);
|
|
json_deserialize_if_exists(ignore_hide_imgui);
|
|
json_deserialize_if_exists(text_filters);
|
|
json_deserialize_if_exists(text_check_range);
|
|
json_deserialize_if_exists(text_max_range);
|
|
json_deserialize_if_exists(hide_imgui_key);
|
|
}
|
|
|
|
DebugSettings::DebugSettings() {}
|
|
|
|
void DebugSettings::load_settings() {
|
|
try {
|
|
std::string file_path =
|
|
(file_util::get_user_misc_dir(g_game_version) / "debug-settings.json").string();
|
|
if (!file_util::file_exists(file_path)) {
|
|
return;
|
|
}
|
|
lg::info("Loading debug settings at {}", file_path);
|
|
auto raw = file_util::read_text_file(file_path);
|
|
from_json(parse_commented_json(raw, "debug-settings.json"), *this);
|
|
} catch (std::exception& e) {
|
|
// do nothing
|
|
lg::error("Error encountered when attempting to load debug settings {}", e.what());
|
|
// TODO - make sure a bad debug-settings.json is fine, check others below as well
|
|
}
|
|
}
|
|
|
|
void DebugSettings::save_settings() {
|
|
// Update the version string as we are now saving it back ground
|
|
version = current_version;
|
|
json data = *this;
|
|
auto debug_settings_filename =
|
|
file_util::get_user_misc_dir(g_game_version) / "debug-settings.json";
|
|
file_util::create_dir_if_needed_for_file(debug_settings_filename);
|
|
file_util::write_text_file(debug_settings_filename, data.dump(2));
|
|
}
|
|
|
|
void to_json(json& j, const DisplaySettings& obj) {
|
|
json_serialize(version);
|
|
json_serialize(display_id);
|
|
json_serialize(window_xpos);
|
|
json_serialize(window_ypos);
|
|
json_serialize(display_mode);
|
|
}
|
|
void from_json(const json& j, DisplaySettings& obj) {
|
|
json_deserialize_if_exists(version);
|
|
json_deserialize_if_exists(display_id);
|
|
json_deserialize_if_exists(window_xpos);
|
|
json_deserialize_if_exists(window_ypos);
|
|
if (j.contains("display_mode")) {
|
|
int mode = j.at("display_mode");
|
|
obj.display_mode = static_cast<DisplaySettings::DisplayMode>(mode);
|
|
}
|
|
}
|
|
|
|
DisplaySettings::DisplaySettings() {}
|
|
|
|
void DisplaySettings::load_settings() {
|
|
try {
|
|
std::string file_path =
|
|
(file_util::get_user_settings_dir(g_game_version) / "display-settings.json").string();
|
|
if (!file_util::file_exists(file_path)) {
|
|
return;
|
|
}
|
|
lg::info("Loading display settings at {}", file_path);
|
|
auto raw = file_util::read_text_file(file_path);
|
|
from_json(parse_commented_json(raw, "display-settings.json"), *this);
|
|
} catch (std::exception& e) {
|
|
// do nothing
|
|
lg::error("Error encountered when attempting to load display settings {}", e.what());
|
|
}
|
|
}
|
|
|
|
void DisplaySettings::save_settings() {
|
|
// Update the version string as we are now saving it back ground
|
|
version = current_version;
|
|
json data = *this;
|
|
auto file_path = file_util::get_user_settings_dir(g_game_version) / "display-settings.json";
|
|
file_util::create_dir_if_needed_for_file(file_path);
|
|
file_util::write_text_file(file_path, data.dump(2));
|
|
}
|
|
|
|
void to_json(json& j, const InputSettings& obj) {
|
|
json_serialize(version);
|
|
json_serialize(last_selected_controller_guid);
|
|
json_serialize(controller_port_mapping);
|
|
json_serialize(controller_binds);
|
|
json_serialize(keyboard_binds);
|
|
json_serialize(mouse_binds);
|
|
json_serialize(keyboard_enabled);
|
|
}
|
|
|
|
void from_json(const json& j, InputSettings& obj) {
|
|
json_deserialize_if_exists(version);
|
|
json_deserialize_if_exists(last_selected_controller_guid);
|
|
json_deserialize_if_exists(controller_port_mapping);
|
|
json_deserialize_if_exists(controller_binds);
|
|
json_deserialize_if_exists(keyboard_binds);
|
|
json_deserialize_if_exists(mouse_binds);
|
|
json_deserialize_if_exists(keyboard_enabled);
|
|
}
|
|
|
|
InputSettings::InputSettings() {}
|
|
|
|
void InputSettings::load_settings() {
|
|
try {
|
|
keyboard_binds = DEFAULT_KEYBOARD_BINDS;
|
|
mouse_binds = DEFAULT_MOUSE_BINDS;
|
|
std::string file_path =
|
|
(file_util::get_user_settings_dir(g_game_version) / "input-settings.json").string();
|
|
if (!file_util::file_exists(file_path)) {
|
|
return;
|
|
}
|
|
lg::info("Loading input settings at {}", file_path);
|
|
auto raw = file_util::read_text_file(file_path);
|
|
from_json(parse_commented_json(raw, "input-settings.json"), *this);
|
|
} catch (std::exception& e) {
|
|
// do nothing
|
|
lg::error("Error encountered when attempting to load input settings {}", e.what());
|
|
}
|
|
}
|
|
|
|
void InputSettings::save_settings() {
|
|
// Update the version string as we are now saving it back ground
|
|
version = current_version;
|
|
json data = *this;
|
|
auto file_path = file_util::get_user_settings_dir(g_game_version) / "input-settings.json";
|
|
file_util::create_dir_if_needed_for_file(file_path);
|
|
file_util::write_text_file(file_path, data.dump(2));
|
|
}
|
|
} // namespace game_settings
|