How can i draw a textured triangle in max2d?

BlitzMax Forums/BlitzMax Programming/How can i draw a textured triangle in max2d?

Garred(Posted 2005) [#1]
Max2D cannot draws textured triangles, so i think i need mix max2d with ogl. How can i do it without problems?


ImaginaryHuman(Posted 2005) [#2]
Well. You can't draw a textured triangle in Max2D. You can draw a textured Quad which is two triangles, using DrawImage.

This page has an introduction to using textures in OpenGL:

http://www.gamedev.net/reference/articles/article947.asp


AntonyWells(Posted 2005) [#3]
actually you can if you don't mind going slightly low level.

glbegin(GL_TRIANGLES)
'el code'
glmultitexcoord3f unit,u,v,0
glvertex2f screenpixelx,screenpixely
gl'etc
glEnd()
-

i did this to create custom styles in a game i never finished(another one..) mark's 2d stuff sets up gl so the above is all you have to do gl wise.

you should then just have to look through max2d to find the bit of code mark uses to bind max2d images to the texture units and pre-cded the above with it.


ImaginaryHuman(Posted 2005) [#4]
Going to a lower level is not Max2D, it's direct OpenGL, which is different.

I do agree you can easily draw your own triangles with textures using direct OpenGL commands.


Garred(Posted 2005) [#5]
Thanks, I used direct OpenGL and I made this:
' Prueba para pintar triangulos con textura.
' http://www.blitzbasic.com/Community/posts.php?topic=48462

Strict


Local texturaGL	: Int
Local imagen	: TImage
Local trisList	: TList


SetGraphicsDriver(GLMax2DDriver())
Graphics(800,600,16,NOSYNC)

texturaGL% = bglTexFromPixmap%(LoadPixmap:TPixmap("max.png"))
imagen = LoadImage("max.png")
trisList = New TList
For Local cont1=1 To 50	'Adding triangles to triangle list
	Local tris	: TTriangle
	tris = New TTriangle

	tris.SetXY([RndFloat()*600.0,RndFloat()*600.0,RndFloat()*600.0,RndFloat()*600.0,RndFloat()*600.0,RndFloat()*600.0])
	tris.SetUV([RndFloat(),RndFloat(),RndFloat(),RndFloat(),RndFloat(),RndFloat()])
	tris.SetRGBA([RndFloat(),RndFloat(),RndFloat(),RndFloat(), RndFloat(),RndFloat(),RndFloat(),RndFloat(), RndFloat(),RndFloat(),RndFloat(),RndFloat()])
	tris.SetGLTexture(Rand(0,1)*texturaGL%)
	tris.SetBlendMode(ALPHABLEND)

	trisList.AddLast(tris:TTriangle)
Next


While ( Not KeyDown(KEY_ESCAPE) )	'Main
	Local time	: Int

	time% = MilliSecs()
	TTriangle.RenderTriangleList(trisList:TList)
	time% = MilliSecs()-time%
	
	DrawText("DrawText function test. RenderTriangleList time: " + String(time%), 10,10)
	DrawImage(imagen,MouseX(),MouseY())
	
	Flip()
	Cls()
	FlushMem()
Wend


Type TTriangle
	Field xy		: Float[6]
	Field uv		: Float[6]
	Field rgba		: Float[12]
	Field glTexture	: Int
	Field blendMode	: Int
	
	Function RenderTriangleList( triangleList:TList )
		Local tris	: TTriangle
		If (triangleList:TList)
			For tris:TTriangle = EachIn triangleList:TList
				If (tris.glTexture%)
					glBindTexture(GL_TEXTURE_2D,tris.glTexture%)
					glEnable(GL_TEXTURE_2D)
				EndIf
				SetBlend(tris.blendMode%)			
				glBegin(GL_TRIANGLES)
				 glTexCoord2f(tris.uv[0],tris.uv[1])	'coorner A
				 glcolor4f(tris.rgba[0],tris.rgba[1],tris.rgba[2],tris.rgba[3])
				 glVertex2f(tris.xy[0],tris.xy[1])
				 glTexCoord2f(tris.uv[2],tris.uv[3])	'coorner B
				 glcolor4f(tris.rgba[4],tris.rgba[5],tris.rgba[6],tris.rgba[7])
				 glVertex2f(tris.xy[2],tris.xy[3])
				 glTexCoord2f(tris.uv[4],tris.uv[5])	'coorner C
				 glcolor4f(tris.rgba[8],tris.rgba[9],tris.rgba[10],tris.rgba[11])
				 glVertex2f(tris.xy[4],tris.xy[5])
				glEnd()
			Next
			SetColor(255.0,255.0,255.0)
			SetAlpha(1.0)
		EndIf
	End Function
	
	Function RenderTriangle( tris:TTriangle )
		If (tris.glTexture%)
			glBindTexture(GL_TEXTURE_2D,tris.glTexture%)
			glEnable(GL_TEXTURE_2D)
		EndIf
		SetBlend(tris.blendMode%)			
		glBegin(GL_TRIANGLES)
		 glTexCoord2f(tris.uv[0],tris.uv[1])	'coorner A
		 glcolor4f(tris.rgba[0],tris.rgba[1],tris.rgba[2],tris.rgba[3])
		 glVertex2f(tris.xy[0],tris.xy[1])
		 glTexCoord2f(tris.uv[2],tris.uv[3])	'coorner B
		 glcolor4f(tris.rgba[4],tris.rgba[5],tris.rgba[6],tris.rgba[7])
		 glVertex2f(tris.xy[2],tris.xy[3])
		 glTexCoord2f(tris.uv[4],tris.uv[5])	'coorner C
		 glcolor4f(tris.rgba[8],tris.rgba[9],tris.rgba[10],tris.rgba[11])
		 glVertex2f(tris.xy[4],tris.xy[5])
		glEnd()
		SetColor(255.0,255.0,255.0)
		SetAlpha(1.0)
	End Function

	Method Render()
		If (glTexture%)
			glBindTexture(GL_TEXTURE_2D,glTexture%)
			glEnable(GL_TEXTURE_2D)
		EndIf
		SetBlend(blendMode%)			
		glBegin(GL_TRIANGLES)
		 glTexCoord2f(uv[0],uv[1])	'coorner A
		 glcolor4f(rgba[0],rgba[1],rgba[2],rgba[3])
		 glVertex2f(xy[0],xy[1])	
		 glTexCoord2f(uv[2],uv[3])	'coorner B
		 glcolor4f(rgba[4],rgba[5],rgba[6],rgba[7])
		 glVertex2f(xy[2],xy[3])
		 glTexCoord2f(uv[4],uv[5])	'coorner C
		 glcolor4f(rgba[8],rgba[9],rgba[10],rgba[11])
		 glVertex2f(xy[4],xy[5])
		glEnd()
		SetColor(255.0,255.0,255.0)
		SetAlpha(1.0)
	End Method

	Method SetXY( newXY:Float[] )
		If (newXY.length=6) MemCopy(xy,newXY,24)
	End Method

	Method SetUV( newUV:Float[] )
		If (newUV.length=6) MemCopy(uv,newUV,24)
	End Method

	Method SetRGBA( newRGBA:Float[] )
		If (newRGBA.length=12) MemCopy(rgba,newRGBA,48)
	End Method
	
	Method SetGLTexture( newGLTexture:Int )
		glTexture% = newGLTexture%
	End Method
	
	Method SetBlendMode( newBlendMode:Int )
		blendMode% = newBlendMode%
	End Method
End Type



Haramanai(Posted 2006) [#6]
Can someone say the essential changes for Blitz Max 1.6
EDIT: The bGLTexFromPixmap has changed to GLTexFromPixmap
And the FlushMem is dead (Delete the line).

Edit2: A simpler example
Edit3: The codeBox is gone.


TartanTangerine (was Indiepath)(Posted 2006) [#7]
You need my textured poly module :P


Haramanai(Posted 2006) [#8]
I thing that this is better.
I replaced the
glBindTexture(GL_TEXTURE_2D,tris.glTexture%)
and the glEnable(GL_TEXTURE_2D)
with the
EnableTex GLTexture
and I created a Function called DrawTexQuad
Edit1: I created the GLTexture from an TImage and now the MASKBLEND works for the textured QUAD
pls try this :

I think this is 100% stable. If anyone finds a problem pls post.