From b89c79e905fb6d8187c066652657c70ccb18b07d Mon Sep 17 00:00:00 2001 From: Kahrl Date: Mon, 3 Jun 2013 01:53:43 +0200 Subject: Delay deleting replaced textures (m_texture_trash) --- src/tile.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src/tile.cpp') diff --git a/src/tile.cpp b/src/tile.cpp index 5f25e123b..098a963a8 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -440,6 +440,10 @@ private: // Queued texture fetches (to be processed by the main thread) RequestQueue m_get_texture_queue; + + // Textures that have been overwritten with other ones + // but can't be deleted because the ITexture* might still be used + std::list m_texture_trash; }; IWritableTextureSource* createTextureSource(IrrlichtDevice *device) @@ -485,6 +489,16 @@ TextureSource::~TextureSource() } m_atlaspointer_cache.clear(); + for (std::list::iterator iter = + m_texture_trash.begin(); iter != m_texture_trash.end(); + iter++) + { + video::ITexture *t = *iter; + + //cleanup trashed texture + driver->removeTexture(t); + } + infostream << "~TextureSource() "<< textures_before << "/" << driver->getTextureCount() << std::endl; } @@ -870,7 +884,7 @@ void TextureSource::rebuildImagesAndTextures() sap->intsize = img->getDimension(); if (t_old != 0) - driver->removeTexture(t_old); + m_texture_trash.push_back(t_old); } } -- cgit v1.2.3 From 4f6bec19bc0d838db6d1236e7815c0113bd05e81 Mon Sep 17 00:00:00 2001 From: Kahrl Date: Tue, 4 Jun 2013 07:44:19 +0200 Subject: Only add ^[forcesingle to get raw texture if atlas is used --- src/tile.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/tile.cpp') diff --git a/src/tile.cpp b/src/tile.cpp index 098a963a8..f176d1549 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -364,14 +364,14 @@ public: // Gets a separate texture video::ITexture* getTextureRaw(const std::string &name) { - AtlasPointer ap = getTexture(name + "^[forcesingle"); + AtlasPointer ap = getTexture(name + m_forcesingle_suffix); return ap.atlas; } // Gets a separate texture atlas pointer AtlasPointer getTextureRawAP(const AtlasPointer &ap) { - return getTexture(getTextureName(ap.id) + "^[forcesingle"); + return getTexture(getTextureName(ap.id) + m_forcesingle_suffix); } // Returns a pointer to the irrlicht device @@ -437,6 +437,7 @@ private: // Main texture atlas. This is filled at startup and is then not touched. video::IImage *m_main_atlas_image; video::ITexture *m_main_atlas_texture; + std::string m_forcesingle_suffix; // Queued texture fetches (to be processed by the main thread) RequestQueue m_get_texture_queue; @@ -1137,6 +1138,8 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef) <writeImageToFile(atlas_img, atlaspath.c_str());*/ + + m_forcesingle_suffix = "^[forcesingle"; } video::IImage* generate_image_from_scratch(std::string name, -- cgit v1.2.3