diff --git a/Runtime/Mapbox/VectorModule/VectorLayerModule.cs b/Runtime/Mapbox/VectorModule/VectorLayerModule.cs index a3af98ef4..71dc70884 100644 --- a/Runtime/Mapbox/VectorModule/VectorLayerModule.cs +++ b/Runtime/Mapbox/VectorModule/VectorLayerModule.cs @@ -25,6 +25,7 @@ public class VectorLayerModule : ILayerModule private HashSet _retainedTiles; private HashSet _activeTiles; private HashSet _readyTiles; + private HashSet _visibleTiles; public VectorLayerModule(IMapInformation mapInformation, Source source, MeshGenerationUnit meshGenerator, VectorModuleSettings vectorModuleSettings = null) : base() { @@ -36,6 +37,7 @@ public VectorLayerModule(IMapInformation mapInformation, Source sour _vectorSource.CacheItemDisposed += ClearDisposedDataVisual; _retainedTiles = new HashSet(); _activeTiles = new HashSet(); + _visibleTiles = new HashSet(); } public virtual IEnumerator Initialize() @@ -79,13 +81,29 @@ public virtual bool RetainTiles(HashSet retainedTiles, Dictiona foreach (var tileId in _readyTiles) { - _meshGenerationUnit.SetVisualActive(tileId, _activeTiles.Contains(tileId) || _retainedTiles.Contains(tileId), _mapInformation); + var isRetained = _activeTiles.Contains(tileId) || _retainedTiles.Contains(tileId); + UpdateVisibilityCallbacks(tileId,isRetained); + _meshGenerationUnit.SetVisualActive(tileId, isRetained, _mapInformation); } _meshGenerationUnit.RetainTiles(_retainedTiles); var isReady = _vectorSource.RetainTiles(_retainedTiles); return isReady; } + private void UpdateVisibilityCallbacks(CanonicalTileId tileId, bool isRetained) + { + if (isRetained && !_visibleTiles.Contains(tileId)) + { + OnVectorMeshTurnVisible(tileId); + _visibleTiles.Add(tileId); + return; + } + if (!isRetained &&_visibleTiles.Contains(tileId)) + { + OnVectorMeshTurnInvisible(tileId); + _visibleTiles.Remove(tileId); + } + } private void UpdateActiveTileList(Dictionary activeTiles) { @@ -265,28 +283,35 @@ private void CreateVisual(CanonicalTileId tileId, VectorData vectorData, Action< { _meshGenerationUnit.MeshGeneration(vectorData, (result => { - if (result != null && result.ResultType == TaskResultType.Success) + if (result != null) { - _readyTiles.Add(tileId); - OnVectorMeshCreated(result.GeneratedObjects); - _meshGenerationUnit.UpdateForView(tileId, _mapInformation); - } - else if (result.ResultType == TaskResultType.DataProcessingFailure) - { - _vectorSource.InvalidateData(vectorData.TileId); - Debug.Log(result.ExceptionsAsString); - } - else if (result.ResultType == TaskResultType.Cancelled) - { - if (result.GeneratedObjects != null) + switch (result.ResultType) { - foreach (var gameObject in result.GeneratedObjects) + case TaskResultType.Success: + _readyTiles.Add(tileId); + _meshGenerationUnit.UpdateForView(tileId, _mapInformation); + UpdateVisibilityCallbacks(tileId, true); + OnVectorMeshCreated(vectorData.TileId, result.GeneratedObjects); + break; + case TaskResultType.DataProcessingFailure: + _vectorSource.InvalidateData(vectorData.TileId); + Debug.Log(result.ExceptionsAsString); + break; + case TaskResultType.Cancelled: { - GameObject.Destroy(gameObject); + if (result.GeneratedObjects != null) + { + foreach (var gameObject in result.GeneratedObjects) + { + GameObject.Destroy(gameObject); + } + } + + break; } } } - callback?.Invoke(result);; + callback?.Invoke(result); })); } } @@ -309,12 +334,12 @@ private void ClearDisposedDataVisual(CanonicalTileId tileId) { _readyTiles.Remove(tileId); _meshGenerationUnit.ClearDisposedDataVisual(tileId); - + OnVectorMeshDestroyed(tileId); } - public Action> OnVectorMeshCreated = list => { }; - public Action OnVectorMeshDestroyed = go => { }; - public Action OnVectorMeshTurnVisible = go => { }; - public Action OnVectorMeshTurnInvisible = go => { }; + public Action> OnVectorMeshCreated = (_, _) => {}; + public Action OnVectorMeshDestroyed = _ => {}; + public Action OnVectorMeshTurnVisible = _ => {}; + public Action OnVectorMeshTurnInvisible = _ => {}; } }