diff options
| author | Mai <mai.iam2048@gmail.com> | 2024-01-23 14:18:25 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-23 14:18:25 -0500 |
| commit | 0b1087e9c907331bc5de76c9bb47fc78d3da64dc (patch) | |
| tree | 29bfcd3204cb2ae24d8385ee3c100656cc16bf6e | |
| parent | f2292467ad54da9e577aaea2cb3fadc232ee7ebe (diff) | |
| parent | 3a688aa35ed944be9f6394069c6b410997098ac4 (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.cpp | 74 | ||||
| -rw-r--r-- | Source/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 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; }; |
