Code archives/Graphics/unofficial glmax2d

This code has been declared by its author to be Public Domain code.

Download source code

unofficial glmax2d by slenkar2009
A very simple (but almost feature complete)
version of glmax2d.
anyone can send me changes to the code and I will add them here.

Features:
1.You can place the image vertices where ever you want with the
setimagevertices command

changes this loaded image:

into this in the game:


2.draw tint text
use vertex colors to shade text

3.compatible with MaxGUI canvas and glsharecontexts

4.grabimage is a lot faster than normal glmax2d

5.hollow rect and hollow circle

6.adjust vertex colors of rectangles

7. parent an image to another
it will rotate and move with the parent image

This will be a library that takes advantage of cool OpenGL

features that so far have not been added to the official

max2d due to DirectX not supporting those functions.

If interest is shown in this library:
1.grabimagefast will be implemented -done
2.texture splatting/masking??
3.image parent-child -done
4.choose to upload texture to video ram or just ram??
5.delete image?

problems/issues
1.Due to the fact that you can place vertices anywhere the handle commands are kind of obsolete - (but are still there for rectangle images)
2.No imagecollides function, I have some collision code that I 'borrowed'.
3.Instead of using TTF files for fonts,bitmap fonts are used.
a bitmap font creator program is also included.
The font's png and xml files must be in the same directory and have the same name.
4.You will need to fix glgraphics.bmx with this:
http://www.blitzbasic.com/Community/posts.php?topic=73299
' Slenkars unofficial GL Graphics

Rem
' NOTE: open window with:
  InitGL width,height [,depth=0][,fps=30]
EndRem

Strict
Module keef.gldraw
Import bah.libxml
Import BRL.LinkedList
Import BRL.PngLoader
Import BRL.JpgLoader
Import Pub.OpenGL
Import BRL.GLGraphics
Import PUB.Glew

Const MASKBLEND=1
Const SOLIDBLEND=2
Const ALPHABLEND=3
Const LIGHTBLEND=4
Const SHADEBLEND=5

'flags for frames/images
Const MASKEDIMAGE=		$1
Const FILTEREDIMAGE=	$2
Const MIPMAPPEDIMAGE=	$4
Const DYNAMICIMAGE=		$8

Type font_char
	Field x#,y#,width#,height#,id
	Field vertex[9]
	Field pixel_width#,pixel_height#
	Field yoffset,xoffset,xadvance
EndType

Type image_font
	Global list:TList=New TList
	Method New()
		list.AddLast Self
	EndMethod
	Field tex:TImage
	Field image_width#
	Field image_height#
	Field name$
	Field backgroundr
	Field backgroundg
	Field backgroundb
	Field char_array:font_char[256]
	Field height
	Field font_height
EndType


Type TImage
	Field num,height#,width#
	Field handlex,handley
	Field path$
	Field vertex#[9]
	Field animx#[]
	Field animy#[]
	Field cell_width#
	Field cell_height#
	Field real_cell_width#
	Field real_cell_height#
	Field cell_count
	Field child_x,child_y
	Field child_rotation
	Field child_list:TList
	Field child_frame
	Field parent:TImage
	Method ResetVerts()
		Local iw#=width , ih#=height
		If cell_count>0
			iw=cell_width ; ih=cell_height
		EndIf
		vertex[0]=0 ; vertex[1]=0
		vertex[2]=iw ; vertex[3]=0
		vertex[4]=iw ; vertex[5]=ih
		vertex[6]=0 ; vertex[7]=ih
	End Method
EndType

Global rotation=0
Global scalex#=1.0
Global scaley#=1.0
Global colorr=255
Global colorg=255
Global colorb=255
Global maskcolorr=0
Global maskcolorg=0
Global maskcolorb=0
Global globalalpha#
Global imagefont:image_font
Global glzoom#

Function InitGL(xsize,ysize,screendepth=0,fps=30)
	GLGraphics(xsize,ysize,ScreenDepth,fps,GRAPHICS_BACKBUFFER|GRAPHICS_DEPTHBUFFER) '| BGL_FULLSCREEN
	glMatrixMode (GL_PROJECTION)
	glLoadIdentity ()
	glClearColor(0, 0, 0, 0)
	glOrtho (0, XSize, YSize, 0, 0, 1)
	glDisable(GL_DEPTH_TEST)
	glMatrixMode (GL_MODELVIEW)
	glLoadIdentity()
	glTranslatef(0.375, 0.375, 0)
	glEnable(GL_BLEND)
	glEnable(GL_TEXTURE_2D)
	glenable(GL_SCISSOR_TEST)
	glscissor(0,0,xsize,ysize)
	glblendfunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
	SetAlpha 1.0
	Cls ; Flip ; Cls
