mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 11:33:44 +01:00
Revert "Don't leak textures all over the place"
This causes textures to be deleted before they are no longer accessed, resulting in a segmentation fault. This needs to be rewritten in such a way that textures are deleted when the client disconnects from a server. This reverts commit 41c00e87d42580881d8c7001f39014814e3b55f2.
This commit is contained in:
parent
bbd990f2cc
commit
e02b95741b
@ -433,9 +433,6 @@ video::ITexture *generateTextureFromMesh(scene::IMesh *mesh,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create render target texture
|
// Create render target texture
|
||||||
video::ITexture *oldtexture = driver->findTexture(texture_name.c_str());
|
|
||||||
if(oldtexture)
|
|
||||||
driver->removeTexture(oldtexture);
|
|
||||||
video::ITexture *rtt = driver->addRenderTargetTexture(
|
video::ITexture *rtt = driver->addRenderTargetTexture(
|
||||||
dim, texture_name.c_str(), video::ECF_A8R8G8B8);
|
dim, texture_name.c_str(), video::ECF_A8R8G8B8);
|
||||||
if(rtt == NULL)
|
if(rtt == NULL)
|
||||||
|
40
src/tile.cpp
40
src/tile.cpp
@ -518,15 +518,6 @@ core::dimension2d<u32> imageTransformDimension(u32 transform, core::dimension2d<
|
|||||||
// Apply transform to image data
|
// Apply transform to image data
|
||||||
void imageTransform(u32 transform, video::IImage *src, video::IImage *dst);
|
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".
|
Generate image based on a string like "stone.png" or "[crack0".
|
||||||
if baseimg is NULL, it is created. Otherwise stuff is made on it.
|
if baseimg is NULL, it is created. Otherwise stuff is made on it.
|
||||||
@ -695,9 +686,11 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
|
|||||||
" create texture \""<<name<<"\""<<std::endl;
|
" create texture \""<<name<<"\""<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create texture from resulting image
|
|
||||||
if(baseimg != NULL)
|
if(baseimg != NULL)
|
||||||
t = register_texture(driver, name, baseimg);
|
{
|
||||||
|
// Create texture from resulting image
|
||||||
|
t = driver->addTexture(name.c_str(), baseimg);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Add texture to caches (add NULL textures too)
|
Add texture to caches (add NULL textures too)
|
||||||
@ -816,7 +809,7 @@ void TextureSource::rebuildImagesAndTextures()
|
|||||||
// Create texture from resulting image
|
// Create texture from resulting image
|
||||||
video::ITexture *t = NULL;
|
video::ITexture *t = NULL;
|
||||||
if(img)
|
if(img)
|
||||||
t = register_texture(driver, sap->name, img);
|
t = driver->addTexture(sap->name.c_str(), img);
|
||||||
|
|
||||||
// Replace texture
|
// Replace texture
|
||||||
sap->a.atlas = t;
|
sap->a.atlas = t;
|
||||||
@ -1051,7 +1044,7 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef)
|
|||||||
/*
|
/*
|
||||||
Make texture
|
Make texture
|
||||||
*/
|
*/
|
||||||
video::ITexture *t = register_texture(driver, "__main_atlas__", atlas_img);
|
video::ITexture *t = driver->addTexture("__main_atlas__", atlas_img);
|
||||||
assert(t);
|
assert(t);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1142,15 +1135,6 @@ video::IImage* generate_image_from_scratch(std::string name,
|
|||||||
return baseimg;
|
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,
|
bool generate_image(std::string part_of_name, video::IImage *& baseimg,
|
||||||
IrrlichtDevice *device, SourceImageCache *sourcecache)
|
IrrlichtDevice *device, SourceImageCache *sourcecache)
|
||||||
{
|
{
|
||||||
@ -1557,12 +1541,12 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
|
|||||||
assert(img_top && img_left && img_right);
|
assert(img_top && img_left && img_right);
|
||||||
|
|
||||||
// Create textures from images
|
// Create textures from images
|
||||||
video::ITexture *texture_top = register_texture(driver,
|
video::ITexture *texture_top = driver->addTexture(
|
||||||
imagename_top + "__temp1__", img_top);
|
(imagename_top + "__temp__").c_str(), img_top);
|
||||||
video::ITexture *texture_left = register_texture(driver,
|
video::ITexture *texture_left = driver->addTexture(
|
||||||
imagename_left + "__temp2__", img_left);
|
(imagename_left + "__temp__").c_str(), img_left);
|
||||||
video::ITexture *texture_right = register_texture(driver,
|
video::ITexture *texture_right = driver->addTexture(
|
||||||
imagename_right + "__temp3__", img_right);
|
(imagename_right + "__temp__").c_str(), img_right);
|
||||||
assert(texture_top && texture_left && texture_right);
|
assert(texture_top && texture_left && texture_right);
|
||||||
|
|
||||||
// Drop images
|
// Drop images
|
||||||
|
Loading…
Reference in New Issue
Block a user