/// <summary> /// Gets the chunk at the target chunk position. /// </summary> /// <param name="chunkPos">The chunk position.</param> /// <param name="create">Whether or not to create the chunk if it doesn't currently exist.</param> /// <returns>The chunk, or null if it doesn't exist.</returns> private Chunk GetChunk(ChunkPosition chunkPos, bool create) { var chunk = World.GetChunk(chunkPos); if (chunk != null || !create) { return(chunk); } chunk = World.CreateChunk(chunkPos); bool remesh = ChunkLoader.LoadSync(chunk); if (remesh) { m_DirtyChunks.Add(chunkPos); m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(0)); m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(1)); m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(2)); m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(3)); m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(4)); m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(5)); RemeshDirtyChunks(); } return(chunk); }
/// <summary> /// Determines which chunks should be remeshed based on the given block position. /// </summary> /// <param name="blockPos">The local block position.</param> /// <param name="chunkPos">The chunk position.</param> private void RemeshEffectedChunks(BlockPosition blockPos, ChunkPosition chunkPos) { m_DirtyChunks.Add(chunkPos); if (blockPos.X == 0) { m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(1)); } if (blockPos.X == World.ChunkSize.Mask) { m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(0)); } if (blockPos.Y == 0) { m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(3)); } if (blockPos.Y == World.ChunkSize.Mask) { m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(2)); } if (blockPos.Z == 0) { m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(5)); } if (blockPos.Z == World.ChunkSize.Mask) { m_DirtyChunks.Add(chunkPos.ShiftAlongDirection(4)); } }