home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Amos / amproe2x.dms / in.adf / Compiler_Examples / AMOS_versions / 3Dcube2.AMOS / 3Dcube2.amosSourceCode
Encoding:
AMOS Source Code  |  1993-06-16  |  4.1 KB  |  190 lines

  1. ' ------------------------------------   
  2. '
  3. ' AMOSPro Compiler Example 
  4. '
  5. ' Real time surface lit 3D cuboid  
  6. '
  7. ' By Jean-Baptiste BOLCATO 
  8. '
  9. ' (c) 1993 Europress Software Ltd. 
  10. '
  11. ' ------------------------------------   
  12. '
  13. '
  14. ' ---------------------------------------------        
  15. '   Remark: An surface lit 3D filled cube!     
  16. '           Much harder to calculate but a better result.  
  17. '           (Real time calculated version!)
  18. '
  19. '           Average Acceleration:  200 % 
  20. '
  21. '           Test configuration: A1200, 6Mb   
  22. '
  23. '           Original AMOS Compiler:  180 % 
  24. ' -----------------------------------------------      
  25.  
  26.  
  27. ' ---- Variables Init ---- 
  28.  
  29. ' Ntsc test
  30. YMID=128-28*(Ntsc=True)
  31.  
  32. ' Lens paramenter
  33. DIST=500 : ZOM=200
  34.  
  35. ' Number of loops
  36. NL=100
  37.  
  38. ' Init coords  
  39. Restore _DATA_POINTS
  40. Read NP
  41. Dim XP(NP),YP(NP),ZP(NP)
  42. Dim XP2(NP),YP2(NP),ZP2(NP)
  43. Dim X(4),Y(4),Z(4)
  44. For I=1 To NP
  45.    Read XP(I),YP(I),ZP(I)
  46. Next I
  47.  
  48. Restore _DATA_FACES
  49. Read NF
  50. Dim P(NF,4)
  51. For I=1 To NF
  52.    For J=1 To 4
  53.       Read P(I,J)
  54.    Next J
  55. Next I
  56.  
  57. ' ---- Screen Init ----
  58.  
  59. Screen Open 0,320,YMID*2,16,Lowres
  60. Flash Off : Curs Off : Hide : Cls 0
  61. For I=0 To 15 : Colour I,I*$111 : Next I
  62.  
  63. Double Buffer 
  64. Autoback 0
  65. Degree 
  66.  
  67. ' ---- Main Loop ----
  68.  
  69. Timer=0
  70. For N=1 To NL
  71.    
  72.    Cls 0
  73.    
  74.    ' Increment rotation angles
  75.    Add TETA,1,0 To 359
  76.    Add PHI,2,0 To 359
  77.    
  78.    ' Precalculation of COSs and SINs  
  79.    ' ( *256 to stay in integer mode (faster!))    
  80.    CPHI=Cos(PHI)*256
  81.    SPHI=Sin(PHI)*256
  82.    CTETA=Cos(TETA)*256
  83.    STETA=Sin(TETA)*256
  84.    
  85.    
  86.    ' Calculation of rotated 3D coords of A,B,C,D of all points  
  87.    ' ( /256 to bring back COS and SIN beetween 0->1)    
  88.    ' Rotation (X-Z with PHI) & rotation (X-Y with TETA) 
  89.    For I=1 To NP
  90.       XP2(I)=(XP(I)*CPHI+ZP(I)*SPHI)/256
  91.       ZP2(I)=(ZP(I)*CPHI-XP(I)*SPHI)/256
  92.       YP2(I)=(YP(I)*CTETA-XP2(I)*STETA)/256
  93.       XP2(I)=(XP2(I)*CTETA+YP(I)*STETA)/256
  94.    Next I
  95.    
  96.    For I=1 To NF
  97.       
  98.       ' Calculation of AB vector 
  99.       X1=XP2(P(I,2))-XP2(P(I,1))
  100.       Y1=YP2(P(I,2))-YP2(P(I,1))
  101.       Z1=ZP2(P(I,2))-ZP2(P(I,1))
  102.       
  103.       ' Calculaton of AC vector
  104.       X2=XP2(P(I,3))-XP2(P(I,1))
  105.       Y2=YP2(P(I,3))-YP2(P(I,1))
  106.       Z2=ZP2(P(I,3))-ZP2(P(I,1))
  107.       
  108.       ' Calculation of PV vector = AB^AC   
  109.       PVX=Y1*Z2-Z1*Y2
  110.       PVY=Z1*X2-X1*Z2
  111.       PVZ=X1*Y2-Y1*X2
  112.       
  113.       ' Calculation of ENL scalair product PV.AB   
  114.       ' (proportionnal with Enlightment of a Face) 
  115.       ENL=PVX*XP2(P(I,1))+PVY*YP2(P(I,1))+PVZ*(ZP2(P(I,1))+DIST)
  116.       
  117.       ' Positive ENL means that the face is hidden 
  118.       If ENL<0
  119.          
  120.          ' Bring back ENL from 0 to 15 for use with Ink 
  121.          ENL=-ENL*16
  122.          ENL=ENL/(Sqr(PVX^2+PVY^2+PVZ^2))
  123.          ENL=ENL/(Sqr(X(1)^2+Y(1)^2+(Z(1)+DIST)^2))
  124.          If ENL>=15 : ENL=15 : End If 
  125.          
  126.          ' Calculation of screen coords of A,B,C,D    
  127.          For J=1 To 4
  128.             X(J)=160+(XP2(P(I,J))*ZOM)/(DIST+ZP2(P(I,J)))
  129.             Y(J)=YMID+(YP2(P(I,J))*ZOM)/(DIST+ZP2(P(I,J)))
  130.          Next J
  131.          
  132.          ' Draw Faces!
  133.          Ink ENL
  134.          Polygon X(1),Y(1) To X(2),Y(2) To X(3),Y(3) To X(4),Y(4)
  135.          
  136.       End If 
  137.    Next I
  138.    Screen Swap 
  139.    Wait Vbl 
  140. Next N
  141. T#=Timer
  142.  
  143. ' --- Final Report --- 
  144.  
  145. Autoback 1 : Cls 0 : Paper 0 : Pen 15
  146. Print "  Needs";T#/50;" seconds for";NL;" loops."
  147. V#=T#/NL
  148. Print "          ( =";V#;" VBLs )"
  149. Print 
  150. Print "   Press mouse key to end"
  151. Repeat 
  152.    Multi Wait 
  153. Until Mouse Key or(Inkey$<>"")
  154. End 
  155.  
  156. ' ---- Cube Data ----  
  157.  
  158. _DATA_POINTS:
  159. Data 8
  160.  
  161. Data -100,-100,-100
  162. Data 100,-100,-100
  163. Data 100,100,-100
  164. Data -100,100,-100
  165.  
  166. Data -100,-100,100
  167. Data 100,-100,100
  168. Data 100,100,100
  169. Data -100,100,100
  170.  
  171. '       5----------6                     
  172. '      /.         /|             
  173. '     / .        / |                 
  174. '    1----------2  |                         
  175. '    |  .       |  |                 
  176. '    |          |  |               
  177. '    |  8 . . . |. 7               
  178. '    | .        | /                    
  179. '    |.         |/                   
  180. '    4----------3              
  181. '                            
  182.  
  183. _DATA_FACES:
  184. Data 6
  185. Data 1,4,3,2
  186. Data 1,2,6,5
  187. Data 3,4,8,7
  188. Data 5,6,7,8
  189. Data 1,5,8,4
  190. Data 2,3,7,6