Layered Terrain Surface Representation
Terrain surfaces for the whole world are represented by a pair of textures covering the whole world: Satellite Map and Layer Map. PNG format is used for both textures, both textures are split into segments when imported to Visitor and Layer Map is converted to Layer Mask during the process. Each segment overlaps it's neighbours to allow terrain streaming. The Satellite Map provides basic colour information for displaying distant terrain. As terrain can be visable beyond the range that objects are, representations of objects such as trees, roads, ocean and buildings are all included on the satellite map. The Layer Map and Config defines which terrain type to display at close distances.
Note: The import process can be very time consuming because of the huge amount of data being processed. The full import of data for 20x20 km world with resolution 1 takes about 10 hours on a 2 GHz computer. The conversion is incremental, therefore if you edit only a small part of the maps, the next iteration is a lot faster, but it still can take about 1 hour (only launching Buldozer to check the results takes around 15 minutes). Be sure to tune your surfaces with small world first and once you are happy with the results, proceed with the large one.
Layer Legend
Legend is an image accompanied with a config, defining conversion from RGB to layers. Config defines which color represents what surface type. One surface type can be represented by multiple colors, which makes creating smooth blends between multiple surface type pairs possible. Only first line of the image is read, the rest is ignored and can be used for annotations.
There are few limitations imposed on the legend file - main being no color can exist twice in the image. The sample legend was created using gradient Rainbow in Photoshop, with added gradients to black and white on the ends using gradient between two colors.
Config describing basic surfaces for this legend might look like this (the config is part of the layer config described below):
class Legend { picture="layertest\src\mapLegend.png"; class Colors { /// color names should correspond to surface layer names snow[]={{255,255,255}}; wetSand[]={{0,0,0}}; grass[]={{0,255,131},{255,255,0}}; sand[]={{207,115,0}}; rock[]={{0,255,255},{121,255,0}}; mud[]={{0,255,0}}; } };
Layer Map
Layer map is edited as an RGB image. Each pixel of the map image is interpreted as follows:
- best matching color in the Legend is found
- based on nearest left and right basic surface corresponding surface blend is used
There is another config file describing the layer map. It defines what legend is used, and it also defines surface materials for basic surfaces. Surface materials used in one layer map need to have all parameters except the textures referenced identical. Textures used should not use SRGB color conversions, which implies _lco texture type should be used.
class Layers { class Grass { texture="layertest\data\grass_lco.paa"; material="layertest\data\grass.rvmat"; }; class Sand { texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1)"; material="layertest\data\sand.rvmat"; }; class Rock { texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1)"; material="layertest\data\rock.rvmat"; }; class Mud { texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1)"; material="layertest\data\mud.rvmat"; }; }; class Legend { // see above };
Editing Layer Map and Satellite Map
Assume texture folder is defined as LayerTest\Data in the Visitor for given world. All source files are assume to be located in LayerTest\Source unless specified otherwise.
Preparations:
- create a legend image
- create a config layers.cfg defining surfaces and legend used
- in Tools/Project Preferences decide on the satellite map segment size. The segments need to overlap slightly because of texture connecting - good overlap size is around 16 texels. Satellite map segment size is given as a multiple of basic landscape grid.
- Example: Assume world size 10240 x 10240 m with 40 m grid (i.e. 256 x 256 grids) , satellite texture with resolution 7680 x 7680 (one landscape grid needs to be covered by a whole number of texels, therefore satellite texture size needs to be a multiple of world size in grids). We want to achieve segment size 512 x 512 texels, and given the 16 texel overlap wanted, one segment will cover 496 x 496 texels. Size of one texel is 10240 m /7680 (1.3333 m) in this case, 496 texels give around 661.33 m. With 40 m grid we get 661.33/40 = 16.5, which rounded down gives 16. (If the texture grid is different from the terrain grid, rounding down is not enough - we need to round down to the nearest multiple of the number of terrain grids in the texture grid. With terrain grid 10 and texture grid 40 the satellite segment size needs to be a multiple of 4.
- Example2 : SaraLite uses 11x11 segments. Each segment is 512x512 pixels and overlaps it's neighbours by 32 pixels, so each segment covers 480x480m. The total layer maps cover 5312x5312 pixels (5280 subtracting the perimeter overlaps?). The terrain covers 10240 x 10240m in 512x512 ~20 meter cells. The texture grid appears to be made up of 256x256 ~40m cells. This working example appears to break the rules above.
Editing cycle: (editing is usually done in Photoshop with Buldozer not running)
- edit satellite map in Photoshop (file Satellite-map_lco.png). Note: you need to use _lco or _draftlco as a texture type.
- edit layer map mask in Photoshop (file Layer-map_lco.png). Note: you need to use _lco or _draftlco as a texture type.
- run Tools / Import Satellite + Mask, select Satellite-map_lco.png, Layers.cfg, Layer-map_lco.png files in the file browser
- run Buldozer to check the result
Textures
Each terrain type is represented at close distance by a colour only (CO) texture and a normal map (NO*). On SaraLite, each 1024x1024 pixel detail covers about 4m. Each pixel of the layer mask covers about 2m.
Terrain types also have an associated MCO texture. This is multiplied with the satellite map to provide middle distance details. On SaraLite, each 1024x1024 MCO texture covers about 40m (one terrain texture grid cell). The engine loads terrain textures one texture grid at a time, each segment being made up into 12x12 texture grids, plus the overlapping 32 pixels.
Game Engine Notes
The information about the layer map above relates to tool use rather than the ArmA game engine. For game use each segment of the Layer map uses its own pallete that is unrelated to the Layer Legend mentioned above. Each terrain type within a segment uses a colour based upon the order in which the terrain types are defined in the config. Colours are used in the following order : Black (000000), Red (FF0000), Green (00FF00), Blue (0000FF). It is interesting to note SaraLite uses a maximum of 4 terrain types in any given segment. This may be an engine limitation. All 4 terrain types can be blended together within one pixel of the layer map (2m x 2m), although blending is rarely used.
There are several RVMAT configs for each segment, each defining a PixelShaderID. There exist one RVMAT config for each combination of terrain types within each texture grid (40m and 40 pixels) within that segment. The PixelShaderIDs are named using this manner : first terrain type = 1, 2nd = 2, 3rd = 4, 4th = 8. (technical term?). For example: PixelShaderID = "Terrain15" contains all 4 terrains, "Terrain6" contains the 2nd and 3rd terrains. The configs also define ground texture files and their transformations.
Unknown Information
How the ground clutters are placed - possibly using cell flags rather than the layer map.