Added to it, made image generation faster with memblocks. Also creates a terrain object with it.
set display mode desktop width(), desktop height(), 32
Set window position 0,0
sync on
sync rate 60
objId = 1 ` not implemented yet
scale# = 5.3 ` probably any non-zero value will work
reduce# = 0.5 ` values in the range 0.5 to 1.0 work best
sizeX = 512 ` doesn't need to be square
sizeY = 512
GenerateTerrain(objId,scale#,reduce#,sizeX,sizeY)
Ink rgb(255,255,255),rgb(0,0,0)
Text 0,sizeY+10, "DONE"
load image "Heightmap.jpg",2
Paste image 2,0,0
sync
sync
wait key
position camera 0,100,0
Make object Terrain 1
set terrain heightmap 1, "Heightmap.jpg"
set terrain scale 1,5,1,5
set terrain split 1, 32
set terrain tiling 1, 32
set terrain light 1, 1, -0.25, 0, 1, 1, 0.78, 0.5
build terrain 1
position object 1,0,0,0
do
ControlCam(0,5.0)
sync
loop
Function GenerateTerrain(Obj,scale#,reduce#,sizeX,sizeY)
Global Dim terrainH(sizeX,sizeY) as Float
global dim marker(sizeX,sizeY)
for x = 1 to sizeX
for y = 1 to sizeY
marker(x,y) = 0
next y
next x
InitialiseArray(sizeX,sizeY)
DivideArray(1,1,sizeX,sizeY,scale#,reduce#)
Img=CreateImage(SizeX,SizeY)
Save image "Heightmap.jpg",Img
Endfunction
function InitialiseArray(sizeX,sizeY)
terrainH(1,1) = 0
terrainH(1,sizeY) = 0
terrainH(sizeX,1) = 0
terrainH(sizeX,sizeY) = 0
endfunction
Function DivideArray(X1,Y1,X2,Y2,scale#,reduce#)
Local H11 as float
Local H21 as float
Local H12 as float
Local H22 as float
H11=terrainH(X1,Y1)
H21=terrainH(X2,Y1)
H12=terrainH(X1,Y2)
H22=terrainH(X2,Y2)
stepX = X2-X1
stepY = Y2-Y1
NewX=X1+stepX/2
NewY=Y1+stepY/2
if marker(NewX,Y1) = 0 then terrainH(NewX,Y1)=(H11+H21)/2.0+(rnd(100)-50)*scale#:marker(NewX,Y1) = 1
if marker(X1,NewY) = 0 then terrainH(X1,NewY)=(H11+H12)/2.0+(rnd(100)-50)*scale#:marker(X1,NewY) = 1
if marker(NewX,Y2) = 0 then terrainH(NewX,Y2)=(H12+H22)/2.0+(rnd(100)-50)*scale#:marker(NewX,Y2) = 1
if marker(X2,NewY) = 0 then terrainH(X2,NewY)=(H21+H22)/2.0+(rnd(100)-50)*scale#:marker(X2,NewY) = 1
if marker(NewX,NewY) = 0 then terrainH(NewX,NewY)=(H11+H21+H12+H22)/4.0+(rnd(100)-50)*scale#:marker(NewX,NewY) = 1
if (stepX<=2) and (stepY<=2) then exitfunction
scale# = scale#*reduce#
DivideArray(X1,Y1,NewX,NewY,scale#,reduce#)
DivideArray(NewX,Y1,X2,NewY,scale#,reduce#)
DivideArray(X1,NewY,NewX,Y2,scale#,reduce#)
DivideArray(NewX,NewY,X2,Y2,scale#,reduce#)
Endfunction
Function CreateImage(SizeX,SizeY)
mem=FreeMem()
cls
img=FreeImg()
get image img,0,0,SizeX,SizeY
make memblock from image mem,img
MemW=memblock dword(mem,0)
MemH=memblock dword(mem,4)
For X=1 to sizeX
For Y=1 to sizeY
col=int(TerrainH(X,Y))
Pos=(3+x+y*MemW)*4
if col<0 then col=0
if col>255 then col=255
if Pos< Get Memblock Size(mem)
Write memblock byte mem,Pos,Col
Write memblock byte mem,Pos+1,Col
Write memblock byte mem,Pos+2,Col
endif
Next Y
Next X
Delete image img
Make image from memblock img,mem
Delete memblock mem
Endfunction img
Function FreeMem()
mem=1
while memblock exist(mem)
inc mem
endwhile
endfunction mem
Function FreeImg()
Img=1
while Image exist(Img)
inc Img
endwhile
endfunction Img
Function ControlCam(cam,Sp#)
rotate camera Cam,camera angle x(Cam)+(mousemovey()/2),camera angle y(Cam)+(mousemovex()/2.0),0
If keystate(17)=1 then move camera Cam,Sp#
If keystate(31)=1 then move camera Cam,-Sp#
If keystate(30)=1
Yrotate camera Cam,Camera angle Y(Cam)-90
Move camera Cam,Sp#
Yrotate camera Cam,Camera angle Y(Cam)+90
endif
If keystate(32)=1
Yrotate camera Cam,Camera angle Y(Cam)+90
Move camera Cam,Sp#
Yrotate camera Cam,Camera angle Y(Cam)-90
endif
if wrapvalue(camera angle x(Cam))>40 and wrapvalue(camera angle x(Cam))<180 then xrotate camera Cam,40
if wrapvalue(camera angle x(Cam))>180 and wrapvalue(camera angle x(Cam))<280 then xrotate camera Cam,280
position camera Cam,camera position X(Cam),camera position Y(Cam)-FallVelocity#,camera position Z(Cam)
Endfunction
My computer surpasses all the technologies of the day. What computer do I have?