diff options
-rw-r--r-- | bench/bitmask.cpp | 2 | ||||
-rw-r--r-- | editor/imgui-editors.cpp | 2 | ||||
-rw-r--r-- | editor/update.cpp | 8 | ||||
-rw-r--r-- | loader/ground-atlas.cpp | 16 | ||||
-rw-r--r-- | loader/ground-info.hpp | 2 | ||||
-rw-r--r-- | loader/wall-atlas.cpp | 1 | ||||
-rw-r--r-- | serialize/ground-atlas.cpp | 2 | ||||
-rw-r--r-- | src/ground-atlas.hpp | 2 | ||||
-rw-r--r-- | src/tile.cpp | 11 | ||||
-rw-r--r-- | test/json.cpp | 2 | ||||
-rw-r--r-- | test/loader.cpp | 16 | ||||
-rw-r--r-- | test/serializer.cpp | 2 |
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()) }; |