SpriteAtlas.h
SpriteAtlas.h
CPP1/* Copyright Statement:2 *3 * (C) 2021-2024 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 protected:30 Cubios::Math::Rect2 rc;31 SpriteAtlasBase* host;32 };3334 class SpriteAtlasBase35 {36 public:37 SpriteAtlasBase(Cubios::Scene* scene): scene(scene) {}3839 public:40 u32_t resourceId;41 Cubios::Scene* scene;42 };4344 template <typename T>45 class SpriteAtlas: public SpriteAtlasBase46 {47 static_assert(std::is_base_of<Cubios::Gfx::SpriteAtlasElement, T>::value, "T must inherit from Cubios::Gtf::SpriteAtlasElement");4849 public:50 SpriteAtlas(std::string name, Cubios::Scene* scene);51 virtual ~SpriteAtlas();5253 bool AddSprite(uint32_t id, const Cubios::Math::Rect2& rc);54 bool RemoveSprite(uint32_t id);5556 T* operator[](uint32_t);57 T* Get(uint32_t ind);5859 private:60 std::unordered_map<uint32_t,T*> elements;61 };62}63}646566namespace Cubios67{68 namespace Gfx69 {70 template <typename T>71 SpriteAtlas<T>::SpriteAtlas(std::string name, Cubios::Scene* scene):SpriteAtlasBase(scene)72 {73 this->resourceId = Cubios::GFX_getAssetId(name.c_str());74 }7576 template <typename T>77 SpriteAtlas<T>::~SpriteAtlas()78 {}7980 template <typename T>81 bool SpriteAtlas<T>::AddSprite(uint32_t id, const Cubios::Math::Rect2& rc)82 {83 bool ret = true;8485 if(this->scene->CreateObjectWithID(id,new T(this,rc)))86 {87 this->elements[id] = dynamic_cast<T*>(this->scene->operator[](id));88 }89 else90 {91 LOG_e("SpriteAtlas::AddSprite: Resource with id %d already exists\n",id);92 ret = false;93 }9495 return ret;96 }9798 template <typename T>99 bool SpriteAtlas<T>::RemoveSprite(uint32_t id)100 {101 bool ret = true;102 typename std::unordered_map<uint32_t, T*>::iterator it = this->elements.find(id);103104 if(it!=this->elements.end())105 {106 if(this->elements[id]!=nullptr)107 {108 delete this->elements[id];109 }110111 this->elements.erase(it);112 }113 else114 {115 ret = false;116 }117118 return ret;119 }120121 template <typename T>122 T* SpriteAtlas<T>::operator[](uint32_t ind)123 {124 return this->elements[ind];125 }126127 template <typename T>128 T* SpriteAtlas<T>::Get(uint32_t ind)129 {130 return this->elements[ind];131 }132 }133}134135
Wrapped for easier reading. Turn wrap off to inspect exact line lengths.