Подскажите, пожалуйста, можно ли ускорить?
Код:
#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