diff --git a/sdkproject/Assets/Mapbox/Unity/MeshGeneration/Data/VectorFeatureUnity.cs b/sdkproject/Assets/Mapbox/Unity/MeshGeneration/Data/VectorFeatureUnity.cs index a87c68c3f..24219902d 100644 --- a/sdkproject/Assets/Mapbox/Unity/MeshGeneration/Data/VectorFeatureUnity.cs +++ b/sdkproject/Assets/Mapbox/Unity/MeshGeneration/Data/VectorFeatureUnity.cs @@ -7,6 +7,7 @@ namespace Mapbox.Unity.MeshGeneration.Data public class VectorFeatureUnity { + public string Id; public VectorTileFeature Data; public Dictionary Properties; public List> Points = new List>(); @@ -29,10 +30,21 @@ public VectorFeatureUnity(VectorTileFeature feature, UnityTile tile, float layer Properties = Data.GetProperties(); Points.Clear(); + //this is a temp hack until we figure out how streets ids works + if (feature.Id > 10000) //ids from building dataset is big ulongs + { + Id = feature.Id.ToString(); + _geom = feature.Geometry(); //and we're not clipping by passing no parameters + } + else //streets ids, will require clipping + { + Id = string.Empty; + _geom = feature.Geometry(0); //passing zero means clip at tile edge + } + _rectSizex = tile.Rect.Size.x; _rectSizey = tile.Rect.Size.y; - - _geom = feature.Geometry(0); + _geomCount = _geom.Count; for (int i = 0; i < _geomCount; i++) { diff --git a/sdkproject/Assets/Mapbox/Unity/MeshGeneration/LayerVisualizers/VectorLayerVisualizer.cs b/sdkproject/Assets/Mapbox/Unity/MeshGeneration/LayerVisualizers/VectorLayerVisualizer.cs index da7e6add1..97c9e4737 100644 --- a/sdkproject/Assets/Mapbox/Unity/MeshGeneration/LayerVisualizers/VectorLayerVisualizer.cs +++ b/sdkproject/Assets/Mapbox/Unity/MeshGeneration/LayerVisualizers/VectorLayerVisualizer.cs @@ -75,11 +75,16 @@ public override string Key private int _entityPerCoroutine = 20; private int _entityInCurrentCoroutine = 0; + private HashSet _activeIds; + private Dictionary> _idPool; //necessary to keep _activeIds list up to date when unloading tiles + public override void Initialize() { base.Initialize(); _entityInCurrentCoroutine = 0; _activeCoroutines = new Dictionary>(); + _activeIds = new HashSet(); + _idPool = new Dictionary>(); foreach (var filter in Filters) { @@ -127,7 +132,26 @@ private IEnumerator ProcessLayer(VectorTileLayer layer, UnityTile tile, Action c for (int i = 0; i < fc; i++) { filterOut = false; - var feature = new VectorFeatureUnity(layer.GetFeature(i, 0), tile, layer.Extent); + var feature = new VectorFeatureUnity(layer.GetFeature(i), tile, layer.Extent); + + //skip existing features, only works on tilesets with unique ids + if (!string.IsNullOrEmpty(feature.Id) && _activeIds.Contains(feature.Id)) + { + continue; + } + else + { + _activeIds.Add(feature.Id); + if (!_idPool.ContainsKey(tile)) + { + _idPool.Add(tile, new List()); + } + else + { + _idPool[tile].Add(feature.Id); + } + } + foreach (var filter in Filters) { if (!string.IsNullOrEmpty(filter.Key) && !feature.Properties.ContainsKey(filter.Key)) @@ -272,12 +296,25 @@ public override void OnUnregisterTile(UnityTile tile) } if (_defaultStack != null) + { _defaultStack.UnregisterTile(tile); + } + foreach (var val in Stacks) { if (val != null && val.Stack != null) val.Stack.UnregisterTile(tile); } + + //removing ids from activeIds list so they'll be recreated next time tile loads (necessary when you're unloading/loading tiles) + if (_idPool.ContainsKey(tile)) + { + foreach (var item in _idPool[tile]) + { + _activeIds.Remove(item); + } + _idPool[tile].Clear(); + } } } }