summaryrefslogtreecommitdiffhomepage
path: root/serialize/wall-atlas.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'serialize/wall-atlas.cpp')
-rw-r--r--serialize/wall-atlas.cpp23
1 files changed, 17 insertions, 6 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))