Подскажите, пожалуйста, можно ли ускорить?
Код:
#SCR_WIDTH = 320 * 1
#SCR_HEIGHT = 240 * 1
#SCR_SIZE = #SCR_WIDTH * #SCR_HEIGHT
#TWID = #SCR_WIDTH
#THEI = #SCR_HEIGHT
#TWIDM1 = #TWID - 1
#THEIM1 = #THEI - 1
#MAXPOINTS = 32
#XMID = #SCR_WIDTH / 2
#YMID = #SCR_HEIGHT / 2
RandomSeed(1234)
Global Dim xcoords.f(#MAXPOINTS)
Global Dim ycoords.f(#MAXPOINTS)
Global Dim Buffer.l(#SCR_SIZE-1 )
Global Dim Tangle.l( #TWID, #THEI)
Global Dim Tdepth.l( #TWID, #THEI)
Global Dim Texture.l( 255, 255)
Global Dim Distbuffer.f( 255, 255)
Procedure.f dist(x.f,y.f)
mindist.f = 1000000;$1D+$16
;max = UBOUND(xc.f)
For i = 0 To #MAXPOINTS;max
a.f = (xcoords(i) - x) * (xcoords(i) - x)
b.f = (ycoords(i) - y) * (ycoords(i) - y)
d.f = Sqr(a + b)
If d < mindist
mindist = d
EndIf
Next i
ProcedureReturn mindist
EndProcedure
;Procedure PrecalcLUTS(byref Tangle() As integer, byref TDepth() As integer diameter)
Procedure PrecalcLUTS(diameter)
;Dim cx, cy, x, y As integer
;Dim distance As single
cx.l = #TWID/2
cy.l = #THEI/2
For x = 0 To #TWID - 1
For y = 0 To #THEI -1
Tangle(x, y) = Int(ATan2(cy - y, cx - x) * 256 / #PI )
distance.f = (Sqr((x-cx)*(x-cx) + (y-cy)*(y-cy)))
Tdepth(x, y) = 256 * diameter / distance
Next y
; flow = flow + flowadd
Next x
EndProcedure
Procedure DrawTunnel(addx.l,addy.l)
For y = 0 To #THEIM1
For x = 0 To #TWIDM1
tx.l = (Tangle(x,y) + addx) &255
ty.l = (Tdepth(x,y) + addy) & 255
;buffer( y * #SCR_WIDTH + x) = texture(tx, ty)
Box(x*2,y*2,2,2,texture(tx, ty))
Next x
Next y
EndProcedure
If InitSprite() And OpenWindow(0,0,0,640,480,"freeBASIC v0.01 - Tunnel demo(Relsoft)",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
For i = 0 To #MAXPOINTS
xcoords(i) = Random(#SCR_WIDTH)
ycoords(i) = Random(#SCR_HEIGHT)
Next i
mindist.f = 1000000;$1D+$16
maxdist.f = 0
For y = 0 To 255
For x = 0 To 255
tx = Abs(x - 128)
ty = Abs(y - 128)
distance.f = dist(tx, ty)
distbuffer.f(x, y) = distance
If distance < mindist
mindist = distance
EndIf
If distance > maxdist
maxdist = distance
EndIf
Next x
Next y
For y = 0 To 255
For x = 0 To 255
c.f =(distbuffer(x, y) - mindist) / (maxdist - mindist)
r = Int(c * 55)
g = Int(c * 155)
b = Int(c * 255)
texture(x, y) = RGB(r,g,b);r shl 16 Or g shl 8 Or b
Next x
Next y
PrecalcLUTS(64); Tangle(), TDepth(), 64
t.f=0
Repeat
StartDrawing(ScreenOutput())
DrawTunnel( (#TWID>>1)* Sin(t *0.5),(t *0.8)* (#THEI>>1) )
; For y = 0 To 255
; For x = 0 To 255
; Box(x*2,y*2,2,2,texture(x, y))
; Next x
; Next y
t=t+0.2
StopDrawing()
FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
EndIf
