Code archives/3D Graphics - Mesh/Random Terrain Tile

This code has been declared by its author to be Public Domain code.

Download source code

Random Terrain Tile by AbbaRue2004
Use this with your programs to Create a random Terrain Tile.
Has Good form. Hit E key.
;Written by Harold W. Lehmann of Sarnia, On. Canada. 
;Submitted to archeives on May 16, 2004. 
;You may use this code as you please
;Just give me some Credit in your program if you do. 
; ------------------ 
;E key to create a 3D Mesh Tile.
;CRSR Del. Ins. keys to Turn Mesh for viewing. 
;Number keys for manual develop stages.
;Try the following order: 0 9 5 4 8 7 1 3. To see stages.
;Leave comment of what you think, after testing.
; ------------------ 
; Vert. Tester
; ------------------ 

;Graphics3D 640,480
Graphics3D 1024,768,32,1

Global xx=0
Global YY#=0
Global zz=0
Global nodes=360	;number of nodes x or z -1

Dim H(nodes*nodes)
Dim V(nodes,nodes); set up array to store vertices
Dim T(Nodes*nodes); set up array to store Triangles

 
SetBuffer BackBuffer() 

camera=CreateCamera() 

light=CreateLight() 
RotateEntity light,45,0,0 

ts=512 ;Texture creation using WritePixel 
tex57=CreateTexture (ts,ts,1)
SetBuffer TextureBuffer (tex57,0) 
For cdy= 0 To ts-1
For cdx= 0 To ts-1
rca=255 
rcg=Rnd(100,255)
;If rcg<70 Then rcg=0
rcr=rcg
rcb=rcg
argb=0 ;clear color
argb=(rca Shl 24) Or (rcr Shl 16) Or (rcg Shl 8) Or (rcb) 
;If rcg<74 Then argb=0 ;just to be sure lots of black
WritePixel cdx,cdy,argb 

Next 
Next 

SetBuffer BackBuffer() 

; Create blank mesh 
Land=CreateMesh() 

; Create blank Surface which is attached to mesh (Surfaces must always be attached to a mesh) 
SF=CreateSurface(Land) 
;EntityTexture land,tex57 ;a texture if I need it

;mm must be 2 less then desired verts. mm=15 gives 17 verts.
mm=17 ;Number of units-1 (start with 17)

For nx=0 To mm+1
For nz=0 To mm+1
	V(nx,nz)=AddVertex(SF,nx,0,nz,(nx*0.0625),(nz*0.0625),0 )	;create all vertices
Next 
Next

;v0=AddVertex(SF,1,0,1) ; Node corner

tt=0
For x=0 To mm Step 2 ;0-6 has 16 triangles (16x16=256)
For z=0 To mm Step 2

t(tt)=AddTriangle( SF,V(x,z),V(x,z+1),V(x+1,z+1) ) 		;1
tt=tt+1
t(tt)=AddTriangle( SF,V(x+1,z+1),V(x+1,z),V(x,z) ) 	;2
tt=tt+1
t(tt)=AddTriangle( SF,V(x,z+1),V(x,z+2),V(x+1,z+1) ) 		;3
tt=tt+1
t(tt)=AddTriangle( SF,V(x+1,z+1),V(x,z+2),V(x+1,z+2) ) 		;4
tt=tt+1
t(tt)=AddTriangle( SF,V(x+1,z),V(x+1,z+1),V(x+2,z) ) 		;5
tt=tt+1
t(tt)=AddTriangle( SF,V(x+2,z),V(x+1,z+1),V(x+2,z+1) ) 		;6
tt=tt+1
t(tt)=AddTriangle( SF,V(x+1,z+1),V(x+1,z+2),V(x+2,z+2) ) 	;7
tt=tt+1
t(tt)=AddTriangle( SF,V(x+2,z+2),V(x+2,z+1),V(x+1,z+1) ) 	;8
tt=tt+1

.ctc

Next 
Next 

; Now we will position our Mesh in front of the camera so we can see it! 
PositionEntity Land,-9,-7,12 

; Enable wireframe mode so we can see structure of model more clearly 
WireFrame True  

; And a quick loop that renders the scene and displays the contents on the screen until we press esc 
While Not KeyDown(1) 

; Constantly turn our Mesh to show it off a bit 
; TurnEntity Land,0,1,0 
If KeyDown( 205 )=True Then TurnEntity Land,0,0,-1	;Right
If KeyDown( 203 )=True Then TurnEntity Land,0,0,1	;Left
If KeyDown( 208 )=True Then TurnEntity Land,-1,0,0	;Down
If KeyDown( 200 )=True Then TurnEntity Land,1,0,0	;up
If KeyDown( 210 )=True Then TurnEntity Land,0,-1,0	;ins
If KeyDown( 211 )=True Then TurnEntity Land,0,1,0	;del
If KeyDown( 199 )=True Then RotateEntity Land,0,0,0	;hom
If KeyDown( 199 )=True Then PositionEntity Land,-9,-7,12	;hom
If KeyDown( 201 )=True Then RotateEntity Land,-90,0,0 	;pgup
If KeyDown( 201 )=True Then PositionEntity Land,-9,-9,13	;pgup

If KeyDown( 52 )=True Then MoveEntity camera,0,0,+1 ;. key
If KeyDown( 51 )=True Then MoveEntity camera,0,0,-1 ;, key

; keys for testing
If KeyDown( 20 )=True Then Gosub Test1	;t key
If KeyDown( 45 )=True Then Gosub Test2	;x key
If KeyDown( 44 )=True Then Gosub Test3	;z key
If KeyDown( 46 )=True Then Gosub Test4	;c key
If KeyDown( 47 )=True Then Gosub Test5	;v key
If KeyDown( 48 )=True Then Gosub Test6	;b key
If KeyDown( 17 )=True Then Gosub Test7	;w key
If KeyDown( 18 )=True Then Gosub Test8	;e key


; subroutine calls
.keys
If KeyDown( 2 )=True Then Gosub Octave01	;1 key
If KeyDown( 3 )=True Then Gosub Octave02	;2 key
If KeyDown( 4 )=True Then Gosub Octave03	;3 key
If KeyDown( 5 )=True Then Gosub Octave04	;4 key
If KeyDown( 6 )=True Then Gosub Octave05	;5 key
If KeyDown( 7 )=True Then Gosub Octave06	;6 key
If KeyDown( 8 )=True Then Gosub Octave07	;7 key
If KeyDown( 9 )=True Then Gosub Octave08	;8 key
If KeyDown( 10 )=True Then Gosub Octave09	;9 key
If KeyDown( 11 )=True Then Gosub Octave10	;0 key




RenderWorld 
	Text 10,12," Triangles: " + TrisRendered() 
	Text 10,24," XX: " + XX	
	Text 10,36," YY#: " + VertexY# ( SF,V(xx,zz) )
	Text 10,48," ZZ: " + ZZ 
	Text 10,60," Index: " + V(xx,zz) 
	Text 10,72," Test#: " + kk#
Flip 

Wend 


End

.Test1 ;T key
;VertexCoords SFace,index,x#,y#,z#
YY#=VertexY# ( SF,V(xx,zz) )+0.1
VertexCoords SF,V(xx,zz),xx,YY#,zz

.k20
If KeyDown(20) Goto K20 ;loop until key released
Return 

.Test2 ;X key
xx=xx+1

.k45
If KeyDown(45) Goto K45 ;loop until key released
Return 


.Test3 ;Z key

zz=zz+1
.k44
If KeyDown(44) Goto K44 ;loop until key released
Return 

.Test4 ;C key

xx=0
zz=0
.k46
If KeyDown(46) Goto K46 

Return 

.Test5 ;V key

YY#=VertexY# ( SF,V(xx,zz) )-0.1
VertexCoords SF,V(xx,zz),xx,YY#,zz

.k47
If KeyDown(47) Goto K47
Return 


.Test6 ;B key

YY#=0
VertexCoords SF,V(xx,zz),xx,YY#,zz

.k48
If KeyDown(48) Goto K48
Return 


.Test7 ;W key

If YY#=Abs(YY#) Then WireFrame True Else WireFrame False 
.k17
If KeyDown(17) Goto K17
Return 



.Test8 ;E key

Gosub Octave10 
Gosub Octave09 
Gosub Octave05 
Gosub Octave04 
Gosub Octave08 
;Gosub Octave02 
Gosub Octave07 
;Gosub Octave06 
Gosub Octave01 
Gosub Octave03 
;Gosub Octave06 

