home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 55
/
Amiga_Dream_55.iso
/
RISCOS
/
MAGAZINE
/
LABOS
/
KING.ZIP
/
King
/
!FUNQTM
/
Balls
(
.txt
)
< prev
next >
Wrap
RISC OS BBC BASIC V Source
|
1997-12-21
|
11KB
|
461 lines
Author: KING for all code.
Display spheres in 3D accordingly to QTM's output
Comment: All code in BASIC and not at all optimised so don't expect to go over 15 fps on a simple RPC 700.
WARNING This is the ugliest part!
"<Basic$Dir>.Library.General"
General
mode("X1024 Y768 C256")
ShadowInit
InitBalls
InitBalls
XS%=XScreen%
YS%=YScreen%
VU%(4)
Voice(4)
XS%,YS%
! A1=1
" B1=0
# C1=0
$ D1=0
& A2=0
' B2=1
( C2=0
) D2=0
+ A3=0
, B3=0
- C3=1
. D3=0
Counter=0
ZDep%=0
ZDepY%=0
XDep%=0
YDep%=0
"QTM_ReadSongLength"
NbSeq%,NbPat%
"QTM_Info"
,,origin%,,,,address%
origin%>=16
0,"Oi! I can't recognise this song!"
9( patterns%=address%+20+30*31+2+128+4
:" sequence%=address%+20+30*31+2
Radius%=70000
BRadius%=90000
PosX%=30000
PosY%=30000
Spot%=Radius%/4
Counter+=
ShadowSwitch
"QTM_ReadVULevels",1
VU%(0)
"QTM_ReadVULevels",2
VU%(1)
"QTM_ReadVULevels",3
VU%(2)
"QTM_ReadVULevels",4
VU%(3)
"QTM_Pos",-1,-1
seq%,event%
GCOL 128,VU%(0)/63*100,VU%(1)/63*100,VU%(2)/63*100
A%,B%,C%
C%=4
ZDep%+=(B%-ZDepY%)*10
XDep%+=A%*2
YDep%+=B%*2
D1=XDep%
D2=YDep%
A1=1
B1=0
C1=0
A2=0
B2=1
C2=0
A3=0
B3=0
C3=1
PROCLight
ZDep%<0
ZDep%=18000
ZDep%>18000
ZDep%=0
ZDep%>=0
ZDep%<3000
D3=3000-ZDep% :
Satellites
ZDep%>=3000
ZDep%<6000
D3=6000-ZDep% :
ZDep%>=6000
ZDep%<9000
D3=9000-ZDep% :
Space
ZDep%>=9000
ZDep%<12000
D3=12000-ZDep% :
ZDep%>=12000
ZDep%<15000
D3=15000-ZDep% :
RotBalls
ZDep%>=15000
ZDep%<18000
D3=18000-ZDep% :
Voices
Voice(0)+=VU%(0)/64*
Voice(1)+=VU%(1)/64*
Voice(2)+=VU%(2)/64*
Voice(3)+=VU%(3)/64*
255,255,255
0,0,120,15
0,0,0
T%=1/(
/100)
0,15
"FPS: ";T%
XS%,YS%
C%=1
Voices
VU0%=VU%(0)*10
VU1%=VU%(1)*10
VU2%=VU%(2)*10
VU3%=VU%(3)*10
Trigo(Counter/2,Counter,Counter/2)
Angle=0
Cos=
(Angle)
Sin=
(Angle)
X=Cos*VU0%
Y=750
Z=Sin*VU0%
Transform
1,T%,0,0
X%,Y%,Ct*Radius%
1,255,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X=Cos*VU1%
Y=250
Z=Sin*VU1%
Transform
1,0,T%,0
X%,Y%,Ct*Radius%
1,T%,255,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X=Cos*VU2%
Y=-250
Z=Sin*VU2%
Transform
1,0,0,T%
X%,Y%,Ct*Radius%
1,T%,T%,255
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X=Cos*VU3%
Y=-750
Z=Sin*VU3%
Transform
1,T%,0,T%
X%,Y%,Ct*Radius%
1,255,T%,255
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
Satellites
Angle=0
(Angle)*300
Y=0
(Angle)*300
D1=XDep%
Trigo(Voice(0),Voice(1),Counter)
D1-=500
Transform
1,0,0,T%
X%,Y%,Ct*Radius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
Y=VU%(0)*5+100
Transform
1,T%,0,0
X%,Y%,Ct*Radius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X%,Y%
Y=-VU%(1)*5-100
Transform
1,T%,T%,T%
X%,Y%
1,0,T%,0
X%,Y%,Ct*Radius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
Angle=0
(Angle)*300
Y=0
(Angle)*300
D1=XDep%
Trigo(Voice(2),Voice(3),Counter)
D1+=500
Transform
1,0,T%,0
X%,Y%,Ct*Radius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
Y=VU%(2)*5+100
Transform
1,T%,T%,0
X%,Y%,Ct*BRadius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X%,Y%
Y=-VU%(3)*5-100
Transform
1,T%,T%,T%
X%,Y%
1,T%,0,T%
X%,Y%,Ct*BRadius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
RotBalls
P%=0
X=500
Y=0
Z=0
1,T%,0,0
0*
Trigo(Voice(1),Voice(2),Voice(3))
1,0,T%,0
3*
Trigo(Voice(0),Voice(2),Voice(3))
1,0,0,T%
7*
Trigo(Voice(0),Voice(1),Voice(3))
1,T%,T%,0
;*
Trigo(Voice(0),Voice(1),Voice(2))
Transform
R=VU%(P%)/63
B
X%,Y%,Ct*BRadius%*R
1,T%,T%,T%
D-
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
0,255,255,255
X%,Y%,Ct*Radius%
X=0
Y=0
Z=0
D1=XDep%
Transform
1,255,0,255
T(
X%,Y%,Ct*BRadius%*event%/63
1,200,255,0
V*
X%,Y%,Ct*BRadius%*seq%/NbSeq%
0,255,255,255
X'
X%,Y%,Ct*BRadius%*seq%/NbSeq%
X=-500
Z=-VU%(0)*20
Transform
1,T%,0,0
X%,Y%,Ct*Radius%
0,255,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X=-250
Z=-VU%(1)*20
Transform
1,0,T%,0
X%,Y%,Ct*Radius%
0,T%,255,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X=250
Z=-VU%(2)*20
Transform
1,0,0,T%
X%,Y%,Ct*Radius%
0,T%,T%,255
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
X=500
Z=-VU%(3)*20
Transform
1,T%,T%,0
X%,Y%,Ct*Radius%
0,255,255,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
Space
P%=0
(Counter))*300
Angle=0
(Angle)*(150+K)
Y=0
(Angle)*(150+K)
Trigo(Counter/5,Counter*5,Counter/2)
Transform
0 :
1,T%,0,0
1 :
1,0,T%,0
2 :
1,0,0,T%
3 :
1,T%,T%,0
R=VU%(P%)/64
X%,Y%,Ct*Radius%*R
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
1,T%,T%,T%
X%,Y%,Ct*Radius%
P%+=1
Transform
1,255,0,255
X%,Y%,Ct*BRadius%*event%/63
1,200,255,0
X%,Y%,Ct*BRadius%*seq%/NbSeq%
0,255,255,255
X%,Y%,Ct*BRadius%*seq%/NbSeq%
P%=0
Angle=0
! X=
(Angle)*(150+VU%(P%)*5)
Y=0
! Z=
(Angle)*(150+VU%(P%)*5)
Trigo(Counter,Counter*5,0)
Transform
!
0 : R%=T% : G%=0 : B%=0
!
1 : R%=0 : G%=T% : B%=0
!
2 : R%=0 : G%=0 : B%=T%
"
3 : R%=T% : G%=T% : B%=0
1,R%,G%,B%
X%,Y%,Ct*Radius%
1,T%,T%,T%
X%-Ct*PosX%,Y%+Ct*PosY%,Ct*Spot%
GCOL 1,(255+R%)/2,(255+G%)/2,(255+B%)/2
CIRCLE FILL X%*2-Ct*24*1.2,Y%*2+Ct*24*1.2,Ct*16*1.5+Ct
GCOL 1,(255+R%*0.5)/1.5,(255+G%*0.5)/1.5,(255+B%*0.5)/1.5
CIRCLE FILL X%*2-Ct*24*1.3,Y%*2+Ct*24*1.3,Ct*16*1+Ct
GCOL 1,255,255,255
CIRCLE FILL X%*2-Ct*24*1.4,Y%*2+Ct*24*1.4,Ct*16*0.5+Ct
P%+=1
X=0
Y=0
Z=0
Transform
1,255,0,255
X%,Y%,Ct*BRadius%*event%/63
1,200,255,0
X%,Y%,Ct*BRadius%*seq%/NbSeq%
0,255,255,255
X%,Y%,Ct*BRadius%*seq%/NbSeq%
VUSPitch
&47E4F,seq%
pat%
pos%=1024*pat%+event%*16
pos%+=patterns%
ReadPitch(pos%)
Y=300
Z=-VU%(0)*10+100+ZDep%
Transform
1,255,0,0
X%*2,Y%*2,Ct*90
0,255,200,200
X%*2-Ct*40,Y%*2+Ct*40,Ct*20
X%*2,Y%*2
ReadPitch(pos%+4)
Y=100
Z=-VU%(1)*10+100+ZDep%
Transform
1,0,255,0
X%*2,Y%*2,Ct*90
0,200,255,200
X%*2-Ct*40,Y%*2+Ct*40,Ct*20
X%*2,Y%*2
ReadPitch(pos%+8)
Y=-100
Z=-VU%(2)*10+100+ZDep%
Transform
1,0,0,255
X%*2,Y%*2,Ct*90
0,200,200,255
X%*2-Ct*40,Y%*2+Ct*40,Ct*20
X%*2,Y%*2
ReadPitch(pos%+16)
Y=-300
Z=-VU%(3)*10+100+ZDep%
Transform
1,255,255,0
X%*2,Y%*2,Ct*90
0,255,255,200
X%*2-Ct*40,Y%*2+Ct*40,Ct*20
X%*2,Y%*2
ReadPitch(addr%)=addr%?1+((?addr%
&F)<<8)
Transform
<= X%,Y%
0 A= A1*X + B1*Y + C1*Z + D1
1 B= A2*X + B2*Y + C2*Z + D2
2 C= A3*X + B3*Y + C3*Z + D3
3 X=A
4 Y=B
5 Z=C
DLight=SQR((X-D1-XLight)^2+(Y-D2-YLight)^2+(Z-D3-ZLight)^2)
Cl=1/(DLight/500+1)
IF Cl>1 THEN Cl=1
T%=255*Cl
(X*X+Y*Y+Z*Z)
Ct=1/(D+1)
T%=3/(D/200+1)*255
T%>255
T%=255
X%=2*X/D*500
Y%=2*Y/D*500
PosX%=40*(X-XLight)
PosY%=40*(-Y+YLight)
Trigo(Xang,Yang,Zang)
Sinx =
(Xang)
Siny =
(Yang)
Sinz =
(Zang)
Cosx =
(Xang)
Cosy =
(Yang)
Cosz =
(Zang)
Sinus=Sinz*Cosx
Cosinus=Cosz*Siny
A1 = Cosz*Cosy
A2 = Cosy*Sinz
A3 = -Siny
B1 = -Sinus+Cosinus*Sinx
U" B2 = Cosx*Cosz+Sinx*Siny*Sinz
B3 = Cosy*Sinx
W C1 = Sinx*Sinz+Cosinus*Cosx
C2 = -Cosz*Sinx+Sinus*Siny
C3 = Cosx*Cosy
Light
D3=3000-ZDep%
XLight=
(Counter*2)*500
YLight=
(Counter*2)*500
ZLight=
(Counter*2)*500
X=XLight
Y=YLight
Z=ZLight
Transform
1,255,255,0
X%,Y%,Ct*Radius%
1,255,255,255
X%,Y%,Ct*Radius%/2