October 19, 2021, 10:41:59

Author Topic: [bb] Retro style patchwork landscape generator - ala Zarch by Stevie G [ 1+ years ago ]  (Read 953 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Retro style patchwork landscape generator - ala Zarch
Author : Stevie G
Posted : 1+ years ago

Description : The landscape is made from a single surface using vertex colors.  I posted this code in the forums a few days ago but figured that it'd be handy for anyone attempting a virus / zarch / conqueror or zeewolf clone.

Code :
Code: BlitzBasic
  1. Graphics3D 320,240,16,1
  2.  
  3. Const size#=256
  4. Const divs#=7
  5. Const divg#=divs*4+1
  6. Const scale#=16
  7. Const speed#=.25
  8.  
  9. Global divd#=Sqr( 2*(divs*divs) )
  10. Global camera=CreateCamera()
  11. Global light=CreateLight()
  12. Global target=CreatePivot()
  13. Global map,map_tex
  14. Global grid=create_grid()
  15. Global surf=GetSurface(grid,1)
  16. Global x_pos#= size *.5
  17. Global z_pos#= size *.5
  18. Global last_x# = x_pos
  19. Global last_z# = z_pos
  20. Global frames
  21.  
  22. Type point
  23.         Field height#
  24.         Field index
  25.         Field r,g,b
  26. End Type
  27.  
  28. Dim terrain.point(size-1,size-1)
  29.  
  30. random_terrain(0) ;10031972
  31.  
  32. While Not KeyDown(1)
  33.  
  34.         x_pos=qwrap( x_pos + (KeyDown(205)-KeyDown(203)) * speed,size)
  35.         z_pos=qwrap( z_pos + (KeyDown(208)-KeyDown(200)) * speed,size)
  36.        
  37.         update_terrain()
  38.         update_camera()
  39.        
  40.         frames=qwrap(frames+1,10)
  41.         If frames = 0 update_map()
  42.  
  43.  
  44. UpdateWorld()
  45. RenderWorld()
  46.  
  47. Flip
  48. Wend
  49.  
  50. ;=====================================================================================================
  51. ;UPDATE TERRAIN =====================================================================================================
  52. ;=====================================================================================================
  53.  
  54. Function update_terrain()
  55.  
  56. ax#=Floor(x_pos):az#=Floor(z_pos)
  57. fx#=(x_pos) - ax:fz#=(z_pos) - az
  58.  
  59. For z=-divs To divs+1
  60.         For x=-divs To divs+1
  61.  
  62.                 nx#=qwrap(ax+x,size)
  63.                 nz#=qwrap(az+z,size)
  64.                
  65.                 vy#=terrain(nx,nz)height
  66.                 vx#=qlimit( x-fx,-divs,divs)
  67.                 vz#=qlimit( z-fz,-divs,divs)
  68.                
  69.                 ;brightness
  70.                 c#=.25 + ( divd - Sqr(vx*vx+vz*vz) ) / (divd )  
  71.                 r=terrain(nx,nz)
  72.  * c
  73.                 g=terrain(nx,nz)g * c
  74.                 b=terrain(nx,nz) * c
  75.                
  76.                 If Abs(vx)=divs Or Abs(vz)=divs
  77.                 vy#=get_height( x_pos+vx , z_pos+vz)
  78.                 EndIf
  79.  
  80.                 ;vertex positions
  81.                 For iz = 0 To ( z > -divs And z < divs+1 )
  82.                         For ix = 0 To ( x > -divs And x < divs+1 )
  83.                                 x1 = ( x + divs ) * 2 - ( x > -divs ) + ix
  84.                                 z1 = ( z + divs ) * 2 - ( z > -divs ) + iz
  85.                                 v=x1+z1*(divg+1)
  86.                                 VertexCoords surf,v, vx * scale , vy , -vz * scale
  87.                         Next
  88.                 Next
  89.  
  90.                 ;colours
  91.                 For iz = 0 To (z < divs+1)
  92.                         For ix = 0 To (x < divs+1)
  93.                                 x1 = ( x + divs ) * 2 + ix
  94.                                 z1 = ( z + divs ) * 2 + iz
  95.                                 v=x1+z1*(divg+1)
  96.                                 VertexColor surf,v,r,g,b
  97.                         Next
  98.                 Next
  99.  
  100.         Next
  101. Next
  102.  
  103. End Function
  104.  
  105. ;=====================================================================================================
  106. ;GET HEIGHT OF POINT ON WORLD CO-ORDS =====================================================================================================
  107. ;=====================================================================================================
  108.  
  109. Function get_height(bx#,bz#)
  110.  
  111. bx=qwrap(bx,size):bz=qwrap(bz,size)
  112. tx#=Floor(bx):tz#=Floor(bz)
  113. jx#=bx - tx:jz#=bz - tz
  114. cx#=qwrap(tx+1.0,size)
  115. cz#=qwrap(tz+1.0,size)
  116. v1#=terrain(tx,tz)height+(terrain(cx,tz)height-terrain(tx,tz)height)*jx
  117. v2#=terrain(tx,cz)height+(terrain(cx,cz)height-terrain(tx,cz)height)*jx
  118.  
  119. Return v1+(v2-v1)*jz
  120.  
  121. End Function
  122.  
  123. ;=====================================================================================================
  124. ;UPDATE CAMERA =====================================================================================================
  125. ;=====================================================================================================
  126.  
  127. Function update_camera()
  128.  
  129. PositionEntity target,0,divs*10+get_height(x_pos,z_pos)* 1.0,-divs*25
  130. dx#=(EntityX(target,1)-EntityX(camera,1))*.1
  131. dy#=(EntityY(target,1)-EntityY(camera,1))*.1
  132. dz#=(EntityZ(target,1)-EntityZ(camera,1))*.1
  133. TranslateEntity camera,dx,dy,dz
  134.  
  135. End Function
  136.  
  137. ;=====================================================================================================
  138. ;UPDATE MAP =====================================================================================================
  139. ;=====================================================================================================
  140.  
  141. Function update_map()
  142.  
  143. SetBuffer TextureBuffer(map_tex)
  144.  
  145. For z=-2 To 2
  146.         For x=-2 To 2
  147.                 xp=qwrap(last_x+x,size)
  148.                 zp=qwrap(last_z+z,size)
  149.                 Color terrain(xp,zp)
  150. ,terrain(xp,zp)g,terrain(xp,zp)
  151.                 Plot xp,zp
  152.         Next
  153. Next
  154.  
  155. For z=-2 To 2
  156.         For x=-2 To 2
  157.                 xp=qwrap(Floor(x_pos)+x,size)
  158.                 zp=qwrap(Floor(z_pos)+z,size)
  159.                 Color 255,255,255
  160.                 Plot xp,zp
  161.         Next
  162. Next
  163.  
  164. SetBuffer BackBuffer()
  165.  
  166. last_x=Floor(x_pos)
  167. last_z=Floor(z_pos)
  168.  
  169. End Function
  170.  
  171.  
  172. ;=====================================================================================================
  173. ;GENERATE RANDOM TERRAIN FOR TESTING =====================================================================================================
  174. ;=====================================================================================================
  175.  
  176. Function random_terrain(seed)
  177.  
  178. SeedRnd seed
  179.  
  180. ;initialise
  181. For z=0 To size-1
  182.         For x=0 To size-1
  183.                 terrain(x,z) = New point
  184.         Next
  185. Next
  186.  
  187. passes=50+Rand(150)
  188.  
  189. ;do heights
  190. For parts=0 To passes
  191.         start_x=Rand(0,size)
  192.         start_z=Rand(0,size)
  193.         rad#=Rand(1,32)
  194.         start_y#=Rand(8,32)
  195.        
  196.         For z=-rad To rad
  197.                 For x=-rad To rad
  198.                         d#=Sqr(x*x+z*z)
  199.                         If d < rad
  200.                                 py#=Cos(d/rad * 90) * start_y
  201.                                 px=qwrap(start_x+x,size)
  202.                                 pz=qwrap(start_z+z,size)
  203.                                 terrain(px,pz)height = ( terrain(px,pz)height + py )
  204.                         EndIf
  205.                 Next
  206.         Next
  207. Next
  208.  
  209. ;do colours - based on code from BIG&
  210.  
  211. For z=size-1 To 0 Step -1
  212.         For x=0 To size-1
  213.                 th#=get_height(x+.5,z+.5)
  214.                 terrain(x,z)
  215.  = th+Rnd(80)
  216.                 terrain(x,z)g = th+120
  217.                 terrain(x,z) = th+Rnd(80)
  218.                 If th=0 ;*BODGE*Sea
  219.                         terrain(x,z)
  220. =60+Rnd(40)
  221.                         terrain(x,z)g=60+Rnd(40)
  222.                         terrain(x,z)=200+Rnd(40)
  223.                 Else
  224.                         If th < 12;*BODGE*Beach
  225.                                 terrain(x,z)
  226. =th *10+90
  227.                                 terrain(x,z)g=th *10+90
  228.                                 terrain(x,z)=240-th *20
  229.                         End If
  230.                 End If
  231.         Next
  232. Next
  233. ;*BODGE* Color Landing Pad
  234. For z=-4 To 4
  235.         For x=-4 To 4
  236.                 col=Rnd(32)+168
  237.                 xp=qwrap(size*.5+x,size):zp=qwrap(size*.5+z,size)
  238.                 If x >-4 And z >-4 terrain(xp,zp)height=30
  239.                 terrain(xp,zp)
  240. =col
  241.                 terrain(xp,zp)g=col
  242.                 terrain(xp,zp)=col
  243.         Next
  244. Next
  245.  
  246. ;create map
  247. map_tex=CreateTexture(256,256)
  248. SetBuffer TextureBuffer(map_tex)
  249. For z=0 To size-1
  250.         For x=0 To size-1
  251.                 Color terrain(x,z)
  252. ,terrain(x,z)g,terrain(x,z)
  253.                 Plot x,z
  254.         Next
  255. Next
  256.  
  257. SetBuffer BackBuffer()
  258. map=create_quad(camera)
  259. PositionEntity map,-5,3,6
  260. EntityTexture map,map_tex,0
  261.  
  262. End Function
  263.  
  264. ;=====================================================================================================
  265. ;CREATE DISPLAY GRID =====================================================================================================
  266. ;=====================================================================================================
  267.  
  268. Function create_grid()
  269.  
  270. mesh=CreateMesh():s=CreateSurface(mesh)
  271.  
  272. For z=0 To divg
  273.         For x=0 To divg
  274.                 v=AddVertex(s,0,0,0)
  275.         Next
  276. Next
  277.  
  278. For z=0 To divg-1
  279.         For x=0 To divg-1
  280.                 v0=x+z*(divg+1):v1=v0+1
  281.                 v2=v1+divg+1:v3=v0+divg+1
  282.                 AddTriangle s,v0,v1,v2
  283.                 AddTriangle s,v2,v3,v0
  284.         Next
  285. Next
  286.  
  287. EntityFX mesh,6
  288. Return mesh
  289.  
  290. End Function
  291.  
  292. ;=====================================================================================================
  293. ;=====================================================================================================
  294. ;=====================================================================================================
  295.  
  296. Function qlimit#(q#,a#,b#)
  297.  
  298. If q < a q=a
  299. If q > b q=b
  300. Return q
  301.  
  302. End Function
  303.  
  304. ;=====================================================================================================
  305. ;=====================================================================================================
  306. ;=====================================================================================================
  307.  
  308. Function qwrap#(q#,a#)
  309.  
  310. If q >=a q=q-a
  311. If q < 0 q=a+q
  312. Return q
  313.  
  314. End Function
  315.  
  316. ;=====================================================================================================
  317. ;=====================================================================================================
  318. ;=====================================================================================================
  319.  
  320. Function create_quad(parent=0)
  321.  
  322. mesh=CreateMesh(parent)
  323. surface=CreateSurface(mesh)
  324. AddVertex surface,-1,1,0,0,0
  325. AddVertex surface,1,1,0,1,0
  326. AddVertex surface,1,-1,0,1,1
  327. AddVertex surface,-1,-1,0,0,1
  328. AddTriangle surface,0,1,2
  329. AddTriangle surface,2,3,0
  330. Return mesh
  331.  
  332. End Function


Comments :


Jeroen(Posted 1+ years ago)

 old school :-) nice


grindalf(Posted 1+ years ago)

 so very awesome :D


Jason W.(Posted 1+ years ago)

 Make a bmax port ;) Jason


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal