home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1993-06-16 | 5.2 KB | 225 lines |
- ' ---------------------------------
- '
- ' AMOSPro Compiler Example
- '
- ' Fractal Landscaping 2
- '
- ' By Jean-Baptiste BOLCATO
- '
- ' (c) 1993 Europress Software Ltd.
- '
- ' ---------------------------------
- '
- '
- ' --------------------------------------------
- ' remark: Random fractal Landscape Generator
- ' Surface lit (but slow!) version
- '
- ' Average Acceleration: 220 %
- '
- ' Test configuration: A1200, 6Mb
- ' Original AMOS Compiler: 180 %
- ' --------------------------------------------
-
-
- ' ---- Variables Init ----
-
- Set Buffer 50
-
- ' Set lens parameters
- DIST=500 : ZOM=400
-
- ' Time for loops
- TIME=1000
-
- ' Coord grid limites
- XF1=-100 : ZF1=-100 : YF1=50
- XF2=100 : ZF2=100
-
- ' Options screen
- Screen Open 0,320,32,2,Hires
- Palette 0,$FFF
-
- ' Number of steps
- Input "Grid Subdivision (1 to 32)?:";NS
- If NS<1
- NS=1
- Else
- If NS>32
- NS=32
- End If
- End If
-
- Dim X3D(NS,NS),Y3D(NS,NS),Z3D(NS,NS)
- Dim XROT(NS,NS),YROT(NS,NS),ZROT(NS,NS)
- Dim X2D(NS,NS),Y2D(NS,NS)
-
- ' Size of gridding intervals
- ITX=(XF2-XF1)/NS
- ITZ=(ZF2-ZF1)/NS
-
-
- ' ---- Screen Init ----
-
- Screen Open 0,320,200,16,Lowres
- Flash Off : For I=0 To 15 : Colour I,I*$111 : Next I
- Screen Display 0,128,45,,
- Curs Off : Cls 0 : Hide
- Double Buffer : Autoback 0
-
- ' ---- Main Loop ----
-
- Degree
- PHI=240
- TETA=-60
-
- Timer=0
-
- ' Init landscape
-
- For J=1 To NS
- For I=1 To NS
- X3D(I,J)=XF1+ITX*I
- Z3D(I,J)=ZF1+ITZ*J
- R=((Abs(I-NS/2)+Abs(J-NS/2))*90)/NS
- Y3D(I,J)=-100*Cos(R)
- Next I
- Next J
-
- N=0
- Repeat
-
- Cls 0
-
- ' Increment rotation angle
- Add PHI,2,0 To 359
-
- ' Precalculation of COSs and SINs
- ' ( *256 to stay in integer mode (faster!))
- CPHI=Cos(PHI)*256
- SPHI=Sin(PHI)*256
- CTETA=Cos(TETA)*256
- STETA=Sin(TETA)*256
-
- For J=1 To NS
- For I=1 To NS
-
- ' Patch Y - landscape deformation
- Y3D2=Y3D(I,J)*Cos((N-1)*4)
-
- ' Calculation of rotated 3Dcoords of new point
- ' ( /256 to bring back COS and SIN beetween 0->1)
- ' Rotation (X-Z with PHI)
- XROT(I,J)=(X3D(I,J)*CPHI+Z3D(I,J)*SPHI)/256
- ZROT(I,J)=(Z3D(I,J)*CPHI-X3D(I,J)*SPHI)/256
- YROT(I,J)=(Y3D2*CTETA+ZROT(I,J)*STETA)/256
- ZROT(I,J)=(ZROT(I,J)*CTETA-Y3D2*STETA)/256
-
- ' Calculation of screen coords
- X2D(I,J)=160+(XROT(I,J)*ZOM)/(DIST+ZROT(I,J))
- Y2D(I,J)=100+(YROT(I,J)*ZOM)/(DIST+ZROT(I,J))
-
- Next I
- Next J
-
- For J1=2 To NS
- If PHI>=0 and PHI<90
- J=NS-J1+2
- Else
- If PHI>=90 and PHI<180
- I=J1
- Else
- If PHI>=180 and PHI<270
- J=J1
- Else
- I=NS-J1+2
- End If
- End If
- End If
-
- For I1=2 To NS
- If PHI>=0 and PHI<90
- I=I1
- Else
- If PHI>=90 and PHI<180
- J=I1
- Else
- If PHI>=180 and PHI<270
- I=NS-I1+2
- Else
- J=NS-I1+2
- End If
- End If
- End If
-
- ' Calculation of first vector
- X1=XROT(I,J)-XROT(I-1,J)
- Y1=YROT(I,J)-YROT(I-1,J)
- Z1=ZROT(I,J)-ZROT(I-1,J)
-
- ' Calculation of second vector
- X2=XROT(I-1,J-1)-XROT(I,J)
- Y2=YROT(I-1,J-1)-YROT(I,J)
- Z2=ZROT(I-1,J-1)-ZROT(I,J)
-
- ' Calculation of third vector
- X3=XROT(I,J-1)-XROT(I,J)
- Y3=YROT(I,J-1)-YROT(I,J)
- Z3=ZROT(I,J-1)-ZROT(I,J)
-
- ' Calculation of first PV vector (Vectoriel Product)
- PVX1=Y1*Z2-Z1*Y2 : PVY1=Z1*X2-X1*Z2 : PVZ1=X1*Y2-Y1*X2
-
- ' Calculation of second PVvector (Vectoriel Product)
- PVX2=Y3*Z2-Z3*Y2 : PVY2=Z3*X2-X3*Z2 : PVZ2=X3*Y2-Y3*X2
-
- ' Calculation of ENLs scalair product PV.AB
- ' (Proportional with number of lit faces)
- ENL1=PVX1*X3D(I,J)+PVY1*Y3D(I,J)+PVZ1*(DIST+Z3D(I,J))
- ENL2=PVX2*X3D(I,J)+PVY2*Y3D(I,J)+PVZ2*(DIST+Z3D(I,J))
- NR=Sqr(XROT(I,J)^2+YROT(I,J)^2+(DIST+ZROT(I,J))^2)
-
- ' Negative ENLs means that faces are hidden
- If ENL1>0
- ' Bring back ENL1 from 0 to 15 for use with Ink
- ENL1=ENL1*16
- ENL1=ENL1/(Sqr(PVX1^2+PVY1^2+PVZ1^2))
- ENL1=ENL1/NR : If ENL1>=15 : ENL1=15 : End If
- Else
- ENL1=0
- End If
- If ENL2>0
- ' Bring back ENL2 from 0 to 15 for use with Ink
- ENL2=ENL2*16
- ENL2=ENL2/(Sqr(PVX2^2+PVY2^2+PVZ2^2))
- ENL2=ENL2/NR : If ENL2>=15 : ENL2=15 : End If
- Else
- ENL2=0
- End If
- ' Draw lit face
- Ink ENL1
- Polygon X2D(I,J),Y2D(I,J) To X2D(I-1,J),Y2D(I-1,J) To X2D(I-1,J-1),Y2D(I-1,J-1)
- Ink ENL2
- Polygon X2D(I,J),Y2D(I,J) To X2D(I-1,J-1),Y2D(I-1,J-1) To X2D(I,J-1),Y2D(I,J-1)
-
- Next I1
- Next J1
-
- Screen Swap
- Wait Vbl
-
- Inc N
- Until Timer>=TIME
- T#=Timer
-
- ' --- Final Report ---
-
- Autoback 1 : Paper 0 : Pen 15
- Print " Needs";T#/50;" seconds for";N;" loops."
- Print " ( =";T#/N;" VBLs )"
- Print
- Print " Press mouse key to end"
- Repeat
- Multi Wait
- Until Mouse Key or(Inkey$<>"")
- End