Skip to content

Commit ad01b7f

Browse files
committed
add TileLoaded and TileUnloading events to MapboxMap class, along with LoadViewStarting and LoadViewCompleted events
1 parent bf5a08d commit ad01b7f

File tree

3 files changed

+84
-36
lines changed

3 files changed

+84
-36
lines changed

Runtime/Mapbox/BaseModule/Data/Interfaces/IMapVisualizer.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ namespace Mapbox.BaseModule.Data.Interfaces
1010
public interface IMapVisualizer
1111
{
1212
public void Load(TileCover tileCover);
13+
public void LoadSnapshot(TileCover tileCover);
1314
IEnumerator Initialize();
1415
IEnumerator LoadTileCoverToMemory(TileCover tileCover);
1516
void OnDestroy();
1617
Dictionary<UnwrappedTileId, UnityMapTile> ActiveTiles { get; }
1718
bool TryGetLayerModule<T>(Type type, out T layerModule) where T : ILayerModule;
19+
20+
event Action<UnityMapTile> TileLoaded;
21+
event Action<UnityMapTile> TileUnloading;
1822
}
1923
}

Runtime/Mapbox/BaseModule/Map/MapboxMap.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public IEnumerator Initialize()
3535

3636
Status = InitializationStatus.Initializing;
3737
yield return MapVisualizer.Initialize();
38+
MapVisualizer.TileLoaded += tile => { TileLoaded(tile); };
39+
MapVisualizer.TileUnloading += tile => { TileUnloading(tile); };
40+
3841
Status = InitializationStatus.Initialized;
3942
Initialized();
4043

@@ -52,9 +55,12 @@ public void LoadMapView(Action callback)
5255
LoadViewStarting();
5356
Runnable.Instance.StartCoroutine(LoadMapViewCoroutine(() =>
5457
{
55-
Status = InitializationStatus.ReadyForUpdates;
58+
MapService.TileCover(MapInformation, TileCover);
59+
MapVisualizer.LoadSnapshot(TileCover);
60+
5661
callback?.Invoke();
5762
LoadViewCompleted();
63+
Status = InitializationStatus.ReadyForUpdates;
5864
}));
5965
}
6066

@@ -65,11 +71,15 @@ public void LoadMapView(Action callback, LatitudeLongitude coordinates)
6571
MapInformation.SetInformation(coordinates);
6672
Runnable.Instance.StartCoroutine(LoadMapViewCoroutine(() =>
6773
{
68-
callback();
74+
MapService.TileCover(MapInformation, TileCover);
75+
MapVisualizer.LoadSnapshot(TileCover);
76+
77+
callback?.Invoke();
78+
LoadViewCompleted();
6979
Status = InitializationStatus.ReadyForUpdates;
7080
}));
7181
}
72-
82+
7383
public IEnumerator LoadMapViewCoroutine(Action callback)
7484
{
7585
var tileCover = new TileCover();
@@ -83,17 +93,19 @@ public void ChangeView(LatitudeLongitude? latlng = null, float? zoom = null, flo
8393
MapInformation.SetInformation(latlng, zoom, pitch, bearing);
8494
}
8595

86-
public Action Initialized = () => {};
87-
public Action LoadViewStarting = () => { };
88-
public Action LoadViewCompleted = () => { };
89-
9096
public void OnDestroy()
9197
{
9298
MapVisualizer?.OnDestroy();
9399
MapService.OnDestroy();
94100
}
95101

96102
public void UpdateTileCover() => MapService.TileCover(MapInformation, TileCover);
103+
104+
public Action Initialized = () => {};
105+
public Action LoadViewStarting = () => { };
106+
public Action LoadViewCompleted = () => { };
107+
public Action<UnityMapTile> TileLoaded = (tile) => { };
108+
public Action<UnityMapTile> TileUnloading = (tile) => { };
97109
}
98110
}
99111

