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. ".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 xxmax 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 xxmax 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