'        3D Landscape demo by Shockwave (C) 2002.
'       -========================================-
'        Greetings to all the yabasic forum users.
'     To contact me email : nastynicksimpson@aol.com
'                  Coders only please.
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'#########################################################
'##             SET UP SCROLL VARIABLES
'#########################################################
s$="                                                                 "
s$=s$+"HAVE NO FEAR, SHOCKWAVE IS BACK WITH HIS FIRST "
s$=s$+"RELEASE OF 2002.. IF YOU KNOW ME THEN YOU'LL KNOW "
s$=s$+"WHY THIS IS THE ONLY ONE SO FAR...  I'LL TELL YOU "
s$=s$+"THIS LITTLE ROUTINE IS REALLY OPTIMISED AND IT'S "
s$=s$+"ALL IN REAL TIME!!!   ONLY SHOCKWAVE MAKES IT "
s$=s$+"POSSIBLE!!!  HELLO TO ALL MY FRIENDS... BYE!!"

p=0
scx=0

lxo=340
lyo=100
poll=18
   dim logx(poll*3)
   dim logy(poll*3)
for a=1 to poll*3
   read logx(a),logy(a)
logx(a)=logx(a)*4
logy(a)=logy(a)*6
next a

'#########################################################
'##                 OPEN GRAPHICS SCREEN
'#########################################################

 open window 640,512

'#########################################################
'##                CREATE THE LANSCAPE GRID
'#########################################################
point=81
dim x(point)
dim y(point)
dim z(point)
dim xt(point)
dim yt(point)
xc=-20
yc=0
zc=2
for a=1 to point
 x(a)=xc
 y(a)=650+ran(123)
 z(a)=zc
 xc=xc+5
 if xc>20 then xc=-20 : zc=zc+1 : fi
next a

'#########################################################
'##               TRANSFORM X PERSPECTIVES
'#########################################################

for a=1 to point
 x(a)=x(a)*120
next a
mx=zc

'#########################################################
'##                   START MAIN LOOP
'#########################################################
repeat
 setdrawbuf dw
 dw=1-dw
 setdispbuf dw
 setrgb 3,0,0,20
 setrgb 2,0,20,0
 setrgb 1,20,0,0
 gtriangle 0,0 to 640,512 to 0,512
 gtriangle 0,0 to 640,512 to 640,0
 gosub landscape
xsn=40*sin(m)
m=m+.1

  setrgb 1,250,250,250
  text scx+xsn,400,mid$(s$,p,67)
  scx=scx-2
  if scx<-10 then
    p=p+1
    if p>len(s$) p=0
    scx=scx+10
  fi
a=1
zz=2+1*sin(m)
setrgb 1,45,45,65
for b=1 to 18
 fill triangle zz*logx(a)+lxo,logy(a)+lyo to zz*logx(a+1)+lxo,logy(a+1)+lyo to zz*logx(a+2)+lxo,logy(a+2)+lyo
 a=a+3
next b

until (peek("port1")<>0)
'#########################################################
'##                  END MAIN LOOP
'#########################################################
exit

'#########################################################
'##                    3D LANDSCAPE:
'#########################################################
label landscape

 for a=1 to point:rem                TRANSFORM POINTS LOOP
  q=z(a)+zo:rem             SET CONSTANT DIVISION VARIABLE
  xt(a)=(x(a)/q)+320:rem            TRANSFORM AND OFFSET X
  yt(a)=(y(a)/q):rem                           TRANSFORM Y
 next a:rem                             END TRANSFORM LOOP
zo=zo-.1:rem                            SCROLL INTO SCREEN
'#########################################################
'##          HAS ONE LINE COMPLETELY SCROLLED IN?
'#########################################################
if zo<-2 then 
zo=-1 :rem                                  RESET Z OFFSET
for b=1 to 72 :rem      SHIFT ALL ROWS FORWARD BY ONE LINE
    y(b)=y(b+9)
next b

for a=73 to 81:rem          GENERATE NEW WAVE FOR BACK ROW
 y(a)=650+l*sin(mm+a)
next a
l=340*sin(mm*2):rem                          SET SINE SIZE
mm=mm+.4:rem                       SHIFTING VALUE FOR SINE
fi

'#########################################################
'##                     DRAW HILLS
'#########################################################

xw=71:rem                                      START POINT
for a=1 to 64 
  c=(z(a)*10)-20:rem             COLOUR ACCORDING TO DEPTH
  setrgb 1,0,0,c:rem               DRAW THE BLUE ONE FIRST
 fill  triangle xt(xw),yt(xw) to xt(xw+1),yt(xw+1) to xt(xw+9),yt(xw+9)
  setrgb 1,c,0,0:rem                    NOW DO THE RED ONE
   fill triangle xt(xw+1),yt(xw+1) to xt(xw+10),yt(xw+10) to xt(xw+9),yt(xw+9)
  xw=xw-1:rem                    JUMP TO NEXT POLYGON PAIR
  if mod (xw,9)=0 xw=xw-1:rem ARE WE AT EDGE? IF YES, JUMP
next a
setrgb 1,255,55,55
return

data -39,-9,-25,-15,-24,-8
data -31,-15,-35,15,-28,15
data -38,0,-27,-4,-26,5
data -25,15,-20,-15,-21,18
data -21,-15,-15,15,-18,15
data -25,3,-18,-4,-16,4
data -15,14,-13,-14,-13,17
data -16,-14,-9,15,-5,18
data -11,-7,-8,-10,-6,19
data -3,-12,-5,15,-3,18
data -6,-13,5,15,2,16
data -6,3,-5,-2,4,4
data -2,-10,0,-6,15,-12
data 6,17,10,15,3,-13
data 12,15,20,15,15,-4
data 15,-4,17,-7,10,-8
data 15,-11,35,15,27,13
data 35,-15,29,-13,21,19
'19


