X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Ftexture.cpp;h=b40046705b32bdfbecd459b56ce5e9b7c81ae4d9;hp=347634d4c27fa204d169c6a731f39139165f3213;hb=7b569bbfcfb65d8d88b47ac42ee1df6a7d27e784;hpb=bea2bcf1aa353b1dd8d1728931ef0508677bd2c6 diff --git a/source/core/texture.cpp b/source/core/texture.cpp index 347634d4..b4004670 100644 --- a/source/core/texture.cpp +++ b/source/core/texture.cpp @@ -21,6 +21,8 @@ int Texture::swizzle_orders[] = GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; +Texture *Texture::scratch_binding = 0; + Texture::Texture(GLenum t, ResourceManager *m): id(0), target(t), @@ -45,6 +47,8 @@ Texture::Texture(GLenum t, ResourceManager *m): Texture::~Texture() { + if(this==scratch_binding) + unbind_scratch(); if(id) glDeleteTextures(1, &id); } @@ -139,22 +143,13 @@ void Texture::generate_mipmap() // glGenerateMipmap is defined here static Require _req(EXT_framebuffer_object); - if(!ARB_direct_state_access) - { - glActiveTexture(GL_TEXTURE0); - glBindTexture(target, id); - } - generate_mipmap_(); - if(!ARB_direct_state_access) - glBindTexture(target, 0); -} - -void Texture::generate_mipmap_() -{ if(ARB_direct_state_access) glGenerateTextureMipmap(id); else + { + bind_scratch(); glGenerateMipmap(target); + } } void Texture::set_auto_generate_mipmap(bool gm) @@ -194,6 +189,28 @@ void Texture::set_debug_name(const string &name) #endif } +void Texture::bind_scratch() +{ + if(!scratch_binding) + glActiveTexture(GL_TEXTURE0); + if(scratch_binding!=this) + { + if(scratch_binding && scratch_binding->target!=target) + glBindTexture(scratch_binding->target, 0); + glBindTexture(target, id); + scratch_binding = this; + } +} + +void Texture::unbind_scratch() +{ + if(scratch_binding) + { + glBindTexture(scratch_binding->target, 0); + scratch_binding = 0; + } +} + Texture::Loader::Loader(Texture &t): DataFile::CollectionObjectLoader(t, 0)