// Updates our clipmap region. Has to be set from the outside!
        private void UpdateRanges()
        {
            // Make sure horizontal ranges are always correct
            HorizontalChunkLoadRadius = Mathf.Max(HorizontalMinRange, HorizontalChunkLoadRadius);
            HorizontalChunkLoadRadius = Mathf.Min(HorizontalMaxRange, HorizontalChunkLoadRadius);

            // Make sure vertical ranges are always correct
            VerticalChunkLoadRadius = Mathf.Max(VerticalMinRange, VerticalChunkLoadRadius);
            VerticalChunkLoadRadius = Mathf.Min(VerticalMaxRange, VerticalChunkLoadRadius);

            bool isDifferenceXZ = HorizontalChunkLoadRadius != m_chunkHorizontalLoadRadiusPrev || m_chunkPositions == null;
            bool isDifferenceY  = VerticalChunkLoadRadius != m_chunkVerticalLoadRadiusPrev;

            m_chunkHorizontalLoadRadiusPrev = HorizontalChunkLoadRadius;
            m_chunkVerticalLoadRadiusPrev   = VerticalChunkLoadRadius;

            // Rebuild precomputed chunk positions
            if (isDifferenceXZ)
            {
                m_chunkPositions = ChunkLoadOrder.ChunkPositions(HorizontalChunkLoadRadius);
            }
            // Invalidate prev pos so that updated ranges can take effect right away
            if (isDifferenceXZ || isDifferenceY ||
                HorizontalChunkLoadRadius != m_chunkHorizontalLoadRadiusPrev ||
                VerticalChunkLoadRadius != m_chunkVerticalLoadRadiusPrev)
            {
                OnUpdateRanges();

                m_viewerPosPrev = m_viewerPos + Vector3Int.one; // Invalidate prev pos so that updated ranges can take effect right away
            }
        }
        protected override void OnProcessChunk(Chunk chunk)
        {
            Profiler.BeginSample("ProcessChunk");

            int xd = (m_viewerPos.x - chunk.Pos.x) / Env.ChunkSize;
            int yd = (m_viewerPos.y - chunk.Pos.y) / Env.ChunkSize;
            int zd = (m_viewerPos.z - chunk.Pos.z) / Env.ChunkSize;

            // Remove the chunk if it is too far away
            if (
                !ChunkLoadOrder.CheckXZ(xd, zd, HorizontalChunkLoadRadius) ||
                !ChunkLoadOrder.CheckY(yd, VerticalChunkLoadRadius)
                )
            {
                chunk.RequestRemoval();
            }
            else
            {
                // Dummy collider example - create a collider for chunks directly surrounding the viewer
                chunk.NeedsColliderGeometry = Helpers.Abs(xd) <= 1 && Helpers.Abs(yd) <= 1 && Helpers.Abs(zd) <= 1;

                if (!UseFrustumCulling)
                {
                    // Update visibility information
                    chunk.NeedsRenderGeometry = true;
                    chunk.PossiblyVisible     = true;
                }
            }

            Profiler.EndSample();
        }
Beispiel #3
0
 void Start()
 {
     chunks         = vm.components.chunks;
     chunkSize      = chunks.chunkSize;
     chunkPositions = ChunkLoadOrder.ChunkPositions(chunkLoadRadius);
     distanceToDeleteInUnitsSquared  = (int)(DistanceToDeleteChunks * chunkSize * chunks.blockSize);
     distanceToDeleteInUnitsSquared *= distanceToDeleteInUnitsSquared;
 }
Beispiel #4
0
        public bool CheckInsideWorld(Vector3Int pos)
        {
            int offsetX = (Bounds.maxX + Bounds.minX) >> 1;
            int offsetZ = (Bounds.maxZ + Bounds.minZ) >> 1;

            int xx = (pos.x - offsetX) / Env.ChunkSize;
            int zz = (pos.z - offsetZ) / Env.ChunkSize;
            int yy = pos.y / Env.ChunkSize;
            int horizontalRadius = (Bounds.maxX - Bounds.minX) / (2 * Env.ChunkSize);

            return(ChunkLoadOrder.CheckXZ(xx, zz, horizontalRadius) &&
                   yy >= (Bounds.minY / Env.ChunkSize) && yy <= (Bounds.maxY / Env.ChunkSize));
        }
        private void OnDrawGizmosSelected()
        {
            if (!enabled)
            {
                return;
            }

            float size      = Env.ChunkSize * Env.BlockSize;
            float halfSize  = size * 0.5f;
            float smallSize = size * 0.25f;

            if (world != null && (Diag_DrawWorldBounds || Diag_DrawLoadRange))
            {
                foreach (Chunk chunk in world.Chunks)
                {
                    if (Diag_DrawWorldBounds)
                    {
                        // Make central chunks more apparent by using yellow color
                        bool isCentral = chunk.Pos.x == m_viewerPos.x || chunk.Pos.y == m_viewerPos.y || chunk.Pos.z == m_viewerPos.z;
                        Gizmos.color = isCentral ? Color.yellow : Color.blue;
                        Vector3 chunkCenter = new Vector3(
                            chunk.Pos.x + (Env.ChunkSize >> 1),
                            chunk.Pos.y + (Env.ChunkSize >> 1),
                            chunk.Pos.z + (Env.ChunkSize >> 1)
                            );
                        Vector3 chunkSize = new Vector3(Env.ChunkSize, Env.ChunkSize, Env.ChunkSize);
                        Gizmos.DrawWireCube(chunkCenter, chunkSize);
                    }

                    if (Diag_DrawLoadRange)
                    {
                        Vector3Int pos = chunk.Pos;
                        int        xd  = (m_viewerPos.x - chunk.Pos.x) / Env.ChunkSize;
                        int        zd  = (m_viewerPos.z - chunk.Pos.z) / Env.ChunkSize;

                        if (ChunkLoadOrder.CheckXZ(xd, zd, HorizontalChunkLoadRadius))
                        {
                            Gizmos.color = Color.green;
                            Gizmos.DrawWireCube(
                                new Vector3(chunk.Pos.x + halfSize, 0, chunk.Pos.z + halfSize),
                                new Vector3(size - 1f, 0, size - 1f)
                                );
                        }
                        else
                        {
                            Gizmos.color = Color.red;
                            Gizmos.DrawWireCube(
                                new Vector3(chunk.Pos.x + halfSize, 0, chunk.Pos.z + halfSize),
                                new Vector3(size - 1f, 0, size - 1f)
                                );
                        }

                        // Show generated chunks
                        if (chunk.IsStateCompleted(ChunkState.Generate))
                        {
                            Gizmos.color = Color.magenta;
                            Gizmos.DrawWireCube(
                                new Vector3(chunk.Pos.x + halfSize, 0, chunk.Pos.z + halfSize),
                                new Vector3(smallSize - 0.05f, 0, smallSize - 0.05f)
                                );
                        }
                    }
                }
            }
        }