diff options
-rw-r--r-- | anim-crop-tool/main.cpp | 7 | ||||
-rw-r--r-- | serialize/wall-atlas.cpp | 25 | ||||
-rw-r--r-- | serialize/wall-atlas.hpp | 1 | ||||
-rw-r--r-- | src/wall-atlas.cpp | 12 | ||||
-rw-r--r-- | src/wall-atlas.hpp | 9 | ||||
-rw-r--r-- | test/wall-atlas.cpp | 6 | ||||
-rw-r--r-- | wall-tileset-tool/main.cpp | 8 | ||||
-rw-r--r-- | wall-tileset-tool/main.hpp | 3 |
8 files changed, 45 insertions, 26 deletions
diff --git a/anim-crop-tool/main.cpp b/anim-crop-tool/main.cpp index 9cd3bcd4..3f314719 100644 --- a/anim-crop-tool/main.cpp +++ b/anim-crop-tool/main.cpp @@ -1,7 +1,7 @@ #include "atlas.hpp" #include "compat/assert.hpp" #include "compat/defs.hpp" -#include "compat/strerror.hpp" +#include "compat/debug.hpp" #include "compat/sysexits.hpp" #include "compat/fix-argv0.hpp" #include "loader/loader.hpp" @@ -271,9 +271,8 @@ int main(int argc, char** argv) : anim_info.object_name; if (auto pathname = Path::join(opts.output_dir, (base_name + ".png")); !atlas.dump(pathname)) { - char errbuf[128]; - auto errstr = get_error_string(errbuf); - ERR_nospace << "error: failed writing image to '" << pathname << "': " << errstr; + auto errstr = error_string(); + ERR << "error: failed writing image to" << quoted(pathname) << colon() << errstr; return EX_CANTCREAT; } anim_info.pixel_size = Vector2ui(atlas.size()); diff --git a/serialize/wall-atlas.cpp b/serialize/wall-atlas.cpp index 4e8a2b28..786920cc 100644 --- a/serialize/wall-atlas.cpp +++ b/serialize/wall-atlas.cpp @@ -100,7 +100,8 @@ wall_atlas_def wall_atlas_def::deserialize(StringView filename) return atlas; } -void wall_atlas_def::serialize(StringView filename, const Info& header, ArrayView<const Frame> frames, +void wall_atlas_def::serialize(StringView filename, const Info& header, + ArrayView<const Frame> frames, ArrayView<const Direction> dir_array, std::array<DirArrayIndex, Direction_COUNT> dir_map) { @@ -111,11 +112,14 @@ void wall_atlas_def::serialize(StringView filename, const Info& header, ArrayVie for (const auto [name_, dir] : wall_atlas::directions) if (auto idx = dir_map[(size_t)dir]) - if (const auto& dir = dir_array[idx.val]) + { + const auto& dir = dir_array[idx.val]; + if (is_direction_defined(dir)) { std::string_view name = {name_.data(), name_.size()}; write_direction_metadata(jroot[name], dir); } + } json_helper::to_json_(jroot, filename); } @@ -172,6 +176,17 @@ std::vector<Frame> read_all_frames(const json& jroot) return frames; } +bool is_direction_defined(const Direction& dir) +{ + for (auto [str, ptr, tag] : Direction::groups) + { + const auto& group = dir.*ptr; + if (group.is_defined) + return false; + } + return true; +} + Group read_group_metadata(const json& jgroup) { fm_assert(jgroup.is_object()); @@ -206,6 +221,7 @@ Group read_group_metadata(const json& jgroup) if (jgroup.contains("default-tint")) val.default_tint = !!jgroup["default-tint"]; + val.is_defined = true; return val; } @@ -262,6 +278,7 @@ void write_group_metadata(json& jgroup, const Group& val) constexpr Group group_defaults; fm_assert(jgroup.is_null()); + fm_assert(val.is_defined); if (val.index != (uint32_t)-1) jgroup["offset"] = val.index; @@ -286,8 +303,10 @@ void write_direction_metadata(json& jdir, const Direction& dir) for (auto [s_, memfn, tag] : Direction::groups) { - std::string_view s = {s_.data(), s_.size()}; const auto& group = dir.*memfn; + if (!group.is_defined) + continue; + std::string_view s = {s_.data(), s_.size()}; write_group_metadata(jdir[s], group); } if (jdir.contains("top")) diff --git a/serialize/wall-atlas.hpp b/serialize/wall-atlas.hpp index 3342ca49..725204ad 100644 --- a/serialize/wall-atlas.hpp +++ b/serialize/wall-atlas.hpp @@ -27,5 +27,6 @@ void write_group_metadata(json& jgroup, const Group& val); void write_direction_metadata(json& jdir, const Direction& dir); void write_all_directions(json& jroot, const wall_atlas& a); void write_info_header(json& jroot, const Info& info); +bool is_direction_defined(const Direction& dir); } // namespace floormat::Wall::detail diff --git a/src/wall-atlas.cpp b/src/wall-atlas.cpp index 77c8e404..721b7906 100644 --- a/src/wall-atlas.cpp +++ b/src/wall-atlas.cpp @@ -129,8 +129,10 @@ auto wall_atlas::group(size_t dir, size_t group) const -> const Group* const auto memfn = set.groups[group].member; const Group& ret = set.*memfn; +#if 0 if (ret.is_empty()) return {}; +#endif return &ret; } @@ -139,8 +141,10 @@ auto wall_atlas::group(const Direction& dir, Group_ tag) const -> const Group* fm_assert(tag < Group_::COUNT); const auto memfn = dir.groups[(size_t)tag].member; const Group& ret = dir.*memfn; +#if 0 if (ret.is_empty()) return {}; +#endif return &ret; } @@ -167,14 +171,6 @@ size_t wall_atlas::enum_to_index(enum rotation r) namespace floormat::Wall { -bool Direction::is_empty() const noexcept -{ - for (auto [str, member, tag] : Direction::groups) - if (const auto& val = this->*member; !val.is_empty()) - return false; - return true; -} - const Group& Direction::group(Group_ i) const { return const_cast<Direction&>(*this).group((size_t)i); } const Group& Direction::group(size_t i) const { return const_cast<Direction&>(*this).group(i); } Group& Direction::group(Group_ i) { return group((size_t)i); } diff --git a/src/wall-atlas.hpp b/src/wall-atlas.hpp index d00370fd..8afddc24 100644 --- a/src/wall-atlas.hpp +++ b/src/wall-atlas.hpp @@ -29,10 +29,10 @@ struct Group Color3 tint_add; uint8_t from_rotation = (uint8_t)-1; // applies only to images bool mirrored : 1 = false, - default_tint : 1 = true; + default_tint : 1 = true, + is_defined : 1 = false; - explicit operator bool() const noexcept { return !is_empty(); } - bool is_empty() const noexcept { return count == 0; } + //bool is_empty() const noexcept { return count == 0; } bool operator==(const Group&) const noexcept; }; @@ -46,9 +46,6 @@ struct Direction using memfn_ptr = Group Direction::*; struct member_tuple { StringView str; memfn_ptr member; Group_ tag; }; - explicit operator bool() const noexcept { return !is_empty(); } - bool is_empty() const noexcept; - Group wall{}, overlay{}, side{}, top{}; Group corner_L{}, corner_R{}; pass_mode passability = pass_mode::blocked; diff --git a/test/wall-atlas.cpp b/test/wall-atlas.cpp index df17eb14..e49abd80 100644 --- a/test/wall-atlas.cpp +++ b/test/wall-atlas.cpp @@ -55,9 +55,9 @@ void test_read_groups(StringView filename) fm_assert( jroot.contains("w") ); fm_assert(jroot["n"].is_object() && !jroot["n"].empty()); fm_assert(jroot["w"].is_object() && !jroot["w"].empty()); - fm_assert(!read_direction_metadata(jroot, Direction_::N).is_empty()); - fm_assert(read_direction_metadata(jroot, Direction_::E).is_empty()); - fm_assert(read_direction_metadata(jroot, Direction_::S).is_empty()); + fm_assert(is_direction_defined(read_direction_metadata(jroot, Direction_::N))); + fm_assert(!is_direction_defined(read_direction_metadata(jroot, Direction_::E))); + fm_assert(!is_direction_defined(read_direction_metadata(jroot, Direction_::S))); const auto dir = read_direction_metadata(jroot, Direction_::W); fm_assert(dir.passability == pass_mode::shoot_through); diff --git a/wall-tileset-tool/main.cpp b/wall-tileset-tool/main.cpp index ac4a7498..4fc62b9d 100644 --- a/wall-tileset-tool/main.cpp +++ b/wall-tileset-tool/main.cpp @@ -2,7 +2,6 @@ #include "compat/assert.hpp" #include "compat/sysexits.hpp" #include "compat/fix-argv0.hpp" -#include "compat/strerror.hpp" //#include "compat/format.hpp" #include "compat/debug.hpp" #include "src/wall-atlas.hpp" @@ -42,7 +41,7 @@ Vector2i get_buffer_size(const wall_atlas_def& a) for (auto j = 0uz; j < (size_t)Group_::COUNT; j++) { const auto& group = (dir.*(Direction::groups[j].member)); - if (group.is_empty()) + if (!group.is_defined) continue; auto val = wall_atlas::expected_size(a.header.depth, (Group_)j); size = Math::max(size, val); @@ -202,6 +201,11 @@ using namespace floormat::wall_tool; int main(int argc, char** argv) { + auto s = "foo"_s; + static_assert(std::is_same_v<decltype(quoted(StringView{"foo"}))::type, StringView>); + static_assert(std::is_same_v<decltype(quoted(String{"foo"}))::type, String>); + static_assert(std::is_same_v<decltype(quoted(s))::type, const StringView&>); + argv[0] = fix_argv0(argv[0]); auto [opts, args, opts_ok] = parse_cmdline(argc, argv); if (!opts_ok) diff --git a/wall-tileset-tool/main.hpp b/wall-tileset-tool/main.hpp index b826d634..d6403ccf 100644 --- a/wall-tileset-tool/main.hpp +++ b/wall-tileset-tool/main.hpp @@ -4,7 +4,10 @@ namespace cv { template<typename T> class Mat_; template<typename T, int cn> class Vec; +typedef Vec<unsigned char, 3> Vec3b; typedef Vec<unsigned char, 4> Vec4b; +typedef Mat_<unsigned char> Mat1b; +typedef Mat_<Vec3b> Mat3b; typedef Mat_<Vec4b> Mat4b; } // namespace cv |