Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using UnityEngine;
using System.Collections;
using UnityEditor;
using Mapbox.Unity.MeshGeneration.Factories;

Expand All @@ -13,7 +12,7 @@ public SerializedProperty
basicMaps_Prop,
customMapId_Prop,
useMipMap_Prop,
textureFormat_Prop,
useCompression_Prop,
useRetina_Prop,
mapId_Prop;
private MonoScript script;
Expand Down Expand Up @@ -43,7 +42,7 @@ void OnEnable()
mapId_Prop = serializedObject.FindProperty("_mapId");
material_Prop = serializedObject.FindProperty("_baseMaterial");
useMipMap_Prop = serializedObject.FindProperty("_useMipMap");
textureFormat_Prop = serializedObject.FindProperty("_textureFormat");
useCompression_Prop = serializedObject.FindProperty("_useCompression");
useRetina_Prop = serializedObject.FindProperty("_useRetina");
script = MonoScript.FromScriptableObject((MapImageFactory)target);
for (int i = 0; i < _basicMapIds.Length; i++)
Expand Down Expand Up @@ -99,15 +98,14 @@ public override void OnInspectorGUI()
EditorGUILayout.LabelField("Raster Tile Texture Settings");
EditorGUI.indentLevel++;

EditorGUILayout.PropertyField(textureFormat_Prop, new GUIContent("Texture Format"));
var textureFormat = (TextureFormat)textureFormat_Prop.intValue;
if (textureFormat == TextureFormat.DXT1 || textureFormat == TextureFormat.DXT5)
EditorGUILayout.PropertyField(useCompression_Prop, new GUIContent("Use Compression"));
if (useCompression_Prop.boolValue)
{
EditorGUILayout.HelpBox("Texture will be compressed. This will reduce image quality and lead to longer initialization times but save memory.", MessageType.Info);
}
else
{
EditorGUILayout.HelpBox("Use DXT format to save memory.", MessageType.Warning);
EditorGUILayout.HelpBox("Use compression to save memory.", MessageType.Warning);
}

