summaryrefslogtreecommitdiffhomepage
path: root/loader/atlas-loader.inl
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-02-11 00:39:28 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-02-11 08:49:51 +0100
commit5267d7b5b52fb8112dc4001b3b8f7985521af5ba (patch)
tree32952992edee1144841b1cb8d69965ee981fe870 /loader/atlas-loader.inl
parentb8c538bcdfdcc7f2739934ea96fe98ae61b565dc (diff)
wip atlas loader
Diffstat (limited to 'loader/atlas-loader.inl')
-rw-r--r--loader/atlas-loader.inl40
1 files changed, 34 insertions, 6 deletions
diff --git a/loader/atlas-loader.inl b/loader/atlas-loader.inl
index af5d9567..f5cd39ea 100644
--- a/loader/atlas-loader.inl
+++ b/loader/atlas-loader.inl
@@ -25,13 +25,37 @@ atlas_loader(TRAITS&& traits) noexcept -> atlas_loader<TRAITS, typename TRAITS::
template<typename ATLAS, typename TRAITS>
auto atlas_loader<ATLAS, TRAITS>::ensure_atlas_list() -> ArrayView<const Cell>
{
- if (!s.cell_array.empty()) [[likely]]
+ if (!s.name_map.empty()) [[likely]]
return { s.cell_array.data(), s.cell_array.size() };
+
t.ensure_atlases_loaded(s);
+
for (Cell& c : s.cell_array)
- if (String& name{t.name_of(c)}; name.isSmall())
+ {
+ String& name{t.name_of(c)};
+ if (name.isSmall())
name = String{AllocatedInit, name};
+ fm_soft_assert(name != loader.INVALID);
+ fm_soft_assert(loader.check_atlas_name(name));
+ }
+
+ s.name_map.max_load_factor(0.4f);
+ s.name_map.reserve(s.cell_array.size()*3/2 + 1);
+ for (auto i = 0uz; const auto& c : s.cell_array)
+ s.name_map[t.name_of(c)] = i++;
+
+ { const Cell& invalid_atlas{get_invalid_atlas()};
+ size_t sz{s.cell_array.size()};
+ s.cell_array.push_back(invalid_atlas);
+ s.name_map[loader.INVALID] = sz;
+ }
+
+ fm_assert(!s.name_map.empty());
fm_assert(!s.cell_array.empty());
+
+ for (const auto& [name, index] : s.name_map)
+ fm_assert(index < s.cell_array.size() || index == -1uz);
+
return { s.cell_array.data(), s.cell_array.size() };
}
@@ -39,7 +63,7 @@ template<typename ATLAS, typename TRAITS>
const std::shared_ptr<ATLAS>& atlas_loader<ATLAS, TRAITS>::get_atlas(StringView name, loader_policy p)
{
ensure_atlas_list();
- const std::shared_ptr<Atlas>& invalid_atlas = t.atlas_of(t.make_invalid_atlas(s));
+ const std::shared_ptr<Atlas>& invalid_atlas = t.atlas_of(get_invalid_atlas());
fm_debug_assert(invalid_atlas);
switch (p)
@@ -152,9 +176,13 @@ auto atlas_loader<ATLAS, TRAITS>::make_atlas(StringView name, const Cell& c) ->
template<typename ATLAS, typename TRAITS>
auto atlas_loader<ATLAS, TRAITS>::get_invalid_atlas() -> const Cell&
{
- const auto& cell = t.make_invalid_atlas(s);
- fm_assert(t.atlas_of(cell));
- return cell;
+ if (s.invalid_atlas) [[likely]]
+ return *s.invalid_atlas;
+ s.invalid_atlas = t.make_invalid_atlas(s);
+ fm_assert(s.invalid_atlas);
+ fm_assert(t.atlas_of(*s.invalid_atlas));
+ fm_assert(t.name_of(*s.invalid_atlas) == loader.INVALID);
+ return *s.invalid_atlas;
}
} // namespace floormat::loader_detail