Runtime/Mapbox/BaseModule/Map/MapboxMapVisualizer.cs

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,7 @@ public virtual void Load(TileCover tileCover)
7373
{
7474
if (unityMapTile.IsTemporary)
7575
{
76-
var tileFinished = true;
77-
foreach (var module in LayerModules)
78-
{
79-
var moduleFinished = module.LoadInstant(unityMapTile);
80-
tileFinished &= moduleFinished;
81-
if (!moduleFinished) break;
82-
}
83-
if (tileFinished) unityMapTile.IsTemporary = false;
76+
FinalizeTempTile(unityMapTile);
8477
}
8578

8679
ShowTile(unityMapTile);
@@ -109,9 +102,10 @@ public virtual void Load(TileCover tileCover)
109102

110103
foreach (var tileId in _toRemove)
111104
{
112-
if (ActiveTiles.ContainsKey(tileId))
105+
if (ActiveTiles.TryGetValue(tileId, out var tile))
113106
{
114-
PoolTile(ActiveTiles[tileId]);
107+
TileUnloading(tile);
108+
PoolTile(tile);
115109
}
116110
else
117111
{
@@ -125,6 +119,30 @@ public virtual void Load(TileCover tileCover)
125119
}
126120
}
127121

122+
/// <summary>
123+
/// Minimal function that'll try to load view with whatever data is available.
124+
/// It will not unload any tiles, it will not trigger any data fetching.
125+
/// It'll only organize and use data already in memory.
126+
/// If resources required for the requested tile aren't ready, it'll use whatever available
127+
/// and create a "temporary tile".
128+
/// </summary>
129+
/// <param name="tileCover"></param>
130+
public void LoadSnapshot(TileCover tileCover)
131+
{
132+
foreach (var tileId in tileCover.Tiles)
133+
{
134+
if (CreateTileInstant(tileId, out var unityMapTile))
135+
{
136+
137+
}
138+
else
139+
{
140+
CreateTempTile(tileId, out unityMapTile);
141+
}
142+
ShowTile(unityMapTile);
143+
}
144+
}
145+
128146
public void OnDestroy()
129147
{
130148
foreach (var layerModule in LayerModules)
@@ -210,13 +228,9 @@ protected void PoolTile(UnityMapTile tile)
210228

211229
protected void CreateTempTile(UnwrappedTileId tileId, out UnityMapTile tile)
212230
{
213-
var rectd = Conversions.TileBoundsInUnitySpace(tileId, _mapInformation.CenterMercator, _mapInformation.Scale);
214-
tile = null;
215-
tile = _tileCreator.GetTile();
216-
tile.transform.position = new Vector3((float) rectd.Center.x, 0, (float) rectd.Center.y);
217-
tile.transform.localScale = Vector3.one * (float) rectd.Size.x;
218-
tile.Initialize(tileId, (float) rectd.Size.x * _mapInformation.Scale);
219-
231+
//we need to do positioning and scaling before mesh gen for now
232+
GetMapTile(tileId, out tile);
233+
220234
foreach (var module in LayerModules)
221235
{
222236
module.LoadTempTile(tile);
@@ -227,31 +241,46 @@ protected void CreateTempTile(UnwrappedTileId tileId, out UnityMapTile tile)
227241
}
228242

229243
protected bool CreateTileInstant(UnwrappedTileId tileId, out UnityMapTile tile)
244+
{
245+
//we need to do positioning and scaling before mesh gen for now
246+
GetMapTile(tileId, out tile);
247+
248+
var result = FinalizeTempTile(tile);
249+
250+
//couldn't create the tile
251+
if (!result) PoolTile(tile);
252+
253+
return result;
254+
}
255+
256+
protected void GetMapTile(UnwrappedTileId tileId, out UnityMapTile tile)
230257
{
231258
var rectd = Conversions.TileBoundsInUnitySpace(tileId, _mapInformation.CenterMercator, _mapInformation.Scale);
232259
tile = null;
233260
tile = _tileCreator.GetTile();
234261
tile.transform.position = new Vector3((float) rectd.Center.x, 0, (float) rectd.Center.y);
235262
tile.transform.localScale = Vector3.one * (float) rectd.Size.x;
236-
tile.Initialize(tileId, (float) rectd.Size.x * _mapInformation.Scale);
237-
238-
var loaded = true;
263+
tile.Initialize(tileId, (float) rectd.Size.x * _mapInformation.Scale);
264+
}
265+
266+
protected bool FinalizeTempTile(UnityMapTile unityMapTile)
267+
{
268+
var tileFinished = true;
239269
foreach (var module in LayerModules)
240270
{
241-
var moduleFinished = module.LoadInstant(tile);
242-
loaded &= moduleFinished;
271+
var moduleFinished = module.LoadInstant(unityMapTile);
272+
tileFinished &= moduleFinished;
273+
if (!moduleFinished) break;
243274
}
244275

245-
if (!loaded)
276+
if (tileFinished)
246277
{
247-
PoolTile(tile);
248-
return false;
278+
unityMapTile.IsTemporary = false;
279+
ActiveTiles.TryAdd(unityMapTile.UnwrappedTileId, unityMapTile);
280+
TileLoaded(unityMapTile);
249281
}
250-
251-
tile.IsTemporary = false;
252-
ActiveTiles.Add(tileId, tile);
253282

254-
return true;
283+
return tileFinished;
255284
}
256285

257286
protected void RepositionAllTiles(IMapInformation mapInformation)
@@ -266,5 +295,8 @@ protected void RepositionAllTiles(IMapInformation mapInformation)
266295
module.UpdatePositioning(mapInformation);
267296
}
268297
}
298+
299+
public event Action<UnityMapTile> TileLoaded = (tile) => { };
300+
public event Action<UnityMapTile> TileUnloading = (tile) => { };
269301
}
270302
}

0 commit comments

Comments
 (0)