Jump to content

Terrain in Leadwerks 5 Beta Updated


Josh

1,570 views

 Share

A new update is available for beta testers. This adds a new LOD system to the terrain system, fixes the terrain normals, and adds some new features. The terrain example has been updated ans shows how to apply multiple material layers and save the data.

Untitled.thumb.jpg.8541c1ead88647755e961de61e45355f.jpg

Terrain in LE4 uses a system of tiles. The tiles are rendered at a different resolution based on distance. This works great for medium sized terrains, but problems arise when we have very large view distances. This is why it is okay to use a 4096x4096 terrain in LE4, but your camera range should only show a portion of the terrain at once. A terrain that size will use 1024 separate tiles, and having them all onscreen at once can cause slowdown just because of the number of objects. That have to be culled and drawn.

IMG_3256.JPG.eca612ad2740a4bb1b2a5d42d1240306.JPG

Another approach is to progressively divide the terrain up into quadrants starting from the top and working down to the lowest level. When a box is created that is a certain distance from the camera, the algorithm stops subdividing it and draws a tile. The same resolution tile is drawn over and over, but it is stretched to cover different sized areas.

hierarch.JPG.b751f323a639bf7b693a95109be9f168.jpg.11cda4b25fa143284596c3731b8293db.jpg

This approach is much better suited to cover very large areas. At the furthest distance, the entire terrain will be drawn with just one single 32x32 patch. Here it is in action with a 2048x2048 terrain, the same size as The Zone:

This example shows how to load a heightmap, add some layers to it, and save the data, or load the data we previously saved:

--Create terrain
local terrain = CreateTerrain(world,2048,32)
terrain:SetScale(1,150,1)

--Load heightmap
terrain:LoadHeightmap("Terrain/2048/2048.r16", VK_FORMAT_R16_UNORM)

--Add base layer
local mtl = LoadMaterial("Materials/Dirt/dirt01.mat")
local layerID = terrain:AddLayer(mtl)

--Add rock layer
mtl = LoadMaterial("Materials/Rough-rockface1.json")
rockLayerID = terrain:AddLayer(mtl)
terrain:SetLayerSlopeConstraints(rockLayerID, 35, 90, 25)

--Add snow layer
mtl = LoadMaterial("Materials/Snow/snow01.mat")
snowLayerID = terrain:AddLayer(mtl)
terrain:SetLayerHeightConstraints(snowLayerID, 50, 1000, 8)
terrain:SetLayerSlopeConstraints(snowLayerID, 0, 35, 10)

--Normals
if FileType("Terrain/2048/2048_N.raw") == 0 then
	terrain:UpdateNormals()
	terrain:SaveNormals("Terrain/2048/2048_N.raw")
else
	terrain:LoadNormals("Terrain/2048/2048_N.raw")
end

--Layers
if FileType("Terrain/2048/2048_L.raw") == 0 or FileType("Terrain/2048/2048_A.raw") == 0 then
	terrain:SetLayer(rockLayerID, 1)
	terrain:SetLayer(snowLayerID, 1)
	terrain:SaveLayers(WriteFile("Terrain/2048/2048_L.raw"))
	terrain:SaveAlpha(WriteFile("Terrain/2048/2048_A.raw"))
else
	terrain:LoadLayers("Terrain/2048/2048_L.raw")
	terrain:LoadAlpha("Terrain/2048/2048_A.raw")
end

The x86 build configurations have also been removed from the game template project. This is available now in the beta tester forum.

  • Like 5
  • Upvote 1
 Share

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...