Esempio n. 1
0
 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);
     }
 }
Esempio n. 2
0
 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;
     }
 }
Esempio n. 3
0
 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;
     }
 }
Esempio n. 4
0
 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;
 }
Esempio n. 5
0
 public bool IsInViewRange(Chunk chunk)
 {
     return m_viewRangeBoundingBox.Contains(chunk.BoundingBox) != ContainmentType.Disjoint;
 }