home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1997-09-16 | 18.2 KB | 866 lines |
- Set Buffer 100
- Degree
- Dim _SIN(359),_COS(359)
- _SETVAR
- 'shapes are individual building blocks, such as cubes, arms etc
- 'groups are made up of shapes in various positions/orientations
-
- ' _tx,_ty,_tz are the 3D coords of each point of a shape
- '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)
- Dim _TX(_NSH,_NPT),_TY(_NSH,_NPT),_TZ(_NSH,_NPT),_POLY(_NSH,_NPL,10)
- '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?
- Dim _SHINFO(_NSH,11)
- 'screen x,y coords of each point of each shape on each object
- Dim _SX(_NOB,_NSG,_NPT),_SY(_NOB,_NSG,_NPT)
- 'information about groups; group,shape per group,info: info; 1=shape number,
- Dim _GRP(_NGR,_NSG,10)
- 'information about objects; 1=group ID, 2,3,4=x,y,z position, 5,6,7=x,y,z rotations
- Dim _OBJ(_NOB,10)
- 'object distance; format: 1000000*dist+1000*object number+shape id
- Dim _OBDIST(_NOB*_NSG+_NSG)
- 'object (shape) distance
- Dim _OBSHDIST(_NOB,_NSG)
- 'object animation; object,frame: 1=group id, 2=delay (50ths sec) : current frame
- Dim _OBANIM(_NOB,10,2),_OBFRAME(_NOB)
- 'object: x,y,z (1,2,3) displacements to move forward 100 units in current direction
- Dim _OBMOVE(_NOB,3)
- Screen Open 0,_SW,_SH,16,Lowres
- '-Lowres+Hires+Laced
- Flash Off
- Curs Off
- Paper 0
- Cls
- Clip 0,0 To _SW-1,_SH-1
-
- 'shape definitions...
- '1=cube length 2S, 2=cuboid 4Sx4Sx8S, 3=square (2Sx2S) based pyramid (height 2S)
- Restore _SHPT
- S=100
- For SH=1 To _NPSH
- For P=1 To _NPT
- Read _TX(SH,P),_TY(SH,P),_TZ(SH,P)
- Next
- For P=1 To _NPL
- For K=1 To 6
- Read _POLY(SH,P,K)
- Next
- Next
- Read _SHINFO(SH,11)
- Next
- 'cube
- _SHPT:
- Data -S,-S,-S
- Data -S,S,-S
- Data -S,S,S
- Data -S,-S,S
- Data S,-S,-S
- Data S,S,-S
- Data S,S,S
- Data S,-S,S
- Data -10000,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 7,4,4,3,2,1
- Data 7,4,7,8,5,6
- Data 6,4,3,7,6,2
- Data 6,4,8,4,1,5
- Data 9,4,8,7,3,4
- Data 9,4,1,2,6,5
- Data -10000,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0
-
- 'square based pyramid
- Data S,-S,0
- Data S,S,0
- Data -S,S,0
- Data -S,-S,0
- Data 0,0,2*S
- Data -10000,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 9,3,2,5,1,0
- Data 9,3,3,5,2,0
- Data 9,3,4,5,3,0
- Data 9,3,1,5,4,0
- 'Data 9,4,4,3,2,1
- Data -10000,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0
-
- ' 'bucket' cylinder
- Data 0,0,-S
- Data 0,0,S
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data -1,0,0,0,0,0
- 'rem colour, point, radius
- Data 7,1,0.5*S,0,0,0
- Data 7,2,0.8*S,0,0,0
- Data -10000,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0
-
- 'hexagonal prism
- Data -S,-S,-S
- Data -S*1.5,0,-S
- Data -S,S,-S
- Data S,S,-S
- Data S*1.5,0,-S
- Data S,-S,-S
- Data -S,-S,S
- Data -S*1.5,0,S
- Data -S,S,S
- Data S,S,S
- Data S*1.5,0,S
- Data S,-S,S
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- 'Data 7,4,1,3,4,6
- 'Data 8,4,12,10,9,7
- Data 7,4,1,7,8,2
- Data 8,4,2,8,9,3
- Data 7,4,3,9,10,4
- Data 8,4,4,10,11,5
- Data 7,4,5,11,12,6
- Data 8,4,6,12,7,1
- Data -10000,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0
-
- 'square polygon
- Data -S,-S,0
- Data -S,S,0
- Data S,S,0
- Data S,-S,0
- Data -10000,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,0,0
- Data 0,4,1,2,3,4
- Data -10000,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data 0,0,0,0,0,0
- Data -1
-
- _DEF:
- 'group definitions
- _ADDNEWSHAPE[1,33,0,0,0,0,0,200,0,0,0,40,40,55]
- _ADDNEWSHAPE[4,34,0,0,0,0,0,0,0,0,0,80,100,120]
- _ADDNEWSHAPE[4,35,0,0,-S,0,40,-150,5,0,0,20,20,160]
- _ADDNEWSHAPE[4,36,0,0,-S,0,-40,-150,355,0,0,20,20,160]
-
- _ADDNEWSHAPE[4,37,0,0,-S,30,40,-150,0,30,0,20,20,160]
- _ADDNEWSHAPE[4,38,0,0,-S,30,-40,-150,0,30,0,20,20,160]
-
- _ADDNEWSHAPE[2,39,0,0,0,0,0,250,0,0,0,40,40,20]
- _ADDNEWSHAPE[2,40,0,0,0,40,0,200,0,270,0,10,10,20]
- _ADDNEWSHAPE[5,41,0,0,0,50,-30,230,0,90,0,6,6,6]
- _ADDNEWSHAPE[5,42,0,0,0,50,30,230,0,90,0,6,6,6]
-
- _ADDNEWSHAPE[4,50,0,0,-S,0,S*1.3,120,8,350,0,20,20,80]
- _ADDNEWSHAPE[4,51,0,0,-S,0,-S*1.3,120,352,350,0,20,20,80]
- _ADDNEWSHAPE[4,52,0,0,-S,-20,S*1.5,-35,0,10,0,20,20,60]
- _ADDNEWSHAPE[4,53,0,0,-S,-20,-S*1.5,-35,0,10,0,20,20,60]
-
- '_ADDNEWSHAPE[TYPE,NEW,PX,PY,PZ,DX,DY,DZ,AX,AY,AZ,SX,SY,SZ]
-
- '33 - small head cube
- '34 - body
- '35 - left leg
- '36 - right leg
- '37 - left leg 2
- '38 - right leg 2
- '39 - hat
- '40 - nose
- '41 - left eye
- '42 - right eye
-
- '50 - upper left arm
- '51 - upper right arm
- '52 - lower left arm
- '53 - lower right arm
-
- 'frame 0
- _ADDTOGROUP[1,1,33]
- _ADDTOGROUP[1,2,34]
- _ADDTOGROUP[1,3,35]
- _ADDTOGROUP[1,4,36]
- _ADDTOGROUP[1,5,50]
- _ADDTOGROUP[1,6,51]
- _ADDTOGROUP[1,7,39]
- _ADDTOGROUP[1,8,40]
- _ADDTOGROUP[1,9,41]
- _ADDTOGROUP[1,10,42]
- _ADDTOGROUP[1,11,52]
- _ADDTOGROUP[1,12,53]
-
- 'frame 1
- _ADDTOGROUP[2,1,33]
- _ADDTOGROUP[2,2,34]
- _ADDTOGROUP[2,3,35]
- _ADDTOGROUP[2,4,38]
- _ADDTOGROUP[2,5,50]
- _ADDTOGROUP[2,6,51]
- _ADDTOGROUP[2,7,39]
- _ADDTOGROUP[2,8,40]
- _ADDTOGROUP[2,9,41]
- _ADDTOGROUP[2,10,42]
- _ADDTOGROUP[2,11,52]
- _ADDTOGROUP[2,12,53]
-
- 'frame 2
- _ADDTOGROUP[3,1,33]
- _ADDTOGROUP[3,2,34]
- _ADDTOGROUP[3,3,37]
- _ADDTOGROUP[3,4,36]
- _ADDTOGROUP[3,5,50]
- _ADDTOGROUP[3,6,51]
- _ADDTOGROUP[3,7,39]
- _ADDTOGROUP[3,8,40]
- _ADDTOGROUP[3,9,41]
- _ADDTOGROUP[3,10,42]
- _ADDTOGROUP[3,11,52]
- _ADDTOGROUP[3,12,53]
-
- 'box
- _ADDTOGROUP[4,1,24]
-
- 'object definitions
- _OBJ(1,1)=1
- _OBJ(1,2)=800
- _OBJ(1,3)=0
- _OBJ(1,4)=0
- _OBJ(1,7)=180
-
- _OBJ(0,4)=600
- _OBJ(0,6)=-30
-
- _OBJ(0,4)=0
- _OBJ(0,6)=0
-
- _OBANIM(1,1,1)=2
- _OBANIM(1,2,1)=3
- _OBANIM(1,3,1)=0
- _OBANIM(1,4,1)=0
- _OBFRAME(1)=0
- SPEED=20
- SPEED_ANIM=10
- Double Buffer
- Autoback 0
- _MLOOP:
- COUNT=0
- For K=1 To _NOB
- _ROTATE[K,0,0,0]
- Next
- Timer=0
- _TIMANIM=Timer
- _CSORTDIST=Timer-100
- Do
- 'animation
- If _FMOVE<>0
- If Timer>_TIMANIM+SPEED_ANIM
- C=_OBFRAME(1)
- G=_OBANIM(1,C+1,1)
- If G=0
- _OBFRAME(1)=1
- _OBJ(1,1)=_OBANIM(1,1,1)
- Else
- _OBJ(1,1)=G
- Inc _OBFRAME(1)
- End If
- _TIMANIM=Timer
- End If
- _FMOVE=0
- Else
- _OBFRAME(1)=0
- _OBJ(1,1)=1
- End If
- 'Add _GRP(1,2,7),5,0 To 359
-
- Gosub _DRAW3D
- _CONTROL:
- If Jup(1)
- '_ROTATE[1,0,-5,0]
- _MOVE[1,SPEED,0,0]
- _FMOVE=1
- Inc COUNT
- Else If Jdown(1)
- '_ROTATE[1,0,5,0]
- _MOVE[1,-SPEED,0,0]
- _FMOVE=-1
- Inc COUNT
- End If
- If Jleft(1)
- _ROTATE[1,0,0,-10]
- Inc COUNT
- Else If Jright(1)
- _ROTATE[1,0,0,10]
- Inc COUNT
- End If
- Screen Swap
- Wait Vbl
- Inc COUNT
- Loop
-
- _DRAW3D:
-
- 'calculate global 'matrix'
- GAX=-_OBJ(0,5)
- GAY=-_OBJ(0,6)
- GAZ=-_OBJ(0,7)
- _COSX=_COS(GAX)
- _COSY=_COS(GAY)
- _COSZ=_COS(GAZ)
- _SINX=_SIN(GAX)
- _SINY=_SIN(GAY)
- _SINZ=_SIN(GAZ)
- 'each object
- For K=1 To _NOB
- 'each shape in that object's group
- GR=_OBJ(K,1)
- '_DISPLACEX=0
- '_DISPLACEY=0
- _PTD[K,-1,_OBJ(K,2),_OBJ(K,3),_OBJ(K,4),-1,GR]
- '_DISPLACEX=_SX(K,0,0)-100
- '_DISPLACEY=_SY(K,0,0)+0
- For M=1 To _NSG
- SH=_GRP(GR,M,1)
- Exit If SH=0
- If SH>0
- For L=1 To _NPT
- If _TX(SH,L)=-10000
- Exit
- End If
- _PTD[K,L,_TX(SH,L),_TY(SH,L),_TZ(SH,L),M,GR]
- Next
- If COUNT>_CSORTDIST+2
- _GETDIST[K,GR,SH,-1]
- '_PTD[K,_SHINFO(SH,2),_SHINFO(SH,3),_SHINFO(SH,4),0,M,GR]
- 'DIST2=_OBSHDIST(K,M)
- _OBDIST(K*_NSG+M)=1000000*DIST2+K*1000+M
- End If
- Else
- _OBDIST(K*_NSG+M)=0
- End If
- Next
- Next
- If COUNT>_CSORTDIST+2
- Sort _OBDIST(1)
- _CSORTDIST=COUNT
- End If
- Cls
- For K0=_NOB To 1 Step -1
- For M0=_NSG To 1 Step -1
- _TOD=K0*_NSG+M0
- M=_OBDIST(_TOD) mod 1000
- K=((_OBDIST(_TOD)-M) mod 1000000)/1000
- If M<>0 and K<>0
- GR=_OBJ(K,1)
- 'For L=1 To _NPT
- ' Plot _SX(K,M,L),_SY(K,M,L)
- 'Next
- SPEC=0
- SH=_GRP(GR,M,1)
- For L=1 To _NPL
- ' 'special cases
- ' If SPEC=-1
- ' 'bucket
- ' V1=_POLY(SH,2,2)
- ' V2=_POLY(SH,3,2)
- ' Ink _POLY(SH,2,1)
- ' _GETDIST[K,GR,SH,0]
- ' DIST=Sqr(DIST2)
- ' RAD=_POLY(SH,2,3)
- ' XR1=(100*RAD)/DIST
- ' YR1=(100*RAD)/DIST
- ' RAD=_POLY(SH,3,3)
- ' XR2=(100*RAD)/DIST
- ' YR2=(100*RAD)/DIST
- ' X1=_SX(K,M,V1)
- ' Y1=_SY(K,M,V1)
- ' X2=_SX(K,M,V2)
- ' Y2=_SY(K,M,V2)
- ' DX=X2-X1
- ' DY=Y2-Y1
- ' DXR=XR2-XR1
- ' DYR=YR2-YR1
- ' 'IT=(Abs(DX)+Abs(DY))/8+1
- ' IT=(Abs(XR1)+Abs(XR2))/2+2
- ' For EL=0 To IT
- ' FR#=EL/(IT*1.0)
- ' 'Ellipse X1+DX*FR#,Y1+DY*FR#,XR1+DXR*FR#,YR1+DYR*FR#
- ' 'Draw X1+XR1*FR#,Y1+YR1*FR# To X2+XR2*FR#,Y2+YR2*FR#
- ' Draw X1+XR1*FR#-4,Y1 To X2+XR2*FR#-4,Y2
- ' Next
- ' 'Draw _SX(K,M,V1)-XR1,_SY(K,M,V1) To _SX(K,M,V2)-XR2,_SY(K,M,V2)
- ' 'Draw _SX(K,M,V1)+XR1,_SY(K,M,V1) To _SX(K,M,V2)+XR2,_SY(K,M,V2)
- ' '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)
- ' Exit
- ' Else
- ' If _POLY(SH,L,1)=-1
- ' 'bucket shape
- ' SPEC=-1
- ' End If
- Exit If _POLY(SH,L,1)=-10000
- Ink _POLY(SH,L,1)
- If _POLY(SH,L,2)=4
- V1=_POLY(SH,L,3)
- V2=_POLY(SH,L,4)
- V3=_POLY(SH,L,5)
- V4=_POLY(SH,L,6)
- If _SHINFO(SH,11)=0
- _TESTCW[K,V1,K,V2,K,V3,M]
- F=Param
- Else
- F=-1
- End If
- If F=-1
- 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)
- '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)
- End If
- Else If _POLY(SH,L,2)=3
- V1=_POLY(SH,L,3)
- V2=_POLY(SH,L,4)
- V3=_POLY(SH,L,5)
- 'V4=_POLY(SH,L,3)
- If _SHINFO(SH,11)=0
- _TESTCW[K,V1,K,V2,K,V3,M]
- F=Param
- Else
- F=-1
- End If
- If F=-1
- 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)
- End If
- End If
- ' End If
- Next
- End If
- Next
- Next
- Return
-
- Procedure _SETVAR
- Shared _SW,_SH,_NSH,_NPSH,_NPT,_NPL,_NGR,_NSG,_NOB
- Shared _SIN(),_COS()
- _SW=320
- _SH=200
- _NSH=100
- _NPSH=5
- _NPT=16
- _NPL=8
- _NGR=4
- _NSG=16
- _NOB=1
- For K=0 To 359
- _SIN(K)=Sin(K)*256
- _COS(K)=Cos(K)*256
- Next
- End Proc
- Procedure _ADDNEWSHAPE[TYPE,NEW,PX,PY,PZ,DX,DY,DZ,AX,AY,AZ,SX,SY,SZ]
- 'takes shape type, and creates a new one (new) by transforming it
- 'by pre-displacement px,py,pz
- 'by size sz,sy,sz (%)
- 'by rotation ax,ay,az
- 'by final displacement dx,dy,dz
- Shared _TX(),_TY(),_TZ(),_POLY(),_NPT,_NPL,_SHINFO()
- Shared _COS(),_SIN()
- For P=0 To _NPT
- If P=0
- X=0
- Y=0
- Z=0
- Else
- X=_TX(TYPE,P)
- Y=_TY(TYPE,P)
- Z=_TZ(TYPE,P)
- End If
- If X=-10000
- _TX(NEW,P)=-10000
- _TY(NEW,P)=0
- _TZ(NEW,P)=0
- Else
- Add X,PX
- Add Y,PY
- Add Z,PZ
- X=(X*SX)/100
- Y=(Y*SY)/100
- Z=(Z*SZ)/100
- Gosub ROTATE
- If P=0
- COMX=X+DX
- COMY=Y+DY
- COMZ=Z+DZ
- Else
- _TX(NEW,P)=X+DX
- _TY(NEW,P)=Y+DY
- _TZ(NEW,P)=Z+DZ
- End If
- End If
- Next
- For P=1 To _NPL
- For K=1 To 6
- _POLY(NEW,P,K)=_POLY(TYPE,P,K)
- Next
- Next
- _SHINFO(NEW,2)=COMX
- _SHINFO(NEW,3)=COMY
- _SHINFO(NEW,4)=COMZ
- _SHINFO(NEW,5)=AX
- _SHINFO(NEW,6)=AY
- _SHINFO(NEW,7)=AZ
- _SHINFO(NEW,8)=SX
- _SHINFO(NEW,9)=SY
- _SHINFO(NEW,10)=SZ
- _SHINFO(NEW,11)=_SHINFO(TYPE,11)
- Pop Proc
- ROTATE:
- If AX<>0
- X2=X
- Y2=(Y*_COS(AX)-Z*_SIN(AX))/256
- Z2=(Y*_SIN(AX)+Z*_COS(AX))/256
- Else
- X2=X
- Y2=Y
- Z2=Z
- End If
- If AY<>0
- X3=(X2*_COS(AY)-Z2*_SIN(AY))/256
- Y3=Y2
- Z3=(X2*_SIN(AY)+Z2*_COS(AY))/256
- Else
- X3=X2
- Y3=Y2
- Z3=Z2
- End If
- If AZ<>0
- X4=(X3*_COS(AZ)-Y3*_SIN(AZ))/256
- Y4=(X3*_SIN(AZ)+Y3*_COS(AZ))/256
- Z4=Z3
- Else
- X4=X3
- Y4=Y3
- Z4=Z3
- End If
- X=X4
- Y=Y4
- Z=Z4
- Return
- End Proc
- Procedure _ADDTOGROUP[GR,SHID,SH]
- Shared _GRP()
- _GRP(GR,SHID,1)=SH
- End Proc
- Procedure _PTD[OB,PT,X,Y,Z,M,GR]
- Shared _SW,_SH,DIST
- Shared _OBJ(),_GRP(),_OBSHDIST()
- Shared _SX(),_SY(),_DISPLACEX,_DISPLACEY
- Shared _SIN(),_COS()
- Shared _SINX,_COSX,_SINY,_COSY,_SINZ,_COSZ,GAX,GAY,GAZ
- 'Shared M,R#,A#
- Shared X#,Y#,Z#
- Goto C1
- 'shape local rotations
- 'AX=_GRP(GR,M,5)
- 'AY=_GRP(GR,M,6)
- 'AZ=_GRP(GR,M,7)
- 'Gosub ROTATE
- 'shape translations
- 'Add X,_GRP(GR,M,2)
- 'Add Y,_GRP(GR,M,3)
- 'Add Z,_GRP(GR,M,4)
-
- C1:
- 'object local rotations
- AX=_OBJ(OB,5)
- AY=_OBJ(OB,6)
- AZ=_OBJ(OB,7)
- Gosub ROTATE
- 'translations
- Add X,_OBJ(OB,2)-_OBJ(0,2)
- Add Y,_OBJ(OB,3)-_OBJ(0,3)
- Add Z,_OBJ(OB,4)-_OBJ(0,4)
- 'object global rotations
- Gosub ROTATEGLOB
-
- If X=0
- X=1
- End If
- Y=(Y*128)/X
- Z=(Z*128)/X
- If M<>0 and PT<>0
- If M=-1
- M=0
- End If
- If PT=-1
- PT=0
- End If
- _SX(OB,M,PT)=_SW/2+Y
- _SY(OB,M,PT)=_SH/2-Z
- End If
-
- '_SX(OB,PT)=Min(_SW,_SX(OB,PT))
- '_SX(OB,PT)=Max(0,_SX(OB,PT))
- '_SY(OB,PT)=Min(_SH,_SY(OB,PT))
- '_SY(OB,PT)=Max(0,_SY(OB,PT))
- Pop Proc
- ROTATE:
-
- If AX<>0
- X2=X
- Y2=(Y*_COS(AX)-Z*_SIN(AX))/256
- Z2=(Y*_SIN(AX)+Z*_COS(AX))/256
- Else
- X2=X
- Y2=Y
- Z2=Z
- End If
- If AY<>0
- X3=(X2*_COS(AY)-Z2*_SIN(AY))/256
- Y3=Y2
- Z3=(X2*_SIN(AY)+Z2*_COS(AY))/256
- Else
- X3=X2
- Y3=Y2
- Z3=Z2
- End If
- If AZ<>0
- X4=(X3*_COS(AZ)-Y3*_SIN(AZ))/256
- Y4=(X3*_SIN(AZ)+Y3*_COS(AZ))/256
- Z4=Z3
- Else
- X4=X3
- Y4=Y3
- Z4=Z3
- End If
- X=X4
- Y=Y4
- Z=Z4
- Return
-
- ROTATEGLOB:
-
- If GAX<>0
- X2=X
- Y2=(Y*_COSX-Z*_SINX)/256
- Z2=(Y*_SINX+Z*_COSX)/256
- Else
- X2=X
- Y2=Y
- Z2=Z
- End If
- If GAY<>0
- X3=(X2*_COSY-Z2*_SINY)/256
- Y3=Y2
- Z3=(X2*_SINY+Z2*_COSY)/256
- Else
- X3=X2
- Y3=Y2
- Z3=Z2
- End If
- If GAZ<>0
- X4=(X3*_COSZ-Y3*_SINZ)/256
- Y4=(X3*_SINZ+Y3*_COSZ)/256
- Z4=Z3
- Else
- X4=X3
- Y4=Y3
- Z4=Z3
- End If
- X=X4
- Y=Y4
- Z=Z4
- Return
- End Proc
- Procedure _TESTCW[O1,P1,O2,P2,O3,P3,M]
- Shared _SX(),_SY()
- 'o1,2,3 is pOly;p1,2,3 is Point
- 'If P1=1 and P2=4 and P3=1
- ' '
- 'End If
- DY=_SY(O1,M,P1)-_SY(O3,M,P3)
- DX#=_SX(O3,M,P3)-_SX(O1,M,P1)
- DY=DY-(DY=0)
- '_AT=((100*DX)/DY)+256
- 'If _AT<0
- ' T1=-89.999
- 'Else If _AT>2000
- ' T1=89.999
- 'Else
- ' T1=_ATAN(_AT)
- 'End If
- T1=Atan(DX#/DY)
- If DY<0
- Add T1,180
- End If
- DY=_SY(O1,M,P1)-_SY(O2,M,P2)
- DX#=_SX(O2,M,P2)-_SX(O1,M,P1)
- DY=DY-(DY=0)
- '_AT=((100*DX)/DY)+256
- 'If _AT<0
- ' T2=-89.999
- 'Else If _AT>2000
- ' T2=89.999
- 'Else
- ' T2=_ATAN(_AT)
- 'End If
- T2=Atan(DX#/DY)
- If DY<0
- Add T2,180
- End If
- T0=T1+180
- If T0>360
- Add T0,-360
- End If
- If(T0<T1 and(T2>T0 and T2<T1)) or(T0>T1 and(T2>T0 or T2<T1))
- F=-1
- End If
- End Proc[F]
- Procedure _GETDIST[OB,GR,SH,FL]
- Shared _OBJ(),_GRP(),_SHINFO(),DIST2
- Shared _COS(),_SIN()
- If FL=-1
- X=_SHINFO(SH,2)
- Y=_SHINFO(SH,3)
- Z=_SHINFO(SH,4)
- 'If SH=33 or SH=40
- 'Monitor
- 'End If
- AX=_OBJ(OB,5)
- AY=_OBJ(OB,6)
- AZ=_OBJ(OB,7)
- Gosub ROTATE
- 'X=(X*_SHINFO(SH,8))/100
- 'Y=(Y*_SHINFO(SH,9))/100
- 'Z=(Z*_SHINFO(SH,10))/100
- Else
- X=0
- Y=0
- Z=0
- End If
- Add X,_OBJ(OB,2)
- Add Y,_OBJ(OB,3)
- Add Z,_OBJ(OB,4)
- DX=X-_OBJ(0,2)
- DY=Y-_OBJ(0,3)
- DZ=Z-_OBJ(0,4)
- 'DIST2=DX
- DIST2=(DX*DX+DY*DY+DZ*DZ)
- 'DIST2=(DX+DY+DZ)
- DIST2=DIST2/10000
- Pop Proc
- ROTATE:
- If AX<>0
- X2=X
- Y2=(Y*_COS(AX)-Z*_SIN(AX))/256
- Z2=(Y*_SIN(AX)+Z*_COS(AX))/256
- Else
- X2=X
- Y2=Y
- Z2=Z
- End If
- If AY<>0
- X3=(X2*_COS(AY)-Z2*_SIN(AY))/256
- Y3=Y2
- Z3=(X2*_SIN(AY)+Z2*_COS(AY))/256
- Else
- X3=X2
- Y3=Y2
- Z3=Z2
- End If
- If AZ<>0
- X4=(X3*_COS(AZ)-Y3*_SIN(AZ))/256
- Y4=(X3*_SIN(AZ)+Y3*_COS(AZ))/256
- Z4=Z3
- Else
- X4=X3
- Y4=Y3
- Z4=Z3
- End If
- X=X4
- Y=Y4
- Z=Z4
- Return
- End Proc
- Procedure _MOVE[OB,DX,DY,DZ]
- Shared _OBJ(),_SIN(),_COS(),_OBMOVE()
- AX=_OBJ(OB,5)
- AY=_OBJ(OB,6)
- AZ=_OBJ(OB,7)
- X=_OBJ(OB,2)
- Y=_OBJ(OB,3)
- Z=_OBJ(OB,4)
- If DX<>0
- If DY=0 and DZ=0
- Add X,(_OBMOVE(OB,1)*DX)/100
- Add Y,(_OBMOVE(OB,2)*DX)/100
- Add Z,(_OBMOVE(OB,3)*DX)/100
- Else
- L=(DX*_COS(AY))
- Add X,Int((L*_COS(AZ))/65536)
- Add Y,Int((L*_SIN(AZ))/65536)
- Add Z,Int((DX*_SIN(AY))/65536)
- End If
- End If
- _OBJ(OB,2)=X
- _OBJ(OB,3)=Y
- _OBJ(OB,4)=Z
- End Proc
- Procedure _ROTATE[OB,DX,DY,DZ]
- Shared _OBJ(),_COS(),_SIN(),_OBMOVE()
- Add _OBJ(OB,5),DX,0 To 355
- Add _OBJ(OB,6),DY,0 To 355
- Add _OBJ(OB,7),DZ,0 To 355
- AX=_OBJ(OB,5)
- AY=_OBJ(OB,6)
- AZ=_OBJ(OB,7)
- L=(100*_COS(AY))
- _OBMOVE(OB,1)=Int((L*_COS(AZ))/65536)
- _OBMOVE(OB,2)=Int((L*_SIN(AZ))/65536)
- _OBMOVE(OB,3)=Int((DX*_SIN(AY))/65536)
- End Proc