Commit a95483dd authored by nadro's avatar nadro

- Fixed issues with some OpenGLTexture methods like a lock or regenerateMipMaps.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5157 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 2f3ca311
...@@ -614,6 +614,11 @@ void* COpenGLTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel) ...@@ -614,6 +614,11 @@ void* COpenGLTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel)
if (IsCompressed) // TO-DO if (IsCompressed) // TO-DO
return 0; return 0;
COpenGLCacheHandler* cacheHandler = Driver->getCacheHandler();
const COpenGLTexture* prevTexture = cacheHandler->TextureCache[0];
cacheHandler->TextureCache.set(0, this);
// store info about which image is locked // store info about which image is locked
IImage* image = (mipmapLevel==0)?Image:MipImage; IImage* image = (mipmapLevel==0)?Image:MipImage;
ReadOnlyLock |= (mode==ETLM_READ_ONLY); ReadOnlyLock |= (mode==ETLM_READ_ONLY);
...@@ -657,18 +662,21 @@ void* COpenGLTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel) ...@@ -657,18 +662,21 @@ void* COpenGLTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel)
ColorFormat = ECF_A8R8G8B8; ColorFormat = ECF_A8R8G8B8;
} }
if (!image) if (!image)
{
cacheHandler->TextureCache.set(0, prevTexture);
return 0; return 0;
}
if (mode != ETLM_WRITE_ONLY) if (mode != ETLM_WRITE_ONLY)
{ {
u8* pixels = static_cast<u8*>(image->lock()); u8* pixels = static_cast<u8*>(image->lock());
if (!pixels) if (!pixels)
return 0; {
cacheHandler->TextureCache.set(0, prevTexture);
// we need to keep the correct texture bound later on return 0;
GLint tmpTexture; }
glGetIntegerv(GL_TEXTURE_BINDING_2D, &tmpTexture);
glBindTexture(GL_TEXTURE_2D, TextureName);
// we need to flip textures vertical // we need to flip textures vertical
// however, it seems that this does not hold for mipmap // however, it seems that this does not hold for mipmap
...@@ -707,11 +715,11 @@ void* COpenGLTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel) ...@@ -707,11 +715,11 @@ void* COpenGLTexture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel)
} }
} }
image->unlock(); image->unlock();
//reset old bound texture
glBindTexture(GL_TEXTURE_2D, tmpTexture);
} }
} }
cacheHandler->TextureCache.set(0, prevTexture);
return image->lock(); return image->lock();
} }
...@@ -782,12 +790,19 @@ void COpenGLTexture::regenerateMipMapLevels(void* mipmapData) ...@@ -782,12 +790,19 @@ void COpenGLTexture::regenerateMipMapLevels(void* mipmapData)
return; return;
} }
COpenGLCacheHandler* cacheHandler = Driver->getCacheHandler();
const COpenGLTexture* prevTexture = cacheHandler->TextureCache[0];
cacheHandler->TextureCache.set(0, this);
// hardware moethods for generate mipmaps. // hardware moethods for generate mipmaps.
if (!mipmapData && AutomaticMipmapUpdate && !MipmapLegacyMode) if (!mipmapData && AutomaticMipmapUpdate && !MipmapLegacyMode)
{ {
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
Driver->extGlGenerateMipmap(GL_TEXTURE_2D); Driver->extGlGenerateMipmap(GL_TEXTURE_2D);
cacheHandler->TextureCache.set(0, prevTexture);
return; return;
} }
...@@ -842,26 +857,15 @@ void COpenGLTexture::regenerateMipMapLevels(void* mipmapData) ...@@ -842,26 +857,15 @@ void COpenGLTexture::regenerateMipMapLevels(void* mipmapData)
// cleanup // cleanup
if (!mipmapData) if (!mipmapData)
delete [] target; delete [] target;
}
cacheHandler->TextureCache.set(0, prevTexture);
}
//! Get an access to texture states cache.
COpenGLTexture::SStatesCache& COpenGLTexture::getStatesCache() const COpenGLTexture::SStatesCache& COpenGLTexture::getStatesCache() const
{ {
return StatesCache; return StatesCache;
} }
/* FBO Textures */
// helper function for render to texture
static bool checkFBOStatus(COpenGLDriver* Driver);
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment