public void CullChunks() { Vector3 checkPosition; Vector3 checkSize; checkSize.x = Chunk.SIZE; checkSize.y = Chunk.SIZE; checkSize.z = Chunk.SIZE; UpdateCameraFrustrumPlanes(); int numberOfChunks = ChunkRepository.NumberOfChunks(); for (int chunkIndex = 0; chunkIndex < numberOfChunks; chunkIndex++) { Chunk chunk = ChunkRepository.GetChunkAtIndex(chunkIndex); checkPosition.x = chunk.WorldPosition().x *Chunk.SIZE + Chunk.SIZE / 2; checkPosition.y = chunk.WorldPosition().y *Chunk.SIZE + Chunk.SIZE / 2; checkPosition.z = chunk.WorldPosition().z *Chunk.SIZE + Chunk.SIZE / 2; if (CubeIsWithinFrustrum(checkPosition, checkSize)) { chunk.Show(); } else { chunk.Hide(); } } }
// TODO -- Split up this function to make it shorter and more manageable public void CleanupOldChunks() { // TODO -- This is a weird place to update the worldviewposition worldViewPositionX = (int)(Camera.main.transform.position.x / Chunk.SIZE); worldViewPositionZ = (int)(Camera.main.transform.position.z / Chunk.SIZE); for (int xIttr = 0; xIttr < Configuration.CHUNK_VIEW_DISTANCE * 2 + 1; xIttr++) { for (int yIttr = 0; yIttr < chunkArrayHeight; yIttr++) { for (int zIttr = 0; zIttr < Configuration.CHUNK_VIEW_DISTANCE * 2 + 1; zIttr++) { loadedChunksCheckArray[xIttr, yIttr, zIttr] = false; } } } // Get rid of chunks that are too far from the camera for (int chunkIndex = 0; chunkIndex < ChunkRepository.NumberOfChunks(); chunkIndex++) { Chunk chunk = ChunkRepository.GetChunkAtIndex(chunkIndex); // If the chunk is out of range now, return it int xDiff = Mathf.Abs(chunk.WorldPosition().x - worldViewPositionX); int zDiff = Mathf.Abs(chunk.WorldPosition().z - worldViewPositionZ); if ((xDiff > Configuration.CHUNK_VIEW_DISTANCE) || (zDiff > Configuration.CHUNK_VIEW_DISTANCE)) { ChunkSpacePosition location = chunk.WorldPosition(); ChunkRepository.SetChunkAtPosition(location, null); ChunkRepository.Remove(chunk); chunk.MarkForUnload(); unloadChunksList.Add(chunk); } else { int markX = (chunk.WorldPosition().x - worldViewPositionX) + Configuration.CHUNK_VIEW_DISTANCE; int markZ = (chunk.WorldPosition().z - worldViewPositionZ) + Configuration.CHUNK_VIEW_DISTANCE; loadedChunksCheckArray[markX, chunk.WorldPosition().y, markZ] = true; } } }