Hmmm...the link above is only the compiled exe.
The code is here:
Set Display Mode 1024,768,16
Sync On
Sync Rate 90
Hide Mouse
AutoCam Off
BackDrop On
Color Backdrop RGB(0,0,255)
BX# = 2000.0
BY# = 700.0
BZ# = 2000.0
Make Object Sphere 1,50
Position Object 1,BX#, BY#, BZ#
XSEG = 40
ZSEG = 40
WIDTH# = 1000.0
LENGTH# = 1000.0
MATNUM = 1
MAX_HEIGHT = 200
load image "grass1.bmp",1
Make Matrix MATNUM, WIDTH#, LENGTH#, XSEG, ZSEG
set matrix texture 1,2,1
prepare matrix texture 1,1,1,1
For X = 1 To XSEG -1
For Z = 1 To ZSEG -1
Set Matrix Height MATNUM, X, Z, Rnd(MAX_HEIGHT*2) - MAX_HEIGHT
Next Z
Next X
Dim Mat#(XSEG,ZSEG)
PASSES = 4
For I = 1 To PASSES
For X = 0 To XSEG
For Z = 0 To ZSEG
Mat#(X,Z) = Get Matrix Height(MATNUM, X, Z)
Next Z
Next X
For X = 1 To XSEG - 1
For Z = 1 To ZSEG - 1
CURRENT# = Mat#(X,Z)
TOPLEFT# = Mat#(X-1,Z+1)
TOP# = Mat#(X,Z+1)
TOPRIGHT# = Mat#(X+1,Z+1)
RIGHT# = Mat#(X+1,Z)
BOTTOMRIGHT# = Mat#(X+1,Z-1)
BOTTOM# = Mat#(X,Z-1)
BOTTOMLEFT# = Mat#(X-1,Z-1)
LEFT# = Mat#(X-1,Z)
TOTAL# = CURRENT# + TOPLEFT# + TOP# + TOPRIGHT# + RIGHT# + BOTTOMRIGHT# + BOTTOM# + BOTTOMLEFT# + LEFT#
AVERAGE# = TOTAL# / 9
REM Set the new matrix height
Set Matrix Height MATNUM, X, Z, AVERAGE#
Next Z
Next X
Next I
TILE_WIDTH# = WIDTH# / XSEG
TILE_LENGTH# = LENGTH# / ZSEG
If TILE_WIDTH# > TILE_LENGTH#
DIV# = TILE_WIDTH#
Else
DIV# = TILE_LENGTH#
EndIf
For Z = 0 To ZSEG
For X = 0 To XSEG
AX# = TILE_WIDTH# * X
AZ# = TILE_LENGTH# * Z
AY# = Get Ground Height(1, AX#, AZ#)
VX# = BX# - AX#
VY# = BY# - AY#
VZ# = BZ# - AZ#
BLOCKED = 0
INTERVALS = Sqrt(VX#^2 + VY#^2 + VZ#^2) / DIV#
If INTERVALS = 0 Then INTERVALS = 1
For I = 1 To INTERVALS
K# = (1.0 / INTERVALS ) * I
CX# = AX# + (VX# * K#)
CY# = AY# + (VY# * K#)
CZ# = AZ# + (VZ# * K#)
If Get Ground Height(1,CX#,CZ#) + Matrix Position Y(1) > CY# Then BLOCKED = 1 : Exit
Next I
If BLOCKED = 1
Set Matrix Normal 1,X,Z, 0.0, 0.4, 0.0
Else
Set Matrix Normal 1,X,Z, 0.0, 1.0, 0.0
EndIf
Next X
Next Z
Update Matrix 1
position camera WIDTH#/2,0,LENGTH#/2 : camx#=camera position x() : camz#=camera position z() : ink 0,0
do
Camera_AngleY#=WRAPVALUE(Camera_AngleY#+(MOUSEMOVEX()/))
Camera_AngleX#=Camera_AngleX#+(MOUSEMOVEY()/3.0)
IF Camera_AngleX#<-80.0 THEN Camera_AngleX#=-80.0
IF Camera_AngleX#>80.0 THEN Camera_AngleX#=80.0
POSITION CAMERA camera position x(),get ground height(1,camera position x(),camera position z())+5,camera position z()
ROTATE CAMERA 0,WRAPVALUE(Camera_AngleX#),Camera_AngleY#,0
if mouseclick()=1 then move camera 0.5
if mouseclick()=2 then move camera -0.5
if camera position x()<camx#-2*TILE_WIDTH#
shift matrix right 1
shift matrix right 1
camx#=camera position x()
endif
if camera position x()>camx#+2*TILE_WIDTH#
shift matrix left 1
shift matrix left 1
camx#=camera position x()
endif
if camera position z()<camz#-2*TILE_LENGTH#
shift matrix down 1
shift matrix down 1
camz#=camera position z()
endif
if camera position z()>camz#+2*TILE_LENGTH#
shift matrix up 1
shift matrix up 1
camz#=camera position z()
endif
position matrix 1,camx#-WIDTH#/2,0,camz#-LENGTH#/2
if escapekey()=1 then end
rem set cursor 0,0 : print get ground height(1,camera position x(),camera position z())
Sync
loop
"If you can't make it good
make it look good."
Bill Gates