#ifndef _IMGTEXTUREATLAS_H #define _IMGTEXTUREATLAS_H #include #include namespace IMG { // Fordward declaration... class TextureAtlas; namespace boost { void intrusive_ptr_add_ref(TextureAtlas * p); void intrusive_ptr_release(TextureAtlas * p); }; class _IMGExport TextureAtlas : public Texture { private: long references; friend void boost::intrusive_ptr_add_ref(TextureAtlas * p); friend void boost::intrusive_ptr_release(TextureAtlas * p); protected: enum CurrentTextureAtlas { TEXTURE_ATLAS_PING, TEXTURE_ATLAS_PONG }; Ogre::String mTextureAtlasName; Ogre::Texture *mTextureAtlasPong; Ogre::SceneNode *mTextureAtlasSceneNode; std::vector mTextureList; unsigned int mCurrentTextureAtlas; bool mFirstUpdate; public: TextureAtlas(); virtual ~TextureAtlas(); void debug(); void create(Ogre::String fileName, unsigned int width, unsigned int height, Ogre::PixelFormat pixelFormat, Ogre::Camera *camera); void update(); unsigned int getReference(); void setTextureAtlasSceneNode(Ogre::SceneNode *textureAtlasSceneNode); Ogre::SceneNode* getTextureAtlasSceneNode(); void save(Ogre::String folderName, Ogre::String filename, Ogre::PixelFormat pixelFormat); void addTexture(TexturePtr texture); TexturePtr getTexture(unsigned int iTexture); void removeTexture(unsigned int iTexture); void setTextureAtlasName(Ogre::String textureAtlasName); Ogre::String getTextureAtlasName(); unsigned int getNumTextures(); }; // class specific addref/release implementation // the two function overloads must be in the boost namespace on most compilers: namespace boost { inline void intrusive_ptr_add_ref(TextureAtlas * p) { // increment reference count of object *p ++(p->references); } inline void intrusive_ptr_release(TextureAtlas * p) { // decrement reference count, and delete object when reference count reaches 0 if (--(p->references) == 0) delete p; } } // namespace boost typedef ::boost::intrusive_ptr TextureAtlasPtr; } #endif