using System.Collections.Generic; using Mapbox.Map; using UnityEngine; namespace Mapbox.Unity.Map.TileProviders { public class RangeAroundTransformTileProvider : AbstractTileProvider { [SerializeField] private RangeAroundTransformTileProviderOptions _rangeTileProviderOptions; private bool _initialized = false; private UnwrappedTileId _currentTile; private bool _waitingForTargetTransform = false; public override void OnInitialized() { if (Options != null) { _rangeTileProviderOptions = (RangeAroundTransformTileProviderOptions)Options; } else if (_rangeTileProviderOptions == null) { _rangeTileProviderOptions = new RangeAroundTransformTileProviderOptions(); } if (_rangeTileProviderOptions.targetTransform == null) { Debug.LogError("TransformTileProvider: No location marker transform specified."); _waitingForTargetTransform = true; } else { _initialized = true; } _currentExtent.activeTiles = new HashSet(); _map.OnInitialized += UpdateTileExtent; _map.OnUpdated += UpdateTileExtent; } public override void UpdateTileExtent() { if (!_initialized) return; _currentExtent.activeTiles.Clear(); _currentTile = TileCover.CoordinateToTileId(_map.WorldToGeoPosition(_rangeTileProviderOptions.targetTransform.localPosition), _map.AbsoluteZoom); for (int x = _currentTile.X - _rangeTileProviderOptions.visibleBuffer; x <= (_currentTile.X + _rangeTileProviderOptions.visibleBuffer); x++) { for (int y = _currentTile.Y - _rangeTileProviderOptions.visibleBuffer; y <= (_currentTile.Y + _rangeTileProviderOptions.visibleBuffer); y++) { _currentExtent.activeTiles.Add(new UnwrappedTileId(_map.AbsoluteZoom, x, y)); } } OnExtentChanged(); } public override void UpdateTileProvider() { if (_waitingForTargetTransform && !_initialized) { if (_rangeTileProviderOptions.targetTransform != null) { _initialized = true; } } if (_rangeTileProviderOptions != null && _rangeTileProviderOptions.targetTransform != null && _rangeTileProviderOptions.targetTransform.hasChanged) { UpdateTileExtent(); _rangeTileProviderOptions.targetTransform.hasChanged = false; } } public override bool Cleanup(UnwrappedTileId tile) { bool dispose = false; dispose = tile.X > _currentTile.X + _rangeTileProviderOptions.disposeBuffer || tile.X < _currentTile.X - _rangeTileProviderOptions.disposeBuffer; dispose = dispose || tile.Y > _currentTile.Y + _rangeTileProviderOptions.disposeBuffer || tile.Y < _currentTile.Y - _rangeTileProviderOptions.disposeBuffer; return (dispose); } } }