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.cpp69
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 {