NoCli:DEFTYPE.l
conv.f=Pi/2048

INCLUDE "splines.bb2"

#num=9
#rn=4

Dim co.w(4095)
Dim si.w(4095)
For n=0 To 4095
  co(n)=1024*Cos(n*conv)
Next n
For n=0 To 4095
  si(n)=co((n+1024)&4095)
Next n

NEWTYPE.round
x.l
y.l
z.l
ax.l
ay.l
az.l
r.l
rm.l
px.l[75]
py.l[75]
pz.l[75]
sx.l[75]
sy.l[75]
End NEWTYPE

Dim round.round(#num)
zpo=1024
For n=0 To #num
  USEPATH round(n)
  \z=zpo
  \r=256
  zpo+128
Next n

rnd_kill=0
rnd_reff=2
rnd_camm=6
rnd_last=#num

Dim osx.l(127)
Dim osy.l(127)
For n=0 To 31
  osx(n)=160
  osy(n)=128
Next n

BLITZ
Slice 0,44,320,256,$fff8,1,8,32,320,320
BitMap 0,320,256,1
BitMap 1,320,256,1
BitMap 2,320,256,1

RGB 0, 0, 0, 0
RGB 1,15,15,15

Mouse On

bb1=0
bb2=1
bb3=2

speed=950

SetInt 5
  dtim=dtim+speed
End SetInt

Repeat

  Exchange bb1,bb3
  Exchange bb2,bb3

;  MOVE.w #$333,$dff180
;wf
;  CMP.b #250,$dff006
;  BNE.b wf
;  MOVE.w #$000,$dff180

  VWait
  Show bb1:Use BitMap bb2
  Cls 0:Use BitMap bb3
  BitMapOutput bb3
  Locate 0,0

  NPrint Hex$(tim)

  tim=tim+dtim
  dtim=0

  Gosub move_rounds
  ;Gosub move_camera
  Gosub move_camera2
  Gosub proy_rounds
  Gosub disp_rounds

Until Joyb(0)=1
End

move_rounds

  While tim>4095
    tim=tim-4096

    USEPATH round(rnd_last)
      x=\ x:  y=\ y:  z=\ z
     ax=\ax: ay=\ay: az=\az

    USEPATH round(rnd_kill)

    mr_ax1=(mr_ax1-03)&4095
    mr_ax2=(mr_ax2+12)&4095
    mr_ax3=(mr_ax3+35)&4095

    mr_ay1=(mr_ay1+18)&4095
    mr_ay2=(mr_ay2+27)&4095
    mr_ay3=(mr_ay3-05)&4095

    mr_az1=(mr_az1+14)&4095
    mr_az2=(mr_az2+16)&4095
    mr_az3=(mr_az3-07)&4095

    nax_1=(si(mr_ax1)*si(mr_ax2)) ASR 11
    nax_2=(     nax_1*si(mr_ax3)) ASR 11
    nay_1=(si(mr_ay1)*si(mr_ay2)) ASR 11
    nay_2=(     nay_1*si(mr_ay3)) ASR 11
    naz_1=(si(mr_az1)*si(mr_az2)) ASR 11
    naz_2=(     naz_1*si(mr_az3)) ASR 11

    nax=ax+nax_2
    nay=ay+nay_2
    naz=az+naz_2

      \r=300
     \rm=100            ; size of deform

    \ax=nax
    \ay=nay
    \az=naz

    ddz=300+Sqr((nax_2*nax_2)+(nay_2*nay_2))             ; advance size

    x=x+(mov_m7*ddz) ASR 10
    y=y+(mov_m8*ddz) ASR 10
    z=z+(mov_m9*ddz) ASR 10
      \x=x
      \y=y
      \z=z

    ax=ax&4095
    ay=ay&4095
    az=az&4095

    ca=co(ax)
    sa=si(ax)
    cb=co(ay)
    sb=si(ay)
    cc=co(az)
    sc=si(az)

    mov_m1=(  (cb*cc   )                   ) ASR 10
    mov_m2=( ((sa*sb*cc) ASR 10) - (ca*sc) ) ASR 10
    mov_m3=( ((ca*sb*cc) ASR 10) + (sa*sc) ) ASR 10

    mov_m4=(  (cb*sc   )                   ) ASR 10
    mov_m5=( ((sa*sb*sc) ASR 10) + (ca*cc) ) ASR 10
    mov_m6=( ((ca*sb*sc) ASR 10) - (sa*cc) ) ASR 10

    mov_m7=-sb
    mov_m8=(sa*cb) ASR 10
    mov_m9=(ca*cb) ASR 10

    aa=0
    aaa=0
    For n=0 To #rn
       aa=( aa+(4096/(#rn+1)))&4095
      aaa=(aaa+(8192/(#rn+1)))&4095      ; put 32*number_of_deforms

      rr=(\rm*co(aaa)) ASR 10
      r1=\r-rr

      x0=(r1*si(aa)) ASR 10
      y0=(r1*co(aa)) ASR 10
      ;z0=0

      ;\px[n]=x+(( (x0*mov_m1) + (y0*mov_m4) + (z0*mov_m7) ) ASR 8)
      ;\py[n]=y+(( (x0*mov_m2) + (y0*mov_m5) + (z0*mov_m8) ) ASR 8)
      ;\pz[n]=z+(( (x0*mov_m3) + (y0*mov_m6) + (z0*mov_m9) ) ASR 8)

      \px[n]=x+(( (x0*mov_m1) + (y0*mov_m4) ) ASR 10)
      \py[n]=y+(( (x0*mov_m2) + (y0*mov_m5) ) ASR 10)
      \pz[n]=z+(( (x0*mov_m3) + (y0*mov_m6) ) ASR 10)


    Next n

    If rnd_kill=#num Then rnd_kill=0 Else rnd_kill+1
    If rnd_reff=#num Then rnd_reff=0 Else rnd_reff+1
    If rnd_camm=#num Then rnd_camm=0 Else rnd_camm+1
    If rnd_last=#num Then rnd_last=0 Else rnd_last+1

  Wend
Return

move_camera

  tt=tim ASL 10

  rnd_ref0=QWrap(rnd_reff-1,0,#num+1)
  rnd_ref1=QWrap(rnd_reff  ,0,#num+1)
  rnd_ref2=QWrap(rnd_reff+1,0,#num+1)
  rnd_ref3=QWrap(rnd_reff+2,0,#num+1)
  USEPATH round(rnd_ref0):x0=\x:y0=\y:z0=\z:a0=\az
  USEPATH round(rnd_ref1):x1=\x:y1=\y:z1=\z:a1=\az
  USEPATH round(rnd_ref2):x2=\x:y2=\y:z2=\z:a2=\az
  USEPATH round(rnd_ref3):x3=\x:y3=\y:z3=\z:a3=\az
  cam_xpos=calcspline{tt,x0,x1,x2,x3}
  cam_ypos=calcspline{tt,y0,y1,y2,y3}
  cam_zpos=calcspline{tt,z0,z1,z2,z3}
  cam_z   =calcspline{tt,a0,a1,a2,a3}

  rnd_cam0=QWrap(rnd_camm-1,0,#num+1)
  rnd_cam1=QWrap(rnd_camm  ,0,#num+1)
  rnd_cam2=QWrap(rnd_camm+1,0,#num+1)
  rnd_cam3=QWrap(rnd_camm+2,0,#num+1)
  USEPATH round(rnd_cam0):x0=\x:y0=\y:z0=\z:a0=\az
  USEPATH round(rnd_cam1):x1=\x:y1=\y:z1=\z:a1=\az
  USEPATH round(rnd_cam2):x2=\x:y2=\y:z2=\z:a2=\az
  USEPATH round(rnd_cam3):x3=\x:y3=\y:z3=\z:a3=\az
  cam_vxpos=calcspline{tt,x0,x1,x2,x3}
  cam_vypos=calcspline{tt,y0,y1,y2,y3}
  cam_vzpos=calcspline{tt,z0,z1,z2,z3}
  cam_vz   =calcspline{tt,a0,a1,a2,a3}

  cam_vza_spd=cam_vza_spd+((cam_vz ASL 4)-cam_vza_pos)
  cam_vza_pos=cam_vza_pos+cam_vza_spd
  cam_vza_spd=cam_vza_spd ASR 1

; ahorraaaaaaaaaaaaaaaaaaaaaaaarrrr!!!!!!!!!!!!!!!!!!!!!

  dx=cam_vxpos-cam_xpos
  dy=cam_vypos-cam_ypos
  dz=cam_vzpos-cam_zpos

  le=Sqr((dx*dx)+(dy*dy)+(dz*dz))
  cam_m3=(dx ASL 10)/le
  cam_m6=(dy ASL 10)/le
  cam_m9=(dz ASL 10)/le

  ; xx yy zz ; xx=(ay*bz)-(az*by)
  ; ax ay az ; yy=(az*bx)-(ax*bz)
  ; bx by bz ; zz=(ax*by)-(ay*bx)

  ax=cam_m3
  ay=cam_m6
  az=cam_m9

  ;cam_vzang=((cam_vza_pos ASR 4))&4095

  bx=-co(-cam_vz&4095)
  by= si(-cam_vz&4095)
  bz=0

  dx=((ay*bz)-(az*by)) ASR 10
  dy=((az*bx)-(ax*bz)) ASR 10
  dz=((ax*by)-(ay*bx)) ASR 10
  le=Sqr((dx*dx)+(dy*dy)+(dz*dz))
  cam_m1=(dx ASL 10)/le
  cam_m4=(dy ASL 10)/le
  cam_m7=(dz ASL 10)/le

  cam_m2=((cam_m4*cam_m9)-(cam_m7*cam_m6)) ASR 10
  cam_m5=((cam_m7*cam_m3)-(cam_m1*cam_m9)) ASR 10
  cam_m8=((cam_m1*cam_m6)-(cam_m4*cam_m3)) ASR 10

; yasssssssssssssssssssta!

Return

move_camera2

  tt=tim

  rnd_ref0=QWrap(rnd_reff-1,0,#num+1)
  rnd_ref1=QWrap(rnd_reff+0,0,#num+1)
  rnd_ref2=QWrap(rnd_reff+1,0,#num+1)
  rnd_ref3=QWrap(rnd_reff+2,0,#num+1)

  rnd_ref4=QWrap(rnd_reff-2,0,#num+1)
  rnd_ref5=QWrap(rnd_reff-1,0,#num+1)
  rnd_ref6=QWrap(rnd_reff+0,0,#num+1)
  rnd_ref7=QWrap(rnd_reff+1,0,#num+1)

  USEPATH round(rnd_ref0):x0=\x:y0=\y:z0=\z
  USEPATH round(rnd_ref1):x1=\x:y1=\y:z1=\z
  USEPATH round(rnd_ref2):x2=\x:y2=\y:z2=\z
  USEPATH round(rnd_ref3):x3=\x:y3=\y:z3=\z
  USEPATH round(rnd_ref4):ax0=\ax:ay0=\ay:az0=\az
  USEPATH round(rnd_ref5):ax1=\ax:ay1=\ay:az1=\az
  USEPATH round(rnd_ref6):ax2=\ax:ay2=\ay:az2=\az
  USEPATH round(rnd_ref7):ax3=\ax:ay3=\ay:az3=\az
  cam_xpos=calcspline{tt, x0, x1, x2, x3}
  cam_ypos=calcspline{tt, y0, y1, y2, y3}
  cam_zpos=calcspline{tt, z0, z1, z2, z3}
        ax=calcspline{tt,ax0,ax1,ax2,ax3}
        ay=calcspline{tt,ay0,ay1,ay2,ay3}
        az=calcspline{tt,az0,az1,az2,az3}

    ax=ax&4095
    ay=ay&4095
    az=az&4095

    ca=co(ax)
    sa=si(ax)
    cb=co(ay)
    sb=si(ay)
    cc=co(az)
    sc=si(az)

    cam_m1=(  (cb*cc   )                   ) ASR 10
    cam_m4=( ((sa*sb*cc) ASR 10) - (ca*sc) ) ASR 10
    cam_m7=( ((ca*sb*cc) ASR 10) + (sa*sc) ) ASR 10

    cam_m2=(  (cb*sc   )                   ) ASR 10
    cam_m5=( ((sa*sb*sc) ASR 10) + (ca*cc) ) ASR 10
    cam_m8=( ((ca*sb*sc) ASR 10) - (sa*cc) ) ASR 10

    cam_m3=-sb
    cam_m6=(sa*cb) ASR 10
    cam_m9=(ca*cb) ASR 10

Return

proy_rounds

  For n=0 To #num
    USEPATH round(n)

      \x-cam_xpos
      \y-cam_ypos
      \z-cam_zpos

      For m=0 To #rn

        x0=(\px[m]-cam_xpos)
        y0=(\py[m]-cam_ypos)
        z0=(\pz[m]-cam_zpos)

        \px[m]=x0
        \py[m]=y0
        \pz[m]=z0

        xx=((x0*cam_m1)+(y0*cam_m4)+(z0*cam_m7))
        yy=((x0*cam_m2)+(y0*cam_m5)+(z0*cam_m8))
        zz=((x0*cam_m3)+(y0*cam_m6)+(z0*cam_m9)) ASR 9

        zz+360
        If zz>100
          \sx[m]=160+(xx/zz)
          \sy[m]=128-(yy/zz)
        EndIf

      Next m

  Next n
Return

disp_rounds

  nn=rnd_kill
  If nn=#num Then nn=0 Else nn=nn+1

    USEPATH round(nn)

      For m=0 To #rn
        osx(m)=\sx[m]
        osy(m)=\sy[m]
      Next m

      If nn=#num Then nn=0 Else nn=nn+1

  For n=1 To (#num-1)
    USEPATH round(nn)


      x0=\sx[#rn]
      y0=\sy[#rn]
      For m=0 To #rn
        x1=\sx[m]
        y1=\sy[m]

        Line x0,y0,x1,y1,1
        Line osx(m),osy(m),x1,y1,1

        osx(m)=x1
        osy(m)=y1
        x0=x1
        y0=y1
      Next m

    If nn=#num Then nn=0 Else nn=nn+1
  Next n
Return
