summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMai <mai.iam2048@gmail.com>2024-01-23 14:18:25 -0500
committerGitHub <noreply@github.com>2024-01-23 14:18:25 -0500
commit0b1087e9c907331bc5de76c9bb47fc78d3da64dc (patch)
tree29bfcd3204cb2ae24d8385ee3c100656cc16bf6e
parentf2292467ad54da9e577aaea2cb3fadc232ee7ebe (diff)
parent3a688aa35ed944be9f6394069c6b410997098ac4 (diff)
Merge pull request #12520 from iwubcode/material_serialize_to_json
VideoCommon: add function to serialize MaterialAsset to json
-rw-r--r--Source/Core/VideoCommon/Assets/MaterialAsset.cpp74
-rw-r--r--Source/Core/VideoCommon/Assets/MaterialAsset.h1
2 files changed, 64 insertions, 11 deletions
diff --git a/Source/Core/VideoCommon/Assets/MaterialAsset.cpp b/Source/Core/VideoCommon/Assets/MaterialAsset.cpp
index b754683f2a..651ff589f4 100644
--- a/Source/Core/VideoCommon/Assets/MaterialAsset.cpp
+++ b/Source/Core/VideoCommon/Assets/MaterialAsset.cpp
@@ -7,6 +7,7 @@
#include <string_view>
#include <vector>
+#include "Common/JsonUtil.h"
#include "Common/Logging/Log.h"
#include "Common/StringUtil.h"
#include "Common/VariantUtil.h"
@@ -207,17 +208,6 @@ bool ParseMaterialProperties(const CustomAssetLibrary::AssetID& asset_id,
return true;
}
-
-template <typename T, std::size_t N>
-picojson::array ArrayToPicoArray(const std::array<T, N>& value)
-{
- picojson::array result;
- for (std::size_t i = 0; i < N; i++)
- {
- result.push_back(picojson::value{static_cast<double>(value[i])});
- }
- return result;
-}
} // namespace
void MaterialProperty::WriteToMemory(u8*& buffer, const MaterialProperty& property)
@@ -329,6 +319,68 @@ bool MaterialData::FromJson(const CustomAssetLibrary::AssetID& asset_id,
return true;
}
+void MaterialData::ToJson(picojson::object* obj, const MaterialData& data)
+{
+ if (!obj) [[unlikely]]
+ return;
+
+ auto& json_obj = *obj;
+
+ picojson::array json_properties;
+ for (const auto& property : data.properties)
+ {
+ picojson::object json_property;
+ json_property["code_name"] = picojson::value{property.m_code_name};
+
+ std::visit(overloaded{[&](const CustomAssetLibrary::AssetID& value) {
+ json_property["type"] = picojson::value{"texture_asset"};
+ json_property["value"] = picojson::value{value};
+ },
+ [&](s32 value) {
+ json_property["type"] = picojson::value{"int"};
+ json_property["value"] = picojson::value{static_cast<double>(value)};
+ },
+ [&](const std::array<s32, 2>& value) {
+ json_property["type"] = picojson::value{"int2"};
+ json_property["value"] = picojson::value{ToJsonArray(value)};
+ },
+ [&](const std::array<s32, 3>& value) {
+ json_property["type"] = picojson::value{"int3"};
+ json_property["value"] = picojson::value{ToJsonArray(value)};
+ },
+ [&](const std::array<s32, 4>& value) {
+ json_property["type"] = picojson::value{"int4"};
+ json_property["value"] = picojson::value{ToJsonArray(value)};
+ },
+ [&](float value) {
+ json_property["type"] = picojson::value{"float"};
+ json_property["value"] = picojson::value{static_cast<double>(value)};
+ },
+ [&](const std::array<float, 2>& value) {
+ json_property["type"] = picojson::value{"float2"};
+ json_property["value"] = picojson::value{ToJsonArray(value)};
+ },
+ [&](const std::array<float, 3>& value) {
+ json_property["type"] = picojson::value{"float3"};
+ json_property["value"] = picojson::value{ToJsonArray(value)};
+ },
+ [&](const std::array<float, 4>& value) {
+ json_property["type"] = picojson::value{"float4"};
+ json_property["value"] = picojson::value{ToJsonArray(value)};
+ },
+ [&](bool value) {
+ json_property["type"] = picojson::value{"bool"};
+ json_property["value"] = picojson::value{value};
+ }},
+ property.m_value);
+
+ json_properties.emplace_back(std::move(json_property));
+ }
+
+ json_obj["values"] = picojson::value{std::move(json_properties)};
+ json_obj["shader_asset"] = picojson::value{data.shader_asset};
+}
+
CustomAssetLibrary::LoadInfo MaterialAsset::LoadImpl(const CustomAssetLibrary::AssetID& asset_id)
{
auto potential_data = std::make_shared<MaterialData>();
diff --git a/Source/Core/VideoCommon/Assets/MaterialAsset.h b/Source/Core/VideoCommon/Assets/MaterialAsset.h
index 58731cd02f..0e9a4558a5 100644
--- a/Source/Core/VideoCommon/Assets/MaterialAsset.h
+++ b/Source/Core/VideoCommon/Assets/MaterialAsset.h
@@ -34,6 +34,7 @@ struct MaterialData
{
static bool FromJson(const CustomAssetLibrary::AssetID& asset_id, const picojson::object& json,
MaterialData* data);
+ static void ToJson(picojson::object* obj, const MaterialData& data);
std::string shader_asset;
std::vector<MaterialProperty> properties;
};