remstart
   ==============================================================
   =  Title  : 2d Matrix Oscillation
   =  Author : latch grapple
   =  Date   : 09/16/2007
   =  Update : 09/17/2007
   =  Version: .02
   ==============================================================
   Comments    The goal is to make a 2d matrix that is 3d.  Then
               oscillate the matrix and put a "boat" on it that
               bobs with the waves.  Main elements will be the
               translation of 3d space to 2d screen coordinates,
               the waves of the matrix (grid).  Still have to
               figure out the boat.
   ==============================================================
remend
 
rem =============================================================
rem = SET UP DISPLAY
rem =============================================================
   `autocam off
   set display mode 640,480,32
   set window on
   set window size 640,480
   sync on
   sync rate 60
 
rem =============================================================
rem = MAIN
rem =============================================================
   gosub _init
   do
      cls
      paste sprite 1,300,svert(pos,1)-50
      ink dgreen,0
      thick_line(300,520+(-1*svert(pos,1)),401,svert(pos,1),22)
      ink cyan,0
      gosub _draw_world
 
      text 0,0,str$(screen fps())
      text 0,20,"Camera Z :"+str$(camz#)
 
      sync
   loop
 
   end
 
rem =============================================================
rem = SUBROUTINES - PROCEDURES
rem =============================================================
   _init:
      rem arrays for functions and mat size
      `dim vect#(2)
      matx=498000
      matz=4400
      tilex=41
      tilez=41
      matsize=tilex*tilez
 
      rem calculate camera distance
      hwidth=screen width()/2
      hheight=screen height()/2
      fov#=3.14/2.905
      degrees#=(fov#*(180.0/3.14))/2.0
      zdist#=(hheight)/(tan(degrees#))
 
      rem inital camera position
      camx#=(matx/2)-9000
      camy#=-90000
      camz#=-1.0*zdist#
      cangy#=0
      cangx#=0
      cangz#=0
 
      rem create 2d matrix
      dim matvert(matsize,2)
      dim svert(matsize,1)
      matrix_2d(matx,matz,tilex,tilez,camx#,camy#,camz#,hwidth,hheight)
 
      rem colors
      cyan=rgb(0,255,255)
      dgreen=rgb(0,100,0)
      green=rgb(0,255,0)
 
      rem boat
      gosub _boat
      ink cyan,0
   return
`----------------------------------------------------------------
   _boat:
      ink green,0
      box 0,0,100,60
      ink dgreen,0
      box 0,61,100,100
      get image 1,0,0,101,101
      sprite 1,0,0,1
      hide sprite 1
      set sprite 1,0,0
      cls 0
   return
`----------------------------------------------------------------
   _draw_world:
      rem go through top and bottom values and connect them with lines
      `ink RGB(0,255,255),0
      for z=0 to tilez-1
         for x=1 to tilex
            pos=x+(z*tilex)
            pos2=pos+1
            pos3=pos+tilex
            if x >= tilex then pos2=pos
            if z >= tilez-1 then pos3=pos
            degree=wrapvalue(degree+9)
            matvert(pos,1)=30000*sin(degree)
            svert(pos,0)=screen_x(matvert(pos,0)*1.0,camx#,matvert(pos,2)*1.0,camz#,hwidth)
            svert(pos,1)=screen_y(matvert(pos,1)*1.0,camy#,matvert(pos,2)*1.0,camz#,hheight)
            box svert(pos,0),svert(pos,1),svert(pos2,0),svert(pos2,1)
            line svert(pos3,0),svert(pos3,1),svert(pos,0),svert(pos,1)
 
            `dot svert(pos,0),svert(pos,1)
 
         next x
      next z
   return
 
rem =============================================================
rem = FUNCTIONS
rem =============================================================
   function screen_x(x#,viewerx#,z#,viewerz#,swhalf)
      adjz#=z#-viewerz#
      if adjz#=0
         sx#=-1
      else
         sx#=((x#-viewerx#)/adjz#*2.0)+swhalf
      endif
   endfunction sx#
`----------------------------------------------------------------
   function screen_y(y#,viewery#,z#,viewerz#,shhalf)
      adjz#=z#-viewerz#
      if adjz#=0
         sy#=-1
      else
         sy#=(((y#-viewery#)/adjz#))+shhalf
      endif
   endfunction sy#
`----------------------------------------------------------------
   function matrix_2d(matx,matz,tilex,tilez,camx#,camy#,camz#,hwidth,hheight)
      sizex=matx/tilex
      sizez=matz/tilez
      for z=0 to tilez-1
         for x=1 to tilex
            pos=x+(z*tilex)
            matvert(pos,0)=(x-1)*sizex
            matvert(pos,1)=0
            matvert(pos,2)=z*sizez
            svert(pos,0)=screen_x(matvert(pos,0)*1.0,camx#,matvert(pos,2)*1.0,camz#,hwidth)
            svert(pos,1)=screen_y(matvert(pos,1)*1.0,camy#,matvert(pos,2)*1.0,camz#,hheight)
         next x
      next z
   endfunction
`----------------------------------------------------------------
   function thick_line(x1,y1,x2,y2,thickness)
      for n=0 to thickness-1
         if x1<>x2 then line x1,y1+n,x2,y2+n
         if x1=x2 then line x1+n,y1,x2+n,y2
      next n
   endfunction