summaryrefslogtreecommitdiffhomepage
path: root/loader/wall-traits.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-02-10 05:39:10 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-02-10 05:39:10 +0100
commit972275ca9cfbbbe23039c0cecb359420358d8ebf (patch)
tree77975d0349250c68ecbaf5f094cafee894a10773 /loader/wall-traits.cpp
parent25fd6d8eb0ec170ef6fabfb3097fe5f70e42edb8 (diff)
loader: don't require atlas's Cell pointer to remain constant
The make_cell() thing hasn't been tested yet.
Diffstat (limited to 'loader/wall-traits.cpp')
-rw-r--r--loader/wall-traits.cpp30
1 files changed, 11 insertions, 19 deletions
diff --git a/loader/wall-traits.cpp b/loader/wall-traits.cpp
index b5a4245c..ac9f1a7a 100644
--- a/loader/wall-traits.cpp
+++ b/loader/wall-traits.cpp
@@ -27,32 +27,24 @@ void wall_traits::ensure_atlases_loaded(Storage& st)
{
if (!st.name_map.empty()) [[likely]]
return;
- st.name_map.max_load_factor(0.4f);
-
- constexpr bool add_invalid = true;
st.cell_array = wall_cell::load_atlases_from_json().vec;
- st.name_map.reserve(st.cell_array.size()*2);
- fm_assert(!st.cell_array.empty());
- fm_assert(st.name_map.empty());
-
- if constexpr(add_invalid)
- {
- for (auto& x : st.cell_array)
- fm_soft_assert(x.name != loader.INVALID);
- st.cell_array.push_back(make_invalid_atlas(st));
- }
+ st.name_map.max_load_factor(0.4f);
+ st.name_map.reserve((st.cell_array.size()+1)*3/2);
+ st.name_map[loader.INVALID] = -1uz;
for (auto& c : st.cell_array)
+ if (c.name.isSmall())
+ c.name = String{AllocatedInit, c.name};
+
+ for (auto i = 0uz; const auto& c : st.cell_array)
{
- if constexpr(!add_invalid)
- fm_soft_assert(c.name != "<invalid>"_s);
+ fm_soft_assert(c.name != loader.INVALID);
fm_soft_assert(loader.check_atlas_name(c.name));
- StringView name = c.name;
- st.name_map[name] = &c;
+ fm_soft_assert(!c.atlas);
+ fm_assert(!c.name.isSmall());
+ st.name_map[c.name] = i++;
}
-
- fm_assert(!st.cell_array.empty());
}
auto wall_traits::make_invalid_atlas(Storage& st) -> const Cell&