EndFunction


Function setfont(i:image_font)
	imagefont=i
EndFunction


Function GetScale(var1 Var,var2 Var)
	var1=scalex ; var2=scaley
EndFunction

Function GetRotation()
	Return rotation
EndFunction

Global state_blend
Global state_boundtex
Global state_texenabled

Function EnableTex(name)
	BindTex name
	If state_texenabled Return
	glEnable GL_TEXTURE_2D
	state_texenabled=True
End Function

Function DisableTex()
	If Not state_texenabled Return
	glDisable GL_TEXTURE_2D
	state_texenabled=False
End Function

Function BindTex( name )
	If name=state_boundtex Return
	glBindTexture GL_TEXTURE_2D,name
	state_boundtex=name
End Function

Function SetZoom(zoom#)
	glzoom=zoom
EndFunction

Function DrawImage(img:TImage,x,y,frame=0)
	EnableTex img.num
	gltranslatef(x,y,0)
	glrotatef(rotation,0,0,1)
	glscalef(scalex,scaley,1)
	If img.cell_count=0
		glBegin(GL_QUADS)
		glTexCoord2f(0,0)
		glVertex2f(img.vertex[0],img.vertex[1] )
		glTexCoord2f(1,0)
		glVertex2f(img.vertex[2], img.vertex[3])
		glTexCoord2f(1,1)
		glVertex2f(img.vertex[4], img.vertex[5])
		glTexCoord2f(0,1)
		glVertex2f(img.vertex[6], img.vertex[7])
		glend
	EndIf
	If img.cell_count>0
		Local i:TImage=TImage(img)
		glBegin(GL_QUADS)
		glTexCoord2f(i.animx[frame],i.animy[frame])
		glVertex2f(i.vertex[0],i.vertex[1] )
		glTexCoord2f(i.animx[frame]+i.cell_width,i.animy[frame])
		glVertex2f(i.vertex[2], i.vertex[3])
		glTexCoord2f(i.animx[frame]+i.cell_width,i.animy[frame]+i.cell_height)
		glVertex2f(i.vertex[4], i.vertex[5])
		glTexCoord2f(i.animx[frame],i.animy[frame]+i.cell_height)
		glVertex2f(i.vertex[6], i.vertex[7])
		glend
	EndIf
	If img.child_list<>Null
		If img.child_list.isempty()=False
			For Local j:TImage=EachIn img.child_list
				DrawChildImage(j,x,y,rotation)
			Next
		EndIf
	EndIf
	glloadidentity()
	gltranslatef(0.375,0.375,0)
EndFunction

Function DrawChildImage(j:TImage,parentx,parenty,parentrot)
	glloadidentity()
	gltranslatef(0.375,0.375,0)
	gltranslatef(parentx,parenty,0)
	glrotatef(parentrot,0,0,1)
	gltranslatef(j.child_x,j.child_y,0)
	glrotatef(j.child_rotation,0,0,1)
	If j.cell_count=0
		glBegin(GL_QUADS)
		glTexCoord2f(0,0)
		glVertex2f(j.vertex[0],j.vertex[1] )
		glTexCoord2f(1,0)
		glVertex2f(j.vertex[2], j.vertex[3])
		glTexCoord2f(1,1)
		glVertex2f(j.vertex[4], j.vertex[5])
		glTexCoord2f(0,1)
		glVertex2f(j.vertex[6],j.vertex[7])
		glend
	EndIf
	If j.cell_count>0
		glBegin(GL_QUADS)
		glTexCoord2f(j.animx[j.child_frame],j.animy[j.child_frame])
		glVertex2f(j.vertex[0],j.vertex[1] )
		glTexCoord2f(j.animx[j.child_frame]+j.cell_width,j.animy[j.child_frame])
		glVertex2f(j.vertex[2], j.vertex[3])
		glTexCoord2f(j.animx[j.child_frame]+j.cell_width,j.animy[j.child_frame]+j.cell_height)
		glVertex2f(j.vertex[4], j.vertex[5])
		glTexCoord2f(j.animx[j.child_frame],j.animy[j.child_frame]+j.cell_height)
		glVertex2f(j.vertex[6], j.vertex[7])
		glend
	EndIf
	If j.child_list<>Null
		If j.child_list.isempty()=False
			For Local i:TImage=EachIn j.child_list
				drawchildimage(i,j.child_X,j.child_y,j.child_rotation)
			Next
		EndIf
	EndIf
EndFunction


Function DrawOval(x1,y1,width#,height#,solid=True)
	If solid
		DisableTex
		glBegin(GL_TRIANGLE_FAN)
	Else
		glBegin(GL_LINE_LOOP)
	EndIf
	gltranslatef(x1,y1,0)
	glrotatef(rotation,0,0,1)
	width:*0.5 ; height:*0.5
	For Local angle# = 0 To 360 Step 10
		glVertex2f(x1+Sin(angle)*width,y1+Cos(angle)*height)
	Next
	glEnd()
	gltranslatef(0.375,0.375,0)
EndFunction

Function DrawLine(x1,y1,x2,y2)
	glBegin(GL_LINES)
	glVertex2f(x1,y1) ; glVertex2f(x2,y2)
	glEnd()
EndFunction

Function DrawRect(posx#,posy#,width#,height#,solid=True)
	gltranslatef(posx,posy,0)
	glrotatef(rotation,0,0,1)
	If solid
		DisableTex
		glBegin(GL_QUADS)
	Else
		glBegin(GL_LINE_LOOP)
	EndIf
	glVertex2f 0,0 ; glVertex2f width,0
	glVertex2f width,height ; glVertex2f 0,height
	glEnd()
	glloadidentity()
	gltranslatef(0.375,0.375,0)
End Function

Function DrawShadeRect( posx#,posy#,width#,height#,r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4)
	DisableTex
	gltranslatef(posx,posy,0)
	glrotatef(rotation,0,0,1)
	glBegin(GL_QUADS)
	SetColor (r1,g1,b1)
	glVertex2f 0,0
	SetColor (r2,g2,b2)
	glVertex2f width,0
	SetColor (r3,g3,b3)
	glVertex2f width,height
	SetColor (r4,g4,b4)
	glVertex2f 0,height
	glend	
	glloadidentity()
	gltranslatef(0.375,0.375,0)
End Function

Function DrawTintText(txt$,x,y,tintR,tintG,tintB)
	If tintR>255
		tintR=10 ; tintG=10 ; tintB=10
	EndIf
	EnableTex imagefont.tex.num
	Local colorrr=colorr
	Local colorgg=colorg
	Local colorbb=colorb
	Local x_place=x
	Local highest_char
	For x=1 To txt.length
		Local char$=txt[x-1..x]
		Local f:font_char=imagefont.char_array[Asc(char)]
		If f<>Null
			If f.pixel_height>highest_char
				highest_char=f.pixel_height
			EndIf 
		EndIf
	Next
	For x=1 To txt.length
		Local char$= txt[x-1..x]
		Local f:font_char=imagefont.char_array[Asc(char)]
		If f<>Null
			'Local y_place=y+((highest_char-f.pixel_height)+f.yoffset)
			Local y_place=y+(f.yoffset*scaley)
			gltranslatef(x_place,y_place,0)
			glrotatef(rotation,0,0,1)
			glscalef(scalex,scaley,1)
			glBegin(GL_QUADS)
			SetColor(colorrr,colorgg,colorbb)
			glTexCoord2f(f.x,f.y)
			glVertex2f(f.vertex[0],f.vertex[1] )
			glTexCoord2f(f.x+f.width,f.y)
			glVertex2f(f.vertex[2], f.vertex[3])
			SetColor(tintr,tintg,tintb)
			glTexCoord2f(f.x+f.width,f.y+f.height)
			glVertex2f(f.vertex[4], f.vertex[5])
			glTexCoord2f(f.x,f.y+f.height)
			glVertex2f(f.vertex[6], f.vertex[7])
			glend
			glloadidentity()
			gltranslatef(0.375,0.375,0)
			x_place:+((f.xadvance*scalex))
			x_place=x_place+(-f.xoffset*scalex)
		EndIf
	Next
	SetColor(colorrr,colorgg,colorbb)
EndFunction

Function DrawText(txt$,x,y)
	If imagefont=Null
		GLDrawText txt,x,y
		Return
		'RuntimeError "No font is set yet, use SetImageFont"
	EndIf
	EnableTex imagefont.tex.num
	Local colorrr=colorr
	Local colorgg=colorg
	Local colorbb=colorb
	Local x_place=x
	Local highest_char
	For x=1 To txt.length
		Local char$=txt[x-1..x]
		Local f:font_char=imagefont.char_array[Asc(char)]
		If f<>Null
			If f.pixel_height>highest_char
				highest_char=f.pixel_height
			EndIf 
		EndIf
	Next
	For x=1 To txt.length
		Local char$= txt[x-1..x]
		Local f:font_char=imagefont.char_array[Asc(char)]
		If f<>Null
			'Local y_place=y+((highest_char-f.pixel_height)+f.yoffset)
			Local y_place=y+(f.yoffset*scaley)
			gltranslatef(x_place,y_place,0)
			glrotatef(rotation,0,0,1)
			glscalef(scalex,scaley,1)
			glBegin(GL_QUADS)
			SetColor(colorrr,colorgg,colorbb)
			glTexCoord2f(f.x,f.y)
			glVertex2f(f.vertex[0],f.vertex[1] )
			glTexCoord2f(f.x+f.width,f.y)
			glVertex2f(f.vertex[2], f.vertex[3])
			glTexCoord2f(f.x+f.width,f.y+f.height)
			glVertex2f(f.vertex[4], f.vertex[5])
			glTexCoord2f(f.x,f.y+f.height)
			glVertex2f(f.vertex[6], f.vertex[7])
			glEnd
			glloadidentity()
			gltranslatef(0.375,0.375,0)
			x_place:+((f.xadvance*scalex))
			x_place=x_place+(-f.xoffset*scalex)
		EndIf
	Next
	SetColor(colorrr,colorgg,colorbb)
EndFunction

'Function GrabImage:TImage(i:TImage,x,y)
'glBindTexture GL_TEXTURE_2D,i.num
'glCopyTexSubImage2D GL_TEXTURE_2D,0,0,0,x,y,width,height
'glCopyTexsubImage2D(GL_TEXTURE_2D, 0,0, 0,x, GraphicsHeight()-i.height-y, i.width, i.height)
'End Function

Function GrabImage:TImage(x,y,width,height)
	Local i:TImage=CreateImage(width,height)
	glBindTexture GL_TEXTURE_2D,i.num
	glCopyTexSubImage2D GL_TEXTURE_2D,0,0,0,x,GraphicsHeight()-i.height-y,width,height
	Return i
End Function

Function CreateImage:TImage(width,height)
	Local i:TImage=New TImage
	i.width=Width
	i.height=Height
	i.ResetVerts()	
	glGenTextures 1,Varptr i.num
	BindTex i.num	
	'set texture parameters
	glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE
	glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE
	glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR
	glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR
	glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST
	glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST
	Local mip_level
	glTexImage2D GL_TEXTURE_2D,mip_level,GL_RGBA8,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,Null
	Return i
EndFunction

Function LoadImage:TImage(url:String)
	If FileType(url)=1
		Local pix:TPixmap=LoadPixmap(url)
		If pix=Null
			RuntimeError "pixmap is null: "+url
		EndIf
		pix=MaskPixmap(pix,maskcolorr,maskcolorg,maskcolorb)
		Local tex=GLTexFromPixmap(pix)
		Local i:TImage=New TImage
		i.num=tex ; i.path=url
		i.width=PixmapWidth(pix)
		i.height=PixmapHeight(pix)
		i.ResetVerts()
		Return i
	Else
		RuntimeError "Image not found: "+url
	EndIf
EndFunction

Function LoadAnimImage:TImage(url:Object,cell_width,cell_height,first_cell,cell_count,flags=MASKEDIMAGE)
	Local pix:TPixmap
	If String(url)
		Local ur:String=String(url)
		If FileType(ur)=1
			pix:TPixmap=LoadPixmap(ur)
		Else
			RuntimeError "Image not found: "+ur
		EndIf
	EndIf
	If TPixmap(url)
		Local ur:TPixmap=TPixmap(url)
		pix=ur
	EndIf
	pix=MaskPixmap(pix,maskcolorr,maskcolorg,maskcolorb)
	Local tex=GLTexFromPixmap(pix)
	Local i:TImage=New TImage
	i.num=tex
	If String(url)
		Local ur:String=String(url)
		i.path=ur
	EndIf
	i.width=PixmapWidth(pix)
	i.height=PixmapHeight(pix)
	i.animx=i.animx[..cell_count]
	i.animy=i.animy[..cell_count]
	i.real_cell_width=cell_width
	i.real_cell_height=cell_height
	i.cell_count=cell_count
	i.ResetVerts()
	Local w_iter=i.width/cell_width
	Local h_iter=i.height/cell_height
	Local cell_iter=0
	For Local y=0 To h_iter-1
		For Local x=0 To w_iter-1
			Local length=x*cell_width
			Local height=y*cell_height
			i.animx[cell_iter]=length/i.width
			i.animy[cell_iter]=height/i.height
			cell_iter:+1
		Next
	Next
	i.cell_width=cell_width/i.width
	i.cell_height=cell_height/i.height
	Return i
EndFunction

Function ImageWidth(i:TImage)
	If i.cell_count=0
		Return i.width
	Else
		Return i.real_cell_width
	EndIf
EndFunction

Function ImageHeight(i:TImage)
	If i.cell_count=0
		Return i.height
	Else
		Return i.real_cell_height
EndIf
EndFunction

Function ImageParent(child:TImage,parent:TImage)
	If parent<>Null
		If parent.child_list=Null
			parent.child_list=New TList
		EndIf
		parent.child_list.addlast(child)
		child.parent=parent
	Else
		child.parent.child_list.remove(child)
		child.parent=Null
	EndIf
EndFunction

Function SetImageFont(i:image_font)
	imagefont=i
EndFunction


Function LoadImageFont:image_font(url:String,incstring$)
	Local x,y
	Local doc:TxmlDoc
	Local node:TxmlNode
	Local thisnode:TxmlNode
	Local charnode:TxmlNode
	Local filename$
	Local docname$=incstring+url
	doc = TxmlDoc.parseFile(docname) 
	If doc = Null
		RuntimeError docname + " not found"
	EndIf
	node=doc.getrootelement()
	Local i:image_font=New image_font
	i.name=StripAll(url)
	Local nodeList:TList = node.getChildren()
	For thisnode = EachIn nodeList
		If thisnode.getname()="img"
			i.image_width=Float(Int(thisnode.getattribute("width")))
			i.image_height=Float(Int(thisnode.getattribute("height")))
			i.backgroundr=Int(thisnode.getattribute("backgroundr"))
			i.backgroundg=Int(thisnode.getattribute("backgroundg"))
			i.backgroundb=Int(thisnode.getattribute("backgroundb"))
			i.font_height=Int(thisnode.getattribute("fontheight"))
			SetMaskColor (i.backgroundr,i.backgroundg,i.backgroundb)
			i.tex=LoadImage(StripExt(url)+".png")
		EndIf
		If thisnode.getName()="chars"
			Local charlist:TList=thisnode.getchildren()
			For charnode=EachIn charlist
				Local fo:font_char=New font_char
				fo.xoffset=Int(charnode.getattribute("xoffset"))
				fo.yoffset=Int(charnode.getattribute("yoffset"))
				fo.pixel_width=Float(charnode.getattribute("width"))
				fo.pixel_height=Float(charnode.getattribute("height"))
				fo.width=fo.pixel_width/i.image_width
				fo.height=fo.pixel_height/i.image_height
				fo.id=Int(charnode.getattribute("ascnum"))
				fo.xadvance=Int(charnode.getattribute("xadvance"))
				fo.x=Float(charnode.getattribute("x"))
				fo.y=Float(charnode.getattribute("y"))
				fo.x=fo.x/i.image_width
				fo.y=fo.y/i.image_height
				fo.vertex[0]=0
				fo.vertex[1]=0
				fo.vertex[2]=fo.pixel_width
				fo.vertex[3]=0
				fo.vertex[4]=fo.pixel_width
				fo.vertex[5]=fo.pixel_height
				fo.vertex[6]=0
				fo.vertex[7]=fo.pixel_height
				i.char_array[fo.id]=fo
			Next
		EndIf
	Next
	doc.free()
	SetMaskColor (0,0,0)
	Return i
End Function


Function MidHandleImage(i:TImage)
	If i.cell_count>0
		Local ij:TImage=TImage(i)
		SetImageVertices(ij,-(ij.real_cell_width/2),-(ij.real_cell_height/2),(ij.real_cell_width/2),-(ij.real_cell_height/2),(ij.real_cell_width/2),(ij.real_cell_height/2),-(ij.real_cell_width/2),(ij.real_cell_height/2))
	Else
		SetImageVertices(i,-(i.width/2),-(i.height/2),(i.width/2),-(i.height/2),(i.width/2),(i.height/2),-(i.width/2),(i.height/2))
	EndIf
EndFunction
	
Function SetAlpha( alpha# )
	Local red#=colorr/255.0
	Local green#=colorg/255.0
	Local blue#=colorb/255.0
	globalalpha=alpha
	glColor4f(red,green,blue,alpha)
End Function

Function SetLineWidth( width# )
	glLineWidth width
End Function
		
Function SetColor( red#,green#,blue#)
	colorr=red ; 	colorg=green ; colorb=blue
	glColor4f(red/255.0,green/255.0,blue/255.0,globalalpha#)
End Function

Function SetClsColor(red,green,blue )
	red=Min(Max(red,0),255)
	green=Min(Max(green,0),255)
	blue=Min(Max(blue,0),255)
	glClearColor red/255.0,green/255.0,blue/255.0,1.0
End Function
		
Function SetImageXWhenChild(i:TImage,x)
	i.child_x=x
EndFunction

Function SetImageYWhenChild(i:TImage,y)
i.child_y=y
EndFunction

Function SetImageRotationWhenChild(i:TImage,x)
i.child_rotation=x
EndFunction


Function SetImageHandle(i:TImage,x,y)
	i.handlex=x ; i.handley=y
EndFunction

Function SetScale(x:Float,y:Float)
	scalex=x ; scaley=y
EndFunction

Function SetMaskColor(r,g,b)
	maskcolorr=r ; maskcolorg=g ; maskcolorb=b
EndFunction

Function SetBlend( blend )
	If blend=state_blend Return
	state_blend=blend
	Select blend
		Case MASKBLEND
		glDisable GL_BLEND
		glEnable GL_ALPHA_TEST
		glAlphaFunc GL_GEQUAL,.5
		Case SOLIDBLEND
		glDisable GL_BLEND
		glDisable GL_ALPHA_TEST
		Case ALPHABLEND
		glEnable GL_BLEND
		glBlendFunc GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA
		glDisable GL_ALPHA_TEST
		Case LIGHTBLEND
		glEnable GL_BLEND
		glBlendFunc GL_SRC_ALPHA,GL_ONE
		glDisable GL_ALPHA_TEST
		Case SHADEBLEND
		glEnable GL_BLEND
		glBlendFunc GL_DST_COLOR,GL_ZERO
		glDisable GL_ALPHA_TEST
		Default
		glDisable GL_BLEND
		glDisable GL_ALPHA_TEST
	End Select
EndFunction

Function Plot(x,y)
	DisableTex
	glBegin(GL_POINTS)
	glVertex2f(x,y)
	glEnd()
EndFunction
 
Function SetViewport(x,y,width,height)
	glviewport(x,y,width,height)
EndFunction

Function SetRotation(rot)
	rotation=rot
EndFunction

Function TextHeight(str:String)
	Return imagefont.font_height
EndFunction

Function TextWidth(str:String)
	Local width
	For Local x=1 To str.length
		Local char$= str[x-1..x]
		Local f:font_char=imagefont.char_array[Asc(char)]
		If f<>Null
			width:+(f.xadvance*scalex)
			width:+(-f.xoffset*scalex)
		EndIf
	Next
	Return width
EndFunction
	

Function Cls()
	glClear(GL_COLOR_BUFFER_BIT)
EndFunction


Function SetImageVertices(i:TImage,x0#,y0#,x1#,y1#,x2#,y2#,x3#,y3#)
	i.vertex=[x0,y0,x1,y1,x2,y2,x3,y3]
EndFunction

Comments

slenkar2009
here is the bitmap font generator program:



slenkar2009
here are collision functions that are compatible with the images in this library:



slenkar2009
usage:

use
initgl(800,600,0)

instead of
graphics(800,600,0)

all other commands are the same.

Setgraphicsdriver is not needed


plash2009
What did you do to the formatting!?


ImaginaryHuman2009
So basically the only thing it does different is lets you position the corners of image quads, and add a linear gradient to drawtext?


slenkar2009
yes basically but with peoples help it could do a lot more.

The code is very simple compared to the official glmax2d which helps greatly when someone wants to add more features.


Black3D2012
Thanks Slenkar, I learned a lot from this code. :)


Code Archives Forum