Exemplo n.º 1
0
        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();
                }
            }
        }
Exemplo n.º 2
0
        // 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;
                }
            }
        }