1313namespace sndx ::render {
1414
1515 template <class IdT = std::string>
16- class ImageAtlas {
17- private:
16+ struct ImageAtlas {
1817 struct Entry {
1918 glm::vec<2 , size_t > pos, dims;
2019 };
@@ -27,33 +26,20 @@ namespace sndx::render {
2726
2827 ImageAtlas (decltype (m_entries)&& entries, ImageData&& image) :
2928 m_entries (std::move(entries)), m_image(std::move(image)) {}
30- public:
31-
32- [[nodiscard]]
33- const auto & getImage () const {
34- return m_image;
35- }
36-
37- [[nodiscard]]
38- const auto & getEntry (const IdT& id) const {
39- return m_entries.at (id);
40- }
29+ };
4130
42- [[nodiscard]]
43- auto size () const {
44- return m_entries. size () ;
45- }
31+ template < class IdT > [[nodiscard]]
32+ inline std::unordered_map<IdT, std::pair<glm::vec2, glm::vec2>> normalizeAtlasEntries ( const std::unordered_map<IdT, typename ImageAtlas<IdT>::Entry>& entries, glm::vec2 size) {
33+ std::unordered_map<IdT, std::pair<glm::vec2, glm::vec2>> out{} ;
34+ out. reserve (entries. size ());
4635
47- [[nodiscard]]
48- auto begin () const {
49- return m_entries. begin ( );
36+ const glm::vec2 scaling = 1 . 0f / size;
37+ for ( const auto & [id, entry] : entries) {
38+ out. emplace (id, std::pair{ entry. pos * scaling, entry. dims * scaling } );
5039 }
5140
52- [[nodiscard]]
53- auto end () const {
54- return m_entries.end ();
55- }
56- };
41+ return out;
42+ }
5743
5844 template <class TextureT , class IdT = std::string>
5945 class TextureAtlas {
@@ -70,17 +56,22 @@ namespace sndx::render {
7056 public:
7157
7258 TextureAtlas (const ImageAtlas<IdT>& atlas, bool compress = false ):
73- m_entries{}, m_texture{atlas.getImage () , 0 , compress } {
74- m_entries.reserve (atlas.size ());
75- const auto & image = atlas.getImage () ;
59+ m_entries{}, m_texture{atlas.m_image , 0 , compress } {
60+ m_entries.reserve (atlas.m_entries . size ());
61+ const auto & image = atlas.m_image ;
7662
7763 glm::vec2 scaling = 1 .0f / glm::vec2{ image.width (), image.height ()};
7864
79- for (const auto & [id, entry] : atlas) {
65+ for (const auto & [id, entry] : atlas. m_entries ) {
8066 Entry e{ glm::vec2{entry.pos } *scaling, glm::vec2{entry.dims } *scaling };
8167 m_entries.emplace (id, std::move (e));
8268 }
8369 }
70+
71+ [[nodiscard]]
72+ const auto & getEntries () const {
73+ return m_entries;
74+ }
8475
8576 [[nodiscard]]
8677 const auto & getTexture () const {
0 commit comments