You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mapbox-sdk/Unity/MeshGeneration/Factories/TerrainFactoryBase.cs

154 lines
3.7 KiB

6 months ago
using Mapbox.Unity.MeshGeneration.Factories;
using System.Collections;
using UnityEngine;
using Mapbox.Unity.MeshGeneration.Data;
using Mapbox.Unity.Map;
using Mapbox.Map;
using Mapbox.Unity.MeshGeneration.Enums;
using Mapbox.Unity.MeshGeneration.Factories.TerrainStrategies;
using System;
using System.Collections.Generic;
namespace Mapbox.Unity.MeshGeneration.Factories
{
public class TerrainFactoryBase : AbstractTileFactory
{
public TerrainStrategy Strategy;
[SerializeField]
protected ElevationLayerProperties _elevationOptions = new ElevationLayerProperties();
protected TerrainDataFetcher DataFetcher;
public TerrainDataFetcher GetFetcher()
{
return DataFetcher;
}
public ElevationLayerProperties Properties
{
get
{
return _elevationOptions;
}
}
#region UnityMethods
private void OnDestroy()
{
if (DataFetcher != null)
{
DataFetcher.DataRecieved -= OnTerrainRecieved;
DataFetcher.FetchingError -= OnDataError;
}
}
#endregion
#region AbstractFactoryOverrides
protected override void OnInitialized()
{
Strategy.Initialize(_elevationOptions);
DataFetcher = ScriptableObject.CreateInstance<TerrainDataFetcher>();
DataFetcher.DataRecieved += OnTerrainRecieved;
DataFetcher.FetchingError += OnDataError;
}
public override void SetOptions(LayerProperties options)
{
_elevationOptions = (ElevationLayerProperties)options;
Strategy.Initialize(_elevationOptions);
}
protected override void OnRegistered(UnityTile tile)
{
if (Properties.sourceType == ElevationSourceType.None)
{
tile.SetHeightData(null);
tile.MeshFilter.sharedMesh.Clear();
tile.ElevationType = TileTerrainType.None;
tile.HeightDataState = TilePropertyState.None;
return;
}
if (Strategy is IElevationBasedTerrainStrategy)
{
tile.HeightDataState = TilePropertyState.Loading;
TerrainDataFetcherParameters parameters = new TerrainDataFetcherParameters()
{
canonicalTileId = tile.CanonicalTileId,
tilesetId = _elevationOptions.sourceOptions.Id,
tile = tile
};
DataFetcher.FetchData(parameters);
}
else
{
//reseting height data
tile.SetHeightData(null);
Strategy.RegisterTile(tile);
tile.HeightDataState = TilePropertyState.Loaded;
}
}
protected override void OnUnregistered(UnityTile tile)
{
if (_tilesWaitingResponse != null && _tilesWaitingResponse.Contains(tile))
{
_tilesWaitingResponse.Remove(tile);
}
Strategy.UnregisterTile(tile);
}
public override void Clear()
{
DestroyImmediate(DataFetcher);
}
protected override void OnPostProcess(UnityTile tile)
{
Strategy.PostProcessTile(tile);
}
public override void UnbindEvents()
{
base.UnbindEvents();
}
protected override void OnUnbindEvents()
{
}
#endregion
#region DataFetcherEvents
private void OnTerrainRecieved(UnityTile tile, RawPngRasterTile pngRasterTile)
{
if (tile != null)
{
_tilesWaitingResponse.Remove(tile);
if (tile.HeightDataState != TilePropertyState.Unregistered)
{
tile.SetHeightData(pngRasterTile.Data, _elevationOptions.requiredOptions.exaggerationFactor, _elevationOptions.modificationOptions.useRelativeHeight, _elevationOptions.colliderOptions.addCollider);
Strategy.RegisterTile(tile);
}
}
}
private void OnDataError(UnityTile tile, RawPngRasterTile rawTile, TileErrorEventArgs e)
{
base.OnErrorOccurred(tile, e);
if (tile != null)
{
_tilesWaitingResponse.Remove(tile);
if (tile.HeightDataState != TilePropertyState.Unregistered)
{
Strategy.DataErrorOccurred(tile, e);
tile.HeightDataState = TilePropertyState.Error;
}
}
}
#endregion
}
}