'By Fryer - Please Upload.
'raytracer - R.Fryer

gosub setup
cam_x=0
cam_y=0
cam_z=-600
a=20
b=0
c=350
light_x=-250
light_y=-250
light_z=-350
gosub rotate
gosub raytrace
end

label raytrace
  for i=1 to mf
    p1=p(i,1)
    p2=p(i,2)
    p3=p(i,3)
    x1=rx(p1):y1=ry(p1):z1=rz(p1)
    x2=rx(p2):y2=ry(p2):z2=rz(p2)
    x3=rx(p3):y3=ry(p3):z3=rz(p3)
    nvx1=x2-x1
    nvy1=y2-y1
    nvz1=z2-z1
    nvx2=x3-x1
    nvy2=y3-y1
    nvz2=z3-z1
    nvx=nvy1*nvz2-nvz1*nvy2
    nvy=nvz1*nvx2-nvx1*nvz2
    nvz=nvx1*nvy2-nvy1*nvx2
    d=1/sqrt(nvx*nvx+nvy*nvy+nvz*nvz)
    nx(i)=nvx*d
    ny(i)=nvy*d
    nz(i)=nvz*d
    area(i)=abs(x1*y2+x3*y1+x2*y3-x1*y3-x2*y1-x3*y2)
  next i
stp=4
  for yi=-190 to 230 step stp
    for xi=-320 to 320 step stp
x=xi
y=yi
z=0
      d=1/sqrt(x*x+y*y+2800*2800)
      vx=x*d
      vy=y*d
      vz=2800*d
r=0
g=0
b=0
ligval=1
lastpoly=0
tdist=0
repeat
dist=3000
poly=0
      for i=1 to mf
if i=lastpoly goto none
        p1=p(i,1)
        p2=p(i,2)
        p3=p(i,3)
        x1=rx(p1):y1=ry(p1):z1=rz(p1)
        x2=rx(p2):y2=ry(p2):z2=rz(p2)
        x3=rx(p3):y3=ry(p3):z3=rz(p3)
        nx=nx(i)
        ny=ny(i)
        nz=nz(i)
d=(nx*(x1-x)+ny*(y1-y)+nz*(z1-z))/(vx*nx+vy*ny+vz*nz)
        if d<0 goto none
        px=x+vx*d
        py=y+vy*d
        pz=z+vz*d
tt1=(py-y1)*(x2-x1)-(px-x1)*(y2-y1)
tt2=(py-y2)*(x3-x2)-(px-x2)*(y3-y2)
if tt2*tt1<0 goto none
tt2=(py-y3)*(x1-x3)-(px-x3)*(y1-y3)
if tt2*tt1<0 goto none
if d>dist goto none
dist=d

          xx=px
          yy=py
          zz=pz
          poly=i
label none
      next i
tdist=tdist+dist
if poly>0 then
nx=nx(poly)
ny=ny(poly)
nz=nz(poly)
px=xx
py=yy
pz=zz
          dx=lx-px
          dy=ly-py
          dz=lz-pz
dl=sqrt(dx*dx+dy*dy+dz*dz)
          d=1/sqrt(dx*dx+dy*dy+dz*dz)
dd=-(vx*nx+vy*ny+vz*nz)
          s=(dx*nx+dy*ny+dz*nz)*d*dd
          dx=dx*d
          dy=dy*d
          dz=dz*d
j=0
repeat j=j+1
'          for j=1 to mf
if j=poly goto noshad
        p1=p(j,1)
        p2=p(j,2)
        p3=p(j,3)
        x1=rx(p1):y1=ry(p1):z1=rz(p1)
        x2=rx(p2):y2=ry(p2):z2=rz(p2)
        x3=rx(p3):y3=ry(p3):z3=rz(p3)
        nx=nx(j)
        ny=ny(j)
        nz=nz(j)
