Antialiazing is still not implemented.
Code: Select all
; Define 3D Constants
Global _Od.f=256
Global _Vd.f=256
Global _Oh=256
Global _Ow=256
Global Dim ox(_Ow,_Oh)
Global Dim oy(_Oh)
Global Dim c(_Ow,_Oh)
#PosX=300
#PosY=160; 128 should be enough - wrong y-scaling ?! -h...h = 1 pixel more than 0...h-1
; EndDefine
Macro Rad(a)
(a*#PI/180)
EndMacro
Procedure DrawObject(a)
Protected _sin.f
Protected _cos.f
Protected w=_Ow/2
Protected h=_Oh/2
Protected _mx.f
Protected _my.f
Protected z.f
_cos=_Oh/2*Cos(Rad(a))
_sin=_Oh/2*Sin(Rad(a))
_Td=_Od+_Vd
_mx=_Vd*_Td
_my=_mx*_sin
For y=-h To h
z=_Vd*(_Td+_cos*y/h)
For x=-w To w
ox(x+w,y+h)=x*_mx/z
Next x
oy(y+h)=y*_my/h/z
Next y
EndProcedure
CreateImage(1, 256, 256)
StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, 256, 256, $FF808080)
For x = 0 To 7
For y = x&1 To 7 Step 2
Box(x*32, y*32, 32,32, $FFe0e0e0)
Next
Next
DrawingMode(#PB_2DDrawing_AlphaBlend)
For i=0 To 33
Circle(Random(240),Random(240),Random(40),$60000000|Random(#White))
Next i
For x=0 To _Ow-1
For y=0 To _Oh-1
c(x,y)=Point(x,y)
Next y
Next x
For x=0 To _Ow-1
For y=0 To _Oh-1
c(x,y)=Point(x,y)
Next y
Next x
StopDrawing()
OpenWindow(0, 0, 0, 800, 600, "Screen", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(0,0,0,800,600)
AddWindowTimer(0,0,20)
Repeat
Select WaitWindowEvent(25)
Case #PB_Event_CloseWindow,#WM_CHAR
End
Case #PB_Event_Timer
n+1
StartDrawing(CanvasOutput(0))
Box(0,0,500,500,#White)
;DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawObject(n*5)
For y=0 To _Oh-1
y1=oy(y)+#PosY
yd=(y1-y2)
ys=Bool(yd>0)-Bool(yd<0)
If y=0 Or ys
If ys*yd<>2
ys=0
EndIf
For x=0 To _Ow-1
x1=ox(x,y)+#PosX
If x And x1>x2+1
Plot(x2+1,y1,c)
If ys
Plot(x2+1,y1-ys,c)
EndIf
EndIf
c=$f0000000|c(x,y)
Plot(x1,y1,c)
If ys
Plot(x1,y1-ys,c)
EndIf
x2=x1
Next x
y2=y1
EndIf
Next y
StopDrawing()
EndSelect
ForEver