private void RecacheChunks() { foreach (var chunk in m_chunkStorage.Values.Where(chunk => !IsInCacheRange(chunk))) { m_chunkStorage.Remove(chunk.ChunkCachePosition.X, chunk.ChunkCachePosition.Y, chunk.ChunkCachePosition.Z); chunk.PrepForRemoval(); } m_processingQueue.Clear(); var toAdd = new List<Chunk>(); var chunkPosition = new Vector3Int((int)(m_cacheCenterPosition.X / Chunk.SizeInBlocks), (int)(m_cacheCenterPosition.Y / Chunk.SizeInBlocks), ((int)m_cacheCenterPosition.Z / Chunk.SizeInBlocks)); for (var z = -CacheRange; z <= CacheRange; z++) { for (var y = -CacheRange; y <= CacheRange; y++) { for (var x = -CacheRange; x <= CacheRange; x++) { Chunk chunk; if (!m_chunkStorage.ContainsKey(chunkPosition.X + x, chunkPosition.Y + y, chunkPosition.Z + z)) { chunk = new Chunk( new Vector3Int(chunkPosition.X + x, chunkPosition.Y + y, chunkPosition.Z + z), Blocks, BlockIndexByWorldPosition, GetNeighborChunk); m_chunkStorage[ chunk.ChunkCachePosition.X, chunk.ChunkCachePosition.Y, chunk.ChunkCachePosition.Z] = chunk; } else { chunk = m_chunkStorage[chunkPosition.X + x, chunkPosition.Y + y, chunkPosition.Z + z]; } if ((IsInViewRange(chunk) && chunk.ChunkState == ChunkState.Ready) || (!IsInViewRange(chunk) && chunk.ChunkState == ChunkState.AwaitingLighting)) { continue; } toAdd.Add(chunk); } } } var center = new Vector3(m_cacheCenterPosition.X - Chunk.SizeInBlocks / 2, m_cacheCenterPosition.Y - Chunk.SizeInBlocks / 2, m_cacheCenterPosition.Z - Chunk.SizeInBlocks / 2); toAdd.Sort((chunk1, chunk2) => { var ret = (int) (chunk1.Position.DistanceSquared(ref center) - chunk2.Position.DistanceSquared(ref center)); if (ret == 0) { return (chunk2.ChunkState - chunk1.ChunkState); } return ret; }); foreach (var chunk in toAdd) { m_processingQueue.Enqueue(chunk); } }
private void ProcessChunkInViewRange(Chunk chunk) { switch (chunk.ChunkState) { case ChunkState.AwaitingGenerate: chunk.ChunkState = ChunkState.Generating; //TerrainGenerator.Instance.GenerateDataForChunk(chunk.Position.X, chunk.Position.Y, chunk.Position.Z, Chunk.SizeInBlocks, Blocks, BlockIndexByWorldPosition); PageManager.Instance.LoadOrCreateChunk(chunk.Position, Blocks, BlockIndexByWorldPosition); chunk.UpdateBoundingBox(); chunk.ChunkState = ChunkState.AwaitingLighting; goto case ChunkState.AwaitingLighting; case ChunkState.AwaitingLighting: chunk.ChunkState = ChunkState.Lighting; m_lightingEngine.Process(chunk.Position.X, chunk.Position.Y, chunk.Position.Z); chunk.ChunkState = ChunkState.AwaitingBuild; goto case ChunkState.AwaitingBuild; case ChunkState.AwaitingBuild: chunk.ChunkState = ChunkState.Building; m_vertexBuilder.Build(chunk); chunk.ChunkState = ChunkState.Ready; break; } }
private Chunk GetNeighborChunk(Chunk origin, FaceDirection edge) { switch (edge) { case FaceDirection.XDecreasing: return GetChunkByRelativePosition(origin.ChunkCachePosition.X - 1, origin.ChunkCachePosition.Y, origin.ChunkCachePosition.Z); case FaceDirection.XIncreasing: return GetChunkByRelativePosition(origin.ChunkCachePosition.X + 1, origin.ChunkCachePosition.Y, origin.ChunkCachePosition.Z); case FaceDirection.YDecreasing: return GetChunkByRelativePosition(origin.ChunkCachePosition.X, origin.ChunkCachePosition.Y - 1, origin.ChunkCachePosition.Z); case FaceDirection.YIncreasing: return GetChunkByRelativePosition(origin.ChunkCachePosition.X, origin.ChunkCachePosition.Y + 1, origin.ChunkCachePosition.Z); case FaceDirection.ZDecreasing: return GetChunkByRelativePosition(origin.ChunkCachePosition.X, origin.ChunkCachePosition.Y, origin.ChunkCachePosition.Z - 1); case FaceDirection.ZIncreasing: return GetChunkByRelativePosition(origin.ChunkCachePosition.X, origin.ChunkCachePosition.Y, origin.ChunkCachePosition.Z + 1); default: return null; } }
private void ProcessChunkInCacheRange(Chunk chunk) { if (chunk.ChunkState != ChunkState.AwaitingGenerate) { return; } chunk.ChunkState = ChunkState.Generating; //TerrainGenerator.Instance.GenerateDataForChunk(chunk.Position.X, chunk.Position.Y, chunk.Position.Z, Chunk.SizeInBlocks, Blocks, BlockIndexByWorldPosition); PageManager.Instance.LoadOrCreateChunk(chunk.Position, Blocks, BlockIndexByWorldPosition); chunk.UpdateBoundingBox(); chunk.ChunkState = ChunkState.AwaitingLighting; }
public bool IsInViewRange(Chunk chunk) { return m_viewRangeBoundingBox.Contains(chunk.BoundingBox) != ContainmentType.Disjoint; }