d=(nx*(x1-px)+ny*(y1-py)+nz*(z1-pz))/(dx*nx+dy*ny+dz*nz)
if d<0 goto noshad
        ppx=px+dx*d
        ppy=py+dy*d
        ppz=pz+dz*d
if (ppx-lx)*(ppx-px)<0 then
tt1=(ppy-y1)*(x2-x1)-(ppx-x1)*(y2-y1)
tt2=(ppy-y2)*(x3-x2)-(ppx-x2)*(y3-y2)
'if tt2*tt1<0 s=0
tt3=(ppy-y3)*(x1-x3)-(ppx-x3)*(y1-y3)
if tt2*tt1>0 and tt1*tt3>0 s=0
fi
if s=0 j=mf
label noshad
until(j=mf)
'          next j
s=(s*.8+.2)*1000000/(dl*dl+tdist*tdist)*ligval
r=r+r(c(poly))*s
g=g+g(c(poly))*s
b=b+b(c(poly))*s
ligval=ligval*ref(c(poly))
x=xx
y=yy
z=zz
nx=nx(poly)
ny=ny(poly)
nz=nz(poly)
      s=(vx*nx+vy*ny+vz*nz)*2
      vx=-nx*s+vx
      vy=-ny*s+vy
      vz=-nz*s+vz
lastpoly=poly
fi

until(poly=0 or ligval<.05)
          setrgb 1,r,g,b
          fill rect xi,yi to xi+stp,yi+stp

    next xi
  next yi
return

label rotate
  csa=cs(a):sna=sn(a)
  csb=cs(b):snb=sn(b)
  csc=cs(c):snc=sn(c)
  for i=1 to mp
    tz=z(i)*csa+x(i)*sna
    tx=x(i)*csa-z(i)*sna
    rx(i)=tx*csb+y(i)*snb-cam_x
    ty=y(i)*csb-tx*snb
    rz(i)=tz*csc-ty*snc-cam_z
    ry(i)=ty*csc+tz*snc-cam_y
  next i
  tz=light_z*csa+light_x*sna
  tx=light_x*csa-light_z*sna
  lx=tx*csb+light_y*snb-cam_x
  ty=light_y*csb-tx*snb
  lz=tz*csc-ty*snc-cam_z
  ly=ty*csc+tz*snc-cam_y
return

label setup
  open window 640,512
  window origin "CC"
  dim sn(360),cs(360)
  for i=0 to 360
    sn(i)=sin(i/180*pi)
    cs(i)=cos(i/180*pi)
  next i
  read p
  dim r(p),g(p),b(p),ref(p)
  for i=1 to p
    read r(i),g(i),b(i),ref(i)
  next i
  read mp,mf
  dim x(mp),y(mp),z(mp)
  dim rx(mp),ry(mp),rz(mp)
  dim p(mf,3),c(mf)
  dim nx(mf),ny(mf),nz(mf),area(mf)
  for i=1 to mp
    read x(i),y(i),z(i)
  next i
  for i=1 to mf
    read p(i,1),p(i,2),p(i,3),c(i)
  next i
return

'pallete data
data 6
data 255,0,0,.3
data 230,230,0,.3
data 0,0,255,.3
data 0,255,0,.3
data 255,255,0,.3
data 255,255,255,.3

data 15,16
'point data
data -100,-100,-100
data -100,-100,100
data 100,-100,100
data 100,-100,-100
data -100,100,-100
data -100,100,100
data 100,100,100
data 100,100,-100
data -500,100,-500
data -500,100,500
data 500,100,500
data 500,100,-500
data -500,-250,500
data 500,-250,500
data 500,-250,-500

'face data
data 1,2,6,1,6,5,1,1
data 2,3,7,4,7,6,2,4
data 3,4,8,3,8,7,3,3
data 4,1,5,4,5,8,4,4
'data 5,6,7,5,7,8,5,5
data 1,4,3,6,3,2,1,6
data 9,11,10,1,9,12,11,1
data 10,14,13,2,10,11,14,2
data 11,15,14,3,11,12,15,3











