private void Update() { lock (ChunksAwaitingMeshApplying) { // When chunks are queued for re-generation run the below while (ChunksAwaitingMeshApplying.Count > 0) { if (_update >= _updatesPerFrame) { _update = 0; break; } TerrainChunk chunk = ChunksAwaitingMeshApplying.Dequeue(); chunk.GenerateChunkNeighbours(_generateChunkNeighboursSteps); if (!IsMultiThreaded) chunk.GenerateChunkMesh(chunk.LODLevel, true); // Check if a chunk should generation or delete objects if (MathUtility.CompareLodLevel(chunk.LODLevel, FarLodSize)) { ObjectManager.RemoveObjectsAtChunk(chunk); } else { if (chunk.IsForcedObjectGeneration) { chunk.IsForcedObjectGeneration = false; ObjectManager.PlaceObjectsAtChunk(chunk); } } chunk.UpdateChunkMesh(); _update++; } } }
public override void OnInspectorGUI() { DrawDefaultInspector(); TerrainChunk chunk = (TerrainChunk)target; if (GUILayout.Button("ReGenerate Chunk Mesh")) { chunk.GenerateChunkMesh(); } }
public void ThreadedWork() { while (IsRunning) { if (TerrainGeneration.ChunksAwaitingMeshRecaluation.Count > 0) { TerrainChunk chunk = TerrainGeneration.ChunksAwaitingMeshRecaluation.Dequeue(); if (chunk) { chunk.GenerateChunkMesh(chunk.LODLevel, chunk.IsForcedGeneration); TerrainGeneration.ChunksAwaitingMeshApplying.Enqueue(chunk); } } } Debug.Log("Thread Ended"); }