6#include <nlohmann/json.hpp>
10using json = nlohmann::json;
21 std::ifstream file(confPath);
33 catch (
const json::parse_error &e)
35 utl::Logger::log(
"Failed to parse JSON config (" + confPath.string() +
"): " + std::string(e.what()),
41 if (j.contains(
"audio"))
43 const auto &audio = j[
"audio"];
44 if (audio.contains(
"masterVolume") && audio[
"masterVolume"].is_number_float())
48 if (audio.contains(
"muted") && audio[
"muted"].is_boolean())
53 if (j.contains(
"camera"))
55 const auto &camera = j[
"camera"];
56 if (camera.contains(
"position") && camera[
"position"].is_array() && camera[
"position"].size() == 3)
58 if (
const auto &position = camera[
"position"];
59 position[0].is_number_float() && position[1].is_number_float() && position[2].is_number_float())
66 if (camera.contains(
"rotation") && camera[
"rotation"].is_array() && camera[
"rotation"].size() == 3)
68 if (
const auto &rotation = camera[
"rotation"];
69 rotation[0].is_number_float() && rotation[1].is_number_float() && rotation[2].is_number_float())
76 if (camera.contains(
"direction") && camera[
"direction"].is_array() && camera[
"direction"].size() == 3)
78 if (
const auto &direction = camera[
"direction"];
79 direction[0].is_number_float() && direction[1].is_number_float() && direction[2].is_number_float())
86 if (camera.contains(
"movementSpeed") && camera[
"movementSpeed"].is_number_float())
90 if (camera.contains(
"rotationSpeed") && camera[
"rotationSpeed"].is_number_float())
94 if (camera.contains(
"fov") && camera[
"fov"].is_number_unsigned())
98 if (camera.contains(
"nearPlane") && camera[
"nearPlane"].is_number_float())
102 if (camera.contains(
"farPlane") && camera[
"farPlane"].is_number_float())
107 if (j.contains(
"log"))
109 if (
const auto &log = j[
"log"]; log.contains(
"fps") && log[
"fps"].is_boolean())
114 if (j.contains(
"network"))
116 const auto &network = j[
"network"];
117 if (network.contains(
"host") && network[
"host"].is_string())
121 if (network.contains(
"port") && network[
"port"].is_number_unsigned())
126 if (j.contains(
"renderer"))
128 const auto &renderer = j[
"renderer"];
129 if (renderer.contains(
"vsync") && renderer[
"vsync"].is_boolean())
133 if (renderer.contains(
"frameRateLimit") && renderer[
"frameRateLimit"].is_number_unsigned())
137 if (renderer.contains(
"clearColor") && renderer[
"clearColor"].is_array() && renderer[
"clearColor"].size() == 4)
139 if (
const auto &clearColor = renderer[
"clearColor"];
140 clearColor[0].is_number_float() && clearColor[1].is_number_float() && clearColor[2].is_number_float() &&
141 clearColor[3].is_number_float())
150 if (j.contains(
"window"))
152 const auto &window = j[
"window"];
153 if (window.contains(
"width") && window[
"width"].is_number_unsigned())
157 if (window.contains(
"height") && window[
"height"].is_number_unsigned())
161 if (window.contains(
"fullscreen") && window[
"fullscreen"].is_boolean())
165 if (window.contains(
"name") && window[
"name"].is_string())
169 if (window.contains(
"iconPath") && window[
"iconPath"].is_string())
This file contains the Application class declaration.
This file contains the Logger class.
This file contains Path resolution utilities.
static EngineConfig parseEngineConf(const std::string &path)
Parse the engine configuration file.
static void log(const std::string &message, const LogLevel &logLevel)
Log a message with a specific log level.
static fs::path resolveRelativeToExe(const fs::path &relativePath)
Resolve a relative path to the executable directory.
static bool existsFile(const fs::path &path)
Check if a file exists.
static fs::path resolveRelativeToCwd(const fs::path &relativePath)
Struct for engine configuration.
Color renderer_clear_color
glm::vec3 camera_rotation
uint16_t renderer_frame_rate_limit
glm::vec3 camera_position
glm::vec3 camera_direction
float audio_master_volume
std::string window_icon_path