From 41c00e87d42580881d8c7001f39014814e3b55f2 Mon Sep 17 00:00:00 2001 From: Kahrl Date: Thu, 2 Feb 2012 04:11:56 +0100 Subject: [PATCH] Don't leak textures all over the place --- src/mesh.cpp | 3 +++ src/tile.cpp | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/mesh.cpp b/src/mesh.cpp index 0f075f72b..b9ec82e18 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -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) diff --git a/src/tile.cpp b/src/tile.cpp index f7f1779ca..e676c56c4 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -518,6 +518,15 @@ core::dimension2d 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 \""<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 -- 2.25.1