From b7799bc6dc284f035f46b3f4be7f49f2103b294b Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 26 Nov 2023 13:17:16 +0100 Subject: a2 --- serialize/wall-atlas.cpp | 25 ++++++++++++++++++++++--- serialize/wall-atlas.hpp | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'serialize') diff --git a/serialize/wall-atlas.cpp b/serialize/wall-atlas.cpp index 4e8a2b28..786920cc 100644 --- a/serialize/wall-atlas.cpp +++ b/serialize/wall-atlas.cpp @@ -100,7 +100,8 @@ wall_atlas_def wall_atlas_def::deserialize(StringView filename) return atlas; } -void wall_atlas_def::serialize(StringView filename, const Info& header, ArrayView frames, +void wall_atlas_def::serialize(StringView filename, const Info& header, + ArrayView frames, ArrayView dir_array, std::array dir_map) { @@ -111,11 +112,14 @@ void wall_atlas_def::serialize(StringView filename, const Info& header, ArrayVie for (const auto [name_, dir] : wall_atlas::directions) if (auto idx = dir_map[(size_t)dir]) - if (const auto& dir = dir_array[idx.val]) + { + const auto& dir = dir_array[idx.val]; + if (is_direction_defined(dir)) { std::string_view name = {name_.data(), name_.size()}; write_direction_metadata(jroot[name], dir); } + } json_helper::to_json_(jroot, filename); } @@ -172,6 +176,17 @@ std::vector read_all_frames(const json& jroot) return frames; } +bool is_direction_defined(const Direction& dir) +{ + for (auto [str, ptr, tag] : Direction::groups) + { + const auto& group = dir.*ptr; + if (group.is_defined) + return false; + } + return true; +} + Group read_group_metadata(const json& jgroup) { fm_assert(jgroup.is_object()); @@ -206,6 +221,7 @@ Group read_group_metadata(const json& jgroup) if (jgroup.contains("default-tint")) val.default_tint = !!jgroup["default-tint"]; + val.is_defined = true; return val; } @@ -262,6 +278,7 @@ void write_group_metadata(json& jgroup, const Group& val) constexpr Group group_defaults; fm_assert(jgroup.is_null()); + fm_assert(val.is_defined); if (val.index != (uint32_t)-1) jgroup["offset"] = val.index; @@ -286,8 +303,10 @@ void write_direction_metadata(json& jdir, const Direction& dir) for (auto [s_, memfn, tag] : Direction::groups) { - std::string_view s = {s_.data(), s_.size()}; const auto& group = dir.*memfn; + if (!group.is_defined) + continue; + std::string_view s = {s_.data(), s_.size()}; write_group_metadata(jdir[s], group); } if (jdir.contains("top")) diff --git a/serialize/wall-atlas.hpp b/serialize/wall-atlas.hpp index 3342ca49..725204ad 100644 --- a/serialize/wall-atlas.hpp +++ b/serialize/wall-atlas.hpp @@ -27,5 +27,6 @@ void write_group_metadata(json& jgroup, const Group& val); void write_direction_metadata(json& jdir, const Direction& dir); void write_all_directions(json& jroot, const wall_atlas& a); void write_info_header(json& jroot, const Info& info); +bool is_direction_defined(const Direction& dir); } // namespace floormat::Wall::detail -- cgit v1.2.3