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(); }