private void OnTerrainChunkVisibilityChanged(TerrainChunk chunk, bool isVisible)
 {
     //Debug.Log($"Changed visibility from '{chunk}' to {(isVisible ? "visible" : "hidden")}");
     if (isVisible)
     {
         _visibleTerrainChunks.Add(chunk);
     }
     else
     {
         _visibleTerrainChunks.Remove(chunk);
     }
 }
        private void UpdateVisibleChunks()
        {
            var alreadyUpdatedChunkCoords = new HashSet <Vector2>();

            for (var i = _visibleTerrainChunks.Count - 1; i >= 0; i--)
            {
                alreadyUpdatedChunkCoords.Add(_visibleTerrainChunks[i].Coord);
                _visibleTerrainChunks[i].UpdateTerrainChunk();
            }

            Debug.Log($"Visible chunks: {alreadyUpdatedChunkCoords.Count}");

            var currentChunkCoordX = Mathf.RoundToInt(_viewerPosition.x / _meshWorldSize);
            var currentChunkCoordY = Mathf.RoundToInt(_viewerPosition.y / _meshWorldSize);

            Debug.Log($"Iterating offset (x/z) from {-_chunksVisibleInViewDst} to {_chunksVisibleInViewDst} ({_chunksVisibleInViewDst * 4})");

            for (var yOffset = -_chunksVisibleInViewDst; yOffset <= _chunksVisibleInViewDst; yOffset++)
            {
                for (var xOffset = -_chunksVisibleInViewDst; xOffset <= _chunksVisibleInViewDst; xOffset++)
                {
                    var viewedChunkCoord = new Vector2(currentChunkCoordX + xOffset, currentChunkCoordY + yOffset);
                    if (!alreadyUpdatedChunkCoords.Contains(viewedChunkCoord))
                    {
                        if (_terrainChunkDictionary.ContainsKey(viewedChunkCoord))
                        {
                            //Debug.Log($"[{viewedChunkCoord.ToRoundedString()}] Updating already loaded chunk.");
                            _terrainChunkDictionary[viewedChunkCoord].UpdateTerrainChunk();
                        }
                        else
                        {
                            //Debug.Log($"[{viewedChunkCoord}] Loading chunk.");

                            var newChunk = new TerrainChunk(viewedChunkCoord, heightMapSettings, meshSettings, detailLevels,
                                                            colliderLodIndex, transform, mapMaterial);
                            _terrainChunkDictionary.Add(viewedChunkCoord, newChunk);
                            newChunk.OnVisibilityChanged += OnTerrainChunkVisibilityChanged;
                            newChunk.Load();
                        }
                    }
                }
            }

            OnTerrainUpdated();
        }