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
|