From f58a133edc6bba578385a6a2f3253bda2c04a06b Mon Sep 17 00:00:00 2001 From: iwubcode Date: Wed, 4 Jun 2025 22:31:09 -0500 Subject: [PATCH] Core: add way to serialize and deserialize a 4x4 matrix to Json --- Source/Core/Common/JsonUtil.cpp | 20 ++++++++++++++++++++ Source/Core/Common/JsonUtil.h | 3 +++ 2 files changed, 23 insertions(+) diff --git a/Source/Core/Common/JsonUtil.cpp b/Source/Core/Common/JsonUtil.cpp index fa9b8a73c9..0744e5bbae 100644 --- a/Source/Core/Common/JsonUtil.cpp +++ b/Source/Core/Common/JsonUtil.cpp @@ -5,6 +5,8 @@ #include +#include + #include "Common/FileUtil.h" picojson::object ToJsonObject(const Common::Vec3& vec) @@ -23,6 +25,24 @@ 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) +{ + 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; +} + +void FromJson(const picojson::object& obj, Common::Matrix44& 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); + } +} + 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 c830d777a4..b654937fd3 100644 --- a/Source/Core/Common/JsonUtil.h +++ b/Source/Core/Common/JsonUtil.h @@ -56,5 +56,8 @@ 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); + 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);