summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/bitmask.cpp2
-rw-r--r--editor/imgui-editors.cpp2
-rw-r--r--editor/update.cpp8
-rw-r--r--loader/ground-atlas.cpp16
-rw-r--r--loader/ground-info.hpp2
-rw-r--r--loader/wall-atlas.cpp1
-rw-r--r--serialize/ground-atlas.cpp2
-rw-r--r--src/ground-atlas.hpp2
-rw-r--r--src/tile.cpp11
-rw-r--r--test/json.cpp2
-rw-r--r--test/loader.cpp16
-rw-r--r--test/serializer.cpp2
12 files changed, 44 insertions, 22 deletions
diff --git a/bench/bitmask.cpp b/bench/bitmask.cpp
index 6f80e992..9efa25a9 100644
--- a/bench/bitmask.cpp
+++ b/bench/bitmask.cpp
@@ -12,7 +12,7 @@ namespace {
[[maybe_unused]] void Bitmask(benchmark::State& state)
{
- auto img = loader.texture(loader.SCENERY_PATH, "door-close"_s, false);
+ auto img = loader.texture(loader.SCENERY_PATH, "door-close"_s);
auto bitmask = anim_atlas::make_bitmask(img);
anim_atlas::make_bitmask_(img, bitmask);
diff --git a/editor/imgui-editors.cpp b/editor/imgui-editors.cpp
index 2712dc5f..595d6c77 100644
--- a/editor/imgui-editors.cpp
+++ b/editor/imgui-editors.cpp
@@ -268,7 +268,7 @@ void app::draw_editor_pane(float main_menu_height)
{
if (ed)
for (const auto& [k, v] : *ed)
- draw_editor_tile_pane_atlas(*ed, k, v, dpi);
+ draw_editor_tile_pane_atlas(*ed, k, v->atlas, dpi);
else if (sc)
impl_draw_editor_scenery_pane<scenery_editor>(*sc, dpi);
else if (vo)
diff --git a/editor/update.cpp b/editor/update.cpp
index 6ecffc80..3d22c37c 100644
--- a/editor/update.cpp
+++ b/editor/update.cpp
@@ -17,10 +17,10 @@ namespace floormat {
void app::maybe_initialize_chunk_(const chunk_coords_& pos, chunk& c)
{
- auto floor1 = loader.ground_atlas("ground-tiles", { 44, 4 }, pass_mode::pass);
- auto floor2 = loader.ground_atlas("metal1", { 2, 2 }, pass_mode::pass);
- auto wall1 = loader.ground_atlas("wood2", { 2, 1 }, pass_mode::blocked);
- auto wall2 = loader.ground_atlas("wood1", { 2, 1 }, pass_mode::blocked);
+ auto floor1 = loader.ground_atlas("ground-tiles");
+ auto floor2 = loader.ground_atlas("metal1");
+ auto wall1 = loader.ground_atlas("wood2");
+ auto wall2 = loader.ground_atlas("wood1");
auto door = loader.anim_atlas("door-close", loader.SCENERY_PATH);
auto table = loader.anim_atlas("table", loader.SCENERY_PATH);
auto control_panel = loader.anim_atlas("control-panel", loader.SCENERY_PATH);
diff --git a/loader/ground-atlas.cpp b/loader/ground-atlas.cpp
index 2835db2d..4d76e7ab 100644
--- a/loader/ground-atlas.cpp
+++ b/loader/ground-atlas.cpp
@@ -24,7 +24,7 @@ std::shared_ptr<ground_atlas> loader_impl::get_ground_atlas(StringView name, Vec
auto filename = make_atlas_path(buf, loader.GROUND_TILESET_PATH, name);
auto tex = texture(""_s, filename);
- auto info = ground_info{name, {}, size, pass};
+ auto info = ground_def{name, size, pass};
auto atlas = std::make_shared<class ground_atlas>(info, filename, tex);
return atlas;
}
@@ -32,6 +32,8 @@ std::shared_ptr<ground_atlas> loader_impl::get_ground_atlas(StringView name, Vec
// todo copypasta from wall-atlas.cpp
std::shared_ptr<class ground_atlas> loader_impl::ground_atlas(StringView name, bool fail_ok) noexcept(false)
{
+ (void)ground_atlas_list();
+ fm_assert(fail_ok || name != INVALID);
fm_soft_assert(check_atlas_name(name));
auto it = ground_atlas_map.find(name);
@@ -86,8 +88,14 @@ void loader_impl::get_ground_atlas_list()
{
fm_assert(ground_atlas_map.empty());
- ground_atlas_array = json_helper::from_json<std::vector<ground_info>>(
- Path::join(loader_::GROUND_TILESET_PATH, "ground.json"_s));
+ auto defs = json_helper::from_json<std::vector<ground_def>>(Path::join(loader_::GROUND_TILESET_PATH, "ground.json"_s));
+ std::vector<ground_info> infos;
+ infos.reserve(defs.size());
+
+ for (auto& x : defs)
+ infos.push_back(ground_info{std::move(x.name), {}, x.size, x.pass});
+
+ ground_atlas_array = infos;
ground_atlas_array.shrink_to_fit();
ground_atlas_map.clear();
ground_atlas_map.reserve(ground_atlas_array.size()*2);
@@ -110,7 +118,7 @@ const ground_info& loader_impl::make_invalid_ground_atlas()
return *invalid_ground_atlas;
auto atlas = std::make_shared<class ground_atlas>(
- ground_info{loader.INVALID, {}, Vector2ub{1,1}, pass_mode::pass},
+ ground_def{loader.INVALID, Vector2ub{1,1}, pass_mode::pass},
""_s, make_error_texture(Vector2ui(iTILE_SIZE2)));
invalid_ground_atlas = Pointer<ground_info>{
InPlaceInit, atlas->name(),
diff --git a/loader/ground-info.hpp b/loader/ground-info.hpp
index 44c4c638..1a21e960 100644
--- a/loader/ground-info.hpp
+++ b/loader/ground-info.hpp
@@ -13,7 +13,7 @@ struct ground_info
String name;
std::shared_ptr<ground_atlas> atlas;
Vector2ub size;
- pass_mode pass;
+ pass_mode pass = pass_mode::pass;
};
} // namespace floormat
diff --git a/loader/wall-atlas.cpp b/loader/wall-atlas.cpp
index ce136fdb..ce0f4e4d 100644
--- a/loader/wall-atlas.cpp
+++ b/loader/wall-atlas.cpp
@@ -70,6 +70,7 @@ const wall_info& loader_impl::make_invalid_wall_atlas()
std::shared_ptr<class wall_atlas> loader_impl::wall_atlas(StringView name, bool fail_ok) noexcept(false)
{
+ fm_assert(fail_ok || name != INVALID);
fm_soft_assert(check_atlas_name(name));
auto it = wall_atlas_map.find(name);
diff --git a/serialize/ground-atlas.cpp b/serialize/ground-atlas.cpp
index 517b8186..71c53510 100644
--- a/serialize/ground-atlas.cpp
+++ b/serialize/ground-atlas.cpp
@@ -3,6 +3,8 @@
#include "serialize/magnum-vector.hpp"
#include "serialize/pass-mode.hpp"
#include "loader/loader.hpp"
+#include <Magnum/Trade/ImageData.h>
+#include <Magnum/ImageView.h>
#include <tuple>
#include <nlohmann/json.hpp>
diff --git a/src/ground-atlas.hpp b/src/ground-atlas.hpp
index 83b4705c..38832f9b 100644
--- a/src/ground-atlas.hpp
+++ b/src/ground-atlas.hpp
@@ -16,7 +16,7 @@ struct ground_def
{
String name;
Vector2ub size;
- pass_mode pass;
+ pass_mode pass = pass_mode::pass;
};
class ground_atlas;
diff --git a/src/tile.cpp b/src/tile.cpp
index c5eda401..91fb73aa 100644
--- a/src/tile.cpp
+++ b/src/tile.cpp
@@ -1,5 +1,6 @@
#include "tile.hpp"
#include "chunk.hpp"
+#include "src/ground-atlas.hpp"
namespace floormat {
@@ -7,9 +8,13 @@ namespace floormat {
static_assert(iTILE_SIZE2.x() == iTILE_SIZE2.y());
bool operator==(const tile_proto& a, const tile_proto& b) noexcept {
- return a.ground() == b.ground() &&
- a.wall_north() == b.wall_north() &&
- a.wall_west() == b.wall_west();
+ if (const auto &A = a.ground(), &B = b.ground(); A != B)
+ return false;
+ if (const auto &A = a.wall_north(), &B = b.wall_north(); A != B)
+ return false;
+ if (const auto &A = a.wall_west(), &B = b.wall_west(); A != B)
+ return false;
+ return true;
};
tile_image_proto tile_proto::ground() const noexcept { return { ground_atlas, ground_variant }; }
diff --git a/test/json.cpp b/test/json.cpp
index ad0cee37..0ad0c709 100644
--- a/test/json.cpp
+++ b/test/json.cpp
@@ -41,7 +41,7 @@ void test_app::test_json() // NOLINT(readability-convert-member-functions-to-sta
fm_assert(Path::exists(Path::join(loader.TEMP_PATH, "CMakeCache.txt")));
const auto output_dir = Path::join(loader.TEMP_PATH, "test/."_s);
{
- auto atlas = loader.get_ground_atlas("metal1", { 2, 2 }, pass_mode::pass);
+ auto atlas = loader.ground_atlas("metal1");
json_helper::to_json(atlas, Path::join(output_dir, "atlas.json"));
}
{
diff --git a/test/loader.cpp b/test/loader.cpp
index f400ecb3..8910df72 100644
--- a/test/loader.cpp
+++ b/test/loader.cpp
@@ -8,17 +8,23 @@ namespace floormat {
void test_app::test_loader()
{
- (void)loader.ground_atlases("ground.json");
+ for (const auto& x : loader.ground_atlas_list())
+ (void)loader.ground_atlas(x.name);
fm_assert(loader.ground_atlas("texel")->pass_mode() == pass_mode::blocked);
fm_assert(loader.ground_atlas("metal1")->pass_mode() == pass_mode::pass);
loader.sceneries();
for (StringView name : loader.anim_atlas_list())
loader.anim_atlas(name);
- (void)loader.wall_atlas_list();
-#if 0
+
+ { auto walls = loader.wall_atlas_list();
+ fm_assert(!walls.isEmpty());
+ fm_assert(loader.wall_atlas("test1"_s));
+ fm_assert(loader.wall_atlas(loader.INVALID, true));
+ fm_assert(loader.wall_atlas("test1"_s) == loader.wall_atlas("test1"_s));
+ fm_assert(loader.wall_atlas("test1"_s) != loader.wall_atlas(loader.INVALID, true));
+ }
for (const auto& info : loader.wall_atlas_list())
- (void)loader.wall_atlas(info.name);
-#endif
+ fm_assert(loader.wall_atlas(info.name));
}
} // namespace floormat
diff --git a/test/serializer.cpp b/test/serializer.cpp
index c768023e..518962e0 100644
--- a/test/serializer.cpp
+++ b/test/serializer.cpp
@@ -18,7 +18,7 @@ chunk& test_app::make_test_chunk(world& w, chunk_coords_ ch)
chunk& c = w[ch];
c.mark_modified();
auto metal2 = loader.wall_atlas("empty", false);
- auto tiles = loader.ground_atlas("tiles", { 8, 5 }, pass_mode::pass);
+ auto tiles = loader.ground_atlas("tiles");
constexpr auto N = TILE_MAX_DIM;
for (auto [x, k, pt] : c)
x.ground() = { tiles, variant_t(k % tiles->num_tiles()) };