SpriteAtlas.h
SpriteAtlas.h
CPP1/* Copyright Statement:2 *3 * (C) 2021-2025 Cubios Inc. All rights reserved.4 */5#pragma once67#include "Scene.h"8#include "SceneObject.h"9#include "Math/Rect2.h"1011#include <string>12#include <unordered_map>1314namespace Cubios15{16namespace Gfx17{18 class SpriteAtlasBase;19 class SpriteAtlasElement: public Cubios::SceneObject20 {21 public:22 SpriteAtlasElement(SpriteAtlasBase* host, const Cubios::Math::Rect2& rc);23 virtual ~SpriteAtlasElement();2425 void Render() override;2627 virtual SpriteAtlasElement* Copy();2829 inline Cubios::Math::Rect2* Rect() {return &this->rc;}30 protected:31 Cubios::Math::Rect2 rc;32 SpriteAtlasBase* host;33 };3435 class SpriteAtlasBase36 {37 public:38 SpriteAtlasBase(Cubios::Scene* scene): scene(scene) {}3940 public:41 u32_t resourceId;42 Cubios::Scene* scene;43 };4445 template <typename T>46 class SpriteAtlas: public SpriteAtlasBase47 {48 static_assert(std::is_base_of<Cubios::Gfx::SpriteAtlasElement, T>::value, "T must inherit from Cubios::Gtf::SpriteAtlasElement");4950 public:51 SpriteAtlas(std::string name, Cubios::Scene* scene);52 virtual ~SpriteAtlas();5354 bool AddSprite(uint32_t id, const Cubios::Math::Rect2& rc);55 bool RemoveSprite(uint32_t id);5657 T* operator[](uint32_t);58 T* Get(uint32_t ind);5960 inline size_t Count() {return elements.size();}61 inline std::vector<uint32_t>* ElementsInsertionOrder() {return &this->insertion_order;}62 private:63 std::unordered_map<uint32_t,T*> elements;64 std::vector<uint32_t> insertion_order;65 };66}67}686970namespace Cubios71{72 namespace Gfx73 {74 template <typename T>75 SpriteAtlas<T>::SpriteAtlas(std::string name, Cubios::Scene* scene):SpriteAtlasBase(scene)76 {77 this->resourceId = Cubios::GFX_getAssetId(name.c_str());78 }7980 template <typename T>81 SpriteAtlas<T>::~SpriteAtlas()82 {}8384 template <typename T>85 bool SpriteAtlas<T>::AddSprite(uint32_t id, const Cubios::Math::Rect2& rc)86 {87 bool ret = true;8889 if(this->scene->CreateObjectWithID(id,new T(this,rc)))90 {91 this->elements[id] = dynamic_cast<T*>(this->scene->operator[](id));92 this->insertion_order.push_back(id);93 }94 else95 {96 LOG_e("SpriteAtlas::AddSprite: Resource with id %d already exists\n",id);97 ret = false;98 }99100 return ret;101 }102103 template <typename T>104 bool SpriteAtlas<T>::RemoveSprite(uint32_t id)105 {106 bool ret = true;107 typename std::unordered_map<uint32_t, T*>::iterator it = this->elements.find(id);108109 if(it!=this->elements.end())110 {111 if(this->elements[id]!=nullptr)112 {113 delete this->elements[id];114 }115116 this->elements.erase(it);117118 std::vector<uint32_t>::iterator it2 = this->insertion_order.find(id);119 if(it2!=this->insertion_order.end())120 {121 this->insertion_order.erase(it2);122 }123 }124 else125 {126 ret = false;127 }128129 return ret;130 }131132 template <typename T>133 T* SpriteAtlas<T>::operator[](uint32_t ind)134 {135 return this->elements[ind];136 }137138 template <typename T>139 T* SpriteAtlas<T>::Get(uint32_t ind)140 {141 return this->elements[ind];142 }143 }144}145146
Wrapped for easier reading. Turn wrap off to inspect exact line lengths.