diff options
Diffstat (limited to 'serialize')
-rw-r--r-- | serialize/wall-atlas.cpp | 23 | ||||
-rw-r--r-- | serialize/wall-atlas.hpp | 6 |
2 files changed, 21 insertions, 8 deletions
diff --git a/serialize/wall-atlas.cpp b/serialize/wall-atlas.cpp index 60c2218d..28d54a0c 100644 --- a/serialize/wall-atlas.cpp +++ b/serialize/wall-atlas.cpp @@ -7,6 +7,7 @@ #include "json-helper.hpp" #include <utility> #include <string_view> +#include <Corrade/Containers/ArrayViewStl.h> #include <Corrade/Containers/PairStl.h> #include <Corrade/Containers/StringStl.h> #include <Magnum/ImageView.h> @@ -55,10 +56,11 @@ wall_atlas_def wall_atlas_def::deserialize(StringView filename) fm_soft_assert(loader.check_atlas_name(atlas.header.name)); atlas.frames = read_all_frames(jroot); auto [dirs, dir_indexes] = read_all_directions(jroot); - fm_soft_assert(!dirs.isEmpty()); + fm_soft_assert(!dirs.empty()); fm_soft_assert(dir_indexes != std::array<Wall::DirArrayIndex, 4>{}); atlas.direction_array = std::move(dirs); atlas.direction_map = dir_indexes; + atlas.direction_mask = get_existing_directions(jroot); return atlas; } @@ -113,16 +115,16 @@ StringView direction_index_to_name(size_t i) return wall_atlas::directions[i].name; } -Array<Frame> read_all_frames(const json& jroot) +std::vector<Frame> read_all_frames(const json& jroot) { fm_assert(jroot.contains("frames")); - Array<Frame> frames; + std::vector<Frame> frames; const auto& jframes = jroot["frames"]; fm_assert(jframes.is_array()); const auto sz = jframes.size(); - frames = Array<Frame>{sz}; + frames = std::vector<Frame>{sz}; for (auto i = 0uz; i < sz; i++) { @@ -199,13 +201,22 @@ Direction read_direction_metadata(const json& jroot, Direction_ dir) return val; } -Pair<Array<Direction>, std::array<DirArrayIndex, 4>> read_all_directions(const json& jroot) +[[nodiscard]] std::bitset<(size_t)Direction_::COUNT> get_existing_directions(const json& jroot) +{ + std::bitset<(size_t)Direction_::COUNT> array{0}; + for (uint8_t i = 0; auto [str, dir] : wall_atlas::directions) + if (jroot.contains(str)) + array[i] = true; + return array; +} + +Pair<std::vector<Direction>, std::array<DirArrayIndex, 4>> read_all_directions(const json& jroot) { size_t count = 0; for (auto [str, _] : wall_atlas::directions) if (jroot.contains(str)) count++; - Array<Direction> array{count}; + std::vector<Direction> array{count}; std::array<DirArrayIndex, 4> map = {}; for (uint8_t i = 0; auto [str, dir] : wall_atlas::directions) if (jroot.contains(str)) diff --git a/serialize/wall-atlas.hpp b/serialize/wall-atlas.hpp index b69f7e96..4e96943d 100644 --- a/serialize/wall-atlas.hpp +++ b/serialize/wall-atlas.hpp @@ -1,5 +1,6 @@ #pragma once #include "src/wall-atlas.hpp" +#include <bitset> #include <memory> #include <nlohmann/json_fwd.hpp> @@ -16,10 +17,11 @@ using nlohmann::json; uint8_t direction_index_from_name(StringView s); StringView direction_index_to_name(size_t i); -[[nodiscard]] Array<Frame> read_all_frames(const json& jroot); +[[nodiscard]] std::vector<Frame> read_all_frames(const json& jroot); [[nodiscard]] Group read_group_metadata(const json& jgroup); [[nodiscard]] Direction read_direction_metadata(const json& jroot, Direction_ dir); -Pair<Array<Direction>, std::array<DirArrayIndex, 4>> read_all_directions(const json& jroot); +[[nodiscard]] std::bitset<(size_t)Direction_::COUNT> get_existing_directions(const json& jroot); +Pair<std::vector<Direction>, std::array<DirArrayIndex, 4>> read_all_directions(const json& jroot); Info read_info_header(const json& jroot); void write_all_frames(json& jroot, ArrayView<const Frame> array); |