diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2022-06-11 11:45:40 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-06-11 11:45:40 +0200 |
commit | a7187fa1a4d3f816c8ad2fc865a19b26a41d05f1 (patch) | |
tree | 5d76bcde66922ebd7baa7d777a013b13a682fe58 /anim | |
parent | a22ae93a02226027ef3fa3dccb689e789fa59e90 (diff) |
a
Diffstat (limited to 'anim')
-rw-r--r-- | anim/serialize.cpp | 67 | ||||
-rw-r--r-- | anim/serialize.hpp | 18 |
2 files changed, 20 insertions, 65 deletions
diff --git a/anim/serialize.cpp b/anim/serialize.cpp index 2a0b5a45..3aca6201 100644 --- a/anim/serialize.cpp +++ b/anim/serialize.cpp @@ -10,47 +10,9 @@ using Corrade::Utility::Debug; using Corrade::Utility::Error; -static constexpr -std::pair<anim_direction, const char*> anim_direction_map[] = { - { anim_direction::N, "n" }, - { anim_direction::NE, "ne" }, - { anim_direction::E, "e" }, - { anim_direction::SE, "se" }, - { anim_direction::S, "s" }, - { anim_direction::SW, "sw" }, - { anim_direction::W, "w" }, - { anim_direction::NW, "nw" }, -}; - -const char* anim_group::direction_to_string(anim_direction group) -{ - auto it = std::find_if(std::cbegin(anim_direction_map), std::cend(anim_direction_map), - [=](const auto& pair) { return group == pair.first; }); - if (it != std::cend(anim_direction_map)) - return it->second; - else - return "(unknown)"; -} - -anim_direction anim_group::string_to_direction(const std::string& str) -{ - auto it = std::find_if(std::cbegin(anim_direction_map), std::cend(anim_direction_map), - [&](const auto& pair) { return str == pair.second; }); - if (it != std::cend(anim_direction_map)) - return it->first; - else - return (anim_direction)0; -} - namespace nlohmann { template<> -struct adl_serializer<anim_direction> final { - static void to_json(json& j, anim_direction x); - static void from_json(const json& j, anim_direction& x); -}; - -template<> struct adl_serializer<Magnum::Vector2i> final { static void to_json(json& j, const Magnum::Vector2i& x); static void from_json(const json& j, Magnum::Vector2i& x); @@ -68,25 +30,13 @@ void adl_serializer<Magnum::Vector2i>::from_json(const json& j, Magnum::Vector2i j.at("y").get_to(x[1]); } -#if 0 -void adl_serializer<anim_direction>::to_json(json& j, anim_direction x) -{ - j = anim_group::direction_to_string(x); -} - -void adl_serializer<anim_direction>::from_json(const json& j, anim_direction& x) -{ - x = anim_group::string_to_direction(j); -} -#endif - } // namespace nlohmann NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_frame, ground, offset, size); NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_group, name, frames, ground); NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim, name, nframes, actionframe, fps, groups); -std::optional<anim> anim::from_json(const std::filesystem::path& pathname) +std::tuple<anim, bool> anim::from_json(const std::filesystem::path& pathname) { using namespace nlohmann; std::ifstream s; @@ -95,7 +45,7 @@ std::optional<anim> anim::from_json(const std::filesystem::path& pathname) s.open(pathname, std::ios_base::in); } catch (const std::ios::failure& e) { Error{} << "failed to open" << pathname << ':' << e.what(); - return std::nullopt; + return { {}, false }; } anim ret; try { @@ -105,9 +55,9 @@ std::optional<anim> anim::from_json(const std::filesystem::path& pathname) from_json(j, ret); } catch (const std::exception& e) { Error{} << "failed to parse" << pathname << ':' << e.what(); - return std::nullopt; + return { {}, false }; } - return std::make_optional(std::move(ret)); + return { std::move(ret), true }; } bool anim::to_json(const std::filesystem::path& pathname) @@ -122,8 +72,13 @@ bool anim::to_json(const std::filesystem::path& pathname) Error{} << "failed to open" << pathname << "for writing:" << e.what(); return false; } - s << j.dump(4); - s.flush(); + try { + s << j.dump(4); + s.flush(); + } catch (const std::exception& e) { + Error{} << "failed writing" << pathname << ':' << e.what(); + return false; + } return true; } diff --git a/anim/serialize.hpp b/anim/serialize.hpp index 10fd9e18..8c049978 100644 --- a/anim/serialize.hpp +++ b/anim/serialize.hpp @@ -1,12 +1,15 @@ #pragma once -#include "../defs.hpp" +#include "defs.hpp" + #include <string> #include <array> #include <vector> -#include <optional> -#include <filesystem> -#include <Magnum/Trade/ImageData.h> + +#include <Magnum/Magnum.h> +#include <Magnum/Math/Vector2.h> + +namespace std::filesystem { class path; } struct anim_frame final { @@ -24,15 +27,12 @@ struct anim_group final std::string name; std::vector<anim_frame> frames; Magnum::Vector2i ground; - - static const char* direction_to_string(anim_direction group); - static anim_direction string_to_direction(const std::string& str); }; struct anim final { - static std::optional<anim> from_json(const std::filesystem::path& pathname); - bool to_json(const std::filesystem::path& pathname); + static std::tuple<anim, bool> from_json(const std::filesystem::path& pathname); + [[nodiscard]] bool to_json(const std::filesystem::path& pathname); static constexpr int default_fps = 24; std::string name; |