diff --git a/Source/Core/Common/JsonUtil.cpp b/Source/Core/Common/JsonUtil.cpp index fa9b8a73c98..c5425d7ef99 100644 --- a/Source/Core/Common/JsonUtil.cpp +++ b/Source/Core/Common/JsonUtil.cpp @@ -5,8 +5,33 @@ #include +#include + #include "Common/FileUtil.h" +namespace +{ +template +picojson::object MatrixToJson(const M& mat) +{ + picojson::object obj; + for (std::size_t i = 0; i < mat.data.size(); i++) + { + obj.emplace(fmt::format("m{}", i), mat.data[i]); + } + return obj; +} + +template +void MatrixFromJson(const picojson::object& obj, M& mat) +{ + for (std::size_t i = 0; i < mat.data.size(); i++) + { + mat.data[i] = ReadNumericFromJson(obj, fmt::format("m{}", i)).value_or(0.0f); + } +} +} // namespace + picojson::object ToJsonObject(const Common::Vec3& vec) { picojson::object obj; @@ -23,6 +48,26 @@ void FromJson(const picojson::object& obj, Common::Vec3& vec) vec.z = ReadNumericFromJson(obj, "z").value_or(0.0f); } +picojson::object ToJsonObject(const Common::Matrix44& mat) +{ + return MatrixToJson(mat); +} + +void FromJson(const picojson::object& obj, Common::Matrix44& mat) +{ + MatrixFromJson(obj, mat); +} + +picojson::object ToJsonObject(const Common::Matrix33& mat) +{ + return MatrixToJson(mat); +} + +void FromJson(const picojson::object& obj, Common::Matrix33& mat) +{ + MatrixFromJson(obj, mat); +} + std::optional ReadStringFromJson(const picojson::object& obj, const std::string& key) { const auto it = obj.find(key); diff --git a/Source/Core/Common/JsonUtil.h b/Source/Core/Common/JsonUtil.h index c830d777a41..7f6e0020647 100644 --- a/Source/Core/Common/JsonUtil.h +++ b/Source/Core/Common/JsonUtil.h @@ -56,5 +56,11 @@ std::optional ReadBoolFromJson(const picojson::object& obj, const std::str picojson::object ToJsonObject(const Common::Vec3& vec); void FromJson(const picojson::object& obj, Common::Vec3& vec); +picojson::object ToJsonObject(const Common::Matrix44& mat); +void FromJson(const picojson::object& obj, Common::Matrix44& mat); + +picojson::object ToJsonObject(const Common::Matrix33& mat); +void FromJson(const picojson::object& obj, Common::Matrix33& mat); + bool JsonToFile(const std::string& filename, const picojson::value& root, bool prettify = false); bool JsonFromFile(const std::string& filename, picojson::value* root, std::string* error);