diff options
author | Kahrl <kahrl@gmx.net> | 2012-02-02 04:11:56 +0100 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-11-02 18:45:39 +0200 |
commit | 41c00e87d42580881d8c7001f39014814e3b55f2 (patch) | |
tree | e2e23d27d1a462c2a684accb81a63918b430c12e /src | |
parent | 2863a3291a5cc9be8eeff063cd187a783e58c163 (diff) | |
download | minetest-41c00e87d42580881d8c7001f39014814e3b55f2.tar.gz minetest-41c00e87d42580881d8c7001f39014814e3b55f2.tar.bz2 minetest-41c00e87d42580881d8c7001f39014814e3b55f2.zip |
Don't leak textures all over the place
Diffstat (limited to 'src')
-rw-r--r-- | src/mesh.cpp | 3 | ||||
-rw-r--r-- | 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 @@ -519,6 +519,15 @@ core::dimension2d<u32> imageTransformDimension(u32 transform, core::dimension2d< 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 |