using Mapbox.Unity.MeshGeneration.Data; namespace Mapbox.Unity.Map { using System; using UnityEngine; using Mapbox.Unity.MeshGeneration.Factories; using Mapbox.Unity.Utilities; [Serializable] public class ImageryLayer : AbstractLayer, IImageryLayer { [SerializeField] ImageryLayerProperties _layerProperty = new ImageryLayerProperties(); [NodeEditorElement("Image Layer")] public ImageryLayerProperties LayerProperty { get { return _layerProperty; } set { _layerProperty = value; } } public MapLayerType LayerType { get { return MapLayerType.Imagery; } } public bool IsLayerActive { get { return (_layerProperty.sourceType != ImagerySourceType.None); } } public string LayerSourceId { get { return _layerProperty.sourceOptions.Id; } internal set { if (value != _layerProperty.sourceOptions.Id) { _layerProperty.sourceOptions.Id = value; _layerProperty.HasChanged = true; } } } public ImagerySourceType LayerSource { get { return _layerProperty.sourceType; } } public ImageryLayer() { } public ImageryLayer(ImageryLayerProperties properties) { _layerProperty = properties; } public void SetLayerSource(string imageSource) { if (!string.IsNullOrEmpty(imageSource)) { _layerProperty.sourceType = ImagerySourceType.Custom; _layerProperty.sourceOptions.Id = imageSource; } else { _layerProperty.sourceType = ImagerySourceType.None; Debug.LogWarning("Empty source - turning off imagery. "); } _layerProperty.HasChanged = true; } public void SetRasterOptions(ImageryRasterOptions rasterOptions) { _layerProperty.rasterOptions = rasterOptions; _layerProperty.HasChanged = true; } public void Initialize(LayerProperties properties) { _layerProperty = (ImageryLayerProperties)properties; Initialize(); } public void Initialize() { if (_layerProperty.sourceType != ImagerySourceType.Custom && _layerProperty.sourceType != ImagerySourceType.None) { _layerProperty.sourceOptions.layerSource = MapboxDefaultImagery.GetParameters(_layerProperty.sourceType); } _imageFactory = ScriptableObject.CreateInstance(); _imageFactory.SetOptions(_layerProperty); _layerProperty.PropertyHasChanged += RedrawLayer; _layerProperty.rasterOptions.PropertyHasChanged += (property, e) => { NotifyUpdateLayer(_imageFactory, property as MapboxDataProperty, false); }; } public void RedrawLayer(object sender, System.EventArgs e) { Factory.SetOptions(_layerProperty); NotifyUpdateLayer(_imageFactory, sender as MapboxDataProperty, false); } public void Remove() { _layerProperty = new ImageryLayerProperties { sourceType = ImagerySourceType.None }; } public void Update(LayerProperties properties) { Initialize(properties); } private MapImageFactory _imageFactory; public MapImageFactory Factory { get { return _imageFactory; } } #region API Methods /// /// Sets the data source for the image factory. /// /// public virtual void SetLayerSource(ImagerySourceType imageSource) { if (imageSource != ImagerySourceType.Custom && imageSource != ImagerySourceType.None) { _layerProperty.sourceType = imageSource; _layerProperty.sourceOptions.layerSource = MapboxDefaultImagery.GetParameters(imageSource); _layerProperty.HasChanged = true; } else { Debug.LogWarning("Invalid style - trying to set " + imageSource.ToString() + " as default style!"); } } /// /// Enables high quality images for selected image factory source. /// /// public virtual void UseRetina(bool useRetina) { if (_layerProperty.rasterOptions.useRetina != useRetina) { _layerProperty.rasterOptions.useRetina = useRetina; _layerProperty.rasterOptions.HasChanged = true; } } /// /// Enable Texture2D compression for image factory outputs. /// /// public virtual void UseCompression(bool useCompression) { if (_layerProperty.rasterOptions.useCompression != useCompression) { _layerProperty.rasterOptions.useCompression = useCompression; _layerProperty.rasterOptions.HasChanged = true; } } /// /// Enable Texture2D MipMap option for image factory outputs. /// /// public virtual void UseMipMap(bool useMipMap) { if (_layerProperty.rasterOptions.useMipMap != useMipMap) { _layerProperty.rasterOptions.useMipMap = useMipMap; _layerProperty.rasterOptions.HasChanged = true; } } /// /// Change image layer settings. /// /// Data source for the image provider. /// Enable/Disable high quality imagery. /// Enable/Disable Unity3d Texture2d image compression. /// Enable/Disable Unity3d Texture2d image mipmapping. public virtual void SetProperties(ImagerySourceType imageSource, bool useRetina, bool useCompression, bool useMipMap) { if (imageSource != ImagerySourceType.Custom && imageSource != ImagerySourceType.None) { _layerProperty.sourceType = imageSource; _layerProperty.sourceOptions.layerSource = MapboxDefaultImagery.GetParameters(imageSource); _layerProperty.HasChanged = true; } if (_layerProperty.rasterOptions.useRetina != useRetina || _layerProperty.rasterOptions.useCompression != useCompression || _layerProperty.rasterOptions.useMipMap != useMipMap) { _layerProperty.rasterOptions.useRetina = useRetina; _layerProperty.rasterOptions.useCompression = useCompression; _layerProperty.rasterOptions.useMipMap = useMipMap; _layerProperty.rasterOptions.HasChanged = true; } } #endregion } }