diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-11-05 15:53:03 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-11-05 15:53:03 +0100 |
commit | eb60ef73b0af4ebbf35a67226edf1d8e61d972ae (patch) | |
tree | f9f002cf20cc62f831e996d360acdfd0806f746f /serialize | |
parent | 9c7e2fd21b6a39ad9f1eb0f699fc054559d2a6b9 (diff) |
a
Diffstat (limited to 'serialize')
-rw-r--r-- | serialize/wall-atlas.cpp | 100 |
1 files changed, 60 insertions, 40 deletions
diff --git a/serialize/wall-atlas.cpp b/serialize/wall-atlas.cpp index 4a709060..31090e45 100644 --- a/serialize/wall-atlas.cpp +++ b/serialize/wall-atlas.cpp @@ -13,6 +13,8 @@ namespace floormat { namespace { +using nlohmann::json; +constexpr auto none = (uint8_t)-1; using namespace std::string_literals; constexpr StringView rotation_names[] = { "n"_s, "e"_s, "s"_s, "w"_s, }; @@ -33,54 +35,33 @@ StringView rotation_to_name(size_t i) return rotation_names[i]; } -void read_frameset_metadata(const nlohmann::json& j, wall_frames& val, size_t& rot) +[[nodiscard]] wall_frames read_frames_metadata(const json& jfs) { - val = {}; - rot = rotation_from_name(std::string{j["name"s]}); + wall_frames val; - if (j.contains("pixel-size"s)) - val.pixel_size = j["pixel-size"s]; - if (j.contains("tint"s)) + if (jfs.contains("pixel-size"s)) + val.pixel_size = jfs["pixel-size"s]; + if (jfs.contains("tint"s)) { - std::tie(val.tint_mult, val.tint_add) = std::pair<Vector4, Vector3>{j["tint"s]}; + std::tie(val.tint_mult, val.tint_add) = std::pair<Vector4, Vector3>{ jfs["tint"s]}; fm_soft_assert(val.tint_mult >= Color4{0}); } - if (j.contains("from-rotation"s)) - val.from_rotation = (uint8_t)rotation_from_name(std::string{j["from-rotation"s]}); - if (j.contains("mirrored"s)) - val.mirrored = !!j["mirrored"s]; - if (j.contains("use-default-tint"s)) - val.use_default_tint = !!j["use-default-tint"s]; + if (jfs.contains("from-rotation"s)) + val.from_rotation = (uint8_t)rotation_from_name(std::string{jfs["from-rotation"s]}); + if (jfs.contains("mirrored"s)) + val.mirrored = jfs["mirrored"s]; + if (jfs.contains("use-default-tint"s)) + val.use_default_tint = jfs["use-default-tint"s]; + + return val; } -void write_frameset_metadata(nlohmann::json& j, const wall_atlas& a, const wall_frames& val, size_t rot) +[[nodiscard]] wall_frame_set read_frameset_metadata(const json& j) { - constexpr wall_frames default_value; - - 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) - { - auto tint = std::pair<Vector4, Vector3>{{val.tint_mult}, {val.tint_add}}; - j["tint"s] = tint; - } - if (val.from_rotation != default_value.from_rotation) - { - fm_soft_assert(val.from_rotation != (uint8_t)-1 && val.from_rotation < 4); - j["from-rotation"s] = val.from_rotation; - } - if (val.mirrored != default_value.mirrored) - j["mirrored"s] = val.mirrored; - if (val.use_default_tint) - if (val.tint_mult != default_value.tint_mult || val.tint_add != default_value.tint_add) - j["use-default-tint"s] = true; + return {}; } -void read_framesets(const nlohmann::json& jf, wall_atlas_def& val) +void read_framesets(const json& jf, wall_atlas_def& val) { fm_soft_assert(jf.is_object()); fm_soft_assert(val.framesets == nullptr && val.frameset_count == 0); @@ -95,7 +76,7 @@ void read_framesets(const nlohmann::json& jf, wall_atlas_def& val) { fm_soft_assert(jf[key].is_object()); auto& index = val.frameset_indexes[i]; - fm_soft_assert(index == (uint8_t)-1); + fm_soft_assert(index == none); index = count++; } } @@ -104,11 +85,50 @@ void read_framesets(const nlohmann::json& jf, wall_atlas_def& val) val.framesets = std::make_unique<wall_frame_set[]>(count); val.frameset_count = count; + + for (auto i = 0uz; i < 4; i++) + { + auto index = val.frameset_indexes[i]; + if (index == none) + continue; + auto r = rotation_to_name(i); + auto key = std::string_view{r.data(), r.size()}; + + fm_debug_assert(index < val.frameset_count); + val.framesets[index] = read_frameset_metadata(jf[key]); + } +} + +void write_frameset_metadata(json& j, const wall_atlas& a, const wall_frames& val, size_t rot) +{ + constexpr wall_frames default_value; + + 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) + { + auto tint = std::pair<Vector4, Vector3>{{val.tint_mult}, {val.tint_add}}; + j["tint"s] = tint; + } + if (val.from_rotation != default_value.from_rotation) + { + fm_soft_assert(val.from_rotation != none && val.from_rotation < 4); + j["from-rotation"s] = val.from_rotation; + } + if (val.mirrored != default_value.mirrored) + j["mirrored"s] = val.mirrored; + if (val.use_default_tint) + if (val.tint_mult != default_value.tint_mult || val.tint_add != default_value.tint_add) + j["use-default-tint"s] = true; } } // namespace -void Serialize::wall_test::read_atlas_header(const nlohmann::json& j, wall_atlas_def& val) +void Serialize::wall_test::read_atlas_header(const json& j, wall_atlas_def& val) { val = {}; val.info = { std::string(j["name"s]), j["depth"], }; |