summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-11-05 15:53:03 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-11-05 15:53:03 +0100
commiteb60ef73b0af4ebbf35a67226edf1d8e61d972ae (patch)
treef9f002cf20cc62f831e996d360acdfd0806f746f /serialize
parent9c7e2fd21b6a39ad9f1eb0f699fc054559d2a6b9 (diff)
a
Diffstat (limited to 'serialize')
-rw-r--r--serialize/wall-atlas.cpp100
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"], };