This should contain all you need...
'Why scrolling a non ^2 image may give unexpected results
Strict
SetGraphicsDriver GLMax2DDriver()
'SetGraphicsDriver BufferedD3D7Max2DDriver()
Graphics 800, 600, 0'32, -1
Local image:TImage = LoadImage(getenv_("BMXPATH") + "\samples\digesteroids\graphics\digestive.png")
If image = Null Then RuntimeError "Couldn't load image"
Local tw# = Pow2Size(image.width), th# = Pow2Size(image.height)
Local scalex# = (tw# - image.width) / image.width
Local scaley# = (th# - image.height) / image.height
Local scrollx#, scrolly#, showtex
SetBlend ALPHABLEND
SetTextureRepeat(image, True)
Repeat
If KeyDown(KEY_LEFT) Then scrollx# :+ 0.01
If KeyDown(KEY_RIGHT) Then scrollx# :- 0.01
If KeyDown(KEY_UP) Then scrolly# :+ 0.01
If KeyDown(KEY_DOWN) Then scrolly# :- 0.01
If KeyHit(KEY_SPACE) Then showtex = 1 - showtex
Cls
If showtex
SetAlpha 0.33
SetColor 0, 0, 100
DrawRect 12, 36, tw#, th#
SetColor 255, 255, 255
SetUV(image, 1 + scrollx#, scrolly#, 1 + scalex# + scrollx#, 1 + scrolly#)
SetScale scalex#, 1
DrawImage image, 12 + image.width, 36
SetUV(image, 1 + scrollx#, 1 + scrolly#, 1 + scalex# + scrollx#, 1 + scaley# + scrolly#)
SetScale scalex#, scaley#
DrawImage image, 12 + image.width, 36 + image.height
SetUV(image, scrollx#, 1 + scrolly#, 1 + scrollx#, 1 + scaley# + scrolly#)
SetScale 1, scaley#
DrawImage image, 12, 36 + image.height
EndIf
SetAlpha 1
SetScale 1, 1
SetColor 0, 0, 100
DrawRect 12, 36, image.width, image.height
SetColor 255, 255, 255
SetUV(image, scrollx#, scrolly#, 1 + scrollx#, 1 + scrolly#)
DrawImage image, 12, 36
DrawText "Show Texture = " + showtex, 12, 12
DrawText "Hit SPACE to toggle texture, CURSOR keys to scroll image", 200, 576
Flip 1
Until KeyHit(KEY_ESCAPE)
End
Function SetTextureRepeat(image:TImage, rep=True)' Under DX, *ALL* images drawn will repeat
' Assert (image.width = Pow2Size(image.width)) And (image.height = Pow2Size(image.height)),..
' "Image width and height must be a power of two"
Local D3D7Driver:TD3D7Max2DDriver = TD3D7Max2DDriver(_max2dDriver)
If rep
?Win32
If D3D7Driver
'DX
D3D7Driver.device.SetTextureStageState 0, D3DTSS_ADDRESS, D3DTADDRESS_WRAP
Else
?
'GL
glBindTexture GL_TEXTURE_2D, TGLImageFrame(image.Frame(0)).name
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT
?Win32
EndIf
?
Else
?Win32
If D3D7Driver
'DX
D3D7Driver.device.SetTextureStageState 0, D3DTSS_ADDRESS, D3DTADDRESS_CLAMP
Else
?
'GL
glBindTexture GL_TEXTURE_2D, TGLImageFrame(image.Frame(0)).name
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE
?Win32
EndIf
?
EndIf
End Function
Function SetUV(image:TImage, u0!, v0!, u1!, v1!, frame=0)
Local twr! = Double(image.width) / Pow2Size(image.width)
Local thr! = Double(image.height) / Pow2Size(image.height)
u0! = twr! * u0!
v0! = thr! * v0!
u1! = twr! * u1!
v1! = thr! * v1!
?Win32
If TGLMax2DDriver(_max2dDriver)
?
'GL
Local GLImageFrame:TGLImageFrame = TGLImageFrame(image.Frame(frame))
GLImageFrame.u0# = u0!
GLImageFrame.v0# = v0!
GLImageFrame.u1# = u1!
GLImageFrame.v1# = v1!
?Win32
Else
'DX
TD3D7ImageFrame(image.Frame(frame)).SetUV(u0!, v0!, u1!, v1!)
EndIf
?
End Function
Function Pow2Size(n)
Local t = 1
While t < n
t :* 2
Wend
Return t
End Function