From df18d77a7250253aaaedc0b18f9cef9ce0607369 Mon Sep 17 00:00:00 2001 From: Joey Pollack Date: Wed, 18 May 2022 15:27:02 -0400 Subject: [PATCH] json state files loading --- scripts/build.bat | 2 +- scripts/build.sh | 2 +- src/core/core.cpp | 6 +- src/core/state.cpp | 249 ++++++++++++++++++++++++------------ test_data/engine_state.json | 33 +++++ 5 files changed, 206 insertions(+), 86 deletions(-) create mode 100644 test_data/engine_state.json diff --git a/scripts/build.bat b/scripts/build.bat index eb35bab..59a6b6d 100644 --- a/scripts/build.bat +++ b/scripts/build.bat @@ -40,7 +40,7 @@ IF NOT "!BUILD_ERRORLEVEL!"=="0" ( EXIT /B !BUILD_ERRORLEVEL! ) -xcopy /y test_data\engine_state.xml build\Debug\ +xcopy /y test_data\engine_state.json build\Debug\ ) diff --git a/scripts/build.sh b/scripts/build.sh index 0891e81..17d3562 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -3,4 +3,4 @@ # ex. scripts/build.sh make -C build/ -cp test_data/engine_state.xml build/engine_state.xml \ No newline at end of file +cp test_data/engine_state.json build/engine_state.json \ No newline at end of file diff --git a/src/core/core.cpp b/src/core/core.cpp index 93112a6..02c0d74 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -147,14 +147,14 @@ namespace lunarium Logger::Info(LogCategory::CORE, "Running Lunarium version %s", Version::GetVersion().ToString().c_str()); // Attempt to load the engine state file. This file should be placed in the same directory as the lunarium program. - if (Failed(State::CreateFromFile("engine_state.xml", mState))) + if (Failed(State::CreateFromFile("engine_state.json", mState))) { - Logger::Warn(LogCategory::CORE, "Unable to load state file: engine_state.xml. Loading default state."); + Logger::Warn(LogCategory::CORE, "Unable to load state file: engine_state.json. Loading default state."); mState = State::CreateDefault(); } else { - Logger::Info(LogCategory::CORE, "Loaded state file: engine_state.xml"); + Logger::Info(LogCategory::CORE, "Loaded state file: engine_state.json"); } // Parse command line args -- None right now diff --git a/src/core/state.cpp b/src/core/state.cpp index 9d3c92d..3f8abfd 100644 --- a/src/core/state.cpp +++ b/src/core/state.cpp @@ -9,7 +9,9 @@ #include "state.h" #include #include -#include +#include + +#include namespace lunarium { @@ -56,40 +58,71 @@ namespace lunarium } OpRes State::CreateFromFile(std::string filename, State& state) - { - pugi::xml_document doc; - pugi::xml_parse_result result = doc.load_file(filename.c_str()); + { + std::ifstream ifs = std::ifstream(filename.c_str()); - if (!result) + if (!ifs.is_open()) { return OpRes::Fail((std::string("Could not open file: ") + filename).c_str()); } - pugi::xml_node root = doc.child("State"); - if (pugi::node_null == root.type()) + // std::string buffer; + // char raw_buf[256]; + // while (true) + // { + // ifs.getline(raw_buf, 256); + // if (ifs.eof()) + // break; + + // buffer += raw_buf; + // } + + // nlohmann::json j = nlohmann::json::parse(buffer.c_str()); + + nlohmann::json j; + ifs >> j; + ifs.close(); + + if (j["State"].is_null()) { return OpRes::Fail((filename + " does not contain a State element").c_str()); } - // Read in each state variable, fill in with a default if it is not found - state.DataDirectory = root.child("DataDirectory").child_value(); - if ("" == state.DataDirectory) + if (!j["State"]["DataDirectory"].is_null()) { - state.DataDirectory = "data/"; + state.DataDirectory = j["State"]["DataDirectory"].get(); } - - std::string mode = String::StringToLower(root.child("Mode").attribute("Type").as_string()); - if ("test" == mode) + else { - state.Mode = RunMode::MODE_TEST; + state.DataDirectory = "data/"; } - else if ("editor" == mode) + + if (!j["TEST_NOT_HERE"].is_null()) { - state.Mode = RunMode::MODE_EDITOR; + Logger::Warn(LogCategory::CORE, "WHAT?"); } - else if ("game" == mode) + + if (!j["State"]["Mode"].is_null()) { - state.Mode = RunMode::MODE_GAME; + std::string mode = j["State"]["Mode"].get(); + if ("test" == mode) + { + state.Mode = RunMode::MODE_TEST; + } + else if ("editor" == mode) + { + state.Mode = RunMode::MODE_EDITOR; + } + else if ("game" == mode) + { + state.Mode = RunMode::MODE_GAME; + } + else + { + Logger::Warn(LogCategory::CORE, + "Unknown Run Mode in state file: %s, mode: %s, defaulting to MODE_TEST", filename.c_str(), mode.c_str()); + state.Mode = RunMode::MODE_TEST; + } } else { @@ -98,58 +131,110 @@ namespace lunarium state.Mode = RunMode::MODE_TEST; } - pugi::xml_node display = root.child("Display"); - if (pugi::node_null == display.type()) + if (!j["State"]["Display"].is_null()) { - Sizei size = System::GetScreenResolution(); - state.Display.FullScreenResolution.Width = size.Width; - state.Display.FullScreenResolution.Height = size.Height; - state.Display.Renderer = RenderSystem::OPENGL; - state.Display.IsFullScreen = false; - state.Display.VSyncEnabled = true; - state.Display.WindowedSize.Width = 800; - state.Display.WindowedSize.Height = 600; - state.Display.WindowStartPosition.X = 100; - state.Display.WindowStartPosition.Y = 100; - } - else - { - state.Display.FullScreenResolution.Width = display.child("FullScreenResolution").attribute("Width").as_int(); - state.Display.FullScreenResolution.Height = display.child("FullScreenResolution").attribute("Height").as_int(); + auto d = j["State"]["Display"]; + if (!d["FullScreenResolution"].is_null() && !d["FullScreenResolution"]["Width"].is_null() && !d["FullScreenResolution"]["Height"].is_null()) + { + state.Display.FullScreenResolution.Width = d["FullScreenResolution"]["Width"].get(); + state.Display.FullScreenResolution.Height = d["FullScreenResolution"]["Height"].get(); + } + else + { + Sizei size = System::GetScreenResolution(); + state.Display.FullScreenResolution.Width = size.Width; + state.Display.FullScreenResolution.Height = size.Height; + } - std::string renderer = display.attribute("Renderer").as_string(); - if (String::StringToLower(renderer) == "opengl") + if (!d["WindowedSize"].is_null() && !d["WindowedSize"]["Width"].is_null() && !d["WindowedSize"]["Height"].is_null()) { - state.Display.Renderer = RenderSystem::OPENGL; + state.Display.WindowedSize.Width = d["WindowedSize"]["Width"].get(); + state.Display.WindowedSize.Height = d["WindowedSize"]["Height"].get(); + } + else + { + state.Display.WindowedSize.Width = 800; + state.Display.WindowedSize.Height = 600; } - else if (String::StringToLower(renderer) == "vulkan") + + if (!d["WindowStartPosition"].is_null() && !d["WindowStartPosition"]["X"].is_null() && !d["WindowStartPosition"]["Y"].is_null()) { - state.Display.Renderer = RenderSystem::VULKAN; + state.Display.WindowStartPosition.X = d["WindowStartPosition"]["X"].get(); + state.Display.WindowStartPosition.Y = d["WindowStartPosition"]["Y"].get(); } else { - state.Display.Renderer = RenderSystem::UNKNOWN; + state.Display.WindowStartPosition.X = 100; + state.Display.WindowStartPosition.Y = 100; } - state.Display.IsFullScreen = display.attribute("IsFullScreen").as_bool(); - state.Display.VSyncEnabled = display.attribute("VSyncEnabled").as_bool(); - state.Display.WindowedSize.Width = display.child("WindowedSize").attribute("Width").as_int(); - state.Display.WindowedSize.Height = display.child("WindowedSize").attribute("Height").as_int();; - state.Display.WindowStartPosition.X = display.child("WindowStartPosition").attribute("X").as_int(); - state.Display.WindowStartPosition.Y = display.child("WindowStartPosition").attribute("Y").as_int(); - } + if (!d["Renderer"].is_null()) + { + std::string renderer = d["Renderer"].get(); + if (String::StringToLower(renderer) == "opengl") + { + state.Display.Renderer = RenderSystem::OPENGL; + } + else if (String::StringToLower(renderer) == "vulkan") + { + state.Display.Renderer = RenderSystem::VULKAN; + } + else + { + state.Display.Renderer = RenderSystem::UNKNOWN; + Logger::Warn(LogCategory::CORE, "Unknown Renderer in state file: %s, renderer: %s", filename.c_str(), renderer.c_str()); + } + } + else + { + state.Display.Renderer = RenderSystem::OPENGL; + } + if (!d["IsFullScreen"].is_null()) + { + state.Display.IsFullScreen = d["IsFullScreen"].get(); + } + else + { + state.Display.IsFullScreen = false; + } - pugi::xml_node interface = root.child("Interface"); - if (pugi::node_null == display.type()) - { - state.Interface.MainFont = ""; + if (!d["VSyncEnabled"].is_null()) + { + state.Display.VSyncEnabled = d["VSyncEnabled"].get(); + } + else + { + state.Display.VSyncEnabled = true; + } } else { - state.Interface.MainFont = interface.attribute("MainFont").value(); + Sizei size = System::GetScreenResolution(); + state.Display.FullScreenResolution.Width = size.Width; + state.Display.FullScreenResolution.Height = size.Height; + state.Display.Renderer = RenderSystem::OPENGL; + state.Display.IsFullScreen = false; + state.Display.VSyncEnabled = true; + state.Display.WindowedSize.Width = 800; + state.Display.WindowedSize.Height = 600; + state.Display.WindowStartPosition.X = 100; + state.Display.WindowStartPosition.Y = 100; } + if (!j["State"]["Interface"].is_null()) + { + auto i = j["State"]["Interface"]; + if (!i["MainFont"].is_null()) + { + state.Interface.MainFont = i["MainFont"].get(); + } + else + { + state.Interface.MainFont = ""; + } + } + state.LoadedFile = filename; return OpRes::OK(); @@ -168,41 +253,43 @@ namespace lunarium OpRes State::SaveToFile(std::string filename) { - pugi::xml_document doc; - doc.append_child("State"); + // pugi::xml_document doc; + // doc.append_child("State"); - doc.child("State").append_child("DataDirectory"); - doc.child("State").child("DataDirectory").text().set(DataDirectory.c_str()); + // doc.child("State").append_child("DataDirectory"); + // doc.child("State").child("DataDirectory").text().set(DataDirectory.c_str()); - const char* types[] = { "game", "editor", "test"}; - doc.child("State").append_child("Mode").append_attribute("Type").set_value(types[Mode]); + // const char* types[] = { "game", "editor", "test"}; + // doc.child("State").append_child("Mode").append_attribute("Type").set_value(types[Mode]); - // Display - pugi::xml_node display = doc.child("State").append_child("Display"); - display.append_attribute("IsFullScreen").set_value(Display.IsFullScreen); - display.append_attribute("VSyncEnabled").set_value(Display.VSyncEnabled); + // // Display + // pugi::xml_node display = doc.child("State").append_child("Display"); + // display.append_attribute("IsFullScreen").set_value(Display.IsFullScreen); + // display.append_attribute("VSyncEnabled").set_value(Display.VSyncEnabled); - const char* names[] = { "opengl", "vulkan", "unknown" }; - display.append_attribute("Renderer").set_value(names[Display.Renderer]); + // const char* names[] = { "opengl", "vulkan", "unknown" }; + // display.append_attribute("Renderer").set_value(names[Display.Renderer]); - pugi::xml_node fsr = display.append_child("FullScreenResolution"); - fsr.append_attribute("Width").set_value(Display.FullScreenResolution.Width); - fsr.append_attribute("Height").set_value(Display.FullScreenResolution.Height); + // pugi::xml_node fsr = display.append_child("FullScreenResolution"); + // fsr.append_attribute("Width").set_value(Display.FullScreenResolution.Width); + // fsr.append_attribute("Height").set_value(Display.FullScreenResolution.Height); - pugi::xml_node ws = display.append_child("WindowedSize"); - ws.append_attribute("Width").set_value(Display.WindowedSize.Width); - ws.append_attribute("Height").set_value(Display.WindowedSize.Height); + // pugi::xml_node ws = display.append_child("WindowedSize"); + // ws.append_attribute("Width").set_value(Display.WindowedSize.Width); + // ws.append_attribute("Height").set_value(Display.WindowedSize.Height); - pugi::xml_node wsp = display.append_child("WindowStartPosition"); - wsp.append_attribute("X").set_value(Display.WindowStartPosition.X); - wsp.append_attribute("Y").set_value(Display.WindowStartPosition.Y); + // pugi::xml_node wsp = display.append_child("WindowStartPosition"); + // wsp.append_attribute("X").set_value(Display.WindowStartPosition.X); + // wsp.append_attribute("Y").set_value(Display.WindowStartPosition.Y); - // Interface - pugi::xml_node interface = doc.child("State").append_child("Interface"); - interface.append_attribute("MainFont").set_value(Interface.MainFont.c_str()); + // // Interface + // pugi::xml_node interface = doc.child("State").append_child("Interface"); + // interface.append_attribute("MainFont").set_value(Interface.MainFont.c_str()); - return doc.save_file(filename.c_str()) - ? OpRes::OK() - : OpRes::Fail((std::string("Could not save xml file: ") + filename).c_str()); + // return doc.save_file(filename.c_str()) + // ? OpRes::OK() + // : OpRes::Fail((std::string("Could not save xml file: ") + filename).c_str()); + + return OpRes::OK(); } } \ No newline at end of file diff --git a/test_data/engine_state.json b/test_data/engine_state.json new file mode 100644 index 0000000..5004d9f --- /dev/null +++ b/test_data/engine_state.json @@ -0,0 +1,33 @@ +{ + "State": + { + "DataDirectory": "data/", + "Mode": "editor", + + "Display": + { + "FullScreenResolution": + { + "Width": 1920, + "Height": 1080 + }, + + "WindowedSize": + { + "Width": 1280, + "Height": 720 + }, + + "WindowStartPosition": + { + "X": 100, + "Y": 100 + }, + + "Renderer": "opengl", + "IsFullScreen": false, + "VSyncEnabled": true, + "MainFont": "" + } + } + } \ No newline at end of file