.k18
;If KeyDown(18) Goto K18

Return


.Octave01	;1 key 

For xx= 0 To 15 Step 3
For zz= 0 To 15 Step 3 

A1#=VertexY#(SF,v(xx,zz))
A2#=VertexY#(SF,v(xx,zz+3))
A3#=VertexY#(SF,v(xx+3,zz+3))
A4#=VertexY#(SF,v(xx+3,zz))

YY#=(A1+A2+A4)/3
VertexCoords SF,V(xx+1,zz+1),xx+1,YY#,zz+1

YY#=(A1+A2+A3)/3
VertexCoords SF,V(xx+1,zz+2),xx+1,YY#,zz+2

YY#=(A2+A3+A4)/3
VertexCoords SF,V(xx+2,zz+2),xx+2,YY#,zz+2

YY#=(A1+A3+A4)/3
VertexCoords SF,V(xx+2,zz+1),xx+2,YY#,zz+1

Next 
Next 


.k2
If KeyDown(2) Goto K2

Return 


.Octave02	;2 key 

For xx=0 To 18 ;all verts
For zz=0 To 18 ;all verts


YY#=VertexY#(SF,v(xx,zz))
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx,zz),xx,YY#,zz

Next ;zz
Next ;xx

.k3
If KeyDown(3) Goto K3

Return 

.Octave03	;3 key 

For xx= 3 To 12 Step 3
For zz= 3 To 12 Step 3 


YY#=(VertexY#(SF,v(xx,zz))+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx-1,zz+1)))/3
VertexCoords SF,V(xx-1,zz),xx-1,YY#,zz

YY#=(VertexY#(SF,v(xx-3,zz))+VertexY#(SF,v(xx-2,zz-1))+VertexY#(SF,v(xx-2,zz+1)))/3
VertexCoords SF,V(xx-2,zz),xx-2,YY#,zz

YY#=(VertexY#(SF,v(xx,zz))+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx+1,zz-1)))/3
VertexCoords SF,V(xx,zz-1),xx,YY#,zz-1

YY#=(VertexY#(SF,v(xx,zz-3))+VertexY#(SF,v(xx-1,zz-2))+VertexY#(SF,v(xx+1,zz-2)))/3
VertexCoords SF,V(xx,zz-2),xx,YY#,zz-2



Next 
Next 


.k4
If KeyDown(4) Goto K4

Return 


.Octave04	;4 key 


For xx=0 To 18 ;all verts
For zz=0 To 18 ;all verts


YY#=VertexY#(SF,v(xx,zz))
YY#=YY#+Rnd(-1,1)

VertexCoords SF,V(xx,zz),xx,YY#,zz

Next 
Next 



.k5
If KeyDown(5) Goto K5

Return 

.Octave05	;4 key 
;smoother with random added 
;Here I am only dividing by 2 for 3 verts
;this gives me an increase

For xx= 0 To 15 Step 3
For zz= 0 To 15 Step 3 

A1#=VertexY#(SF,v(xx,zz))
A2#=VertexY#(SF,v(xx,zz+3))
A3#=VertexY#(SF,v(xx+3,zz+3))
A4#=VertexY#(SF,v(xx+3,zz))


;YY#=VertexY#(SF,v(xx,zz))
;YY#=YY#+(Rnd(-YY#,YY#))

;Using /2 here increases many places 
YY#=(A1+A2+A4)/2
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+1,zz+1),xx+1,YY#,zz+1

YY#=(A1+A2+A3)/2
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+1,zz+2),xx+1,YY#,zz+2

YY#=(A2+A3+A4)/2
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+2,zz+2),xx+2,YY#,zz+2

YY#=(A1+A3+A4)/2
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+2,zz+1),xx+2,YY#,zz+1

Next 
Next 

For xx= 3 To 12 Step 3
For zz= 3 To 12 Step 3 

;tried using /2 here also but it didn't look right
YY#=(VertexY#(SF,v(xx,zz))+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx-1,zz+1)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx-1,zz),xx-1,YY#,zz

YY#=(VertexY#(SF,v(xx-3,zz))+VertexY#(SF,v(xx-2,zz-1))+VertexY#(SF,v(xx-2,zz+1)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx-2,zz),xx-2,YY#,zz

