From 81f68a2c83c0c25259cd526c8bb4839caa361e8f Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 1 Dec 2022 13:21:32 +0100 Subject: serialize, loader, test: add serializing scenery --- loader/impl.cpp | 1 + loader/impl.hpp | 5 +++++ loader/json.cpp | 33 ++++++++++++++++++++++++++++----- loader/loader.hpp | 5 +++-- loader/scenery.hpp | 13 +++++++++++++ 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 loader/scenery.hpp (limited to 'loader') diff --git a/loader/impl.cpp b/loader/impl.cpp index 65516e17..45c5b055 100644 --- a/loader/impl.cpp +++ b/loader/impl.cpp @@ -1,5 +1,6 @@ #include "impl.hpp" #include "compat/assert.hpp" +#include "loader/scenery.hpp" #include #include #include diff --git a/loader/impl.hpp b/loader/impl.hpp index 6a49269f..a6916ceb 100644 --- a/loader/impl.hpp +++ b/loader/impl.hpp @@ -25,11 +25,16 @@ struct loader_impl final : loader_ std::unordered_map> anim_atlas_map; std::vector anim_atlases; + std::vector sceneries_array; + std::unordered_map sceneries_map; + StringView shader(StringView filename) override; Trade::ImageData2D texture(StringView prefix, StringView filename); std::shared_ptr tile_atlas(StringView filename, Vector2ub size) override; ArrayView anim_atlas_list() override; std::shared_ptr anim_atlas(StringView name, StringView dir) override; + const std::vector& sceneries() override; + const scenery_proto& scenery(StringView name) override; void get_anim_atlas_list(); diff --git a/loader/json.cpp b/loader/json.cpp index 1a698a38..710792f8 100644 --- a/loader/json.cpp +++ b/loader/json.cpp @@ -1,8 +1,10 @@ #include "impl.hpp" +#include "compat/assert.hpp" #include "serialize/json-helper.hpp" #include "serialize/anim.hpp" #include "serialize/tile-atlas.hpp" #include "serialize/scenery.hpp" +#include "loader/scenery.hpp" #include namespace floormat::loader_detail { @@ -12,6 +14,32 @@ anim_def loader_impl::deserialize_anim(StringView filename) return json_helper::from_json(filename); } +const std::vector& loader_impl::sceneries() +{ + if (!sceneries_array.empty()) + return sceneries_array; + + sceneries_array = json_helper::from_json>(Path::join(SCENERY_PATH, "scenery.json")); + sceneries_map.reserve(sceneries_array.size() * 2); + for (const serialized_scenery& s : sceneries_array) + { + if (sceneries_map.contains(s.name)) + fm_abort("duplicate scenery name '%s'", s.name.data()); + sceneries_map[s.name] = &s; + } + return sceneries_array; +} + +const scenery_proto& loader_impl::scenery(StringView name) +{ + if (sceneries_array.empty()) + (void)sceneries(); + auto it = sceneries_map.find(name); + if (it == sceneries_map.end()) + fm_abort("no such scenery: '%s'", name.data()); + return it->second->proto; +} + } // namespace floormat::loader_detail namespace floormat { @@ -21,9 +49,4 @@ std::vector> loader_::tile_atlases(StringView return json_helper::from_json>>(Path::join(loader_::IMAGE_PATH, filename)); } -std::vector loader_::sceneries() -{ - return json_helper::from_json>(Path::join(SCENERY_PATH, "scenery.json")); -} - } // namespace floormat diff --git a/loader/loader.hpp b/loader/loader.hpp index 93ac5654..458bf34d 100644 --- a/loader/loader.hpp +++ b/loader/loader.hpp @@ -4,7 +4,7 @@ #include namespace Magnum { using Vector2ub = Math::Vector2; } -namespace floormat::Serialize { struct serialized_scenery; } +namespace floormat { struct serialized_scenery; } namespace floormat { @@ -21,7 +21,8 @@ struct loader_ static void destroy(); static loader_& default_loader() noexcept; static std::vector> tile_atlases(StringView filename); - static std::vector sceneries(); + virtual const std::vector& sceneries() = 0; + virtual const scenery_proto& scenery(StringView name) = 0; loader_(const loader_&) = delete; loader_& operator=(const loader_&) = delete; diff --git a/loader/scenery.hpp b/loader/scenery.hpp new file mode 100644 index 00000000..55f3f972 --- /dev/null +++ b/loader/scenery.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "src/scenery.hpp" +#include + +namespace floormat { + +struct serialized_scenery final +{ + String name, descr; + scenery_proto proto; +}; + +} // namespace floormat -- cgit v1.2.3