summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
Diffstat (limited to 'serialize')
-rw-r--r--serialize/wall-atlas.cpp23
-rw-r--r--serialize/wall-atlas.hpp6
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);