Don't leak textures all over the place
authorKahrl <kahrl@gmx.net>
Thu, 2 Feb 2012 03:11:56 +0000 (04:11 +0100)
committerPerttu Ahola <celeron55@gmail.com>
Fri, 2 Nov 2012 16:45:39 +0000 (18:45 +0200)
src/mesh.cpp
src/tile.cpp

index 0f075f72b8e64448d00a34ec9b90317526856d48..b9ec82e18f64f5123c62dc2485567e6e40531213 100644 (file)
@@ -433,6 +433,9 @@ video::ITexture *generateTextureFromMesh(scene::IMesh *mesh,
        }
 
        // Create render target texture
+       video::ITexture *oldtexture = driver->findTexture(texture_name.c_str());
+       if(oldtexture)
+               driver->removeTexture(oldtexture);
        video::ITexture *rtt = driver->addRenderTargetTexture(
                        dim, texture_name.c_str(), video::ECF_A8R8G8B8);
        if(rtt == NULL)
index f7f1779ca51f619d9d987de00b3fab200d085c22..e676c56c438c8eb54859e2d4ae1db0d7c22f1aeb 100644 (file)
@@ -518,6 +518,15 @@ core::dimension2d<u32> imageTransformDimension(u32 transform, core::dimension2d<
 // Apply transform to image data
 void imageTransform(u32 transform, video::IImage *src, video::IImage *dst);
 
+/*
+       Adds a new texture to the video driver and returns a pointer to it.
+       This pointer should not be dropped. Any texture that was registered
+       with that name before is removed (this may invalidate some ITexture
+       pointers).
+*/
+video::ITexture* register_texture(video::IVideoDriver *driver,
+               std::string name, video::IImage *img);
+
 /*
        Generate image based on a string like "stone.png" or "[crack0".
        if baseimg is NULL, it is created. Otherwise stuff is made on it.
@@ -686,11 +695,9 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
                                " create texture \""<<name<<"\""<<std::endl;
        }
        
+       // Create texture from resulting image
        if(baseimg != NULL)
-       {
-               // Create texture from resulting image
-               t = driver->addTexture(name.c_str(), baseimg);
-       }
+               t = register_texture(driver, name, baseimg);
        
        /*
                Add texture to caches (add NULL textures too)
@@ -809,7 +816,7 @@ void TextureSource::rebuildImagesAndTextures()
                // Create texture from resulting image
                video::ITexture *t = NULL;
                if(img)
-                       t = driver->addTexture(sap->name.c_str(), img);
+                       t = register_texture(driver, sap->name, img);
                
                // Replace texture
                sap->a.atlas = t;
@@ -1044,7 +1051,7 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef)
        /*
                Make texture
        */
-       video::ITexture *t = driver->addTexture("__main_atlas__", atlas_img);
+       video::ITexture *t = register_texture(driver, "__main_atlas__", atlas_img);
        assert(t);
 
        /*
@@ -1135,6 +1142,15 @@ video::IImage* generate_image_from_scratch(std::string name,
        return baseimg;
 }
 
+video::ITexture* register_texture(video::IVideoDriver *driver,
+               std::string name, video::IImage *img)
+{
+       video::ITexture *old_texture = driver->findTexture(name.c_str());
+       if(old_texture)
+               driver->removeTexture(old_texture);
+       return driver->addTexture(name.c_str(), img);
+}
+
 bool generate_image(std::string part_of_name, video::IImage *& baseimg,
                IrrlichtDevice *device, SourceImageCache *sourcecache)
 {
@@ -1541,12 +1557,12 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
                        assert(img_top && img_left && img_right);
 
                        // Create textures from images
-                       video::ITexture *texture_top = driver->addTexture(
-                                       (imagename_top + "__temp__").c_str(), img_top);
-                       video::ITexture *texture_left = driver->addTexture(
-                                       (imagename_left + "__temp__").c_str(), img_left);
-                       video::ITexture *texture_right = driver->addTexture(
-                                       (imagename_right + "__temp__").c_str(), img_right);
+                       video::ITexture *texture_top = register_texture(driver,
+                                       imagename_top + "__temp1__", img_top);
+                       video::ITexture *texture_left = register_texture(driver,
+                                       imagename_left + "__temp2__", img_left);
+                       video::ITexture *texture_right = register_texture(driver,
+                                       imagename_right + "__temp3__", img_right);
                        assert(texture_top && texture_left && texture_right);
 
                        // Drop images