public void UpdateChildren()
        {
            lodLevel = newLodLevel;
            while (transform.childCount > 0)
            {
                DestroyImmediate(transform.GetChild(0).gameObject);
            }

            SetNodeSkirts(trees[lodLevel]);
            if (lodLevel <= 1)
            {
                int[] layerIndices = new int[trees[0].validNums.Length];
                int   maxIndex     = trees[0].GetMaxValidNumIndex();
                for (int i = 0; i < trees[0].validNums.Length; i++)
                {
                    layerIndices[i == maxIndex ? 0 : (i < maxIndex ? i + 1 : i)] = i;
                }
                Mesh mesh = TerrainToMeshTool.CreateMesh(trees[lodLevel], terrainData, heights, layerIndices);

                GameObject   obj      = new GameObject("layer_lod_" + lodLevel);
                MeshRenderer renderer = obj.AddComponent <MeshRenderer>();
                MeshFilter   filter   = obj.AddComponent <MeshFilter>();
                obj.transform.SetParent(transform, false);
                filter.sharedMesh = mesh;
                Material[] sharedMaterials = new Material[mesh.subMeshCount];
                for (int i = 0; i < mesh.subMeshCount; i++)
                {
                    sharedMaterials[i] = (i == 0) ? matFirst[layerIndices[i]] : matAdd [layerIndices[i]];
                }
                renderer.sharedMaterials = sharedMaterials;
            }
            else
            {
                Mesh mesh = TerrainToMeshTool.CreateMesh(trees[lodLevel], terrainData, heights, new int[] { 0 });

                GameObject   obj      = new GameObject("base_lod_" + lodLevel);
                MeshRenderer renderer = obj.AddComponent <MeshRenderer>();
                MeshFilter   filter   = obj.AddComponent <MeshFilter>();
                renderer.sharedMaterial = matBase;
                filter.sharedMesh       = mesh;
                obj.transform.SetParent(transform, false);
            }
        }
Esempio n. 2
0
        //创建某个级别的LOD的网格
        public List <Renderer> CreateRenderersForOneLodLevel(int lod)
        {
            List <Renderer> lodRenderers = new List <Renderer>(10);

            if (lod >= 0 && lod < lodMeshInfos.Length)
            {
                lodRenderers.Clear();
                if (lod < 2)
                {
                    bool[] layerValid = new bool[lodMeshInfos[lod].layerIndices.Length];

                    if (layerType == LayerType.SubMesh)
                    {
                        for (int i = 0; i < lodMeshInfos[lod].layerIndices.Length; i++)
                        {
                            if (lodMeshInfos[lod].indices[lodMeshInfos[lod].layerIndices[i]].Length > 0)
                            {
                                layerValid[i] = true;
                            }
                        }
                        Mesh         mesh     = TerrainToMeshTool.CreateMesh(terrainData, heights, lodMeshInfos[lod].intVertices, lodMeshInfos[lod].vecNormals, lodMeshInfos[lod].indices, -1);
                        MeshRenderer renderer = CreateMeshRenderer_SubMesh(mesh, layerValid, lodMeshInfos[lod].layerIndices, lod);
                        if (renderer)
                        {
                            lodRenderers.Add(renderer);
                        }
                    }
                    else if (layerType == LayerType.SingleMesh_Max4Layer)
                    {
                        Mesh         mesh     = TerrainToMeshTool.CreateMesh(terrainData, heights, lodMeshInfos[lod].intVertices, lodMeshInfos[lod].vecNormals, lodMeshInfos[lod].indices, 0);
                        MeshRenderer renderer = CreateMeshRenderer_SingleMesh(mesh, lod);
                        if (renderer)
                        {
                            lodRenderers.Add(renderer);
                        }
                    }
                    else if (layerType == LayerType.SingleMesh_LayerIndexTexture)
                    {
                        Mesh         mesh     = TerrainToMeshTool.CreateMesh(terrainData, heights, lodMeshInfos[lod].intVertices, lodMeshInfos[lod].vecNormals, lodMeshInfos[lod].indices, 0);
                        MeshRenderer renderer = CreateMeshRenderer_SingleMesh_TextureIndex(mesh, lod);
                        if (renderer)
                        {
                            lodRenderers.Add(renderer);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < lodMeshInfos[lod].layerIndices.Length; i++)
                        {
                            Mesh         mesh     = TerrainToMeshTool.CreateMesh(terrainData, heights, lodMeshInfos[lod].intVertices, lodMeshInfos[lod].vecNormals, lodMeshInfos[lod].indices, i);
                            MeshRenderer renderer = CreateMeshRenderer_OneOfMultiMesh(mesh, lodMeshInfos[lod].layerIndices[i], i == 0, lod);
                            if (renderer)
                            {
                                lodRenderers.Add(renderer);
                            }
                        }
                    }
                }
                else
                {
                    List <TerrainToMeshTool.VecInt3>   intVertices = TerrainToMeshTool.GetIntVertices(trees[lod]);
                    List <TerrainToMeshTool.VecNormal> vecNormals  = TerrainToMeshTool.GetNormals(intVertices, terrainData);
                    List <int[]> indices = TerrainToMeshTool.GetIndices(trees[lod], new int[] { 0 });

                    Mesh mesh = TerrainToMeshTool.CreateMesh(terrainData, heights, intVertices, vecNormals, indices, 0);

                    GameObject   obj      = new GameObject("base_lod_" + lod);
                    MeshRenderer renderer = obj.AddComponent <MeshRenderer>();
                    MeshFilter   filter   = obj.AddComponent <MeshFilter>();
                    renderer.sharedMaterial = matBase;
                    filter.sharedMesh       = mesh;
                    obj.transform.SetParent(transform, false);
                    lodRenderers.Add(renderer);
                }
            }
            return(lodRenderers);
        }