home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaDemoCD2.iso / ASCII / TEXTE / SCENE / AMIGA / DC5VHTML.LHA / DC5 / Mag5 / 3DPolygons.AMOS / 3DPolygons.amosSourceCode
Encoding:
AMOS Source Code  |  1997-09-16  |  18.2 KB  |  866 lines

  1. Set Buffer 100
  2. Degree 
  3. Dim _SIN(359),_COS(359)
  4. _SETVAR
  5. 'shapes are individual building blocks, such as cubes, arms etc
  6. 'groups are made up of shapes in various positions/orientations
  7.  
  8. ' _tx,_ty,_tz are the 3D coords of each point of a shape 
  9. 'poly holds information about each face of a shape: 1=colour, 2=number of vertices, 3-6=points that make up face (in clockwise order)
  10. Dim _TX(_NSH,_NPT),_TY(_NSH,_NPT),_TZ(_NSH,_NPT),_POLY(_NSH,_NPL,10)
  11. 'shape info, 2,3,4=x,y,z displacements, 5,6,7=x,y,z rotations, 8,9,10=x,y,z enlargements, 11=always draw polygons? 
  12. Dim _SHINFO(_NSH,11)
  13. 'screen x,y coords of each point of each shape on each object
  14. Dim _SX(_NOB,_NSG,_NPT),_SY(_NOB,_NSG,_NPT)
  15. 'information about groups; group,shape per group,info: info; 1=shape number, 
  16. Dim _GRP(_NGR,_NSG,10)
  17. 'information about objects; 1=group ID, 2,3,4=x,y,z position, 5,6,7=x,y,z rotations
  18. Dim _OBJ(_NOB,10)
  19. 'object distance; format: 1000000*dist+1000*object number+shape id 
  20. Dim _OBDIST(_NOB*_NSG+_NSG)
  21. 'object (shape) distance 
  22. Dim _OBSHDIST(_NOB,_NSG)
  23. 'object animation; object,frame: 1=group id, 2=delay (50ths sec) : current frame 
  24. Dim _OBANIM(_NOB,10,2),_OBFRAME(_NOB)
  25. 'object: x,y,z (1,2,3) displacements to move forward 100 units in current direction
  26. Dim _OBMOVE(_NOB,3)
  27. Screen Open 0,_SW,_SH,16,Lowres
  28. '-Lowres+Hires+Laced 
  29. Flash Off 
  30. Curs Off 
  31. Paper 0
  32. Cls 
  33. Clip 0,0 To _SW-1,_SH-1
  34.  
  35. 'shape definitions...
  36. '1=cube length 2S, 2=cuboid 4Sx4Sx8S, 3=square (2Sx2S) based pyramid (height 2S) 
  37. Restore _SHPT
  38. S=100
  39. For SH=1 To _NPSH
  40.    For P=1 To _NPT
  41.       Read _TX(SH,P),_TY(SH,P),_TZ(SH,P)
  42.    Next 
  43.    For P=1 To _NPL
  44.       For K=1 To 6
  45.          Read _POLY(SH,P,K)
  46.       Next 
  47.    Next 
  48.    Read _SHINFO(SH,11)
  49. Next 
  50. 'cube
  51. _SHPT:
  52. Data -S,-S,-S
  53. Data -S,S,-S
  54. Data -S,S,S
  55. Data -S,-S,S
  56. Data S,-S,-S
  57. Data S,S,-S
  58. Data S,S,S
  59. Data S,-S,S
  60. Data -10000,0,0
  61. Data 0,0,0
  62. Data 0,0,0
  63. Data 0,0,0
  64. Data 0,0,0
  65. Data 0,0,0
  66. Data 0,0,0
  67. Data 0,0,0
  68. Data 7,4,4,3,2,1
  69. Data 7,4,7,8,5,6
  70. Data 6,4,3,7,6,2
  71. Data 6,4,8,4,1,5
  72. Data 9,4,8,7,3,4
  73. Data 9,4,1,2,6,5
  74. Data -10000,0,0,0,0,0
  75. Data 0,0,0,0,0,0
  76. Data 0
  77.  
  78. 'square based pyramid
  79. Data S,-S,0
  80. Data S,S,0
  81. Data -S,S,0
  82. Data -S,-S,0
  83. Data 0,0,2*S
  84. Data -10000,0,0
  85. Data 0,0,0
  86. Data 0,0,0
  87. Data 0,0,0
  88. Data 0,0,0
  89. Data 0,0,0
  90. Data 0,0,0
  91. Data 0,0,0
  92. Data 0,0,0
  93. Data 0,0,0
  94. Data 0,0,0
  95. Data 9,3,2,5,1,0
  96. Data 9,3,3,5,2,0
  97. Data 9,3,4,5,3,0
  98. Data 9,3,1,5,4,0
  99. 'Data 9,4,4,3,2,1
  100. Data -10000,0,0,0,0,0
  101. Data 0,0,0,0,0,0
  102. Data 0,0,0,0,0,0
  103. Data 0,0,0,0,0,0
  104. Data 0
  105.  
  106. ' 'bucket' cylinder
  107. Data 0,0,-S
  108. Data 0,0,S
  109. Data 0,0,0
  110. Data 0,0,0
  111. Data 0,0,0
  112. Data 0,0,0
  113. Data 0,0,0
  114. Data 0,0,0
  115. Data 0,0,0
  116. Data 0,0,0
  117. Data 0,0,0
  118. Data 0,0,0
  119. Data 0,0,0
  120. Data 0,0,0
  121. Data 0,0,0
  122. Data 0,0,0
  123. Data -1,0,0,0,0,0
  124. 'rem  colour, point, radius  
  125. Data 7,1,0.5*S,0,0,0
  126. Data 7,2,0.8*S,0,0,0
  127. Data -10000,0,0,0,0,0
  128. Data 0,0,0,0,0,0
  129. Data 0,0,0,0,0,0
  130. Data 0,0,0,0,0,0
  131. Data 0,0,0,0,0,0
  132. Data 0
  133.  
  134. 'hexagonal prism 
  135. Data -S,-S,-S
  136. Data -S*1.5,0,-S
  137. Data -S,S,-S
  138. Data S,S,-S
  139. Data S*1.5,0,-S
  140. Data S,-S,-S
  141. Data -S,-S,S
  142. Data -S*1.5,0,S
  143. Data -S,S,S
  144. Data S,S,S
  145. Data S*1.5,0,S
  146. Data S,-S,S
  147. Data 0,0,0
  148. Data 0,0,0
  149. Data 0,0,0
  150. Data 0,0,0
  151. 'Data 7,4,1,3,4,6
  152. 'Data 8,4,12,10,9,7
  153. Data 7,4,1,7,8,2
  154. Data 8,4,2,8,9,3
  155. Data 7,4,3,9,10,4
  156. Data 8,4,4,10,11,5
  157. Data 7,4,5,11,12,6
  158. Data 8,4,6,12,7,1
  159. Data -10000,0,0,0,0,0
  160. Data 0,0,0,0,0,0
  161. Data 0
  162.  
  163. 'square polygon
  164. Data -S,-S,0
  165. Data -S,S,0
  166. Data S,S,0
  167. Data S,-S,0
  168. Data -10000,0,0
  169. Data 0,0,0
  170. Data 0,0,0
  171. Data 0,0,0
  172. Data 0,0,0
  173. Data 0,0,0
  174. Data 0,0,0
  175. Data 0,0,0
  176. Data 0,0,0
  177. Data 0,0,0
  178. Data 0,0,0
  179. Data 0,0,0
  180. Data 0,4,1,2,3,4
  181. Data -10000,0,0,0,0,0
  182. Data 0,0,0,0,0,0
  183. Data 0,0,0,0,0,0
  184. Data 0,0,0,0,0,0
  185. Data 0,0,0,0,0,0
  186. Data 0,0,0,0,0,0
  187. Data 0,0,0,0,0,0
  188. Data -1
  189.  
  190. _DEF:
  191. 'group definitions 
  192. _ADDNEWSHAPE[1,33,0,0,0,0,0,200,0,0,0,40,40,55]
  193. _ADDNEWSHAPE[4,34,0,0,0,0,0,0,0,0,0,80,100,120]
  194. _ADDNEWSHAPE[4,35,0,0,-S,0,40,-150,5,0,0,20,20,160]
  195. _ADDNEWSHAPE[4,36,0,0,-S,0,-40,-150,355,0,0,20,20,160]
  196.  
  197. _ADDNEWSHAPE[4,37,0,0,-S,30,40,-150,0,30,0,20,20,160]
  198. _ADDNEWSHAPE[4,38,0,0,-S,30,-40,-150,0,30,0,20,20,160]
  199.  
  200. _ADDNEWSHAPE[2,39,0,0,0,0,0,250,0,0,0,40,40,20]
  201. _ADDNEWSHAPE[2,40,0,0,0,40,0,200,0,270,0,10,10,20]
  202. _ADDNEWSHAPE[5,41,0,0,0,50,-30,230,0,90,0,6,6,6]
  203. _ADDNEWSHAPE[5,42,0,0,0,50,30,230,0,90,0,6,6,6]
  204.  
  205. _ADDNEWSHAPE[4,50,0,0,-S,0,S*1.3,120,8,350,0,20,20,80]
  206. _ADDNEWSHAPE[4,51,0,0,-S,0,-S*1.3,120,352,350,0,20,20,80]
  207. _ADDNEWSHAPE[4,52,0,0,-S,-20,S*1.5,-35,0,10,0,20,20,60]
  208. _ADDNEWSHAPE[4,53,0,0,-S,-20,-S*1.5,-35,0,10,0,20,20,60]
  209.  
  210. '_ADDNEWSHAPE[TYPE,NEW,PX,PY,PZ,DX,DY,DZ,AX,AY,AZ,SX,SY,SZ]
  211.  
  212. '33 - small head cube  
  213. '34 - body 
  214. '35 - left leg 
  215. '36 - right leg
  216. '37 - left leg 2 
  217. '38 - right leg 2
  218. '39 - hat
  219. '40 - nose 
  220. '41 - left eye 
  221. '42 - right eye
  222.  
  223. '50 - upper left arm 
  224. '51 - upper right arm
  225. '52 - lower left arm 
  226. '53 - lower right arm
  227.  
  228. 'frame 0 
  229. _ADDTOGROUP[1,1,33]
  230. _ADDTOGROUP[1,2,34]
  231. _ADDTOGROUP[1,3,35]
  232. _ADDTOGROUP[1,4,36]
  233. _ADDTOGROUP[1,5,50]
  234. _ADDTOGROUP[1,6,51]
  235. _ADDTOGROUP[1,7,39]
  236. _ADDTOGROUP[1,8,40]
  237. _ADDTOGROUP[1,9,41]
  238. _ADDTOGROUP[1,10,42]
  239. _ADDTOGROUP[1,11,52]
  240. _ADDTOGROUP[1,12,53]
  241.  
  242. 'frame 1 
  243. _ADDTOGROUP[2,1,33]
  244. _ADDTOGROUP[2,2,34]
  245. _ADDTOGROUP[2,3,35]
  246. _ADDTOGROUP[2,4,38]
  247. _ADDTOGROUP[2,5,50]
  248. _ADDTOGROUP[2,6,51]
  249. _ADDTOGROUP[2,7,39]
  250. _ADDTOGROUP[2,8,40]
  251. _ADDTOGROUP[2,9,41]
  252. _ADDTOGROUP[2,10,42]
  253. _ADDTOGROUP[2,11,52]
  254. _ADDTOGROUP[2,12,53]
  255.  
  256. 'frame 2 
  257. _ADDTOGROUP[3,1,33]
  258. _ADDTOGROUP[3,2,34]
  259. _ADDTOGROUP[3,3,37]
  260. _ADDTOGROUP[3,4,36]
  261. _ADDTOGROUP[3,5,50]
  262. _ADDTOGROUP[3,6,51]
  263. _ADDTOGROUP[3,7,39]
  264. _ADDTOGROUP[3,8,40]
  265. _ADDTOGROUP[3,9,41]
  266. _ADDTOGROUP[3,10,42]
  267. _ADDTOGROUP[3,11,52]
  268. _ADDTOGROUP[3,12,53]
  269.  
  270. 'box 
  271. _ADDTOGROUP[4,1,24]
  272.  
  273. 'object definitions
  274. _OBJ(1,1)=1
  275. _OBJ(1,2)=800
  276. _OBJ(1,3)=0
  277. _OBJ(1,4)=0
  278. _OBJ(1,7)=180
  279.  
  280. _OBJ(0,4)=600
  281. _OBJ(0,6)=-30
  282.  
  283. _OBJ(0,4)=0
  284. _OBJ(0,6)=0
  285.  
  286. _OBANIM(1,1,1)=2
  287. _OBANIM(1,2,1)=3
  288. _OBANIM(1,3,1)=0
  289. _OBANIM(1,4,1)=0
  290. _OBFRAME(1)=0
  291. SPEED=20
  292. SPEED_ANIM=10
  293. Double Buffer 
  294. Autoback 0
  295. _MLOOP:
  296. COUNT=0
  297. For K=1 To _NOB
  298.    _ROTATE[K,0,0,0]
  299. Next 
  300. Timer=0
  301. _TIMANIM=Timer
  302. _CSORTDIST=Timer-100
  303. Do 
  304.    'animation 
  305.    If _FMOVE<>0
  306.       If Timer>_TIMANIM+SPEED_ANIM
  307.          C=_OBFRAME(1)
  308.          G=_OBANIM(1,C+1,1)
  309.          If G=0
  310.             _OBFRAME(1)=1
  311.             _OBJ(1,1)=_OBANIM(1,1,1)
  312.          Else 
  313.             _OBJ(1,1)=G
  314.             Inc _OBFRAME(1)
  315.          End If 
  316.          _TIMANIM=Timer
  317.       End If 
  318.       _FMOVE=0
  319.    Else 
  320.       _OBFRAME(1)=0
  321.       _OBJ(1,1)=1
  322.    End If 
  323.    'Add _GRP(1,2,7),5,0 To 359
  324.    
  325.    Gosub _DRAW3D
  326.    _CONTROL:
  327.    If Jup(1)
  328.       '_ROTATE[1,0,-5,0] 
  329.       _MOVE[1,SPEED,0,0]
  330.       _FMOVE=1
  331.       Inc COUNT
  332.    Else If Jdown(1)
  333.       '_ROTATE[1,0,5,0]
  334.       _MOVE[1,-SPEED,0,0]
  335.       _FMOVE=-1
  336.       Inc COUNT
  337.    End If 
  338.    If Jleft(1)
  339.       _ROTATE[1,0,0,-10]
  340.       Inc COUNT
  341.    Else If Jright(1)
  342.       _ROTATE[1,0,0,10]
  343.       Inc COUNT
  344.    End If 
  345.    Screen Swap 
  346.    Wait Vbl 
  347.    Inc COUNT
  348. Loop 
  349.  
  350. _DRAW3D:
  351.  
  352. 'calculate global 'matrix' 
  353. GAX=-_OBJ(0,5)
  354. GAY=-_OBJ(0,6)
  355. GAZ=-_OBJ(0,7)
  356. _COSX=_COS(GAX)
  357. _COSY=_COS(GAY)
  358. _COSZ=_COS(GAZ)
  359. _SINX=_SIN(GAX)
  360. _SINY=_SIN(GAY)
  361. _SINZ=_SIN(GAZ)
  362. 'each object 
  363. For K=1 To _NOB
  364.    'each shape in that object's group 
  365.    GR=_OBJ(K,1)
  366.    '_DISPLACEX=0
  367.    '_DISPLACEY=0
  368.    _PTD[K,-1,_OBJ(K,2),_OBJ(K,3),_OBJ(K,4),-1,GR]
  369.    '_DISPLACEX=_SX(K,0,0)-100 
  370.    '_DISPLACEY=_SY(K,0,0)+0 
  371.    For M=1 To _NSG
  372.       SH=_GRP(GR,M,1)
  373.       Exit If SH=0
  374.       If SH>0
  375.          For L=1 To _NPT
  376.             If _TX(SH,L)=-10000
  377.                Exit 
  378.             End If 
  379.             _PTD[K,L,_TX(SH,L),_TY(SH,L),_TZ(SH,L),M,GR]
  380.          Next 
  381.          If COUNT>_CSORTDIST+2
  382.             _GETDIST[K,GR,SH,-1]
  383.             '_PTD[K,_SHINFO(SH,2),_SHINFO(SH,3),_SHINFO(SH,4),0,M,GR]
  384.             'DIST2=_OBSHDIST(K,M)
  385.             _OBDIST(K*_NSG+M)=1000000*DIST2+K*1000+M
  386.          End If 
  387.       Else 
  388.          _OBDIST(K*_NSG+M)=0
  389.       End If 
  390.    Next 
  391. Next 
  392. If COUNT>_CSORTDIST+2
  393.    Sort _OBDIST(1)
  394.    _CSORTDIST=COUNT
  395. End If 
  396. Cls 
  397. For K0=_NOB To 1 Step -1
  398.    For M0=_NSG To 1 Step -1
  399.       _TOD=K0*_NSG+M0
  400.       M=_OBDIST(_TOD) mod 1000
  401.       K=((_OBDIST(_TOD)-M) mod 1000000)/1000
  402.       If M<>0 and K<>0
  403.          GR=_OBJ(K,1)
  404.          'For L=1 To _NPT 
  405.          '   Plot _SX(K,M,L),_SY(K,M,L) 
  406.          'Next  
  407.          SPEC=0
  408.          SH=_GRP(GR,M,1)
  409.          For L=1 To _NPL
  410.             '            'special cases  
  411.             '            If SPEC=-1
  412.             '               'bucket
  413.             '               V1=_POLY(SH,2,2) 
  414.             '               V2=_POLY(SH,3,2) 
  415.             '               Ink _POLY(SH,2,1)
  416.             '               _GETDIST[K,GR,SH,0]
  417.             '               DIST=Sqr(DIST2)
  418.             '               RAD=_POLY(SH,2,3)
  419.             '               XR1=(100*RAD)/DIST 
  420.             '               YR1=(100*RAD)/DIST 
  421.             '               RAD=_POLY(SH,3,3)
  422.             '               XR2=(100*RAD)/DIST 
  423.             '               YR2=(100*RAD)/DIST 
  424.             '               X1=_SX(K,M,V1) 
  425.             '               Y1=_SY(K,M,V1) 
  426.             '               X2=_SX(K,M,V2) 
  427.             '               Y2=_SY(K,M,V2) 
  428.             '               DX=X2-X1 
  429.             '               DY=Y2-Y1 
  430.             '               DXR=XR2-XR1
  431.             '               DYR=YR2-YR1
  432.             '               'IT=(Abs(DX)+Abs(DY))/8+1
  433.             '               IT=(Abs(XR1)+Abs(XR2))/2+2 
  434.             '               For EL=0 To IT 
  435.             '                  FR#=EL/(IT*1.0) 
  436.             '                  'Ellipse X1+DX*FR#,Y1+DY*FR#,XR1+DXR*FR#,YR1+DYR*FR#  
  437.             '                  'Draw X1+XR1*FR#,Y1+YR1*FR# To X2+XR2*FR#,Y2+YR2*FR#  
  438.             '                  Draw X1+XR1*FR#-4,Y1 To X2+XR2*FR#-4,Y2 
  439.             '               Next 
  440.             '               'Draw _SX(K,M,V1)-XR1,_SY(K,M,V1) To _SX(K,M,V2)-XR2,_SY(K,M,V2) 
  441.             '               'Draw _SX(K,M,V1)+XR1,_SY(K,M,V1) To _SX(K,M,V2)+XR2,_SY(K,M,V2) 
  442.             '               'Polygon _SX(K,M,V2)-XR2,_SY(K,M,V2) To _SX(K,M,V2)+XR2,_SY(K,M,V2) To _SX(K,M,V1)+XR1,_SY(K,M,V1) To _SX(K,M,V1)-XR1,_SY(K,M,V1)
  443.             '               Exit 
  444.             '            Else  
  445.             '               If _POLY(SH,L,1)=-1
  446.             '                  'bucket shape 
  447.             '                  SPEC=-1 
  448.             '               End If 
  449.             Exit If _POLY(SH,L,1)=-10000
  450.             Ink _POLY(SH,L,1)
  451.             If _POLY(SH,L,2)=4
  452.                V1=_POLY(SH,L,3)
  453.                V2=_POLY(SH,L,4)
  454.                V3=_POLY(SH,L,5)
  455.                V4=_POLY(SH,L,6)
  456.                If _SHINFO(SH,11)=0
  457.                   _TESTCW[K,V1,K,V2,K,V3,M]
  458.                   F=Param
  459.                Else 
  460.                   F=-1
  461.                End If 
  462.                If F=-1
  463.                   Polygon _SX(K,M,V1),_SY(K,M,V1) To _SX(K,M,V2),_SY(K,M,V2) To _SX(K,M,V3),_SY(K,M,V3) To _SX(K,M,V4),_SY(K,M,V4)
  464.                   'Polyline _SX(K,M,V1),_SY(K,M,V1) To _SX(K,M,V2),_SY(K,M,V2) To _SX(K,M,V3),_SY(K,M,V3) To _SX(K,M,V4),_SY(K,M,V4) 
  465.                End If 
  466.             Else If _POLY(SH,L,2)=3
  467.                V1=_POLY(SH,L,3)
  468.                V2=_POLY(SH,L,4)
  469.                V3=_POLY(SH,L,5)
  470.                'V4=_POLY(SH,L,3)
  471.                If _SHINFO(SH,11)=0
  472.                   _TESTCW[K,V1,K,V2,K,V3,M]
  473.                   F=Param
  474.                Else 
  475.                   F=-1
  476.                End If 
  477.                If F=-1
  478.                   Polygon _SX(K,M,V1),_SY(K,M,V1) To _SX(K,M,V2),_SY(K,M,V2) To _SX(K,M,V3),_SY(K,M,V3)
  479.                End If 
  480.             End If 
  481.             '            End If  
  482.          Next 
  483.       End If 
  484.    Next 
  485. Next 
  486. Return 
  487.  
  488. Procedure _SETVAR
  489.    Shared _SW,_SH,_NSH,_NPSH,_NPT,_NPL,_NGR,_NSG,_NOB
  490.    Shared _SIN(),_COS()
  491.    _SW=320
  492.    _SH=200
  493.    _NSH=100
  494.    _NPSH=5
  495.    _NPT=16
  496.    _NPL=8
  497.    _NGR=4
  498.    _NSG=16
  499.    _NOB=1
  500.    For K=0 To 359
  501.       _SIN(K)=Sin(K)*256
  502.       _COS(K)=Cos(K)*256
  503.    Next 
  504. End Proc
  505. Procedure _ADDNEWSHAPE[TYPE,NEW,PX,PY,PZ,DX,DY,DZ,AX,AY,AZ,SX,SY,SZ]
  506.    'takes shape type, and creates a new one (new) by transforming it
  507.    'by pre-displacement px,py,pz
  508.    'by size sz,sy,sz (%)
  509.    'by rotation ax,ay,az
  510.    'by final displacement dx,dy,dz
  511.    Shared _TX(),_TY(),_TZ(),_POLY(),_NPT,_NPL,_SHINFO()
  512.    Shared _COS(),_SIN()
  513.    For P=0 To _NPT
  514.       If P=0
  515.          X=0
  516.          Y=0
  517.          Z=0
  518.       Else 
  519.          X=_TX(TYPE,P)
  520.          Y=_TY(TYPE,P)
  521.          Z=_TZ(TYPE,P)
  522.       End If 
  523.       If X=-10000
  524.          _TX(NEW,P)=-10000
  525.          _TY(NEW,P)=0
  526.          _TZ(NEW,P)=0
  527.       Else 
  528.          Add X,PX
  529.          Add Y,PY
  530.          Add Z,PZ
  531.          X=(X*SX)/100
  532.          Y=(Y*SY)/100
  533.          Z=(Z*SZ)/100
  534.          Gosub ROTATE
  535.          If P=0
  536.             COMX=X+DX
  537.             COMY=Y+DY
  538.             COMZ=Z+DZ
  539.          Else 
  540.             _TX(NEW,P)=X+DX
  541.             _TY(NEW,P)=Y+DY
  542.             _TZ(NEW,P)=Z+DZ
  543.          End If 
  544.       End If 
  545.    Next 
  546.    For P=1 To _NPL
  547.       For K=1 To 6
  548.          _POLY(NEW,P,K)=_POLY(TYPE,P,K)
  549.       Next 
  550.    Next 
  551.    _SHINFO(NEW,2)=COMX
  552.    _SHINFO(NEW,3)=COMY
  553.    _SHINFO(NEW,4)=COMZ
  554.    _SHINFO(NEW,5)=AX
  555.    _SHINFO(NEW,6)=AY
  556.    _SHINFO(NEW,7)=AZ
  557.    _SHINFO(NEW,8)=SX
  558.    _SHINFO(NEW,9)=SY
  559.    _SHINFO(NEW,10)=SZ
  560.    _SHINFO(NEW,11)=_SHINFO(TYPE,11)
  561.    Pop Proc
  562.    ROTATE:
  563.    If AX<>0
  564.       X2=X
  565.       Y2=(Y*_COS(AX)-Z*_SIN(AX))/256
  566.       Z2=(Y*_SIN(AX)+Z*_COS(AX))/256
  567.    Else 
  568.       X2=X
  569.       Y2=Y
  570.       Z2=Z
  571.    End If 
  572.    If AY<>0
  573.       X3=(X2*_COS(AY)-Z2*_SIN(AY))/256
  574.       Y3=Y2
  575.       Z3=(X2*_SIN(AY)+Z2*_COS(AY))/256
  576.    Else 
  577.       X3=X2
  578.       Y3=Y2
  579.       Z3=Z2
  580.    End If 
  581.    If AZ<>0
  582.       X4=(X3*_COS(AZ)-Y3*_SIN(AZ))/256
  583.       Y4=(X3*_SIN(AZ)+Y3*_COS(AZ))/256
  584.       Z4=Z3
  585.    Else 
  586.       X4=X3
  587.       Y4=Y3
  588.       Z4=Z3
  589.    End If 
  590.    X=X4
  591.    Y=Y4
  592.    Z=Z4
  593.    Return 
  594. End Proc
  595. Procedure _ADDTOGROUP[GR,SHID,SH]
  596.    Shared _GRP()
  597.    _GRP(GR,SHID,1)=SH
  598. End Proc
  599. Procedure _PTD[OB,PT,X,Y,Z,M,GR]
  600.    Shared _SW,_SH,DIST
  601.    Shared _OBJ(),_GRP(),_OBSHDIST()
  602.    Shared _SX(),_SY(),_DISPLACEX,_DISPLACEY
  603.    Shared _SIN(),_COS()
  604.    Shared _SINX,_COSX,_SINY,_COSY,_SINZ,_COSZ,GAX,GAY,GAZ
  605.    'Shared M,R#,A#
  606.    Shared X#,Y#,Z#
  607.    Goto C1
  608.    'shape local rotations 
  609.    'AX=_GRP(GR,M,5) 
  610.    'AY=_GRP(GR,M,6) 
  611.    'AZ=_GRP(GR,M,7) 
  612.    'Gosub ROTATE
  613.    'shape translations
  614.    'Add X,_GRP(GR,M,2)
  615.    'Add Y,_GRP(GR,M,3)
  616.    'Add Z,_GRP(GR,M,4)
  617.    
  618.    C1:
  619.    'object local rotations
  620.    AX=_OBJ(OB,5)
  621.    AY=_OBJ(OB,6)
  622.    AZ=_OBJ(OB,7)
  623.    Gosub ROTATE
  624.    'translations
  625.    Add X,_OBJ(OB,2)-_OBJ(0,2)
  626.    Add Y,_OBJ(OB,3)-_OBJ(0,3)
  627.    Add Z,_OBJ(OB,4)-_OBJ(0,4)
  628.    'object global rotations 
  629.    Gosub ROTATEGLOB
  630.    
  631.    If X=0
  632.       X=1
  633.    End If 
  634.    Y=(Y*128)/X
  635.    Z=(Z*128)/X
  636.    If M<>0 and PT<>0
  637.       If M=-1
  638.          M=0
  639.       End If 
  640.       If PT=-1
  641.          PT=0
  642.       End If 
  643.       _SX(OB,M,PT)=_SW/2+Y
  644.       _SY(OB,M,PT)=_SH/2-Z
  645.    End If 
  646.    
  647.    '_SX(OB,PT)=Min(_SW,_SX(OB,PT))
  648.    '_SX(OB,PT)=Max(0,_SX(OB,PT))
  649.    '_SY(OB,PT)=Min(_SH,_SY(OB,PT))
  650.    '_SY(OB,PT)=Max(0,_SY(OB,PT))
  651.    Pop Proc
  652.    ROTATE:
  653.    
  654.    If AX<>0
  655.       X2=X
  656.       Y2=(Y*_COS(AX)-Z*_SIN(AX))/256
  657.       Z2=(Y*_SIN(AX)+Z*_COS(AX))/256
  658.    Else 
  659.       X2=X
  660.       Y2=Y
  661.       Z2=Z
  662.    End If 
  663.    If AY<>0
  664.       X3=(X2*_COS(AY)-Z2*_SIN(AY))/256
  665.       Y3=Y2
  666.       Z3=(X2*_SIN(AY)+Z2*_COS(AY))/256
  667.    Else 
  668.       X3=X2
  669.       Y3=Y2
  670.       Z3=Z2
  671.    End If 
  672.    If AZ<>0
  673.       X4=(X3*_COS(AZ)-Y3*_SIN(AZ))/256
  674.       Y4=(X3*_SIN(AZ)+Y3*_COS(AZ))/256
  675.       Z4=Z3
  676.    Else 
  677.       X4=X3
  678.       Y4=Y3
  679.       Z4=Z3
  680.    End If 
  681.    X=X4
  682.    Y=Y4
  683.    Z=Z4
  684.    Return 
  685.    
  686.    ROTATEGLOB:
  687.    
  688.    If GAX<>0
  689.       X2=X
  690.       Y2=(Y*_COSX-Z*_SINX)/256
  691.       Z2=(Y*_SINX+Z*_COSX)/256
  692.    Else 
  693.       X2=X
  694.       Y2=Y
  695.       Z2=Z
  696.    End If 
  697.    If GAY<>0
  698.       X3=(X2*_COSY-Z2*_SINY)/256
  699.       Y3=Y2
  700.       Z3=(X2*_SINY+Z2*_COSY)/256
  701.    Else 
  702.       X3=X2
  703.       Y3=Y2
  704.       Z3=Z2
  705.    End If 
  706.    If GAZ<>0
  707.       X4=(X3*_COSZ-Y3*_SINZ)/256
  708.       Y4=(X3*_SINZ+Y3*_COSZ)/256
  709.       Z4=Z3
  710.    Else 
  711.       X4=X3
  712.       Y4=Y3
  713.       Z4=Z3
  714.    End If 
  715.    X=X4
  716.    Y=Y4
  717.    Z=Z4
  718.    Return 
  719. End Proc
  720. Procedure _TESTCW[O1,P1,O2,P2,O3,P3,M]
  721.    Shared _SX(),_SY()
  722.    'o1,2,3 is pOly;p1,2,3 is Point
  723.    'If P1=1 and P2=4 and P3=1 
  724.    '   '
  725.    'End If  
  726.    DY=_SY(O1,M,P1)-_SY(O3,M,P3)
  727.    DX#=_SX(O3,M,P3)-_SX(O1,M,P1)
  728.    DY=DY-(DY=0)
  729.    '_AT=((100*DX)/DY)+256 
  730.    'If _AT<0
  731.    '   T1=-89.999 
  732.    'Else If _AT>2000
  733.    '   T1=89.999
  734.    'Else  
  735.    '   T1=_ATAN(_AT)  
  736.    'End If  
  737.    T1=Atan(DX#/DY)
  738.    If DY<0
  739.       Add T1,180
  740.    End If 
  741.    DY=_SY(O1,M,P1)-_SY(O2,M,P2)
  742.    DX#=_SX(O2,M,P2)-_SX(O1,M,P1)
  743.    DY=DY-(DY=0)
  744.    '_AT=((100*DX)/DY)+256 
  745.    'If _AT<0
  746.    '   T2=-89.999 
  747.    'Else If _AT>2000
  748.    '   T2=89.999
  749.    'Else  
  750.    '   T2=_ATAN(_AT)  
  751.    'End If  
  752.    T2=Atan(DX#/DY)
  753.    If DY<0
  754.       Add T2,180
  755.    End If 
  756.    T0=T1+180
  757.    If T0>360
  758.       Add T0,-360
  759.    End If 
  760.    If(T0<T1 and(T2>T0 and T2<T1)) or(T0>T1 and(T2>T0 or T2<T1))
  761.       F=-1
  762.    End If 
  763. End Proc[F]
  764. Procedure _GETDIST[OB,GR,SH,FL]
  765.    Shared _OBJ(),_GRP(),_SHINFO(),DIST2
  766.    Shared _COS(),_SIN()
  767.    If FL=-1
  768.       X=_SHINFO(SH,2)
  769.       Y=_SHINFO(SH,3)
  770.       Z=_SHINFO(SH,4)
  771.       'If SH=33 or SH=40 
  772.       'Monitor 
  773.       'End If  
  774.       AX=_OBJ(OB,5)
  775.       AY=_OBJ(OB,6)
  776.       AZ=_OBJ(OB,7)
  777.       Gosub ROTATE
  778.       'X=(X*_SHINFO(SH,8))/100 
  779.       'Y=(Y*_SHINFO(SH,9))/100 
  780.       'Z=(Z*_SHINFO(SH,10))/100
  781.    Else 
  782.       X=0
  783.       Y=0
  784.       Z=0
  785.    End If 
  786.    Add X,_OBJ(OB,2)
  787.    Add Y,_OBJ(OB,3)
  788.    Add Z,_OBJ(OB,4)
  789.    DX=X-_OBJ(0,2)
  790.    DY=Y-_OBJ(0,3)
  791.    DZ=Z-_OBJ(0,4)
  792.    'DIST2=DX
  793.    DIST2=(DX*DX+DY*DY+DZ*DZ)
  794.    'DIST2=(DX+DY+DZ)
  795.    DIST2=DIST2/10000
  796.    Pop Proc
  797.    ROTATE:
  798.    If AX<>0
  799.       X2=X
  800.       Y2=(Y*_COS(AX)-Z*_SIN(AX))/256
  801.       Z2=(Y*_SIN(AX)+Z*_COS(AX))/256
  802.    Else 
  803.       X2=X
  804.       Y2=Y
  805.       Z2=Z
  806.    End If 
  807.    If AY<>0
  808.       X3=(X2*_COS(AY)-Z2*_SIN(AY))/256
  809.       Y3=Y2
  810.       Z3=(X2*_SIN(AY)+Z2*_COS(AY))/256
  811.    Else 
  812.       X3=X2
  813.       Y3=Y2
  814.       Z3=Z2
  815.    End If 
  816.    If AZ<>0
  817.       X4=(X3*_COS(AZ)-Y3*_SIN(AZ))/256
  818.       Y4=(X3*_SIN(AZ)+Y3*_COS(AZ))/256
  819.       Z4=Z3
  820.    Else 
  821.       X4=X3
  822.       Y4=Y3
  823.       Z4=Z3
  824.    End If 
  825.    X=X4
  826.    Y=Y4
  827.    Z=Z4
  828.    Return 
  829. End Proc
  830. Procedure _MOVE[OB,DX,DY,DZ]
  831.    Shared _OBJ(),_SIN(),_COS(),_OBMOVE()
  832.    AX=_OBJ(OB,5)
  833.    AY=_OBJ(OB,6)
  834.    AZ=_OBJ(OB,7)
  835.    X=_OBJ(OB,2)
  836.    Y=_OBJ(OB,3)
  837.    Z=_OBJ(OB,4)
  838.    If DX<>0
  839.       If DY=0 and DZ=0
  840.          Add X,(_OBMOVE(OB,1)*DX)/100
  841.          Add Y,(_OBMOVE(OB,2)*DX)/100
  842.          Add Z,(_OBMOVE(OB,3)*DX)/100
  843.       Else 
  844.          L=(DX*_COS(AY))
  845.          Add X,Int((L*_COS(AZ))/65536)
  846.          Add Y,Int((L*_SIN(AZ))/65536)
  847.          Add Z,Int((DX*_SIN(AY))/65536)
  848.       End If 
  849.    End If 
  850.    _OBJ(OB,2)=X
  851.    _OBJ(OB,3)=Y
  852.    _OBJ(OB,4)=Z
  853. End Proc
  854. Procedure _ROTATE[OB,DX,DY,DZ]
  855.    Shared _OBJ(),_COS(),_SIN(),_OBMOVE()
  856.    Add _OBJ(OB,5),DX,0 To 355
  857.    Add _OBJ(OB,6),DY,0 To 355
  858.    Add _OBJ(OB,7),DZ,0 To 355
  859.    AX=_OBJ(OB,5)
  860.    AY=_OBJ(OB,6)
  861.    AZ=_OBJ(OB,7)
  862.    L=(100*_COS(AY))
  863.    _OBMOVE(OB,1)=Int((L*_COS(AZ))/65536)
  864.    _OBMOVE(OB,2)=Int((L*_SIN(AZ))/65536)
  865.    _OBMOVE(OB,3)=Int((DX*_SIN(AY))/65536)
  866. End Proc