コード例 #1
0
    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);
        }
    }
コード例 #2
0
    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);
    }