Skip to content

Commit

Permalink
VideoCommon: add function to serialize MaterialAsset to json
Browse files Browse the repository at this point in the history
  • Loading branch information
iwubcode committed Jan 23, 2024
1 parent f229246 commit 73a1ddd
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 11 deletions.
74 changes: 63 additions & 11 deletions Source/Core/VideoCommon/Assets/MaterialAsset.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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.push_back(picojson::value{json_property});
}

json_obj["values"] = picojson::value{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>();
Expand Down
1 change: 1 addition & 0 deletions Source/Core/VideoCommon/Assets/MaterialAsset.h
Expand Up @@ -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;
};
Expand Down

0 comments on commit 73a1ddd

Please sign in to comment.