json state files loading

gui_api_redesign
Joey Pollack 4 years ago
parent c0a74d7903
commit df18d77a72

@ -40,7 +40,7 @@ IF NOT "!BUILD_ERRORLEVEL!"=="0" (
EXIT /B !BUILD_ERRORLEVEL! EXIT /B !BUILD_ERRORLEVEL!
) )
xcopy /y test_data\engine_state.xml build\Debug\ xcopy /y test_data\engine_state.json build\Debug\
) )

@ -3,4 +3,4 @@
# ex. scripts/build.sh # ex. scripts/build.sh
make -C build/ make -C build/
cp test_data/engine_state.xml build/engine_state.xml cp test_data/engine_state.json build/engine_state.json

@ -147,14 +147,14 @@ namespace lunarium
Logger::Info(LogCategory::CORE, "Running Lunarium version %s", Version::GetVersion().ToString().c_str()); 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. // 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(); mState = State::CreateDefault();
} }
else 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 // Parse command line args -- None right now

@ -9,7 +9,9 @@
#include "state.h" #include "state.h"
#include <utils/helpers.h> #include <utils/helpers.h>
#include <utils/logger.h> #include <utils/logger.h>
#include <pugixml.hpp> #include <nlohmann/json.hpp>
#include <fstream>
namespace lunarium namespace lunarium
{ {
@ -56,40 +58,71 @@ namespace lunarium
} }
OpRes State::CreateFromFile(std::string filename, State& state) OpRes State::CreateFromFile(std::string filename, State& state)
{ {
pugi::xml_document doc; std::ifstream ifs = std::ifstream(filename.c_str());
pugi::xml_parse_result result = doc.load_file(filename.c_str());
if (!result) if (!ifs.is_open())
{ {
return OpRes::Fail((std::string("Could not open file: ") + filename).c_str()); return OpRes::Fail((std::string("Could not open file: ") + filename).c_str());
} }
pugi::xml_node root = doc.child("State"); // std::string buffer;
if (pugi::node_null == root.type()) // 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()); 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 if (!j["State"]["DataDirectory"].is_null())
state.DataDirectory = root.child("DataDirectory").child_value();
if ("" == state.DataDirectory)
{ {
state.DataDirectory = "data/"; state.DataDirectory = j["State"]["DataDirectory"].get<std::string>();
} }
else
std::string mode = String::StringToLower(root.child("Mode").attribute("Type").as_string());
if ("test" == mode)
{ {
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<std::string>();
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 else
{ {
@ -98,58 +131,110 @@ namespace lunarium
state.Mode = RunMode::MODE_TEST; state.Mode = RunMode::MODE_TEST;
} }
pugi::xml_node display = root.child("Display"); if (!j["State"]["Display"].is_null())
if (pugi::node_null == display.type())
{ {
Sizei size = System::GetScreenResolution(); auto d = j["State"]["Display"];
state.Display.FullScreenResolution.Width = size.Width; if (!d["FullScreenResolution"].is_null() && !d["FullScreenResolution"]["Width"].is_null() && !d["FullScreenResolution"]["Height"].is_null())
state.Display.FullScreenResolution.Height = size.Height; {
state.Display.Renderer = RenderSystem::OPENGL; state.Display.FullScreenResolution.Width = d["FullScreenResolution"]["Width"].get<int>();
state.Display.IsFullScreen = false; state.Display.FullScreenResolution.Height = d["FullScreenResolution"]["Height"].get<int>();
state.Display.VSyncEnabled = true; }
state.Display.WindowedSize.Width = 800; else
state.Display.WindowedSize.Height = 600; {
state.Display.WindowStartPosition.X = 100; Sizei size = System::GetScreenResolution();
state.Display.WindowStartPosition.Y = 100; state.Display.FullScreenResolution.Width = size.Width;
} state.Display.FullScreenResolution.Height = size.Height;
else }
{
state.Display.FullScreenResolution.Width = display.child("FullScreenResolution").attribute("Width").as_int();
state.Display.FullScreenResolution.Height = display.child("FullScreenResolution").attribute("Height").as_int();
std::string renderer = display.attribute("Renderer").as_string(); if (!d["WindowedSize"].is_null() && !d["WindowedSize"]["Width"].is_null() && !d["WindowedSize"]["Height"].is_null())
if (String::StringToLower(renderer) == "opengl")
{ {
state.Display.Renderer = RenderSystem::OPENGL; state.Display.WindowedSize.Width = d["WindowedSize"]["Width"].get<int>();
state.Display.WindowedSize.Height = d["WindowedSize"]["Height"].get<int>();
}
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<int>();
state.Display.WindowStartPosition.Y = d["WindowStartPosition"]["Y"].get<int>();
} }
else else
{ {
state.Display.Renderer = RenderSystem::UNKNOWN; state.Display.WindowStartPosition.X = 100;
state.Display.WindowStartPosition.Y = 100;
} }
state.Display.IsFullScreen = display.attribute("IsFullScreen").as_bool(); if (!d["Renderer"].is_null())
state.Display.VSyncEnabled = display.attribute("VSyncEnabled").as_bool(); {
state.Display.WindowedSize.Width = display.child("WindowedSize").attribute("Width").as_int(); std::string renderer = d["Renderer"].get<std::string>();
state.Display.WindowedSize.Height = display.child("WindowedSize").attribute("Height").as_int();; if (String::StringToLower(renderer) == "opengl")
state.Display.WindowStartPosition.X = display.child("WindowStartPosition").attribute("X").as_int(); {
state.Display.WindowStartPosition.Y = display.child("WindowStartPosition").attribute("Y").as_int(); 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<bool>();
}
else
{
state.Display.IsFullScreen = false;
}
pugi::xml_node interface = root.child("Interface"); if (!d["VSyncEnabled"].is_null())
if (pugi::node_null == display.type()) {
{ state.Display.VSyncEnabled = d["VSyncEnabled"].get<bool>();
state.Interface.MainFont = ""; }
else
{
state.Display.VSyncEnabled = true;
}
} }
else 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<std::string>();
}
else
{
state.Interface.MainFont = "";
}
}
state.LoadedFile = filename; state.LoadedFile = filename;
return OpRes::OK(); return OpRes::OK();
@ -168,41 +253,43 @@ namespace lunarium
OpRes State::SaveToFile(std::string filename) OpRes State::SaveToFile(std::string filename)
{ {
pugi::xml_document doc; // pugi::xml_document doc;
doc.append_child("State"); // doc.append_child("State");
doc.child("State").append_child("DataDirectory"); // doc.child("State").append_child("DataDirectory");
doc.child("State").child("DataDirectory").text().set(DataDirectory.c_str()); // doc.child("State").child("DataDirectory").text().set(DataDirectory.c_str());
const char* types[] = { "game", "editor", "test"}; // const char* types[] = { "game", "editor", "test"};
doc.child("State").append_child("Mode").append_attribute("Type").set_value(types[Mode]); // doc.child("State").append_child("Mode").append_attribute("Type").set_value(types[Mode]);
// Display // // Display
pugi::xml_node display = doc.child("State").append_child("Display"); // pugi::xml_node display = doc.child("State").append_child("Display");
display.append_attribute("IsFullScreen").set_value(Display.IsFullScreen); // display.append_attribute("IsFullScreen").set_value(Display.IsFullScreen);
display.append_attribute("VSyncEnabled").set_value(Display.VSyncEnabled); // display.append_attribute("VSyncEnabled").set_value(Display.VSyncEnabled);
const char* names[] = { "opengl", "vulkan", "unknown" }; // const char* names[] = { "opengl", "vulkan", "unknown" };
display.append_attribute("Renderer").set_value(names[Display.Renderer]); // display.append_attribute("Renderer").set_value(names[Display.Renderer]);
pugi::xml_node fsr = display.append_child("FullScreenResolution"); // pugi::xml_node fsr = display.append_child("FullScreenResolution");
fsr.append_attribute("Width").set_value(Display.FullScreenResolution.Width); // fsr.append_attribute("Width").set_value(Display.FullScreenResolution.Width);
fsr.append_attribute("Height").set_value(Display.FullScreenResolution.Height); // fsr.append_attribute("Height").set_value(Display.FullScreenResolution.Height);
pugi::xml_node ws = display.append_child("WindowedSize"); // pugi::xml_node ws = display.append_child("WindowedSize");
ws.append_attribute("Width").set_value(Display.WindowedSize.Width); // ws.append_attribute("Width").set_value(Display.WindowedSize.Width);
ws.append_attribute("Height").set_value(Display.WindowedSize.Height); // ws.append_attribute("Height").set_value(Display.WindowedSize.Height);
pugi::xml_node wsp = display.append_child("WindowStartPosition"); // pugi::xml_node wsp = display.append_child("WindowStartPosition");
wsp.append_attribute("X").set_value(Display.WindowStartPosition.X); // wsp.append_attribute("X").set_value(Display.WindowStartPosition.X);
wsp.append_attribute("Y").set_value(Display.WindowStartPosition.Y); // wsp.append_attribute("Y").set_value(Display.WindowStartPosition.Y);
// Interface // // Interface
pugi::xml_node interface = doc.child("State").append_child("Interface"); // pugi::xml_node interface = doc.child("State").append_child("Interface");
interface.append_attribute("MainFont").set_value(Interface.MainFont.c_str()); // interface.append_attribute("MainFont").set_value(Interface.MainFont.c_str());
return doc.save_file(filename.c_str()) // return doc.save_file(filename.c_str())
? OpRes::OK() // ? OpRes::OK()
: OpRes::Fail((std::string("Could not save xml file: ") + filename).c_str()); // : OpRes::Fail((std::string("Could not save xml file: ") + filename).c_str());
return OpRes::OK();
} }
} }

@ -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": ""
}
}
}
Loading…
Cancel
Save