'By Fryer - Please Upload.
'An attempt at bump mapping or something
'it's a bit slow

open window 640,512
dim zb(500,500)
dim t(128,128,3),edge(2,512,5)
dim x(6),y(6),z(6),sx(6),sy(6)
dim u(3),v(3),dx(30),dy(30),dz(30),bx(3),by(3)
for y=0 to 127
  for x=0 to 127
    r=64-sqrt((x-64)^2+(y-64)^2)
      t(x,y,1)=40+ran(10)
      t(x,y,2)=40+ran(10)
      t(x,y,3)=40+ran(10)
    if r<0 or r>40 goto n
      r=r/64
      r=1-cos(r*pi*3)
      t(x,y,1)=(128+127*sin(x/40)*cos(y/40))*r
      t(x,y,2)=(128+127*sin(x/12)*cos(y/30))*r
      t(x,y,3)=(128+127*sin(x/50)*cos(y/12))*r
label n
'if mod(x,10)=0 or mod(y,10)=0 or mod(x,10)=1 or mod(y,10)=1 then
'      t(x,y,1)=0
'      t(x,y,2)=0
'      t(x,y,3)=0
'fi
if x=2 or x=125 or y=2 or y=125 then
      t(x,y,1)=255
      t(x,y,2)=255
      t(x,y,3)=255
fi
if x=1 or x=126 or y=1 or y=126 then
      t(x,y,1)=255
      t(x,y,2)=255
      t(x,y,3)=255
fi

  next x
next y

for y=0 to 127
  for x=0 to 127
    setrgb 1,t(x,y,1),t(x,y,2),t(x,y,3)
    rect x,y to x,y+1
  next x
next y


  for i=0 to 8
    read dx(i),dy(i),dz(i)
  next i
ss=0
sn1=sin(.8):cs1=cos(.8)

repeat 
for x=0 to 500:for y=0 to 500
zb(x,y)=10000
next y:next x

'  setdispbuf ss
'  ss=1-ss
'  setdrawbuf ss
  clear window
  for i=0 to 7
    dx=dx(i)*cs1+dz(i)*sn1
    dz(i)=-dx(i)*sn1+dz(i)*cs1
    dx(i)=dx

'    dx=dx(i)*cs2+dy(i)*sn2
'    dy(i)=-dx(i)*sn2+dy(i)*cs2
'    dx(i)=dx

  next i
sn1=sin(.1):cs1=cos(.1)

for it=0 to 7
  x(0)=dx(it):y(0)=dy(it)+5:z(0)=dz(it)+400
itt=mod(it+1,8)
  x(1)=dx(itt):y(1)=dy(itt)+5:z(1)=dz(itt)+400
  x(2)=dx(8):y(2)=dy(8)+5:z(2)=dz(8)+400
  half=it
  gosub tri
next it
until(1=0)

data -100,100,0,0,100,0,100,100,0,100,0,0
data 100,-100,0,0,-100,0
data -100,-100,0,-100,0,0,0,0,0

label tri
  if half=0 then
    u(0)=0:v(0)=0
    u(1)=64:v(1)=0
    u(2)=64:v(2)=64
  fi
  if half=1 then
    u(0)=64:v(0)=0
    u(1)=127:v(1)=0
    u(2)=64:v(2)=64
  fi
  if half=2 then
    u(0)=127:v(0)=0
    u(1)=127:v(1)=64
    u(2)=64:v(2)=64
  fi
  if half=3 then
    u(0)=127:v(0)=64
    u(1)=127:v(1)=127
    u(2)=64:v(2)=64
  fi

  if half=4 then
    u(0)=127:v(0)=127
    u(1)=64:v(1)=127
    u(2)=64:v(2)=64
  fi
  if half=5 then
    u(0)=64:v(0)=127
    u(1)=0:v(1)=127
    u(2)=64:v(2)=64
  fi
  if half=6 then
    u(0)=0:v(0)=127
    u(1)=0:v(1)=64
    u(2)=64:v(2)=64
  fi
  if half=7 then
    u(0)=0:v(0)=64
    u(1)=0:v(1)=0
    u(2)=64:v(2)=64
  fi
      vx1=x(1)-x(0)
      vy1=y(1)-y(0)
      vz1=z(1)-z(0)
      vx2=x(2)-x(0)
      vy2=y(2)-y(0)
      vz2=z(2)-z(0)
      vx=vy1*vz2-vz1*vy2
      vy=vz1*vx2-vx1*vz2
      vz=vx1*vy2-vy1*vx2
      vl=sqrt(vx^2+vy^2+vz^2)
for i=0 to 2
      x(i+3)=x(i)+vx/vl
      y(i+3)=y(i)+vy/vl
      z(i+3)=z(i)+vz/vl
