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()); } }); }