From 4f7b007d3239fd1ce3566b30ab86434ccda1da48 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 8 Feb 2024 23:09:20 +0100 Subject: loader: wall loader wip --- loader/wall-atlas.cpp | 21 ++++--------------- loader/wall-atlas.hpp | 7 +++++++ loader/wall-cell.cpp | 36 +++++++++++++++++++++++++++++++++ loader/wall-traits.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ loader/wall-traits.hpp | 26 ++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 loader/wall-atlas.hpp create mode 100644 loader/wall-cell.cpp create mode 100644 loader/wall-traits.cpp create mode 100644 loader/wall-traits.hpp diff --git a/loader/wall-atlas.cpp b/loader/wall-atlas.cpp index 5baa24f3..3c4e3896 100644 --- a/loader/wall-atlas.cpp +++ b/loader/wall-atlas.cpp @@ -3,9 +3,10 @@ #include "loader/wall-cell.hpp" #include "compat/assert.hpp" #include "compat/exception.hpp" +#include "compat/vector-wrapper.hpp" #include "src/wall-atlas.hpp" -#include "serialize/json-helper.hpp" -#include "serialize/corrade-string.hpp" +//#include "serialize/json-helper.hpp" +//#include "serialize/corrade-string.hpp" #include #include #include @@ -15,20 +16,6 @@ namespace floormat { -using nlohmann::json; - -[[maybe_unused]] static void from_json(const json& j, wall_cell& val) -{ - val = {}; - val.name = j["name"]; - fm_soft_assert(loader.check_atlas_name(val.name)); -} - -[[maybe_unused]] static void to_json(json& j, const wall_cell& val) -{ - j["name"] = val.name; -} - std::shared_ptr loader_::get_wall_atlas(StringView name) noexcept(false) { fm_assert(name != ""_s); @@ -140,7 +127,7 @@ void loader_impl::get_wall_atlas_list() { fm_assert(wall_atlas_map.empty()); - wall_atlas_array = json_helper::from_json>(Path::join(WALL_TILESET_PATH, "walls.json"_s)); + wall_atlas_array = wall_cell::load_atlases_from_json().vec; wall_atlas_array.shrink_to_fit(); wall_atlas_map.clear(); wall_atlas_map.reserve(wall_atlas_array.size()*2); diff --git a/loader/wall-atlas.hpp b/loader/wall-atlas.hpp new file mode 100644 index 00000000..b388f543 --- /dev/null +++ b/loader/wall-atlas.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace floormat::loader_detail { + + + +} // namespace floormat::loader_detail diff --git a/loader/wall-cell.cpp b/loader/wall-cell.cpp new file mode 100644 index 00000000..99ba2fcc --- /dev/null +++ b/loader/wall-cell.cpp @@ -0,0 +1,36 @@ +#include "wall-cell.hpp" +#include "compat/vector-wrapper.hpp" +#include "compat/exception.hpp" +#include "serialize/json-helper.hpp" +#include "serialize/corrade-string.hpp" +#include "loader/loader.hpp" + +namespace floormat { + +using nlohmann::json; + +[[maybe_unused]] static void from_json(const json& j, wall_cell& val) +{ + val = {}; + val.name = j["name"]; + fm_soft_assert(loader.check_atlas_name(val.name)); +} + +[[maybe_unused]] static void to_json(json& j, const wall_cell& val) +{ + j["name"] = val.name; +} + +vector_wrapper wall_cell::load_atlases_from_json() +{ + char buf[fm_FILENAME_MAX]; + auto s = loader.make_atlas_path(buf, loader.WALL_TILESET_PATH, "walls.json"_s); + + return { json_helper::from_json>(s) }; +} + +} // namespace floormat + +namespace floormat::loader_detail { + +} // namespace floormat::loader_detail diff --git a/loader/wall-traits.cpp b/loader/wall-traits.cpp new file mode 100644 index 00000000..d4217a01 --- /dev/null +++ b/loader/wall-traits.cpp @@ -0,0 +1,55 @@ +#include "wall-traits.hpp" +#include "compat/assert.hpp" +#include "atlas-loader-storage.hpp" +#include "wall-cell.hpp" +#include "src/wall-atlas.hpp" +#include +#include + +namespace floormat::loader_detail { + +StringView atlas_loader_traits::loader_name() { return "wall_atlas"_s; } +auto atlas_loader_traits::atlas_of(const Cell& x) -> const std::shared_ptr& { return x.atlas; } +auto atlas_loader_traits::atlas_of(Cell& x) -> std::shared_ptr& { return x.atlas; } +StringView atlas_loader_traits::name_of(const Cell& x) { return x.name; } +StringView atlas_loader_traits::name_of(const Atlas& x) { return x.name(); } + +using traits = atlas_loader_traits; + +void traits::ensure_atlases_loaded(Storage& st) +{ + if (!st.cell_array.empty()) [[likely]] + return; + +#if 0 + wall_atlas_array = json_helper::from_json>(Path::join(WALL_TILESET_PATH, "walls.json"_s)); + wall_atlas_array.shrink_to_fit(); + wall_atlas_map.clear(); + wall_atlas_map.reserve(wall_atlas_array.size()*2); + + for (auto& x : wall_atlas_array) + { + fm_soft_assert(x.name != ""_s); + fm_soft_assert(check_atlas_name(x.name)); + StringView name = x.name; + wall_atlas_map[name] = &x; + fm_debug_assert(name.data() == wall_atlas_map[name]->name.data()); + } +#endif + + fm_assert("todo" && false); + + fm_assert(!st.cell_array.empty()); +} + +auto traits::make_invalid_atlas(Storage& st) -> const Cell& +{ + fm_assert("todo" && false); +} + +auto traits::make_atlas(StringView name, const Cell& c) -> std::shared_ptr +{ + fm_assert("todo" && false); +} + +} // namespace floormat::loader_detail diff --git a/loader/wall-traits.hpp b/loader/wall-traits.hpp new file mode 100644 index 00000000..fb5cc2a0 --- /dev/null +++ b/loader/wall-traits.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "atlas-loader-fwd.hpp" +#include + +namespace floormat { struct wall_cell; class wall_atlas; } + +namespace floormat::loader_detail { + +template<> struct atlas_loader_traits +{ + using Atlas = wall_atlas; + using Cell = wall_cell; // convertible to atlas and holding the atlas + using Self = atlas_loader_traits; + using Storage = atlas_storage; + + static StringView loader_name(); + static const std::shared_ptr& atlas_of(const Cell& x); + static std::shared_ptr& atlas_of(Cell& x); + static StringView name_of(const Cell& x); + static StringView name_of(const Atlas& x); + static void ensure_atlases_loaded(Storage& st); + static const Cell& make_invalid_atlas(Storage& st); + static std::shared_ptr make_atlas(StringView name, const Cell& c); +}; + +} // namespace floormat::loader_detail -- cgit v1.2.3