EditorGUILayout.PropertyField(useMipMap_Prop, new GUIContent("Create Mip Maps"));
Expand All @@ -118,7 +116,7 @@ public override void OnInspectorGUI()
EditorGUILayout.PropertyField(useRetina_Prop, new GUIContent("Request Retina-resolution"));
if (useRetina_Prop.boolValue)
{
EditorGUILayout.HelpBox("Retina will consume additional memory but greatly improves visual quality.", MessageType.Warning);
EditorGUILayout.HelpBox("Retina will consume additional memory but can greatly improve visual quality.", MessageType.Warning);
}
EditorGUI.indentLevel--;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,102 +1,122 @@
using Mapbox.Unity.Utilities;
namespace Mapbox.Unity.MeshGeneration.Factories {
using System;
using System.Collections.Generic;
using Mapbox.Map;
using UnityEngine;
using Mapbox.Unity.MeshGeneration.Enums;
using Mapbox.Unity.MeshGeneration.Data;
using Mapbox.Platform;
namespace Mapbox.Unity.MeshGeneration.Factories
{
using System;
using System.Collections.Generic;
using Mapbox.Map;
using UnityEngine;
using Mapbox.Unity.MeshGeneration.Enums;
using Mapbox.Unity.MeshGeneration.Data;
using Mapbox.Platform;

public enum MapImageType {
BasicMapboxStyle,
Custom,
None
}
public enum MapImageType
{
BasicMapboxStyle,
Custom,
None
}

/// <summary>
/// Uses raster image services to create materials & textures for terrain
/// </summary>
[CreateAssetMenu(menuName = "Mapbox/Factories/Map Image Factory")]
public class MapImageFactory : Factory {
[SerializeField]
private MapImageType _mapIdType;
[SerializeField]
private string _customMapId = "";
[SerializeField]
private string _mapId = "";
[SerializeField]
public Material _baseMaterial;
/// <summary>
/// Uses raster image services to create materials & textures for terrain
/// </summary>
[CreateAssetMenu(menuName = "Mapbox/Factories/Map Image Factory")]
public class MapImageFactory : Factory
{
[SerializeField]
private MapImageType _mapIdType;
[SerializeField]
private string _customMapId = "";
[SerializeField]
private string _mapId = "";
[SerializeField]
public Material _baseMaterial;

[SerializeField]
TextureFormat _textureFormat = TextureFormat.DXT1;
[SerializeField]
bool _useCompression = true;

[SerializeField]
bool _useMipMap = false;
[SerializeField]
bool _useMipMap = false;

[SerializeField]
bool _useRetina;
[SerializeField]
bool _useRetina;

private Dictionary<Vector2, UnityTile> _tiles;
private Dictionary<Vector2, UnityTile> _tiles;

public override void Initialize(IFileSource fs) {
base.Initialize(fs);
_tiles = new Dictionary<Vector2, UnityTile>();
}
public override void Initialize(IFileSource fs)
{
base.Initialize(fs);
_tiles = new Dictionary<Vector2, UnityTile>();
}

public override void Register(UnityTile tile) {
base.Register(tile);
_tiles.Add(tile.TileCoordinate, tile);
Run(tile);
}
public override void Register(UnityTile tile)
{
base.Register(tile);
_tiles.Add(tile.TileCoordinate, tile);
Run(tile);
}

public override void Update() {
base.Update();
foreach (var tile in _tiles.Values) {
Run(tile);
}
}
public override void Update()
{
base.Update();
foreach (var tile in _tiles.Values)
{
Run(tile);
}
}

/// <summary>
/// Fetches the image and applies it to tile material.
/// MapImage factory currently supports both new (RasterTile) and classic (ClassicRasterTile) Mapbox styles.
/// </summary>
/// <param name="tile"></param>
private void Run(UnityTile tile) {
if (!string.IsNullOrEmpty(_mapId)) {
var parameters = new Tile.Parameters();
parameters.Fs = this.FileSource;
parameters.Id = new CanonicalTileId(tile.Zoom, (int)tile.TileCoordinate.x, (int)tile.TileCoordinate.y);
parameters.MapId = _mapId;
/// <summary>
/// Fetches the image and applies it to tile material.
/// MapImage factory currently supports both new (RasterTile) and classic (ClassicRasterTile) Mapbox styles.
/// </summary>
/// <param name="tile"></param>
private void Run(UnityTile tile)
{
if (!string.IsNullOrEmpty(_mapId))
{
var parameters = new Tile.Parameters();
parameters.Fs = this.FileSource;
parameters.Id = new CanonicalTileId(tile.Zoom, (int)tile.TileCoordinate.x, (int)tile.TileCoordinate.y);
parameters.MapId = _mapId;

tile.ImageDataState = TilePropertyState.Loading;
tile.ImageDataState = TilePropertyState.Loading;

RasterTile rasterTile;
if (parameters.MapId.StartsWith("mapbox://", StringComparison.Ordinal)) {
rasterTile = _useRetina ? new RetinaRasterTile() : new RasterTile();
} else {
rasterTile = _useRetina ? new ClassicRetinaRasterTile() : new ClassicRasterTile();
}
RasterTile rasterTile;
if (parameters.MapId.StartsWith("mapbox://", StringComparison.Ordinal))
{
rasterTile = _useRetina ? new RetinaRasterTile() : new RasterTile();
}
else
{
rasterTile = _useRetina ? new ClassicRetinaRasterTile() : new ClassicRasterTile();
}

rasterTile.Initialize(parameters, (Action)(() => {
if (rasterTile.HasError) {
tile.ImageDataState = TilePropertyState.Error;
return;
}
rasterTile.Initialize(parameters, (Action)(() =>
{
if (rasterTile.HasError)
{
tile.ImageDataState = TilePropertyState.Error;
return;
}

var rend = tile.GetComponent<MeshRenderer>();
rend.material = _baseMaterial;
tile.ImageData = new Texture2D(0, 0, _textureFormat, _useMipMap);
tile.ImageData = new Texture2D(0, 0, TextureFormat.RGB24, _useMipMap);
tile.ImageData.wrapMode = TextureWrapMode.Clamp;
tile.ImageData.LoadImage(rasterTile.Data);
if (_useCompression)
{
// High quality = true seems to decrease image quality?
tile.ImageData.Compress(false);
}
rend.material.mainTexture = tile.ImageData;
tile.ImageDataState = TilePropertyState.Loaded;

}));
} else {
var rend = tile.GetComponent<MeshRenderer>();
rend.material = _baseMaterial;
}
}
}
}));
}
else
{
var rend = tile.GetComponent<MeshRenderer>();
rend.material = _baseMaterial;
}
}
}
}