YY#=(VertexY#(SF,v(xx,zz))+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx+1,zz-1)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx,zz-1),xx,YY#,zz-1

YY#=(VertexY#(SF,v(xx,zz-3))+VertexY#(SF,v(xx-1,zz-2))+VertexY#(SF,v(xx+1,zz-2)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx,zz-2),xx,YY#,zz-2

Next 
Next 


.k6
If KeyDown(6) Goto K6

Return 

.Octave06	;6 key 

For xx=2 To 15 Step 3 
For zz=2 To 15 Step 3 

YY#=VertexY#(SF,v(xx+1,zz+1))+VertexY#(SF,v(xx+1,zz-1))
YY#=YY#+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx-1,zz+1))
YY#=YY#/4
YY#=YY#+(Rnd(-YY#,YY#))
kk#=YY#
VertexCoords SF,V(xx,zz),xx,YY#,zz
Next 
Next 

.k7
If KeyDown(7) Goto K7

Return 

.Octave07	;7 key 

;smoother with random added

For xx= 0 To 15 Step 3
For zz= 0 To 15 Step 3 

A1#=VertexY#(SF,v(xx,zz))
A2#=VertexY#(SF,v(xx,zz+3))
A3#=VertexY#(SF,v(xx+3,zz+3))
A4#=VertexY#(SF,v(xx+3,zz))


;YY#=VertexY#(SF,v(xx,zz))
;YY#=YY#+(Rnd(-YY#,YY#))


YY#=(A1+A2+A4)/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+1,zz+1),xx+1,YY#,zz+1

YY#=(A1+A2+A3)/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+1,zz+2),xx+1,YY#,zz+2

YY#=(A2+A3+A4)/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+2,zz+2),xx+2,YY#,zz+2

YY#=(A1+A3+A4)/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx+2,zz+1),xx+2,YY#,zz+1

Next 
Next 

For xx= 3 To 12 Step 3
For zz= 3 To 12 Step 3 


YY#=(VertexY#(SF,v(xx,zz))+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx-1,zz+1)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx-1,zz),xx-1,YY#,zz

YY#=(VertexY#(SF,v(xx-3,zz))+VertexY#(SF,v(xx-2,zz-1))+VertexY#(SF,v(xx-2,zz+1)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx-2,zz),xx-2,YY#,zz

YY#=(VertexY#(SF,v(xx,zz))+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx+1,zz-1)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx,zz-1),xx,YY#,zz-1

YY#=(VertexY#(SF,v(xx,zz-3))+VertexY#(SF,v(xx-1,zz-2))+VertexY#(SF,v(xx+1,zz-2)))/3
YY#=YY#+(Rnd(-YY#,YY#))

VertexCoords SF,V(xx,zz-2),xx,YY#,zz-2

Next 
Next 



.k8
If KeyDown(8) Goto K8

Return 

.Octave08	;8 key 

For xx=3 To 15 Step 3 
For zz=3 To 15 Step 3 

YY#=VertexY#(SF,v(xx+1,zz+1))+VertexY#(SF,v(xx+1,zz-1))
YY#=YY#+VertexY#(SF,v(xx-1,zz-1))+VertexY#(SF,v(xx-1,zz+1))
YY#=YY#/4
YY#=YY#+(Rnd(-YY#,YY#))
kk#=YY#
VertexCoords SF,V(xx,zz),xx,YY#,zz
Next 
Next 

.k9
If KeyDown(9) Goto K9

Return 


.Octave09	;9 key 

For dd=0 To 33
xx=Abs(Rnd(6))
xx=xx*3
YY#=Rnd(-5,5)
zz=Abs(Rnd(6))
zz=zz*3
VertexCoords SF,V(xx,zz),xx,YY#,zz

Next ;dd

.k10
If KeyDown(10) Goto K10

Return 


.Octave10	;0 key 


For xx=0 To 18 
For zz=0 To 18 

VertexCoords SF,V(xx,zz),xx,0,zz
Next 
Next 


.k11
If KeyDown(11) Goto K11

Return 

Function Vxy(ss,ee,ff)
YY#=(VertexY#(ss,v(ee+2,ff-1))+VertexY#(ss,v(ee-1,ff-1))+VertexY#(ss,v(ee-1,ff+2)))/3
Return YY# 
End Function ;End Vxy function 


;  The end!

Comments

None.

Code Archives Forum