next i
  for i=0 to 5
    d=sqrt(x(i)^2+y(i)^2+z(i)^2)/640
    sx(i)=320+x(i)/d
    sy(i)=256-y(i)/d
  next i
for i=0 to 2
bx(i)=sx(i+3)-sx(i)
by(i)=sy(i+3)-sy(i)
next i

  p0=0
  if sy(1)<sy(0) p0=1
  if sy(2)<sy(p0) p0=2
  p2=0
  if sy(1)>sy(0) p2=1
  if sy(2)>sy(p2) p2=2
  p1=3-p0-p2
  u0=u(p0):u1=u(p1):u2=u(p2)
  v0=v(p0):v1=v(p1):v2=v(p2)
  x0=sx(p0):x1=sx(p1):x2=sx(p2)
  y0=sy(p0):y1=sy(p1):y2=sy(p2)
  bx0=bx(p0):bx1=bx(p1):bx2=bx(p2)
  by0=by(p0):by1=by(p1):by2=by(p2)

  xf=x0
  dyf=y2-y0
  dxf=(x2-x0)/dyf

  uf=u0
  duf=(u2-u0)/dyf

  vf=v0
  dvf=(v2-v0)/dyf

  bxf=bx0
  dbxf=(bx2-bx0)/dyf
  byf=by0
  dbyf=(by2-by0)/dyf


  x=x0
  u=u0
  v=v0
  dy=y1-y0
  dx=(x1-x0)/dy
  du=(u1-u0)/dy
  dv=(v1-v0)/dy
  bx=bx0:by=by0
  dbx=(bx1-bx0)/dy
  dby=(by1-by0)/dy
  a=2:b=1
  if dxf<dx then a=1:b=2 fi
  for y=y0 to y1
    edge(a,y,0)=xf
    edge(a,y,1)=uf
    edge(a,y,2)=vf
    edge(a,y,3)=bxf
    edge(a,y,4)=byf
    edge(b,y,0)=x
    edge(b,y,1)=u
    edge(b,y,2)=v
    edge(b,y,3)=bx
    edge(b,y,4)=by
    xf=xf+dxf
    uf=uf+duf
    vf=vf+dvf
    bxf=bxf+dbxf
    byf=byf+dbyf
    x=x+dx
    u=u+du
    v=v+dv
    bx=bx+dbx
    by=by+dby
  next y

  x=x1
  u=u1
  v=v1
  dy=y2-y1
  dx=(x2-x1)/dy
  du=(u2-u1)/dy
  dv=(v2-v1)/dy
  bx=bx1:by=by1
  dbx=(bx2-bx1)/dy
  dby=(by2-by1)/dy
  for y=y1 to y2
    edge(a,y,0)=xf
    edge(a,y,1)=uf
    edge(a,y,2)=vf
    edge(a,y,3)=bxf
    edge(a,y,4)=byf
    edge(b,y,0)=x
    edge(b,y,1)=u
    edge(b,y,2)=v
    edge(b,y,3)=bx
    edge(b,y,4)=by
    xf=xf+dxf
    uf=uf+duf
    vf=vf+dvf
    bxf=bxf+dbxf
    byf=byf+dbyf
    x=x+dx
    u=u+du
    v=v+dv
    bx=bx+dbx
    by=by+dby
  next y
az=(z(0)+z(1)+z(2))*2
  for y=y0 to y2 step .5
    u=edge(1,y,1)
    v=edge(1,y,2)
    bx=edge(1,y,3)
    by=edge(1,y,4)
    dx=edge(2,y,0)-edge(1,y,0)
    du=(edge(2,y,1)-edge(1,y,1))/dx/2
    dv=(edge(2,y,2)-edge(1,y,2))/dx/2
    dbx=(edge(2,y,3)-edge(1,y,3))/dx/2
    dby=(edge(2,y,4)-edge(1,y,4))/dx/2

x=edge(1,y,0)
while(x<edge(2,y,0))
'    for x=edge(1,y,0) to edge(2,y,0) step xres
'if t(u,v,1)=0 goto n1
      bv=(t(u,v,1)+t(u,v,2)+t(u,v,3))/20
sx=x+(bx*bv):sy=y+(by*bv)
      zb=az-bv*4
      if zb>zb(sx,sy) goto n1
      zb(sx,sy)=zb

      setrgb 1,t(u,v,1),t(u,v,2),t(u,v,3)
      rect sx,sy to sx+2,sy+2
label n1
      u=max(min(u+du,127),0)
      v=max(min(v+dv,127),0)
      bx=bx+dbx
      by=by+dby
x=x+.5
wend
'    next x
label n2
  next y

return







