leadwerks.texture.mod

BlitzMax Forums/OpenGL Module/leadwerks.texture.mod

JoshK(Posted 2007) [#1]
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