This mod will handle textures in a straightforward way. It can even retrieve a pixmap from a texture, so there is no need to store a separate pixmap:
Import pub.opengl Import pub.glew Import brl.pixmap Module leadwerks.texture Type TTexture Field url$ Field pixmap:TPixmap Field width,height Field format Field gltarget Field glformat Field glinternalformat Method Free() glDeleteTextures(1,Varptr gltarget) pixmap=Null EndMethod Function Create:TTexture(width,height,format=PF_RGB888) texture:TTexture=New TTexture texture.width=width texture.height=height texture.format=format texture.gltarget=glGenTextures(1,Varptr gltarget) previous=glBindTexture_(GL_TEXTURE_2D,gltarget) glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR Select format Case PF_A8 texture.glformat=GL_ALPHA texture.glinternalformat=GL_ALPHA Case PF_I8 texture.glformat=GL_LUMINANCE texture.glinternalformat=GL_LUMINANCE Case PF_RGB888 texture.glformat=GL_RGB texture.glinternalformat=GL_RGB Case PF_BGR888 texture.glformat=GL_BGR_EXT texture.glinternalformat=GL_RGB Case PF_RGBA8888 texture.glformat=GL_RGBA texture.glinternalformat=GL_RGBA Case PF_BGR8888 texture.glformat=GL_BGRA_EXT texture.glinternalformat=GL_RGBA EndSelect glBindTexture_ GL_TEXTURE_2D,previous Return texture EndFunction Function Load:TTexture(url:Object) pixmap:TPixmap=TPixmap(url) If Not pixmap filename$=String(url) If filename<>"" pixmap=LoadPixmap(filename) EndIf If Not pixmap Return Null texture:TTexture=TTexture.Create(pixmap.width,pixmap.height,pixmap.format) texture.url=filename texture.pixmap=pixmap texture.Unlock() Return texture EndFunction Method Lock:TPixmap() If pixmap Return pixmap previous=glBindTexture_(GL_TEXTURE_2D,gltarget) pixmap=CreatePixmap(width,height,format) glGetTexImage GL_TEXTURE_2D,0,glformat,GL_UNSIGNED_BYTE,pixmap.pixels glBindTexture_ GL_TEXTURE_2D,previous Return pixmap EndMethod Method Unlock() previous=glBindTexture_(GL_TEXTURE_2D,gltarget) glPixelStorei GL_UNPACK_ROW_LENGTH,width glenable GL_TEXTURE_2D gluBuild2DMipmaps GL_TEXTURE_2D,glinternalformat,width,height,glformat,GL_UNSIGNED_BYTE,pixmap.pixels pixmap=Null glBindTexture_ GL_TEXTURE_2D,previous EndMethod Method AFilter:Int(mode#) Local MaxAnisotropy glgetintegerv GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,Varptr MaxAnisotropy If mode>MaxAnisotropy Return False previous=glBindTexture_(GL_TEXTURE_2D,gltarget) glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,mode glBindTexture_ GL_TEXTURE_2D,previous Return True EndMethod Method TFilter(mode) previous=glBindTexture_(GL_TEXTURE_2D,gltarget) If mode glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR Else glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR EndIf glBindTexture_ GL_TEXTURE_2D,previous EndMethod EndType Function CreateTexture:TTexture(width,height,format=PF_RGB888) Return TTexture.Create(width,height,format) EndFunction Function LoadTexture:TTexture(url:Object) Return TTexture.Load(url) EndFunction Private Function glBindTexture_:Int(target,texture) Local CurrentTexture:Int Select target Case GL_TEXTURE_1D glGetIntegerv GL_TEXTURE_BINDING_2D,Varptr(CurrentTexture) Case GL_TEXTURE_2D glGetIntegerv GL_TEXTURE_BINDING_2D,Varptr(CurrentTexture) Case GL_TEXTURE_3D glGetIntegerv GL_TEXTURE_BINDING_3D,Varptr(CurrentTexture) EndSelect If CurrentTexture=target Return CurrentTexture glbindtexture target,texture Return CurrentTexture EndFunction Public