Drawimage with vertex colours

BlitzMax Forums/BlitzMax Programming/Drawimage with vertex colours

necky(Posted 2006) [#1]
Does anyone know how to update this D3D textured poly function to allow for vertex colours as well as UV coordinates on each poly vert?

http://www.blitzbasic.com/codearcs/codearcs.php?code=1812

Ideally, if anyone knows of a function or module that allow for an advanced 'drawimage' with the addition of vertex colours that would be cool. I`ve taken a look on the forums and can't find anything of this nature.

thanks,
andy.


xMicky(Posted 2006) [#2]
1) vertex colors: instead of
c[ii+3] = Driver.DrawColor
set:
c[ii+3] = alpha Shl 24 | red Shl 16 | green Shl 8| blue
(alpha, red, green, blue:INT in the range 0 to 255)

2) uv:
uv[ii+4] = u
uv[ii+5] = v
(u, v:FLOAT in the range 0 to 1)

Shame on me that I haven't commented "thank you" at Progers article yet, because it offers really an explosion for the 2D-graphic-capabilities of BlitzMax ! So I take the possibility here: Thanks a lot !


necky(Posted 2006) [#3]
Thanks Michael! That's just what I was after.

Andy


necky(Posted 2006) [#4]
Thanks again for your help Michael. I`ve almost completed the function but there's still a couple of issues that are puzzling me.

When I set the U or V coordinate I assumed a value of 1.0 would give me the furthest right & bottom edges of the loaded image. Instead, after a lot of blind number changes, I`m having to put in 0.72 for U and 0.585 for V? Any idea what this magic numbers relate to?

Second problem is the rotation of the image. If you run the below code you'll notice my coloured image is rotated the same as the DrawImage version except it's offset? Any idea why this is happening?

Strict
Graphics 640,480
SetClsColor 100,100,100
Cls

Local Image:TImage = LoadImage("Dizzy.png", MASKEDIMAGE)

Local ColA:Int[] = [255,255,192,0]
Local ColB:Int[] = [255,255,0,0]
Local ColC:Int[] = [255,0,0,128]
Local ColD:Int[] = [255,0,0,128]
Local XPos#=100
Local YPos#=50


SetRotation 45
SetBlend AlphaBlend
SetScale 2,2
SetAlpha 1.0

DrawImage Image,XPos,YPos
DrawColImage Image, XPos, YPos, ColA, ColB, ColC, ColD

Flip
WaitKey


'----------------------------------------------------------------------------------------------------
' DrawColImage <IMG>, XPos#, YPos#, ColA[], ColB[], ColC[], ColD[], Frame%
'----------------------------------------------------------------------------------------------------

Function DrawColImage( image:TImage,Xp, Yp, ClrA[], ClrB[], ClrC[], ClrD[], frame=0)

Local handle_x#, handle_y#
GetHandle handle_x#, handle_y#
Local tx#, ty#
GetOrigin tx#, ty#

Local Alph#=GetAlpha()
ClrA[0]=ClrA[0]*Alph
ClrB[0]=ClrB[0]*Alph
ClrC[0]=ClrC[0]*Alph
ClrD[0]=ClrD[0]*Alph

Local Driver:TD3D7Max2DDriver = TD3D7Max2DDriver(_max2dDriver)

Assert Image, "Image not found"

Local uv#[24]
Local ImgWidth#=Image.width
Local ImgHeight#=Image.Height
Local x#=Xp+Handle_X#
Local Y#=Yp+Handle_Y#

Local LeftX#=x
Local RightX#=x+ImgWidth#
Local UpY#=y
Local DownY#=y+ImgHeight#

Local c:Int Ptr=Int Ptr(Float Ptr(uv))

uv[0]=LeftX#*Driver.ix+UpY*Driver.iy+tx '--X POS
uv[1]=LeftX#*Driver.jx+UpY*Driver.jy+ty '--Y POS
uv[2]=0 '--Z POS
c[3]= ClrA[0] Shl 24 | ClrA[1] Shl 16 | ClrA[2] Shl 8 | ClrA[3] '--ARGB COLORS
uv[4]= 0.0 ; uv[5]= 0.0 '--UV COORDS

uv[6]=RightX#*Driver.ix+UpY*Driver.iy+tx
uv[7]=RightX#*Driver.jx+UpY*Driver.jy+ty
uv[8]=0
c[9]= ClrB[0] Shl 24 | ClrB[1] Shl 16 | ClrB[2] Shl 8 | ClrB[3]
uv[10]= .72 ; uv[11]= 0.0

uv[12]=RightX#*Driver.ix+DownY*Driver.iy+tx
uv[13]=RightX#*Driver.jx+DownY*Driver.jy+ty
uv[14]=0
c[15]= ClrC[0] Shl 24 | ClrC[1] Shl 16 | ClrC[2] Shl 8 | ClrC[3]
uv[16]= .72 ; uv[17]= .585

uv[18]=LeftX#*Driver.ix+DownY*Driver.iy+tx
uv[19]=LeftX#*Driver.jx+DownY*Driver.jy+ty
uv[20]=0
c[21]= ClrD[0] Shl 24 | ClrD[1] Shl 16 | ClrD[2] Shl 8 | ClrD[3]
uv[22]= 0.0 ; uv[23]= .585

Driver.SetActiveFrame TD3D7ImageFrame(image.Frame(frame))
Driver.device.DrawPrimitive(D3DPT_TRIANGLEFAN,D3DFVF_XYZ| D3DFVF_DIFFUSE | D3DFVF_TEX1,uv,4,0)

End Function



Thanks for your help,
andy

p.s. how do you embed code into a code box?