summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--anim-crop-tool/main.cpp7
-rw-r--r--serialize/wall-atlas.cpp25
-rw-r--r--serialize/wall-atlas.hpp1
-rw-r--r--src/wall-atlas.cpp12
-rw-r--r--src/wall-atlas.hpp9
-rw-r--r--test/wall-atlas.cpp6
-rw-r--r--wall-tileset-tool/main.cpp8
-rw-r--r--wall-tileset-tool/main.hpp3
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