private void updateTerrainTexture() { Terrain terr = Terrain.activeTerrain; if (terr != null) { List <SplatPrototype> prototypes = new List <SplatPrototype>(); NodeManager.OrderValueFun orderFun = (n) => { if (n.node.value.getNodeType() == NodeType.TextureOutput) { return(((TextureOutput)n.node.value).paintOrder); } return(0); }; nodeManager.forEachNodes_Sorted(orderFun, (n) => { if (n.node.value.getNodeType() == NodeType.TextureOutput) { TextureOutput texNode = (TextureOutput)(n.node.value); if (texNode.Texture != null) { texNode.textureIndex = prototypes.Count; SplatPrototype p = new SplatPrototype(); p.texture = texNode.Texture; p.normalMap = texNode.Normal; p.tileSize = new Vector2(texNode.texSizeX, texNode.texSizeY); prototypes.Add(p); } } }); terr.terrainData.splatPrototypes = prototypes.ToArray(); int w = terr.terrainData.alphamapWidth; int h = terr.terrainData.alphamapHeight; float[,] totalAlpha = new float[w, h]; float scaleX = terr.terrainData.heightmapWidth / ((float)w); float scaleY = terr.terrainData.heightmapHeight / ((float)w); int layers = terr.terrainData.alphamapLayers; float[, ,] alphaDatas = new float[w, h, layers];//terr.terrainData.GetAlphamaps(0, 0, w, h); for (int l = layers - 1; l >= 0; l--) { NodeBase tempNode = null; nodeManager.forEachNodes((n) => { if (n.node.value.getNodeType() == NodeType.TextureOutput) { if (((TextureOutput)n.node.value).paintOrder == l) { tempNode = n.node.value; } } }); if (tempNode != null) { float[,] values = tempNode.update(nodeManager.seed, nodeManager.baseX, nodeManager.baseY, w, h, scaleX, scaleY); for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { if (totalAlpha[i, j] + values[i, j] <= 1.00001f) { alphaDatas[i, j, l] = values[i, j]; totalAlpha[i, j] += values[i, j]; } else { alphaDatas[i, j, l] = 1f - totalAlpha[i, j]; totalAlpha[i, j] = 1f; } } } } } terr.terrainData.SetAlphamaps(0, 0, alphaDatas); } }
void OnGUI() { GUILayout.Space(10); GUILayout.BeginHorizontal(); if (GUILayout.Button("New")) { DoNew(); } if (GUILayout.Button("Load")) { DoLoad(); } if (GUILayout.Button("Save")) { DoSave(); } GUILayout.Space(100); GUILayout.EndHorizontal(); GUILayout.Space(10); //hillSize = EditorGUILayout.Slider("hillSize", hillSize, 0f, 1f); //texture = (Texture2D)EditorGUILayout.ObjectField("Texture", texture, typeof(Texture2D), true); //texture2 = (Texture2D)EditorGUILayout.ObjectField("Texture", texture2, typeof(Texture2D), true); //tree = (Tree)EditorGUILayout.ObjectField("Tree", tree, typeof(UnityEngine.Tree), true); //GUILayout.FlexibleSpace(); nodeManager.seed = EditorGUILayout.IntField("seed", nodeManager.seed); nodeManager.baseX = EditorGUILayout.IntField("offset.x", nodeManager.baseX); nodeManager.baseY = EditorGUILayout.IntField("offset.y", nodeManager.baseY); NodeManager.OrderValueFun orderFun = (n) => { if (n.node.value.getNodeType() == NodeType.HeightOutput) { return(0); } else if (n.node.value.getNodeType() == NodeType.TextureOutput) { return(((TextureOutput)n.node.value).paintOrder + 1000); } else if (n.node.value.getNodeType() == NodeType.GrassOutput) { return(2000); } else if (n.node.value.getNodeType() == NodeType.TreeOutput) { return(3000); } return(0); }; nodeManager.forEachNodes_Sorted(orderFun, (n) => n.node.value.OnMainGUI(gui)); GUILayout.Space(10); GUILayout.BeginHorizontal(); if (GUILayout.Button(" Generate ")) { DoGenerate(); } if (GUILayout.Button("Advance>>")) { DoAdvance(); } GUILayout.EndHorizontal(); GUILayout.Space(10); }