From 3a688aa35ed944be9f6394069c6b410997098ac4 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Tue, 23 Jan 2024 12:47:00 -0600 Subject: [PATCH] VideoCommon: add function to serialize MaterialAsset to json --- .../Core/VideoCommon/Assets/MaterialAsset.cpp | 74 ++++++++++++++++--- .../Core/VideoCommon/Assets/MaterialAsset.h | 1 + 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/Source/Core/VideoCommon/Assets/MaterialAsset.cpp b/Source/Core/VideoCommon/Assets/MaterialAsset.cpp index b754683f2a1c..651ff589f464 100644 --- a/Source/Core/VideoCommon/Assets/MaterialAsset.cpp +++ b/Source/Core/VideoCommon/Assets/MaterialAsset.cpp @@ -7,6 +7,7 @@ #include #include +#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 -picojson::array ArrayToPicoArray(const std::array& value) -{ - picojson::array result; - for (std::size_t i = 0; i < N; i++) - { - result.push_back(picojson::value{static_cast(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(value)}; + }, + [&](const std::array& value) { + json_property["type"] = picojson::value{"int2"}; + json_property["value"] = picojson::value{ToJsonArray(value)}; + }, + [&](const std::array& value) { + json_property["type"] = picojson::value{"int3"}; + json_property["value"] = picojson::value{ToJsonArray(value)}; + }, + [&](const std::array& 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(value)}; + }, + [&](const std::array& value) { + json_property["type"] = picojson::value{"float2"}; + json_property["value"] = picojson::value{ToJsonArray(value)}; + }, + [&](const std::array& value) { + json_property["type"] = picojson::value{"float3"}; + json_property["value"] = picojson::value{ToJsonArray(value)}; + }, + [&](const std::array& 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(); diff --git a/Source/Core/VideoCommon/Assets/MaterialAsset.h b/Source/Core/VideoCommon/Assets/MaterialAsset.h index 58731cd02fd4..0e9a4558a57c 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 properties; };