OK.. ..here is the code. This works at it currently should on the ibook (G3, ATI Rage Mobility L gfx card). On the iMac, it also works fine except that the texture does not show. Instead, it draws white rectangles. I have no idea why or what I need to enable/disable/define to make it work. The iMac is a G4 1GHz with an Nvidia GeForce4 MX gfx card.
Any help or suggestions would be greatly appreciated. Hopefully it's not a blitamax bug or some kind of driver problem. You'd think it would work the same on two macs!
You'll need a 256x256 image, the one I load is RGB not RGBA.
Strict
Const ballsize:Int=256 'based on 256x256 image
Local ballsizehalf:Int=ballsize Shr 1
AutoMidHandle True
Local px1:TPixmap=LoadPixmap("Ball09.png") '4 to 9 RGB no alpha
px1=ConvertPixmap(px1,PF_RGBA8888)
bglCreateContext(640,480,32,0,BGL_BACKBUFFER|BGL_ALPHABUFFER)'|BGL_STENCILBUFFER)
glMatrixMode (GL_PROJECTION)
glOrtho(0,640,480,0,-1,1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity
glClear(GL_COLOR_BUFFER_BIT)
bglSwapBuffers
glClear(GL_COLOR_BUFFER_BIT)
bglSwapBuffers
glDisable(GL_DEPTH_TEST)
glDisable(GL_STENCIL_TEST)
glDisable(GL_ALPHA_TEST)
glDisable(GL_SCISSOR_TEST)
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE)
bglSetSwapInterval(0) 'no vbl sync
GLDisable(GL_DITHER)
glClearColor(0,0,0,0)
glColor4b($FF,$FF,$FF,$FF)
SeedRnd(MilliSecs())
'Create bank space to store a downloaded image
Local bnk:TBank=CreateBank(ballsize*ballsize) 'to store screen image
Local where:Byte Ptr=BankBuf(bnk)
'Give our image an alpha buffer
Local pxp:Byte Ptr=PixmapPixelPtr(px1,0,0)
Local pitch:Int=PixmapPitch(px1)
For Local yy:Int=0 To ballsize-1
Local yloc:Int=yy*pitch
For Local xx:Int=0 To ballsize-1
pxp[yloc+(xx Shl 2)+3]=pxp[yloc+(xx Shl 2)] 'copy the red component into the image's alpha buffer
Next
Next
'Pixmap now has equivalent data in alpha buffer
'Upload our pixmap as a texture
glDrawBuffer(GL_BACK)
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_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
glPixelStorei(GL_UNPACK_ALIGNMENT,4)
glPixelStorei(GL_UNPACK_ROW_LENGTH,PixmapPitch(px1)/4) '4 bytes per pixel RGB format
Local name:Int
glGenTextures(1,VarPtr(name))
glBindTexture(GL_TEXTURE_2D,name)
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,ballsize,ballsize,0,GL_RGBA,GL_UNSIGNED_BYTE,PixmapPixelPtr(px1,0,0)) 'RGB=no alpha in pixmap!
Local objx:Int=Rand(0,619-ballsize)+10
Local objy:Int=Rand(0,459-ballsize)+10
Local objx2:Int=Rand(0,619-ballsize)+10
Local objy2:Int=Rand(0,459-ballsize)+10
Local xadd:Int=Rand(1,5)
Local yadd:Int=Rand(1,5)
Local xadd2:Int=Rand(1,5)
Local yadd2:Int=Rand(1,5)
Local spin:Int=0
Local spin2:Int=0
Repeat
'Move objects
If ballsize<620
objx:+xadd; objx2:+xadd2
If objx>630-ballsize Or objx<10
xadd=-xadd
objx:+xadd
EndIf
If objx2>630-ballsize Or objx2<10
xadd2=-xadd2
objx2:+xadd2
EndIf
EndIf
If ballsize<460
objy:+yadd; objy2:+yadd2
If objy>470-ballsize Or objy<10
yadd=-yadd
objy:+yadd
EndIf
If objy2>470-ballsize Or objy2<10
yadd2=-yadd2
objy2:+yadd2
EndIf
EndIf
glClear(GL_COLOR_BUFFER_BIT) 'cls
'SetBlend LIGHTBLEND
glEnable(GL_BLEND)
'glBlendFunc GL_SRC_ALPHA,GL_ONE 'lightblend
glBlendFunc GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR
glShadeModel(GL_FLAT)'SMOOTH)
glPolygonMode(GL_FRONT,GL_FILL) 'face
'spin=(spin+3) Mod 360
'SetRotation spin
'Draw texture
glColor4b($FF,$FF,$FF,$FF)
glEnable(GL_TEXTURE_2D)
glBegin GL_QUADS
glTexCoord2f(0,0); glVertex2i(objx,objy)
glTexCoord2f(0,1); glVertex2i(objx,objy+ballsize)
glTexCoord2f(1,1); glVertex2i(objx+ballsize,objy+ballsize)
glTexCoord2f(1,0); glVertex2i(objx+ballsize,objy)
glEnd
'SetRotation -spin
glBegin GL_QUADS
glTexCoord2f(0,0); glVertex2i(objx2,objy2)
glTexCoord2f(0,1); glVertex2i(objx2,objy2+ballsize)
glTexCoord2f(1,1); glVertex2i(objx2+ballsize,objy2+ballsize)
glTexCoord2f(1,0); glVertex2i(objx2+ballsize,objy2)
glEnd
Local mx:Int=Int(MouseX())-ballsizehalf
Local my:Int=Int(MouseY())-ballsizehalf
glBegin GL_QUADS
glTexCoord2f(0,0); glVertex2i(mx,my)
glTexCoord2f(0,1); glVertex2i(mx,my+ballsize)
glTexCoord2f(1,1); glVertex2i(mx+ballsize,my+ballsize)
glTexCoord2f(1,0); glVertex2i(mx+ballsize,my)
glEnd
glDisable(GL_TEXTURE_2D)
glDisable(GL_BLEND)
'SetRotation 0
glPixelZoom(1.0,1.0) 'no zooming
glPixelStorei(GL_PACK_ROW_LENGTH,ballsize) 'row length
glPixelStorei(GL_PACK_ALIGNMENT,4) 'byte alignment
glReadPixels(mx,my,ballsize,ballsize,GL_ALPHA,GL_UNSIGNED_BYTE,where) 'grab alpha into buffer
glRasterPos2i 0,256'mx,my 'Set the position top-left to draw this object at
glPixelStorei(GL_UNPACK_ROW_LENGTH,ballsize)
glPixelStorei(GL_UNPACK_ALIGNMENT,4)
glDrawPixels(ballsize,ballsize,GL_RED,GL_UNSIGNED_BYTE,where) 'Render alpha buffer into the stencil buffer
' 'GL_INDEX_SHIFT
' 'GL_INDEX_OFFSET
' glEnable(GL_STENCIL_TEST) 'Test the stencil
' glStencilFunc(GL_GEQUAL,140,$FF) 'Allow any pixels where the alpha is >=140
' glEnable(GL_BLEND) 'Do blending
' glBlendFunc(GL_SRC_ALPHA,GL_ZERO) 'Multiply source color by the alpha value, ignore dest
' 'glEnable(GL_ALPHA_TEST)
' 'glAlphaFunc(GL_GREATER,0.5)
' 'glEnable(GL_ALPHA_TEST)
' 'glAlphaFunc(GL_GREATER,0.5)
' glColor3b($44,$FF,$88) 'What color to render
' glColorMask True,True,True,False 'Draw in color components only, keep alpha for future operations
' glRasterPos2i 0,my+ballsize 'Set the position top-left to draw this object at
' glBegin GL_QUADS
' glVertex2i(mx,my)
' glVertex2i(mx,my+ballsize)
' glVertex2i(mx+ballsize,my+ballsize)
' glVertex2i(mx+ballsize,my)
' glEnd
' glDisable(GL_STENCIL_TEST)
' glDisable(GL_BLEND)
' glFlush()
bglSwapBuffers
' Repeat;Until KeyHit(KEY_SPACE)
Until KeyHit(KEY_ESCAPE)
End
|