Just How Malleable Are Terrains, Really?

I'm currently working on the early stages of a project that will depend heavily on being able to modify the terrain. Altering heightmaps, altering textures, adding/removing mesh objects, associating arbitrary attributes with a terrain, and so forth. Oh, and all of these will need to be persistable. Also, being able to generate terrains, and package them up for dynamic loading, server-side. Plus I'd like a pony :-)

Now I know the only documented (and thus "official") aspect of terrains that can be changed at runtime is the heightmap. What else is there that's undocumented and Unity is willing to let people know about?

If it's not feasible to do what I want with existing terrains, I may have to resort to using mesh objects to do what I'd like. Ideally I'd like to have a completely new class of object - say, DynamicTerrain - that supported the abilities I need without having to compromise the current Terrain class. Now I know what that would involve, but I've got 20 years of C/C++ experience, nothing else on my plate (I've got a defense background but I'm stuck in a state that's got no defense work in it), and would be happy to give any resulting implementation of dynamic terrains to Unity - in addition to the project I'm currently trying to get going, having a more malleable terrain available would open up the possibility of several additional projects for me (of course, then I'd also need a fisheye lens camera option, but that's another question for another time...)

Pie in the sky, I know, but I thought it wouldn't hurt to at least ask.

Al

I would say the pony is the easiest requirement.

The terrain asset is quite limited in what you can do with it in runtime. However... there are some undocumented API's you can use to basically construct/modify anything in a terrain. A simple google gave me the following code, don't know where it's from but it seems to use about anything terrain related to construct one dynamically. As the TerrainData API is undocumented it's unsupported and not guaranteed to work now or in the future...

I don't know who's the owner of the code below and haven't tried it myself but should be helpful to see how you can use the API.

Good luck with your project and pony.

    //Download terrain assets referenced in headers
i = 1;
for(var v : String in trnArr) {
    //v = "name;r:width,height,length,heightmapResolution //,detailResolution,controlResolution,textureResolution;h:heightMapUrl";
    var vS2 : String[] = v.Split(";"[0]);
    var tName = vS2[0];
    for(i2 = 1; i2<vS2.length; i2++) {
    	var str : String[] = vS2[i2].Split(":"[0]);
    	if(str[0] == "r") var tRes : String[] = str[1].Split(","[0]);
    	else if(str[0] == "h") var tHtmp : String = whirld.getURL(str[1]);
    	else if(str[0] == "l") var tLtmp : String = whirld.getURL(str[1]);
    	else if(str[0] == "s") var tSpmp : String = whirld.getURL(str[1]);
    	else if(str[0] == "s2") var tSpmp2 : String = whirld.getURL(str[1]);
    	else if(str[0] == "t") var tTxts : String[] = str[1].Split(","[0]);
    	else if(str[0] == "d") var tDtmp : String = whirld.getURL(str[1]);
    }
    whirld.statusTxt = "Downloading Terrain " + i + " of " + trnArr.length + " (" + tName + "): " + tHtmp;
    www = new WWW(tHtmp);
    while(!www.isDone) {
    	whirld.progress = www.progress;
    	yield new WaitForSeconds(.1);
    }
    if (www.error != null) whirld.info += "
Terrain Undownloadable: " + tName + " " + tHtmp + " (" + www.error + ")";
    else {
    	whirld.statusTxt = "Initializing " + tName + "...";
    	whirld.progress = 0;
    	if(Application.isPlaying) yield;

    	var tWidth : int = parseInt(tRes[0]);
    	var tHeight : int = parseInt(tRes[1]);
    	var tLength : int = parseInt(tRes[2]);
    	var tHRes : int = parseInt(tRes[3]);
    	//var tDRes : int = parseInt(tRes[4]);
    	//var tCRes : int = parseInt(tRes[5]);
    	//var tBRes : int = parseInt(tRes[6]);
    	var trnDat : TerrainData = new TerrainData();

    	//Heights
    	trnDat.heightmapResolution = tHRes;
    	//trnDat.Init(tCRes, tDRes, tBRes);
    	var hmap = trnDat.GetHeights(0, 0, tHRes, tHRes);
    	var br : BinaryReader;
    	if(true) { //Terrain RAW file is compressed
    		/*var stream = new DeflateStream(new MemoryStream(www.bytes), CompressionMode.Decompress);
    		var buffer : byte[] = new byte[4096];
            var ms : MemoryStream = new MemoryStream();
    		var bytesRead : int = 0;
    		while (bytesRead > 0) {
                bytesRead = stream.Read(buffer, 0, buffer.Length);
                if (bytesRead > 0) ms.Write(buffer, 0, bytesRead);
            }
    		br = new BinaryReader(ms);*/
    	    br = new BinaryReader(new MemoryStream(new Ionic.Zlib.GZipStream(new MemoryStream(), Ionic.Zlib.CompressionMode.Decompress).UncompressBuffer(www.bytes)));
    	}
    	else br = new BinaryReader(new MemoryStream(www.bytes));
    	for (var x : int = 0; x < tHRes; x++) for (var y : int = 0; y < tHRes; y++) hmap[x, y] = br.ReadUInt16() / 65535.00000000;
    	trnDat.SetHeights(0, 0, hmap);
    	trnDat.size = Vector3(tWidth, tHeight, tLength);				

    	//Textures
    	if(tTxts) {
    		var splatPrototypes : SplatPrototype[] = new SplatPrototype[tTxts.length];
    		for(i=0; i < tTxts.length; i++) {
    			var splatTxt : String[] = tTxts*.Split("="[0]);*
 *			var splatTxtSize : String[] = splatTxt[1].Split("x"[0]);*
 *			whirld.statusTxt = "Downloading Terrain Texture " + (i + 1) + " of " + tTxts.length + " (" + splatTxt[0] + ")";*
 *			www = new WWW(whirld.getURL(splatTxt[0]));*
 *			while(!www.isDone) {*
 *				whirld.progress = www.progress;*
 *				yield new WaitForSeconds(.1);*
 *			}*
 *			if (www.error != null) whirld.info += "
Terrain Texture Undownloadable: #" + (i + 1) + " (" + splatTxt[0] + ")";*
 *			else {*
 *				whirld.statusTxt = "Initializing Terrain Texture " + (i + 1) + " of " + tTxts.length + "...";*
 *				yield;*
 _				splatPrototypes *= new SplatPrototype();*_
 <em>_				splatPrototypes*.texture = new Texture2D(4, 4, TextureFormat.DXT1, true);*_</em>
 <em><em>_				www.LoadImageIntoTexture(splatPrototypes*.texture);*_</em></em>
 <em><em><em>_				splatPrototypes*.texture.Apply(true);*_</em></em></em>
 <em><em><em><em>_				splatPrototypes*.texture.Compress(true);*_</em></em></em></em>
 <em><em><em><em><em>_				splatPrototypes*.tileSize = Vector2(parseInt(splatTxtSize[0]), parseInt(splatTxtSize[1]));*_</em></em></em></em></em>
 <em><em><em><em><em>_*			}*_</em></em></em></em></em>
 <em><em><em><em><em>_*		}*_</em></em></em></em></em>
 <em><em><em><em><em>_*	}*_</em></em></em></em></em>
 <em><em><em><em><em>_*	else {*_</em></em></em></em></em>
 <em><em><em><em><em>_*		splatPrototypes = new SplatPrototype[whirld.worldTerrainTextures.length];*_</em></em></em></em></em>
 <em><em><em><em><em>_*		for(i=0; i < whirld.worldTerrainTextures.length; i++) {*_</em></em></em></em></em>
 <em><em><em><em><em><em>_			splatPrototypes *= new SplatPrototype();*_</em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em>			splatPrototypes_.texture = whirld.worldTerrainTextures*;*_</em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_			splatPrototypes*.tileSize = Vector2(15, 15);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	trnDat.splatPrototypes = splatPrototypes;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	//Lightmap*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	if(tLtmp) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		whirld.statusTxt = "Downloading Terrain Lightmap (" + tName + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		www = new WWW(tLtmp);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		if (www.error != null) whirld.info += "
Terrain Lightmap Undownloadable: " + tName + " " + tLtmp + " (" + www.error + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		else {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			trnDat.lightmap = www.texture;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	//Splatmap*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	if(tSpmp) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		if(tSpmp2) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			whirld.statusTxt = "Downloading Augmentative Terrain Texturemap (" + tName + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			www = new WWW(tSpmp2);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			var mapColors2 = www.texture.GetPixels();*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		whirld.statusTxt = "Downloading Terrain Texturemap (" + tName + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		www = new WWW(tSpmp);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		whirld.progress = 0;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		whirld.statusTxt = "Mapping Terrain Textures...";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		yield;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		if (www.error != null) whirld.info += "
Terrain Texturemap Undownloadable: " + tName + " " + tLtmp + " (" + www.error + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		else {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			if (www.texture.format != TextureFormat.ARGB32 || www.texture.width != www.texture.height || Mathf.ClosestPowerOfTwo(www.texture.width) != www.texture.width) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				whirld.info += "
Terrain Splatmap Unusable: Splatmap must be in RGBA 32 bit format, square, and it's size a power of 2";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			else {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				trnDat.alphamapResolution = www.texture.width;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				var splatmapData = trnDat.GetAlphamaps(0, 0, www.texture.width, www.texture.width);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				var mapColors = www.texture.GetPixels();*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				var ht : int = www.texture.height;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				var wd : int = www.texture.width;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				for (y = 0; y < ht; y++) for (x = 0; x < wd; x++) for (z = 0; z < trnDat.alphamapLayers; z++) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_					if(z < 4) splatmapData[x,y,z] = mapColors[x * wd + y][z];_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_					else splatmapData[x,y,z] = mapColors2[x * wd + y][z-4];_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*				trnDat.SetAlphamaps(0, 0, splatmapData);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	//Details (rocks, trees, grass, etc)*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*	if(tDtmp) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		whirld.statusTxt = "Downloading Terrain Details (" + tDtmp + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		www = new WWW(tDtmp);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		if (www.error != null) whirld.info += "
Terrain Details Undownloadable: " + tName + " " + tDtmp + " (" + www.error + ")";*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*		else {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			var treePrototypes : Array = new Array();*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			var treeInstances : Array = new Array();*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			var treeProto : TreePrototype;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			var detailProto : DetailPrototype;*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			var detailPrototypes : Array = new Array();*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			file = new Ionic.Zlib.GZipStream(new MemoryStream(), Ionic.Zlib.CompressionMode.Decompress).UncompressString(www.bytes).Split("
"[0]);*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em>_*			for (i=0; i < file.length; i++) {*_</em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_				if(file *== "" || i == file.length - 1) { //Apply Existing Trees*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*					if(treeProto) {*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*						treePrototypes.Add(treeProto);*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*						treeProto = null;*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*						//continue;*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*					if(detailProto) {*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*						detailPrototypes.Add(detailProto);*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*						detailProto = null;*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*						//continue;*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em>				if(file_.length > 10 && file*.Substring(0, 10) == "detailmap2") {*_</em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em>_					whirld.statusTxt = "Downloading Augmentative Terrain Detail Map (" + whirld.getURL(file*.Substring(11)) + ")";*_</em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					www = new WWW(whirld.getURL(file*.Substring(11)));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					if (www.error != null) whirld.info += "
Augmentative Terrain Detail Map Undownloadable: " + tName + " " + file*.Substring(11) + " (" + www.error + ")";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						tex = www.texture;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						pixels = www.texture.GetPixels();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 4) var detLayer4 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 4);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 5) var detLayer5 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 5);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 6) var detLayer6 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 6);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 7) var detLayer7 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 7);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						i2 = 0;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						for(iY = 0; iY < trnDat.detailResolution; iY++) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							for(iX = 0; iX < trnDat.detailResolution; iX++) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 4) detLayer4[iX, iY] = Mathf.RoundToInt(pixels[i2].r * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 5) detLayer5[iX, iY] = Mathf.RoundToInt(pixels[i2].g * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 6) detLayer6[iX, iY] = Mathf.RoundToInt(pixels[i2].b * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 7) detLayer7[iX, iY] = Mathf.RoundToInt(pixels[i2].a * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*								i2 += 1;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>				else if(file_.length > 10 && file*.Substring(0, 9) == "detailmap") {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					whirld.statusTxt = "Downloading Terrain Detail Map (" + whirld.getURL(file*.Substring(10)) + ")";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					www = new WWW(whirld.getURL(file*.Substring(10)));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					if (www.error != null) whirld.info += "
Terrain Detail Map Undownloadable: " + tName + " " + file*.Substring(10) + " (" + www.error + ")";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						tex = www.texture;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						pixels = www.texture.GetPixels();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						trnDat.detailResolution = www.texture.width;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 0) var detLayer0 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 0);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 1) var detLayer1 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 1);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 2) var detLayer2 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 2);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(detailPrototypes.length > 3) var detLayer3 = trnDat.GetDetailLayer(0, 0, trnDat.detailResolution, trnDat.detailResolution, 3);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						i2 = 0;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						for(iY = 0; iY < trnDat.detailResolution; iY++) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							for(iX = 0; iX < trnDat.detailResolution; iX++) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 0) detLayer0[iX, iY] = Mathf.RoundToInt(pixels[i2].r * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 1) detLayer1[iX, iY] = Mathf.RoundToInt(pixels[i2].g * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 2) detLayer2[iX, iY] = Mathf.RoundToInt(pixels[i2].b * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_								if(detailPrototypes.length > 3) detLayer3[iX, iY] = Mathf.RoundToInt(pixels[i2].a * 16);_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*								i2 += 1;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_				else if(file *== "tree") { //Create new tree prototype*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					treeProto = new TreePrototype();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_				else if(file *== "detail") {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					detailProto = new DetailPrototype();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				else if(treeProto) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					if(file*.Substring(0, 1) == "m") {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_						//treeProto.prefab = Resources.Load(file*.Substring(2));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						//treeProto.prefab = Game.Controller.prefab;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						//prefab.AddComponent(MeshFilter);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						//prefab.AddComponent(MeshRenderer);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_						if(objects.ContainsKey(file*.Substring(2))) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeProto.prefab = prefabs.Pop();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_							treeProto.prefab.name = file*.Substring(2);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							if(!treeProto.prefab.GetComponent(MeshFilter)) treeProto.prefab.AddComponent(MeshFilter);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_							treeProto.prefab.GetComponent(MeshFilter).mesh = objects[file*.Substring(2)].GetComponent(MeshFilter).mesh;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							if(!treeProto.prefab.GetComponent(MeshRenderer)) treeProto.prefab.AddComponent(MeshRenderer);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_							treeProto.prefab.GetComponent(MeshRenderer).materials = objects[file*.Substring(2)].GetComponent(MeshRenderer).materials;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_							//treeProto.prefab = objects[file*.Substring(2)];*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_						else whirld.info += "
Terrain Detail Mesh not found: " + file*.Substring(2);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>					else if(file_.Substring(0, 1) == "b") treeProto.bendFactor = parseFloat(file*.Substring(2));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(file[i+1] == "") { //Read detail objects*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_						var treedat : String[] = file*.Split(";"[0]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						for(var tr : String in treedat) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							if(!tr) continue;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							var tree = tr.Split(","[0]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							if(!tree[0] || tree[0] == "") continue;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							var treeInstance = new TreeInstance();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstance.prototypeIndex = treePrototypes.length;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstance.position = Vector3(parseFloat(tree[0]), parseFloat(tree[1]), parseFloat(tree[2]));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstance.widthScale = parseFloat(tree[3]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstance.heightScale = parseFloat(tree[4]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							var c : float = Random.Range(.6, .7);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstance.color = Color(c - .15, c - .15, c - .15, 1);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstance.lightmapColor = Color(c + .15, c + .15, c + .15, 0);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							treeInstances.Add(treeInstance);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				else if(detailProto) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_					l = file*.Split(" "[0]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					if(l[0] == "pO") {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(objects.ContainsKey(l[1])) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							//detailProto.prototype = objects[l[1]];*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							detailProto.prototype = prefabs.Pop();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							detailProto.prototype.name = l[1];*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							if(!detailProto.prototype.GetComponent(MeshFilter)) detailProto.prototype.AddComponent(MeshFilter);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							detailProto.prototype.GetComponent(MeshFilter).mesh = objects[l[1]].GetComponent(MeshFilter).mesh;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							if(!detailProto.prototype.GetComponent(MeshRenderer)) detailProto.prototype.AddComponent(MeshRenderer);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							detailProto.prototype.GetComponent(MeshRenderer).material = objects[l[1]].GetComponent(MeshRenderer).material;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						else whirld.info += "
Terrain Detail Mesh not found: " + l[1];*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "pT") {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						l[1] = whirld.getURL(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						whirld.statusTxt = "Downloading Terrain Detail Texture (" + l[1] + ")";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						www = new WWW(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						while(!www.isDone) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							whirld.progress = www.progress;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							yield new WaitForSeconds(.1);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if (www.error != null) whirld.info += "
Terrain Detail Texture Undownloadable: " + l[1];*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						else {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							whirld.statusTxt = "Initializing " + vS[0] + "...";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							whirld.progress = 0;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							yield;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							mshTxt = new Texture2D(4, 4, TextureFormat.DXT5, true);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							www.LoadImageIntoTexture(mshTxt);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							mshTxt.Apply(true);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							mshTxt.Compress(true);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							mshTxt.wrapMode = TextureWrapMode.Clamp;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*							detailProto.prototypeTexture = mshTxt;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "minW") detailProto.minWidth = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "maxW") detailProto.maxWidth = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "minH") detailProto.minHeight = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "maxH") detailProto.maxHeight = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "nS") detailProto.noiseSpread = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "bF") detailProto.bendFactor = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "hC") detailProto.healthyColor = Color(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "dC") detailProto.dryColor = Color(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]));*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "lF") detailProto.lightmapFactor = parseFloat(l[1]);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "gL") detailProto.grayscaleLighting = (l[1] == "1" ? true : false);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "rM") {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						if(l[1] == "GrassBillboard") detailProto.renderMode = DetailRenderMode.GrassBillboard;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						else if(l[1] == "VertexLit") detailProto.renderMode = DetailRenderMode.VertexLit;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*						else detailProto.renderMode = DetailRenderMode.Grass;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*					else if(l[0] == "uM") detailProto.usePrototypeMesh = (l[1] == "1" ? true : false);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			trnDat.treePrototypes = treePrototypes.ToBuiltin(TreePrototype);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			trnDat.treeInstances = treeInstances.ToBuiltin(TreeInstance);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			trnDat.detailPrototypes = detailPrototypes.ToBuiltin(DetailPrototype);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 0) trnDat.SetDetailLayer(0, 0, 0, detLayer0);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 1) trnDat.SetDetailLayer(0, 0, 1, detLayer1);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 2) trnDat.SetDetailLayer(0, 0, 2, detLayer2);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 3) trnDat.SetDetailLayer(0, 0, 3, detLayer3);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 4) trnDat.SetDetailLayer(0, 0, 4, detLayer4);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 5) trnDat.SetDetailLayer(0, 0, 5, detLayer5);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 6) trnDat.SetDetailLayer(0, 0, 6, detLayer6);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			if(detailPrototypes.length > 7) trnDat.SetDetailLayer(0, 0, 7, detLayer7);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			//trnDat.RefreshPrototypes();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			//trnDat.RecalculateTreePositions();*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*		}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_		/*for(i=0; i<trnDat.treePrototypes.length; i++) {_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>			trnDat.treePrototypes<em>.prefab.name = trnDat.treePrototypes*.prefab.name.Replace(" ", "_");*</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>			MeshWriteObj(trnDat.treePrototypes_.prefab.GetComponent(MeshFilter), trnDat.treePrototypes*.prefab.name);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>			data = "[msh:" + trnDat.treePrototypes_.prefab.name + "," + trnDat.treePrototypes*.prefab.name + ".obj.gz]" + data;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>			trnV += (trnV != "" ? "

" : "") + "tree
m:" + trnDat.treePrototypes_.prefab.name + "
b:" + trnDat.treePrototypes*.bendFactor + "
";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			for(var tree : TreeInstance in trnDat.treeInstances) {*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				if(tree.prototypeIndex != i) continue;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*				trnV += tree.position.x.ToString("F1", System.Globalization.CultureInfo.InvariantCulture) + "," + tree.position.y.ToString("F1", System.Globalization.CultureInfo.InvariantCulture) + "," + tree.position.z.ToString("F1", System.Globalization.CultureInfo.InvariantCulture) + "," + tree.widthScale.ToString("F1", System.Globalization.CultureInfo.InvariantCulture) + "," + tree.heightScale.ToString("F1", System.Globalization.CultureInfo.InvariantCulture) + ";";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*			}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_		}*/_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	//Go!*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	var trnObj : GameObject = new GameObject(tName);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	trnObj.AddComponent(Terrain);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	trnObj.GetComponent(Terrain).terrainData = trnDat;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	trnObj.AddComponent(TerrainCollider);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	trnObj.GetComponent(TerrainCollider).terrainData = trnDat;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	objects.Add(tName, trnObj);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	GameObject.Destroy(trnObj);*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*	whirld.statusTxt = "";*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
 <em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*i++;*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>_*```*_</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em>

You can modify almost anything about terrain at runtime. However, as Jaap already outlined, the API is largely undocumented. But textures (splatmaps), trees, grass and detail meshes are all scriptable.

Yes, chopping down a tree is instant. If you search the forum or look at my website, I created a script to destroy trees at runtime.

Just a heads-up: The script Jaap Kreijkamp found appears to be from the "Whirld" project on the Unify Community wiki.