diff options
Diffstat (limited to 'serialize/wall-atlas.cpp')
-rw-r--r-- | serialize/wall-atlas.cpp | 69 |
1 files changed, 53 insertions, 16 deletions
diff --git a/serialize/wall-atlas.cpp b/serialize/wall-atlas.cpp index d8fe8f60..23fbf1b3 100644 --- a/serialize/wall-atlas.cpp +++ b/serialize/wall-atlas.cpp @@ -3,6 +3,7 @@ #include "magnum-vector.hpp" #include "compat/exception.hpp" #include <utility> +#include <string_view> #include <Corrade/Containers/StringStl.h> #include <nlohmann/json.hpp> @@ -26,18 +27,22 @@ size_t rotation_from_name(StringView s) fm_throw("bad rotation name '{}'"_cf, fmt::string_view{s.data(), s.size()}); } -void read_frameset_metadata(const nlohmann::json& j, wall_frames& val) +StringView rotation_to_name(size_t i) { + fm_soft_assert(i < std::size(rotation_names)); + return rotation_names[i]; +} + +void read_frameset_metadata(const nlohmann::json& j, wall_frames& val, size_t& rot) +{ + val = {}; + rot = rotation_from_name(std::string{j["name"s]}); + if (j.contains("pixel-size"s)) val.pixel_size = j["pixel-size"s]; if (j.contains("tint"s)) { - auto& t = j["tint"s]; - fm_soft_assert(t.contains("mult"s) || t.contains("add"s)); - if (t.contains("mult"s)) - val.tint_mult = Vector4(t["mult"s]); - if (t.contains("add"s)) - val.tint_add = Vector3(t["add"s]); + std::tie(val.tint_mult, val.tint_add) = std::pair<Vector4, Vector3>{j["tint"s]}; fm_soft_assert(val.tint_mult >= Color4{0}); } if (j.contains("from-rotation"s)) @@ -48,17 +53,15 @@ void read_frameset_metadata(const nlohmann::json& j, wall_frames& val) val.use_default_tint = j["use-default-tint"s]; } -void write_frameset_metadata(nlohmann::json& j, const wall_atlas& a, const wall_frames& val) +void write_frameset_metadata(nlohmann::json& j, const wall_atlas& a, const wall_frames& val, size_t rot) { constexpr wall_frames default_value; -#if 0 - fm_soft_assert(val.index != default_value.index); - fm_soft_assert(val.count != default_value.count); - fm_soft_assert(val.pixel_size != default_value.pixel_size); -#endif - - fm_soft_assert(val.index < a.array().size()); - fm_soft_assert(val.count != (uint32_t)-1 && val.count > 0); + + fm_soft_assert(val.count != (uint32_t)-1); + fm_soft_assert(val.index == (uint32_t)-1 || val.index < a.frame_array().size()); + fm_soft_assert((val.index == (uint32_t)-1) == (val.count == 0)); + + j["name"s] = rotation_to_name(rot); j["pixel-size"s] = val.pixel_size; if (val.tint_mult != default_value.tint_mult || val.tint_add != default_value.tint_add) { @@ -77,8 +80,42 @@ void write_frameset_metadata(nlohmann::json& j, const wall_atlas& a, const wall_ j["use-default-tint"s] = true; } +void read_framesets(const nlohmann::json& jf, wall_atlas_def& val) +{ + fm_soft_assert(jf.is_object()); + fm_soft_assert(val.framesets == nullptr && val.frameset_count == 0); + uint8_t count = 0; + + static_assert(std::size(rotation_names) == 4); + for (auto i = 0uz; i < 4; i++) + { + const auto& r = rotation_names[i]; + auto key = std::string_view{r.data(), r.size()}; + if (jf.contains(key)) + { + fm_soft_assert(jf[key].is_object()); + auto& index = val.frameset_indexes[i]; + fm_soft_assert(index == (uint8_t)-1); + index = count++; + } + } + fm_soft_assert(count > 0); + fm_soft_assert(count == jf.size()); + + val.framesets = std::make_unique<wall_frame_set[]>(count); + val.frameset_count = count; +} + } // namespace +void Serialize::wall_test::read_atlas_header(const nlohmann::json& j, wall_atlas_def& val) +{ + val = {}; + val.info = { std::string(j["name"s]), j["depth"], }; + val.frame_count = (uint32_t)j["frames"s].size(); + read_framesets(j["framesets"s], val); +} + } // namespace floormat namespace nlohmann { |