gosub initialise
gosub main
exit

rem #####################################################
label main
 repeat
  gosub flipscreen
  clear window
  gosub drawstars
  gosub resetarrays
  gosub rotatepoints
  gosub calclight
  gosub drawobject
  gosub rotchange
 until (1=2)
return

rem #####################################################
label drawobject
 for f=1 to nf
  gosub getface
  if fv(f)>0 then 
   v1=pv(p1)/(pc(p1)*80)
   v2=pv(p2)/(pc(p1)*80)
   v3=pv(p3)/(pc(p1)*80)
   setrgb 1,v1,0,0
   setrgb 2,v2,0,0
   setrgb 3,v3,0,0
   gtriangle x1,y1 to x2,y2 to x3,y3
  fi
 next f
return

rem #####################################################
label rotchange
 xr=mod(xr+xrc,360)
 yr=mod(yr+yrc,360)
 qq=mod(qq+2,360)
return

rem #####################################################
label resetarrays
 for a=1 to nf
  fv(a)=0
 next a

 for a=1 to np
  pv(a)=0
  pc(a)=0
 next a
return

rem #####################################################
label rotatepoints
 for p=1 to np
  xx=px(p) : y=py(p) : z=pz(p)
  yy=y*co(xr)+z*si(xr)
  zz=z*co(xr)-y*si(xr)
  x=xx*co(yr)-zz*si(yr)
  z=xx*si(yr)+zz*co(yr)
  zz=z+si(qq)*300
  x=x/((zz/focus)+1)
  yy=yy/((zz/focus)+1)
  sx(p)=x : sy(p)=yy : sz(p)=zz
 next p
return

rem #####################################################
label calclight
 for f=1 to nf
  gosub getface
  v1x=x1-x2 : v1y=y1-y2
  v2x=x3-x2 : v2y=y3-y2
  vi=v1x*v2y-v2x*v1y
  fv(f)=vi
  pv(p1)=pv(p1)+vi : pc(p1)=pc(p1)+1
  pv(p2)=pv(p2)+vi : pc(p2)=pc(p2)+1
  pv(p3)=pv(p3)+vi : pc(p3)=pc(p3)+1
 next f
return

rem #####################################################
label drawstars
 for a=1 to ln
  x=l(a):y=m(a):z=n(a)
  x=x/((z/focus)+1)
  y=y/((z/focus)+1)
  b=128-(z/2)
  s=b/50
  setrgb 1,0,0,b
  fill rect x,y to x+s,y+s
  z=z-5

  if abs(x)>320 or abs(y)>320 then
   z=-z
   l(a)=ran(600)-300
   m(a)=ran(400)-200
  fi

  n(a)=z
 next a
return

rem #####################################################
label flipscreen
 setdispbuf cb
 cb=1-cb
 setdrawbuf cb
return

rem #####################################################
label getface
 p1=f(f,1) : p2=f(f,2) : p3=f(f,3)
 x1=sx(p1) : y1=sy(p1) : z1=sz(p1)
 x2=sx(p2) : y2=sy(p2) : z2=sz(p2)
 x3=sx(p3) : y3=sy(p3) : z3=sz(p3)
return

rem #####################################################
label initialise
 open window 640,512
 window origin "cc"

 focus=1000

 dim co(360),si(360)
 f=pi/180
 for a=0 to 360
  co(a)=cos(a*f)
  si(a)=sin(a*f)
 next a

 xrc=1:yrc=2

 ln=80
 dim l(ln),m(ln),n(ln)
 for a=1 to ln
  l(a)=ran(600)-300
  m(a)=ran(400)-200
  n(a)=ran(600)-300
 next a

 restore pointdata
 read np
 dim px(np),py(np),pz(np)
 dim pv(np),pc(np),sx(np),sy(np),sz(np)
 for a=1 to np
  read px(a),py(a),pz(a)
  px(a)=px(a)*50
  py(a)=py(a)*50
  pz(a)=pz(a)*50
 next a

 restore facedata
 read nf
 dim f(nf,3),fv(nf)
 for a=1 to nf
  for b=1 to 3
   read f(a,b)
  next b
 next a
return

label pointdata
data 10
data -1,0,2,1,0,2,2,0,1,2,0,-1,1,0,-2,-1,0,-2,-2,0,-1,-2
data 0,1,0,2,0,0,-3,0

label facedata
data 16
data 1,2,9,2,3,9,3,4,9,4,5,9,5,6,9,6,7,9,7,8,9,8,1,9,1,8
data 10,8,7,10,7,6,10,6,5,10,5,4,10,4,3,10,3,2,10,2,1,10




