leadwerks.texture.mod

BlitzMax Forums/BlitzMax OpenGL Programming/leadwerks.texture.mod

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

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