blbates@AERO4.LARC.NASA.GOV (Bates TAD/HRNAB ms294 x2601) (03/15/88)
program solidshade character file*80,reverse*1,type*1 integer*2 bx,by,numdev,numlights,sleep,val integer*4 ax,ay,curentdev(0:3),dev,fovy,g,i,inorm(162,66,4),lamps integer*4 nullwin,oldwin,rankleft,rankmid,rankright,shadesolid integer*4 xwinlen,xwinorg,ywinlen,ywinorg integer*4 j,k,nx(4),ny(4),nz(4) logical bflag,btogl,cflag,ctogl,extflag,currentwin,front logical ltemp,mflag,pflag,sflag,stogl logical xflag,xtogl,yflag,ytogl,zflag,ztogl real data(3,162,66,4),far,lightlen,mag,magrate real near,nmag1,nmag2,nmag3,nmag4 real norm(3,162,66,4),normlength real nx1,nx2,nx3,nx4,ny1,ny2,ny3,ny4,nz1,nz2,nz3,nz4 real rprate,rxrate,ryrate,rzrate,scale,tempdircos real totdircos,totext,txrate,tyrate real viewpnt,vx1,vx2,vx3,vx4,vy1,vy2,vy3,vy4,vz1,vz2,vz3,vz4 real xangle,xdiff,xdircos(3),xmax,xmid,xmin,xpos real yangle,ydiff,ydircos(3),ymax,ymid,ymin,ypos real zangle,zdircos(3),zmax,zmid,zmin $ include /usr/include/fgl.h $ include /usr/include/fdevice.h call getarg(2,file) call getarg(3,type) call getarg(4,reverse) if(type.eq.'b') then open(79,file=file,form='binary') read(79) ngrid read(79) (nx(i),ny(i),nz(i),i=1,ngrid) do 20 g=1,ngrid write(*,1000) g,nx(g),g,ny(g),g,nz(g) if(reverse.eq.'r') then read(79)(((data(1,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)), . (((data(2,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)), . (((data(3,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)) else read(79)(((data(1,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)), . (((data(2,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)), . (((data(3,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)) endif if(nz(g).gt.1) then open(80,file='out.bin',form='binary') write(80) ngrid write(*,1000) g,nx(g),g,ny(g),g,1 write(80) (nx(i),ny(i),1,i=1,ngrid) write(80)((data(1,i,j,g),i=1,nx(g)),j=1,ny(g)), . ((data(2,i,j,g),i=1,nx(g)),j=1,ny(g)), . ((data(3,i,j,g),i=1,nx(g)),j=1,ny(g)) endif 20 continue else open(79,file=file,form='formatted') read(79,*) ngrid read(79,*) (nx(i),ny(i),nz(i),i=1,ngrid) do 30 g=1,ngrid write(*,1000) g,nx(g),g,ny(g),g,nz(g) if(reverse.eq.'r') then read(79,*)(((data(1,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)), . (((data(2,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)), . (((data(3,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)) else read(79,*)(((data(1,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)), . (((data(2,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)), . (((data(3,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)) endif nz(g)=1 30 continue open(80,file='out.bin',form='binary') write(80) ngrid write(80) (nx(i),ny(i),nz(i),i=1,ngrid) do 40 g=1,ngrid write(*,1000) g,nx(g),g,ny(g),g,nz(g) c if(g.ne.3) then write(80)(((data(1,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)), . (((data(2,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)), . (((data(3,i,j,g),i=1,nx(g)),j=1,ny(g)),k=1,nz(g)) c else c write(80)(((data(1,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)), c . (((data(2,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)), c . (((data(3,i,j,g),i=1,nx(g)),j=ny(g),1,-1),k=1,nz(g)) c endif 40 continue endif close(79) close(80) extflag=.true. do 220 g=1,ngrid do 220 i=1,nx(g) do 220 j=1,ny(g) x1=data(1,i,j,g) y1=data(2,i,j,g) z1=data(3,i,j,g) if(i.gt.1.and.i.lt.nx(g).and.j.gt.1.and.j.lt.ny(g)) then vx1=data(1,i+1,j,g)-x1 vy1=data(2,i+1,j,g)-y1 vz1=data(3,i+1,j,g)-z1 vx2=data(1,i,j+1,g)-x1 vy2=data(2,i,j+1,g)-y1 vz2=data(3,i,j+1,g)-z1 vx3=data(1,i-1,j,g)-x1 vy3=data(2,i-1,j,g)-y1 vz3=data(3,i-1,j,g)-z1 vx4=data(1,i,j-1,g)-x1 vy4=data(2,i,j-1,g)-y1 vz4=data(3,i,j-1,g)-z1 nx1=vy1*vz2-vz1*vy2 ny1=vz1*vx2-vx1*vz2 nz1=vx1*vy2-vy1*vx2 nmag1=sqrt(nx1*nx1+ny1*ny1+nz1*nz1) if(nmag1.gt.0) then nx1=nx1/nmag1 ny1=ny1/nmag1 nz1=nz1/nmag1 endif nx2=vy2*vz3-vz2*vy3 ny2=vz2*vx3-vx2*vz3 nz2=vx2*vy3-vy2*vx3 nmag2=sqrt(nx2*nx2+ny2*ny2+nz2*nz2) if(nmag2.gt.0) then nx2=nx2/nmag2 ny2=ny2/nmag2 nz2=nz2/nmag2 endif nx3=vy3*vz4-vz3*vy4 ny3=vz3*vx4-vx3*vz4 nz3=vx3*vy4-vy3*vx4 nmag3=sqrt(nx3*nx3+ny3*ny3+nz3*nz3) if(nmag3.gt.0) then nx3=nx3/nmag3 ny3=ny3/nmag3 nz3=nz3/nmag3 endif nx4=vy4*vz1-vz4*vy1 ny4=vz4*vx1-vx4*vz1 nz4=vx4*vy1-vy4*vx1 nmag4=sqrt(nx4*nx4+ny4*ny4+nz4*nz4) if(nmag4.gt.0) then nx4=nx4/nmag4 ny4=ny4/nmag4 nz4=nz4/nmag4 endif norm(1,i,j,g)=nx1+nx2+nx3+nx4 norm(2,i,j,g)=ny1+ny2+ny3+ny4 norm(3,i,j,g)=nz1+nz2+nz3+nz4 else if(i.eq.1.and.j.eq.ny(g)) then vx1=data(1,i+1,j,g)-x1 vy1=data(2,i+1,j,g)-y1 vz1=data(3,i+1,j,g)-z1 vx4=data(1,i,j-1,g)-x1 vy4=data(2,i,j-1,g)-y1 vz4=data(3,i,j-1,g)-z1 nx4=vy4*vz1-vz4*vy1 ny4=vz4*vx1-vx4*vz1 nz4=vx4*vy1-vy4*vx1 nmag4=sqrt(nx4*nx4+ny4*ny4+nz4*nz4) if(nmag4.gt.0) then nx4=nx4/nmag4 ny4=ny4/nmag4 nz4=nz4/nmag4 endif norm(1,i,j,g)=nx4 norm(2,i,j,g)=ny4 norm(3,i,j,g)=nz4 else if(i.eq.1.and.j.eq.1) then vx1=data(1,i+1,j,g)-x1 vy1=data(2,i+1,j,g)-y1 vz1=data(3,i+1,j,g)-z1 vx2=data(1,i,j+1,g)-x1 vy2=data(2,i,j+1,g)-y1 vz2=data(3,i,j+1,g)-z1 nx1=vy1*vz2-vz1*vy2 ny1=vz1*vx2-vx1*vz2 nz1=vx1*vy2-vy1*vx2 nmag1=sqrt(nx1*nx1+ny1*ny1+nz1*nz1) if(nmag1.gt.0) then nx1=nx1/nmag1 ny1=ny1/nmag1 nz1=nz1/nmag1 endif norm(1,i,j,g)=nx1 norm(2,i,j,g)=ny1 norm(3,i,j,g)=nz1 else if(i.eq.nx(g).and.j.eq.ny(g)) then vx3=data(1,i-1,j,g)-x1 vy3=data(2,i-1,j,g)-y1 vz3=data(3,i-1,j,g)-z1 vx4=data(1,i,j-1,g)-x1 vy4=data(2,i,j-1,g)-y1 vz4=data(3,i,j-1,g)-z1 nx3=vy3*vz4-vz3*vy4 ny3=vz3*vx4-vx3*vz4 nz3=vx3*vy4-vy3*vx4 nmag3=sqrt(nx3*nx3+ny3*ny3+nz3*nz3) if(nmag3.gt.0) then nx3=nx3/nmag3 ny3=ny3/nmag3 nz3=nz3/nmag3 endif norm(1,i,j,g)=nx3 norm(2,i,j,g)=ny3 norm(3,i,j,g)=nz3 else if(i.eq.nx(g).and.j.eq.1) then vx2=data(1,i,j+1,g)-x1 vy2=data(2,i,j+1,g)-y1 vz2=data(3,i,j+1,g)-z1 vx3=data(1,i-1,j,g)-x1 vy3=data(2,i-1,j,g)-y1 vz3=data(3,i-1,j,g)-z1 nx2=vy2*vz3-vz2*vy3 ny2=vz2*vx3-vx2*vz3 nz2=vx2*vy3-vy2*vx3 nmag2=sqrt(nx2*nx2+ny2*ny2+nz2*nz2) if(nmag2.gt.0) then nx2=nx2/nmag2 ny2=ny2/nmag2 nz2=nz2/nmag2 endif norm(1,i,j,g)=nx2 norm(2,i,j,g)=ny2 norm(3,i,j,g)=nz2 else if(i.eq.1.and.j.gt.1.and.j.lt.ny(g)) then vx1=data(1,i+1,j,g)-x1 vy1=data(2,i+1,j,g)-y1 vz1=data(3,i+1,j,g)-z1 vx2=data(1,i,j+1,g)-x1 vy2=data(2,i,j+1,g)-y1 vz2=data(3,i,j+1,g)-z1 vx4=data(1,i,j-1,g)-x1 vy4=data(2,i,j-1,g)-y1 vz4=data(3,i,j-1,g)-z1 nx1=vy1*vz2-vz1*vy2 ny1=vz1*vx2-vx1*vz2 nz1=vx1*vy2-vy1*vx2 nmag1=sqrt(nx1*nx1+ny1*ny1+nz1*nz1) if(nmag1.gt.0) then nx1=nx1/nmag1 ny1=ny1/nmag1 nz1=nz1/nmag1 endif nx4=vy4*vz1-vz4*vy1 ny4=vz4*vx1-vx4*vz1 nz4=vx4*vy1-vy4*vx1 nmag4=sqrt(nx4*nx4+ny4*ny4+nz4*nz4) if(nmag4.gt.0) then nx4=nx4/nmag4 ny4=ny4/nmag4 nz4=nz4/nmag4 endif norm(1,i,j,g)=nx1+nx4 norm(2,i,j,g)=ny1+ny4 norm(3,i,j,g)=nz1+nz4 else if(i.eq.nx(g).and.j.gt.1.and.j.lt.ny(g)) then vx2=data(1,i,j+1,g)-x1 vy2=data(2,i,j+1,g)-y1 vz2=data(3,i,j+1,g)-z1 vx3=data(1,i-1,j,g)-x1 vy3=data(2,i-1,j,g)-y1 vz3=data(3,i-1,j,g)-z1 vx4=data(1,i,j-1,g)-x1 vy4=data(2,i,j-1,g)-y1 vz4=data(3,i,j-1,g)-z1 nx2=vy2*vz3-vz2*vy3 ny2=vz2*vx3-vx2*vz3 nz2=vx2*vy3-vy2*vx3 nmag2=sqrt(nx2*nx2+ny2*ny2+nz2*nz2) if(nmag2.gt.0) then nx2=nx2/nmag2 ny2=ny2/nmag2 nz2=nz2/nmag2 endif nx3=vy3*vz4-vz3*vy4 ny3=vz3*vx4-vx3*vz4 nz3=vx3*vy4-vy3*vx4 nmag3=sqrt(nx3*nx3+ny3*ny3+nz3*nz3) if(nmag3.gt.0) then nx3=nx3/nmag3 ny3=ny3/nmag3 nz3=nz3/nmag3 endif norm(1,i,j,g)=nx2+nx3 norm(2,i,j,g)=ny2+ny3 norm(3,i,j,g)=nz2+nz3 else if(i.gt.1.and.i.lt.nx(g).and.j.eq.ny(g)) then vx1=data(1,i+1,j,g)-x1 vy1=data(2,i+1,j,g)-y1 vz1=data(3,i+1,j,g)-z1 vx3=data(1,i-1,j,g)-x1 vy3=data(2,i-1,j,g)-y1 vz3=data(3,i-1,j,g)-z1 vx4=data(1,i,j-1,g)-x1 vy4=data(2,i,j-1,g)-y1 vz4=data(3,i,j-1,g)-z1 nx3=vy3*vz4-vz3*vy4 ny3=vz3*vx4-vx3*vz4 nz3=vx3*vy4-vy3*vx4 nmag3=sqrt(nx3*nx3+ny3*ny3+nz3*nz3) if(nmag3.gt.0) then nx3=nx3/nmag3 ny3=ny3/nmag3 nz3=nz3/nmag3 endif nx4=vy4*vz1-vz4*vy1 ny4=vz4*vx1-vx4*vz1 nz4=vx4*vy1-vy4*vx1 nmag4=sqrt(nx4*nx4+ny4*ny4+nz4*nz4) if(nmag4.gt.0) then nx4=nx4/nmag4 ny4=ny4/nmag4 nz4=nz4/nmag4 endif norm(1,i,j,g)=nx3+nx4 norm(2,i,j,g)=ny3+ny4 norm(3,i,j,g)=nz3+nz4 else if(i.gt.1.and.i.lt.nx(g).and.j.eq.1) then vx1=data(1,i+1,j,g)-x1 vy1=data(2,i+1,j,g)-y1 vz1=data(3,i+1,j,g)-z1 vx2=data(1,i,j+1,g)-x1 vy2=data(2,i,j+1,g)-y1 vz2=data(3,i,j+1,g)-z1 vx3=data(1,i-1,j,g)-x1 vy3=data(2,i-1,j,g)-y1 vz3=data(3,i-1,j,g)-z1 nx1=vy1*vz2-vz1*vy2 ny1=vz1*vx2-vx1*vz2 nz1=vx1*vy2-vy1*vx2 nmag1=sqrt(nx1*nx1+ny1*ny1+nz1*nz1) if(nmag1.gt.0) then nx1=nx1/nmag1 ny1=ny1/nmag1 nz1=nz1/nmag1 endif nx2=vy2*vz3-vz2*vy3 ny2=vz2*vx3-vx2*vz3 nz2=vx2*vy3-vy2*vx3 nmag2=sqrt(nx2*nx2+ny2*ny2+nz2*nz2) if(nmag2.gt.0) then nx2=nx2/nmag2 ny2=ny2/nmag2 nz2=nz2/nmag2 endif norm(1,i,j,g)=nx1+nx2 norm(2,i,j,g)=ny1+ny2 norm(3,i,j,g)=nz1+nz2 endif c if(y1.eq.0) norm(2,i,j,g)=0.0 normlength=sqrt(norm(1,i,j,g)*norm(1,i,j,g)+ . norm(2,i,j,g)*norm(2,i,j,g)+ . norm(3,i,j,g)*norm(3,i,j,g)) norm(1,i,j,g)=norm(1,i,j,g)/normlength norm(2,i,j,g)=norm(2,i,j,g)/normlength norm(3,i,j,g)=norm(3,i,j,g)/normlength if(extflag) then xmax=x1 xmin=x1 ymax=y1 ymin=y1 zmax=z1 zmin=z1 extflag=.false. else if(x1.gt.xmax) then xmax=x1 else if(x1.lt.xmin) then xmin=x1 endif if(y1.gt.ymax) then ymax=y1 else if(y1.lt.ymin) then ymin=y1 endif if(z1.gt.zmax) then zmax=z1 else if(z1.lt.zmin) then zmin=z1 endif endif 220 continue write(*,'(''Enter number of light sources:'',$)') read(*,*) numlights do 225 k=1,numlights write(*,1010) k,k,k read(*,*) xdircos(k),ydircos(k),zdircos(k) 225 continue xmid=(xmax+xmin)/2.0 ymid=(ymax+ymin)/2.0 zmid=(zmax+zmin)/2.0 totext=max(abs(xmax-xmin),abs(ymax-ymin),abs(zmax-zmin))*1.25 scale=totext/875.0 curentdev(0)=0 curentdev(1)=0 curentdev(2)=0 curentdev(3)=0 fovy=200 mag=0.10 magrate=0.0 numdev=0 rankleft=0 rankmid=0 rankright=0 rxrate=0.0 ryrate=0.0 rzrate=0.0 txrate=0.0 tyrate=0.0 xangle=0.0 xpos=0.0 yangle=0.0 ypos=0.0 viewpnt=0.0 zangle=0.0 bflag=.false. btogl=.true. cflag=.false. ctogl=.true. mflag=.true. pflag=.false. sflag=.false. stogl=.true. xflag=.false. xtogl=.true. yflag=.true. ytogl=.false. zflag=.true. ztogl=.false. lamps=14 call lampon(lamps) call foregr shadesolid=winope('solidshade',5) oldwin=winatt() currentwin=.true. call double call gconfi call qdevic(redraw) call qdevic(bkey) call qdevic(ckey) call qdevic(ekey) call qdevic(lkey) call qdevic(mkey) call qdevic(pkey) call qdevic(skey) call qdevic(xkey) call qdevic(ykey) call qdevic(zkey) call qdevic(uparro) call qdevic(downar) call qdevic(leftmo) call qdevic(middle) call qdevic(rightm) call tie(leftmo,mousex,mousey) call tie(middle,mousex,mousey) call tie(rightm,mousex,mousey) call noise(mousex,2) call noise(mousey,2) call backfa(.true.) print *,'Making color map' do 230 i=768,1023 c call mapcol(i,i-768,i-768,i-768) call mapcol(i-256,0,0,i-768) call mapcol(i,i-768,i-768,255) C call mapcol(i-512,0,0,i-768) C call mapcol(i-256,0,i-768,255) C call mapcol(i,i-768,255,255) 230 continue call getori(xwinorg,ywinorg) call getsiz(xwinlen,ywinlen) 240 print *,'Calculating surface shading colors' do 245 k=1,numlights lightlen=sqrt(xdircos(k)*xdircos(k)+ydircos(k)*ydircos(k)+ . zdircos(k)*zdircos(k)) xdircos(k)=xdircos(k)/lightlen ydircos(k)=ydircos(k)/lightlen zdircos(k)=zdircos(k)/lightlen 245 continue do 250 g=1,ngrid do 250 i=1,nx(g) do 250 j=1,ny(g) totdircos=0.0 do 255 k=1,numlights tempdircos=norm(1,i,j,g)*xdircos(k)+ . norm(2,i,j,g)*ydircos(k)+ . norm(3,i,j,g)*zdircos(k) if(tempdircos.gt.0) then totdircos=totdircos+tempdircos endif 255 continue c inorm(i,j,g)=768+nint(255*totdircos) c if(inorm(i,j,g).gt.1023) then c inorm(i,j,g)=1023 c else if(inorm(i,j,g).lt.768) then c inorm(i,j,g)=768 c endif inorm(i,j,g)=512+nint(511*totdircos) if(inorm(i,j,g).gt.1023) then inorm(i,j,g)=1023 else if(inorm(i,j,g).lt.511) then inorm(i,j,g)=511 endif C inorm(i,j,g)=256+nint(767*totdircos) C if(inorm(i,j,g).gt.1023) then C inorm(i,j,g)=1023 C else if(inorm(i,j,g).lt.256) then C inorm(i,j,g)=256 C endif 250 continue call qreset 260 call frontb(.true.) front=.true. sleep=0 270 continue if(bflag) call zclear call color(black) call clear call pushma viewpnt=viewpnt-magrate xpos=xpos+txrate ypos=ypos+tyrate fovy=fovy+rprate if(fovy.lt.2) then fovy=2 else if(fovy.gt.1800) then fovy=1800 endif far=totext*1.5-viewpnt if(far.le.0) then far=totext*1.0e-4 endif near=-viewpnt if(near.ge.far.or.near.le.far*1.0e-3.or.near.le.0) then near=far*1.0e-2 endif if(bflag) then call perspe(fovy,real(xwinlen)/real(ywinlen),near,far) else call perspe(fovy,real(xwinlen)/real(ywinlen),0.0,far) endif call lookat(viewpnt-totext,xpos,ypos,viewpnt,xpos,ypos,-900) xangle=xangle+rxrate yangle=yangle+ryrate zangle=zangle+rzrate call rot(zangle,'z') call rot(yangle,'y') call rot(xangle,'x') call color(green) call move(0.0,0.0,0.0) call draw(10.0*scale,0.0,0.0) call move(10.0*scale,0.0,-0.5*scale) call draw(10.5*scale,0.0,0.5*scale) call move(10.0*scale,0.0,0.5*scale) call draw(10.5*scale,0.0,-0.5*scale) call color(cyan) call move(0.0,0.0,0.0) call draw(0.0,10.0*scale,0.0) call move(0.0,10.0*scale,0.5*scale) call draw(0.0,10.25*scale,0.0) call draw(0.0,10.25*scale,-0.5*scale) call move(0.0,10.5*scale,0.5*scale) call draw(0.0,10.25*scale,0.0) call color(magent) call move(0.0,0.0,0.0) call draw(0.0,0.0,10.0*scale) call move(0.25*scale,0.0,11.25*scale) call draw(-0.25*scale,0.0,11.25*scale) call draw(0.25*scale,0.0,10.25*scale) call draw(-0.25*scale,0.0,10.25*scale) call transl(-xmid,0.0,-zmid) call color(white) if(sflag) then if(cflag) then do 280 g=1,ngrid do 280 j=1,ny(g)-1 do 280 i=1,nx(g)-1 call setsha(inorm(i,j,g)) call pmv(data(1,i,j,g), . -data(2,i,j,g),data(3,i,j,g)) call setsha(inorm(i,j+1,g)) call pdr(data(1,i,j+1,g), . -data(2,i,j+1,g),data(3,i,j+1,g)) call setsha(inorm(i+1,j+1,g)) call pdr(data(1,i+1,j+1,g), . -data(2,i+1,j+1,g),data(3,i+1,j+1,g)) call setsha(inorm(i+1,j,g)) call pdr(data(1,i+1,j,g), . -data(2,i+1,j,g),data(3,i+1,j,g)) call spclos 280 continue endif do 290 g=1,ngrid do 290 j=1,ny(g)-1 do 290 i=1,nx(g)-1 call setsha(inorm(i,j,g)) call pmv(data(1,i,j,g), . data(2,i,j,g),data(3,i,j,g)) call setsha(inorm(i+1,j,g)) call pdr(data(1,i+1,j,g), . data(2,i+1,j,g),data(3,i+1,j,g)) call setsha(inorm(i+1,j+1,g)) call pdr(data(1,i+1,j+1,g), . data(2,i+1,j+1,g),data(3,i+1,j+1,g)) call setsha(inorm(i,j+1,g)) call pdr(data(1,i,j+1,g), . data(2,i,j+1,g),data(3,i,j+1,g)) call spclos 290 continue else if(cflag) then do 300 g=1,ngrid do 310 j=1,ny(g) call move(data(1,1,j,g), . -data(2,1,j,g),data(3,1,j,g)) do 310 i=2,nx(g) call draw(data(1,i,j,g), . -data(2,i,j,g),data(3,i,j,g)) 310 continue do 320 i=1,nx(g) call move(data(1,i,1,g), . -data(2,i,1,g),data(3,i,1,g)) do 320 j=2,ny(g) call draw(data(1,i,j,g), . -data(2,i,j,g),data(3,i,j,g)) 320 continue 300 continue endif do 330 g=1,ngrid do 340 j=1,ny(g) call move(data(1,1,j,g),data(2,1,j,g),data(3,1,j,g)) do 340 i=2,nx(g) call draw(data(1,i,j,g),data(2,i,j,g),data(3,i,j,g)) 340 continue do 350 i=1,nx(g) call move(data(1,i,1,g),data(2,i,1,g),data(3,i,1,g)) do 350 j=2,ny(g) call draw(data(1,i,j,g),data(2,i,j,g),data(3,i,j,g)) 350 continue 330 continue endif call popmat if(front.and.btogl) then call frontb(.false.) front=.false. endif 370 if(qtest().eq.0) then if(btogl) call swapbu else sleep=0 dev=qread(val) if(dev.eq.redraw.and.val.eq.shadesolid) then call reshap call getori(xwinorg,ywinorg) call getsiz(xwinlen,ywinlen) curentdev(0)=0 curentdev(1)=0 curentdev(2)=0 curentdev(3)=0 numdev=0 rankleft=0 rankmid=0 rankright=0 magrate=0.0 rprate=0.0 rxrate=0.0 ryrate=0.0 rzrate=0.0 txrate=0.0 tyrate=0.0 call qreset goto 260 else if(dev.eq.inptch) then if(val.eq.shadesolid) then curentdev(0)=0 curentdev(1)=0 curentdev(2)=0 curentdev(3)=0 numdev=0 rankleft=0 rankmid=0 rankright=0 magrate=0.0 rprate=0.0 rxrate=0.0 ryrate=0.0 rzrate=0.0 txrate=0.0 tyrate=0.0 currentwin=.true. call qreset goto 260 else currentwin=.false. endif else if(dev.eq.uparro) then if(val.gt.0) then mag=mag*1.5 txrate=txrate*1.5 tyrate=tyrate*1.5 rprate=rprate*1.5 rxrate=rxrate*1.5 ryrate=ryrate*1.5 rzrate=rzrate*1.5 magrate=magrate*1.5 endif else if(dev.eq.downar) then if(val.gt.0) then mag=mag/1.5 txrate=txrate/1.5 tyrate=tyrate/1.5 rprate=rprate/1.5 rxrate=rxrate/1.5 ryrate=ryrate/1.5 rzrate=rzrate/1.5 magrate=magrate/1.5 endif else if(dev.eq.middle) then if(val.gt.0) then dev=qread(bx) dev=qread(by) if(numdev.lt.3.and.rankmid.eq.0) then numdev=numdev+1 rankmid=numdev curentdev(numdev)=middle endif else dev=qread(bx) dev=qread(by) magrate=0.0 rprate=0.0 rxrate=0.0 if(numdev.gt.0) then do 380 i=rankmid,numdev-1 curentdev(i)=curentdev(i+1) 380 continue curentdev(numdev)=0 numdev=numdev-1 rankmid=0 endif endif else if(dev.eq.leftmo) then if(val.gt.0) then dev=qread(bx) dev=qread(by) if(numdev.lt.3.and.rankleft.eq.0) then numdev=numdev+1 rankleft=numdev curentdev(numdev)=leftmo endif else dev=qread(bx) dev=qread(by) rzrate=0.0 ryrate=0.0 if(numdev.gt.0) then do 390 i=rankleft,numdev-1 curentdev(i)=curentdev(i+1) 390 continue curentdev(numdev)=0 numdev=numdev-1 rankleft=0 endif endif else if(dev.eq.rightm) then if(val.gt.0) then dev=qread(bx) dev=qread(by) if(numdev.lt.3.and.rankright.eq.0) then numdev=numdev+1 rankright=numdev curentdev(numdev)=rightm endif else dev=qread(bx) dev=qread(by) txrate=0.0 tyrate=0.0 if(numdev.gt.0) then do 400 i=rankright,numdev-1 curentdev(i)=curentdev(i+1) 400 continue curentdev(numdev)=0 numdev=numdev-1 rankright=0 endif endif else if(dev.eq.mkey) then if(val.gt.0) then call lampof(15) if(mflag) then mflag=.false. lamps=iand(lamps,7) call lampon(lamps) else mflag=.true. pflag=.false. xflag=.false. lamps=iand(lamps,14) lamps=ior(lamps,8) call lampon(lamps) endif endif else if(dev.eq.pkey) then if(val.gt.0) then if(pflag) then pflag=.false. else call lampof(15) pflag=.true. mflag=.false. xflag=.false. lamps=iand(lamps,6) call lampon(lamps) endif endif else if(dev.eq.bkey) then if(val.gt.0) then ltemp=bflag bflag=btogl btogl=ltemp if(bflag) then call single call gconfi call setdep($0000,$7fff) call zbuffe(bflag) call zclear sleep=sleep+3 else call zbuffe(bflag) call double call gconfi endif call backfa(.true.) front=.true. call qreset goto 270 else if(bflag) then sleep=sleep+3 call qreset endif else if(dev.eq.ckey) then if(val.gt.0) then ltemp=cflag cflag=ctogl ctogl=ltemp goto 270 endif else if(dev.eq.lkey) then if(val.gt.0) then call noport nullwin=winope('null',4) oldwin=winatt() call winclo(nullwin) print *,'' do 410 k=1,numlights read(*,*) xdircos(k),ydircos(k),zdircos(k) 410 continue call winset(shadesolid) oldwin=winatt() call qreset goto 240 endif else if(dev.eq.skey) then if(val.gt.0) then ltemp=sflag sflag=stogl stogl=ltemp goto 270 endif else if(dev.eq.zkey) then if(val.gt.0) then call lampof(15) ltemp=zflag zflag=ztogl ztogl=ltemp lamps=ieor(lamps,4) call lampon(lamps) endif else if(dev.eq.ykey) then if(val.gt.0) then call lampof(15) ltemp=yflag yflag=ytogl ytogl=ltemp lamps=ieor(lamps,2) call lampon(lamps) endif else if(dev.eq.xkey) then if(val.gt.0) then call lampof(15) if(xflag) then xflag=.false. lamps=iand(lamps,14) call lampon(lamps) else xflag=.true. mflag=.false. pflag=.false. lamps=iand(lamps,7) lamps=ior(lamps,1) call lampon(lamps) endif endif else if(dev.eq.ekey) then call curson call lampof(15) stop endif endif if(curentdev(numdev).ne.0) then if(currentwin) then ax=getval(mousex) ay=getval(mousey) if(ax.ne.bx.and.ay.ne.by) then xdiff=ax-bx ydiff=ay-by if(ax.ge.1023) then ax=1 call setval(mousex,ax,0,1023) else if(ax.le.0) then ax=1022 call setval(mousex,ax,0,1023) endif if(ay.ge.767) then ay=1 call setval(mousey,ay,0,767) else if(ay.le.0) then ay=766 call setval(mousey,ay,0,767) endif bx=ax by=ay if(curentdev(numdev).eq.leftmo) then if(zflag) rzrate=rzrate+xdiff*mag/50.0 if(yflag) ryrate=ryrate+ydiff*mag/50.0 else if(curentdev(numdev).eq.middle) then if(mflag) then magrate=magrate+ydiff*mag/10.0*scale else if(pflag) then rprate=rprate+xdiff*mag/40.0 else if(xflag) then rxrate=rxrate+xdiff*mag/40.0 endif else if(curentdev(numdev).eq.rightm) then txrate=txrate+xdiff*mag/40.0*scale tyrate=tyrate-ydiff*mag/40.0*scale endif endif else goto 270 endif else sleep=sleep+1 if(bflag) sleep=sleep+2 if(sleep.ge.3) then sleep=3 goto 370 endif endif goto 270 stop 1000 format(' nx(',i1,')=',i3,' ny(',i1,')=',i3,' nz(',i1,')=',i3) 1010 format('Enter xdircos(',i1,'),ydircos(',i1,'),zdircos(',i1,'):',$) end