Exemple #1
0
        internal void Internal_UpdateLODsAsync(HashSet <Vector2> vertexPool)
        {
            LOD lod0 = new LOD(0, new Renderer[] { MeshRendererComponent });

            LodGroupComponent.SetLODs(new LOD[] { lod0 });
            if (Terrain.TerrainData.Geometry.LODCount == 1)
            {
                GUtilities.ClearChildren(transform);
            }

            for (int i = 1; i < Terrain.TerrainData.Geometry.LODCount; ++i)
            {
                GTerrainChunkLOD chunkLod = GetChunkLOD(i);
                chunkLod.MeshRendererComponent.enabled = false;
            }

            int  meshResolution            = 0;
            Rect uvRange                   = GetUvRange();
            HashSet <Vector2> seamVertices = new HashSet <Vector2>();

            subDivTree.ForEachLeaf(n =>
            {
                if (!GUtilities.IsRectContainPointExclusive(uvRange, n.V0))
                {
                    seamVertices.Add(n.V0);
                }
                if (!GUtilities.IsRectContainPointExclusive(uvRange, n.V1))
                {
                    seamVertices.Add(n.V1);
                }
                if (!GUtilities.IsRectContainPointExclusive(uvRange, n.V2))
                {
                    seamVertices.Add(n.V2);
                }
                meshResolution = Mathf.Max(meshResolution, n.Level);
            });

            ThreadPool.QueueUserWorkItem(state =>
            {
                try
                {
                    GSubDivisionTree[] lodTrees = new GSubDivisionTree[Terrain.TerrainData.Geometry.LODCount];
                    for (int level = 1; level < Terrain.TerrainData.Geometry.LODCount; ++level)
                    {
                        int i = level;
                        int baseResolution = Terrain.TerrainData.Geometry.PolygonDistribution == GPolygonDistributionMode.Dynamic ?
                                             Terrain.TerrainData.Geometry.MeshBaseResolution :
                                             0;
                        int targetResolution = Mathf.Max(baseResolution, meshResolution - i);
                        lodTrees[i]          = subDivTree.Clone(targetResolution);
                        StitchSeamLOD(lodTrees[i], seamVertices);
                        //StitchGeometrySeamsOnSubDivTree(vertexPool, lodTrees[i]);
                        EnqueueMainThreadJob(() =>
                        {
                            Mesh meshLod = GetMesh(i);
                            UpdateMesh(meshLod, lodTrees[i]);
                            GTerrainChunkLOD chunkLod = GetChunkLOD(i);
                            chunkLod.MeshFilterComponent.sharedMesh = meshLod;
                        });
                    }

                    EnqueueMainThreadJob(() =>
                    {
                        float transitionStep = 1.0f / Terrain.TerrainData.Geometry.LODCount;

                        LOD[] lods = new LOD[Terrain.TerrainData.Geometry.LODCount];
                        lods[0]    = new LOD(
                            GGriffinSettings.Instance.LodTransition.Evaluate(transitionStep),
                            new Renderer[] { MeshRendererComponent });

                        for (int level = 1; level < Terrain.TerrainData.Geometry.LODCount; ++level)
                        {
                            int i   = level;
                            lods[i] = new LOD(
                                GGriffinSettings.Instance.LodTransition.Evaluate((i + 1) * transitionStep),
                                new Renderer[] { GetChunkLOD(i).MeshRendererComponent });

                            GTerrainChunkLOD chunkLod = GetChunkLOD(i);
                            chunkLod.MeshRendererComponent.enabled = true;
                        }

                        LodGroupComponent.SetLODs(lods);
                        Internal_UpdateRenderer();
                    });
                }
                catch (System.Exception e)
                {
                    Debug.Log(e.ToString());
                }
            });
        }