home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 55
/
Amiga_Dream_55.iso
/
RISCOS
/
MAGAZINE
/
LABOS
/
KING.ZIP
/
King
/
!FUNQTM
/
Waves
(
.txt
)
< prev
Wrap
RISC OS BBC BASIC V Source
|
1997-12-14
|
19KB
|
737 lines
Authors: Original 3D point and wave algo. code routine by Jan Vlietink.
Rest by KING.
Comments: Well that's my favourite FUNQTM's part. Code in BASIC/ass gives so good speed.
"<Basic$Dir>.Library.General"
General
ShadowInit
mode("X640 Y480 G256")
PROCmode("X320 Y256 G256")
XS%=XScreen%
YS%=YScreen%
PP%=13
VU%=8
XS%=1024
"QTM_VUBarControl",1,4
DAMP=11-7
DM1=100
DM2=100
PROP=12-5
!SH=6 : FIX=2^SH :
Precision
lengte=64+16
WX%=50
!PointSize%=WX%*WX%*12+5000*12
Punt% PointSize%
Punt2% PointSize%
Velo1% WX%*WX%*4+10000
Velo2% WX%*WX%*4+10000
MotionSize%=4*3*4+8
Project% 1000*4*2
Motion% MotionSize%*100+4
Point_Type(3)
Plane_Type(3)
buildpunt
A%=0
PointSize%
Punt2%!A%=Punt%!A%
No velocity
A%=0
WX%*WX%*4
Velo1%!A%=0
Velo2%!A%=0
Pal% 256*4*2
U%=255/3
Grad(1,U%,255,0,255,255,255,0)
Grad(U%,U%*2,255,255,0,0,255,255)
Grad(U%*2,255,0,255,255,255,0,255)
Pal%!0=0
?+Pal%!4=(255<<24)
(255<<16)
(255<<8)
"ColourTrans_WritePalette",-1,,Pal%
buildmotion
XS%,YS%
ShadowSwitch
set2
A%=Motion%
128,0,0,0
waves
>500
X%,Y%,C%
Motion%!TXD+=X%*FIX/10
Motion%!TYD+=Y%*FIX/10
Motion%!TZD+=Y%*FIX/10
Motion%!HZD+=X%*FIX/100
Motion%!HXD+=Y%*FIX/100
Motion%!HYD+=X%*FIX/100
U%=255/3
RndColors(RA%,GA%,BA%)
RndColors(RB%,GB%,BB%)
RndColors(RC%,GC%,BC%)
Grad(1,U%,RA%,GA%,BA%,RB%,GB%,BB%)
Grad(U%,U%*2,RB%,GB%,BB%,RC%,GC%,BC%)
Grad(U%*2,255,RC%,GC%,BC%,RA%,GA%,BA%)
Pal%!0=0
"ColourTrans_WritePalette",-1,,Pal%
Motion%!HZD=TIME/500*FIX*50
Motion%!HYD=
/500*FIX*100
Motion%!TYD=-
/500*FIX*100
Motion%!TZD=+
/500*FIX*300
A%=Motion%
calc_rot_matrix
A%=A%!48
transform_draw
ScreenSwitch
PASS=0
P%=Q%
[OPT PASS
Screen EQUD 0
EQUD 0
.ScreenSwitch
ADR R0,Screen
LDR R1,[R0]
LDR R2,[R0,#4]
STR R2,[R0]
STR R1,[R0,#4]
*
&6,113,Bank%+1 :
Screen
Waves
EE=10
PASS=0
P%=Q%
[OPT PASS
.Point EQUD Punt%
EQUD Punt2%
.Velo EQUD Velo1%
EQUD Velo2%
%.Adr EQUD 4+12*(EE*WX%+EE)
' EQUD 4+12*(EE*WX%+WX%-EE)
) EQUD 4+12*((WX%-EE)*WX%+EE)
- EQUD 4+12*((WX%-EE)*WX%+WX%-EE)
.Adr2 EQUD 4*(EE*WX%+EE)
& EQUD 4*((WX%-EE)*WX%+EE)
* EQUD 4*((WX%-EE)*WX%+WX%-EE)
$ EQUD 4*(EE*WX%+WX%-EE)
.Viscosity EQUD 2
.waves
STMFD R13!,{R14}
MOV R0,#0
SWI "QTM_ReadVULevels"
ADR R3,Point
LDR R1,[R3]
LDR R2,[R3,#4]
STR R2,[R3]
STR R1,[R3,#4]
ADR R3,Adr
; Offsets pointed by R3
LDR R4,[R3]
R5,R0,#&FF
MOV R0,R0,ASR #8
MOV R5,R5,LSL #VU%
STR R5,[R1,R4]
LDR R4,[R3,#4]
R5,R0,#&FF
MOV R0,R0,ASR #8
MOV R5,R5,LSL #VU%
STR R5,[R1,R4]
LDR R4,[R3,#8]
R5,R0,#&FF
MOV R0,R0,ASR #8
MOV R5,R5,LSL #VU%
STR R5,[R1,R4]
LDR R4,[R3,#12]
R5,R0,#&FF
MOV R0,R0,ASR #8
MOV R5,R5,LSL #VU%
STR R5,[R1,R4]
ADR R0,Velo
LDR R9,[R0]
LDR R11,[R0,#4]
STR R11,[R0]
STR R9,[R0,#4]
MOV R0,#0
ADR R3,Adr2
LDR R4,[R3]
STR R0,[R9,R4]
LDR R4,[R3,#4]
STR R0,[R9,R4]
LDR R4,[R3,#8]
STR R0,[R9,R4]
LDR R4,[R3,#12]
STR R0,[R9,R4]
ADR R12,Viscosity
LDR R12,[R12]
MOV R0,R1
MOV R10,R2
ADD R0,R0,#4
ADD R10,R10,#4
MOV R1,#WX%
.koopy
MOV R2,#WX%
.koopx
LDR R3,[R9] ; R3 v(x,y)
LDR R4,[R0] ; R4 h(x,y)
MOV R5,#0
MOV R6,#0
MOV R7,#0
MOV R8,#0
CMP R2,#1
LDRNE R5,[R0,#12]
CMP R2,#WX%
LDRNE R6,[R0,#-12]
CMP R1,#1
LDRNE R7,[R0,#WX%*12]
CMP R1,#WX%
LDRNE R8,[R0,#-WX%*12]
ADD R5,R5,R6
ADD R5,R5,R7
ADD R5,R5,R8
SUB R5,R5,R4,LSL #2
/ ADD R3,R3,R5,ASR R12 :
H Viscosity +
. SUB R4,R4,R4,ASR #5 :
V Viscosity -
( ADD R5,R4,R3;,ASR #1 :
TimeStep
STR R5,[R10] ; h'(x,y)
STR R3,[R11] ; v'(x,y)
h'(x,y)=
N
v'(x,y)=b*v(x,y)+c*((h(x-1,y)+h(x+1,y)+h(x,y-1)+h(x,y+1)-4*h(x,y))/4
ADD R0,R0,#12
ADD R10,R10,#12
ADD R9,R9,#4
ADD R11,R11,#4
SUBS R2,R2,#1
BNE koopx
SUBS R1,R1,#1
BNE koopy
LDMFD 13!,{PC}
MOV PC,R14
/ Q%=P%
Q% 130000
INVERS 4*1024
DITABLE 4000*16*4
CSTABLE 4096*8
CTABLE 100*16
Waves
PROCShadowSwitch
calc_invers
calc_cstable
calc_divtable
transform
moveobjects
calc_rot_matrix
RotPalette
RotPalette
PASS=0
G P%=Q%
[OPT PASS
.Pal EQUD Pal%
.RotPalette
L" STMFD R13!,{R14}
ADR R0,Pal
LDR R0,[R0]
MOV R1,#256
P" LDR R6,[R0,#4]
Q$ ADD R8,R0,#255*4
R" ADD R0,R0,#4+4
.RotLoop:
U" LDMIA R0,{R2-R5}
V SUB R7,R0,#4
W" STMIA R7,{R2-R5}
X" ADD R0,R0,#4*4
Y SUBS R1,R1,#4
BPL RotLoop
STR R6,[R8]
\" LDMFD R13!,{R14}
MOVS PC,R14
buildpunt
P%=Punt%
L=lengte*FIX
Point_Type(1)=P%
Plane
SphereRND
PROCBall(15000,15000,15000,10000)
[OPT 0
DCD (1<<30)
Point_Type(3)=P%
Plane
V=-1
2/WX%
U=-1
2/WX%
(U*U+V*V)
[OPT 0
DCD U*L*3
DCD 0
DCD V*L*3
SphereRND
A%=0
Y=(
(2000)-1000)/1000
(1-Y*Y)
X=(
(2000)-1000)/1000
Z=(
(2000)-1000)/1000
(X*X+Z*Z)
D<>0
X=X/D*N
Z=Z/D*N
[OPT 0
DCD X*20000
DCD Y*20000
DCD Z*20000
A%+=1
A%=500
Ball(x,y,z,r)
A%=0
Y=(
(2000)-1000)/1000
(1-Y*Y)
X=(
(2000)-1000)/1000
Z=(
(2000)-1000)/1000
(X*X+Z*Z)
D<>0
X=X/D*N
Z=Z/D*N
R=r*X
[OPT 0
DCD X*R+x
DCD Y*R+y
DCD Z*R+z
A%+=1
A%=500
buildmotion
PNTR
-TXD=0:TYD=4:TZD=8:DTXD=12:DTYD=16:DTZD=20
0HXD=24:HYD=28:HZD=32:DHXD=36:DHYD=40:DHZD=44
TYPE=1
"PNTR=Motion%+(I-1)*MotionSize%
)PNTR!TXD=0 :
TX,TY,TZ
PNTR!TYD=0
PNTR!TZD=0
PNTR!DTXD=0 :
DTX,DTY,DTZ
PNTR!DTYD=0
PNTR!DTZD=0
6PNTR!HXD=0 :
HX,HY,HZ
PNTR!HYD=0
PNTR!HZD=0
PNTR!DHXD=0 :
DHX,DHY,DYZ
PNTR!DHYD=0
PNTR!DHZD=0
PNTR!48=Point_Type(TYPE)
initial position of drawing and cleaning object is the same
PNTRO=PNTR
"PNTR=Motion%+(I-1)*MotionSize%
J=0
PNTR!J=PNTRO!J
PNTR!48=Point_Type(TYPE)
PNTR!56=1<<31
Nr of type objects
calc_invers
K=2<<20
I=1
1023:INVERS!(4*I)=K/I+.5:
calc_cstable
/4096:V=2^15
T2=CSTABLE+8*1024
T3=CSTABLE+8*2048
T4=CSTABLE+8*3072
H=0
1023
K=F*H
(K)*V:SN=
(K)*V
CSTABLE!(8*H)=CS
CSTABLE!(8*H+4)=SN
T2!(8*H)=-SN
T2!(8*H+4)=CS
T3!(8*H)=-CS
T3!(8*H+4)=-SN
T4!(8*H)=SN
T4!(8*H+4)=-CS
calc_divtable
T=0:N=1:Q=2:I=3:J=4:DIT=5
PASS=0
P%=Q%
[OPT PASS
.DNRD EQUD 4000*16
.DITH EQUD DITABLE
.calc_divtable
% STMFD 13!,{0-12,14}
LDR DIT,DITH
LDR I,DNRD
.DVLOOP2
" MOV T,#YS%<<12
MOV N,I
MOV J,#0
MOV Q,#0
.DVLOOP3
CMP N,T
" MOVLO N,N,LSL #1
ADDLO J,J,#1
BLO DVLOOP3
! MOV N,N,LSR J
.DVLOOP1
! CMP T,N,LSL J
# SUBHS T,T,N,LSL J
ADC Q,Q,Q
SUBS J,J,#1
BPL DVLOOP1
( STR Q,[DIT,I,LSL #2]
SUBS I,I,#1
BNE DVLOOP2
% LDMFD 13!,{0-12,PC}
Q%=P%
calc_divtable
calc_rot_matrix
CHX=0:SHX=1
CHY=2:SHY=3
CHZ=4:SHZ=5
T=6:S=7:H=8
DHX=3:DHY=4:DHZ=5
HX=9:HY=10:HZ=11
TX=9:TY=10:TZ=11
! CS=12
SCR=0:COL=1
PASS=0
$ P%=Q%
[OPT PASS
calc 3x4 transformation matrix on the basis of
hx,hy,hz and tx,ty,tz of the motion array
.CSD EQUD CSTABLE
.calc_rot_matrix
*% STMFD 13!,{0-12,14}
MOV H,0
Load angles HX,HY,HZ
. ADD T,H,#HXD
/$ LDMIA T,{HX,HY,HZ}
Do a modulo 4096 operation on the angles (=> periodic lookup)
MOV S,#4096
SUB S,S,#1
Lookup (cosHX,sinHX) (cosHY, sinHY) (cosHZ, sinHZ)
LDR CS,CSD
CMP HX,#0
6 RSBMI HX,HX,#0
HX,HX,S
8& ADD T,CS,HX,LSL #3
9# LDMIA T,{CHX,SHX}
:" RSBMI SHX,SHX,#0
CMP HY,#0
< RSBMI HY,HY,#0
HY,HY,S
>& ADD T,CS,HY,LSL #3
?# LDMIA T,{CHY,SHY}
@" RSBMI SHY,SHY,#0
CMP HZ,#0
B RSBMI HZ,HZ,#0
HZ,HZ,S
D& ADD T,CS,HZ,LSL #3
E# LDMIA T,{CHZ,SHZ}
F" RSBMI SHZ,SHZ,#0
Load displacement values TX,TY,TZ
H ADD T,H,#TXD
I$ LDMIA T,{TX,TY,TZ}
________First ROW____________
cosHY*cosHZ
cosHY*sinHZ
sinHY
O! MUL T,CHY,CHZ
P# MOV T,T,ASR #15
Q! MUL S,CHY,SHZ
R# MOV S,S,LSR #15
S% ADD T,S,T,LSL #16
STR T,A1D
U( ADD T,TX,SHY,LSL #16
STR T,A2D
_________Second ROW___________
-sinHX*sinHY*cosHZ-cosHX*sinHZ
-sinHX*sinHY*sinHZ+cosHX*cosHZ
sinHX*cosHY
\! MUL T,SHX,SHY
]# MOV T,T,ASR #15
MOV S,T
_! MUL H,CHX,SHZ
`! MLA T,CHZ,T,H
RSB T,T,#0
b# MOV T,T,ASR #15
c! MUL H,CHX,CHZ
MUL S,SHZ,S
SUB S,H,S
f# MOV S,S,LSR #15
g% ADD T,S,T,LSL #16
STR T,B1D
i! MUL T,SHX,CHY
j# MOV T,T,ASR #15
k& ADD T,TY,T,LSL #16
STR T,B2D
_______ Third ROW ___________
-cosHX*sinHY*cosHZ+sinHX*sinHZ
-cosHX*sinHY*sinHZ-sinHX*cosHZ
cosHX*cosHY
r! MUL T,CHX,SHY
s# MOV T,T,ASR #15
MOV S,T
MUL T,CHZ,T
v! MUL H,SHX,SHZ
SUB T,H,T
x# MOV T,T,ASR #15
MUL S,SHZ,S
z# MLA H,SHX,CHZ,S
RSB S,H,#0
|# MOV S,S,LSR #15
}% ADD T,S,T,LSL #16
STR T,C1D
! MUL T,CHX,CHY
# MOV T,T,ASR #15
& ADD T,TZ,T,LSL #16
STR T,C2D
% LDMFD 13!,{0-12,PC}
Q%=P%
moveobjects
sentinel=1<<31
xmin=150*FIX
xmax=150*FIX
ymin=150*FIX
ymax=150*FIX
zmin=0*FIX
zmax=300*FIX
PASS=0
P%=Q%
[OPT PASS
.tmp EQUD 0
.moveobjects
" STMFD 13!,{0-12}
STR 13,tmp
MOV 12,0
.move_loop
6 LDMIA 12,{0,1,2,3,4,5,6,7,8,9,10,11}
# CMP 0,#sentinel
BEQ move_end
0 ADD 0,0,3 ; x=x+dx
" ADD 13,0,#xmin
B CMP 13,#xmax+xmin ; if x<xmin or x>xmax then
: RSBHI 3,3,#0 ; dx=-dx; x=x+2*dx
$ ADDHI 0,0,3,LSL #1
ADD 1,1,4
" ADD 13,1,#ymin
% CMP 13,#ymax+ymin
RSBHI 4,4,#0
$ ADDHI 1,1,4,LSL #1
ADD 2,2,5
" SUB 13,2,#zmin
% CMP 13,#zmax-zmin
RSBHI 5,5,#0
$ ADDHI 2,2,5,LSL #1
2 ADD 6,6,9 ; hx=hx+dhx
ADD 7,7,10
ADD 8,8,11
. STMIA 12,{0,1,2,3,4,5,6,7,8}
* ADD 12,12,#MotionSize%
! BAL move_loop
.move_end LDR 13,tmp
" LDMFD 13!,{0-12}
MOV PC,R14
.moveobject
" STMFD 13!,{0-12}
STR 13,tmp
MOV 12,0
6 LDMIA 12,{0,1,2,3,4,5,6,7,8,9,10,11}
0 ADD 0,0,3 ; x=x+dx
" ADD 13,0,#xmin
B CMP 13,#xmax+xmin ; if x<xmin or x>xmax then
: RSBHI 3,3,#0 ; dx=-dx; x=x+2*dx
$ ADDHI 0,0,3,LSL #1
ADD 1,1,4
" ADD 13,1,#ymin
% CMP 13,#ymax+ymin
RSBHI 4,4,#0
$ ADDHI 1,1,4,LSL #1
ADD 2,2,5
" SUB 13,2,#zmin
% CMP 13,#zmax-zmin
RSBHI 5,5,#0
$ ADDHI 2,2,5,LSL #1
2 ADD 6,6,9 ; hx=hx+dhx
ADD 7,7,10
ADD 8,8,11
. STMIA 12,{0,1,2,3,4,5,6,7,8}
LDR 13,tmp
" LDMFD 13!,{0-12}
MOV PC,R14
Q%=P%
transform
3A1=0:A2=1:B1=2:B2=3:C1=4:C2=5:T=6:DIT=7:A=8:B=9
!U=10:V=11:W=12:X=11:Y=13:Z=14
PASS=0
P%=Q%
[OPT PASS
.A1D EQUD 0:.A2D EQUD 0
.B1D EQUD 0:.B2D EQUD 0
.C1D EQUD 0:.C2D EQUD 0
.DITD EQUD DITABLE
.VD EQUD 0
.SP EQUD 0
.LK EQUD 0
.Lim EQUD Punt%
.Val EQUD WX%*WX%*12
.screen1 EQUD 148:EQUD -1
.screen EQUD 0
.set2
:ADR R0,screen1:ADR R1,screen:SWI "OS_ReadVduVariables"
MOV PC,R14
.COLD EQUD 15
.CTEL EQUD 0
.transform_draw
% STMFD 13!,{0-12,14}
MOV A,0
ADR R0,Point
LDR A,[R0]
LDR R1,Val
ADD R1,A,R1
STR R1,Lim
STR 13,SP
ADR T,A1D
1 LDMIA T,{A1,A2,B1,B2,C1,C2,DIT}
$ LDMIA (A)!,{X,Y,Z}
LDR B,screen
.trans_draw
< MOV T,C1,ASR #16 ; z transformed
MUL W,T,X
$ MOV T,C1,LSL #16
# MOV T,T,ASR #16
MLA W,Y,T,W
$ MOV T,C2,ASR #16
MLA W,Z,T,W
$ MOV T,C2,LSL #16
# MOV T,T,ASR #16
% ADDS W,T,W,ASR #15
! CMP W,#10*FIX
BMI nodraw
< MOV T,A1,ASR #16 ; x transformed
MUL U,X,T
$ MOV T,A1,LSL #16
# MOV T,T,ASR #16
MLA U,Y,T,U
$ MOV T,A2,ASR #16
MLA U,Z,T,U
$ MOV T,A2,LSL #16
!# MOV T,T,ASR #16
"% ADD U,T,U,ASR #15
$; MOV T,B1,ASR #16 ; y transformed
MUL V,T,X
&$ MOV T,B1,LSL #16
'# MOV T,T,ASR #16
MLA V,Y,T,V
)$ MOV T,B2,ASR #16
MLA V,Z,T,V
+$ MOV T,B2,LSL #16
,# MOV T,T,ASR #16
-% ADD V,T,V,ASR #15
/H LDR W,[DIT,W,LSL #2] ; perspective transformation
MUL U,W,U
MUL V,W,V
2$ MOV U,U,ASR #PP%
3$ MOV V,V,ASR #PP%
4" ADD U,U,#XS%/2
5" RSB V,V,#YS%/2
7C CMP U,#XS% ; clipping and plotting
CMPLO V,#YS%
]
XS%
1024
OPT PASS
>@ ADDLO T,U,V,LSL #10 ; resolution factor
OPT PASS
D$ ADDLO T,V,V,LSL #2
E? ADDLO T,U,T,LSL #7 ; resolution factor
OPT PASS
K$ ADDLO T,V,V,LSL #2
L? ADDLO T,U,T,LSL #6 ; resolution factor
OPT PASS
BHS nodraw
; BRUNO
W" MOV Z,Y,ASR #5
CMP Z,#0
CMPNE Z,#1
Q Z,#2
; BRUNO
LDR Y,Lim
CMP Y,A
MOVLT Z,#1
STRB Z,[B,T]
c! BLT nodraw
CMP W,#0
ADDGT Y,T,#1
STRGTB Z,[B,Y]
CMP W,#300
i ADDGT Y,T,#XS%
STRGTB Z,[B,Y]
CMP W,#500
ADDGT Y,Y,#1
STRGTB Z,[B,Y]
pE.nodraw LDMIA (A)!,{X,Y,Z} ; U colour previous point
q CMP X,#1<<30
r" BNE trans_draw
t .skip
LDR 13,SP
v% LDMFD 13!,{0-12,PC}
{ Q%=P%
Grad(A%,B%,RA%,GA%,BA%,RB%,GB%,BB%)
D%=B%-A%
IncrR=(RB%-RA%)/D%
IncrG=(GB%-GA%)/D%
IncrB=(BB%-BA%)/D%
R=RA%
G=GA%
B=BA%
C%=A%
R%=R
G%=G
B%=B
. Pal%!(C%*4)=(B%<<24)
(G%<<16)
(R%<<8)
R+=IncrR
G+=IncrG
B+=IncrB
RndColors(
0 : R%=255 : G%=0 : B%=0
1 : R%=255 : G%=255 : B%=0
2 : R%=0 : G%=255 : B%=0
3 : R%=0 : G%=255 : B%=255
4 : R%=0 : G%=0 : B%=255
5 : R%=255 : G%=0 : B%=255
6 : R%=255 : G%=255 : B%=255