namespace Mapbox.Unity.Map { using System; using UnityEngine; using System.IO; using System.Collections.Generic; using Mapbox.Unity.MeshGeneration.Modifiers; using Mapbox.Unity.MeshGeneration.Data; [Serializable] public class CustomStyleBundle { public UvMapType texturingType = UvMapType.Tiled; public MaterialList[] materials = new MaterialList[2]; public AtlasInfo atlasInfo; public ScriptablePalette colorPalette; public CustomStyleBundle() { materials = new MaterialList[2]; materials[0] = new MaterialList(); materials[1] = new MaterialList(); } private void AssignAssets(StyleAssetPathBundle styleAssetPathBundle) { Material topMaterial = Resources.Load(styleAssetPathBundle.topMaterialPath, typeof(Material)) as Material; Material sideMaterial = Resources.Load(styleAssetPathBundle.sideMaterialPath, typeof(Material)) as Material; AtlasInfo atlas = Resources.Load(styleAssetPathBundle.atlasPath, typeof(AtlasInfo)) as AtlasInfo; ScriptablePalette palette = Resources.Load(styleAssetPathBundle.palettePath, typeof(ScriptablePalette)) as ScriptablePalette; materials[0].Materials[0] = new Material(topMaterial); materials[1].Materials[0] = new Material(sideMaterial); atlasInfo = atlas; colorPalette = palette; } public void SetDefaultAssets(UvMapType mapType = UvMapType.Atlas) { StyleAssetPathBundle styleAssetPathBundle = new StyleAssetPathBundle("Default", Constants.Path.MAP_FEATURE_STYLES_DEFAULT_STYLE_ASSETS); texturingType = mapType; AssignAssets(styleAssetPathBundle); } } [Serializable] public class GeometryMaterialOptions : ModifierProperties, ISubLayerTexturing { public override Type ModifierType { get { return typeof(MaterialModifier); } } private SubLayerDarkStyle _darkStyle; public ISubLayerDarkStyle DarkStyle { get { if (_darkStyle == null) { _darkStyle = new SubLayerDarkStyle(this); } return _darkStyle; } } private SubLayerLightStyle _lightStyle; public ISubLayerLightStyle LightStyle { get { if (_lightStyle == null) { _lightStyle = new SubLayerLightStyle(this); } return _lightStyle; } } private SubLayerColorStyle _colorStyle; public ISubLayerColorStyle ColorStyle { get { if (_colorStyle == null) { _colorStyle = new SubLayerColorStyle(this); } return _colorStyle; } } private SubLayerSimpleStyle _simpleStyle; public ISubLayerSimpleStyle SimpleStyle { get { if (_simpleStyle == null) { _simpleStyle = new SubLayerSimpleStyle(this); } return _simpleStyle; } } private SubLayerRealisticStyle _realisticStyle; public ISubLayerRealisticStyle RealisticStyle { get { if (_realisticStyle == null) { _realisticStyle = new SubLayerRealisticStyle(this); } return _realisticStyle; } } private SubLayerFantasyStyle _fantasyStyle; public ISubLayerFantasyStyle FantasyStyle { get { if (_fantasyStyle == null) { _fantasyStyle = new SubLayerFantasyStyle(this); } return _fantasyStyle; } } private SubLayerCustomStyle _customStyle; public ISubLayerCustomStyle CustomStyle { get { if (_customStyle == null) { _customStyle = new SubLayerCustomStyle(this); } return _customStyle; } } public StyleTypes style; public UvMapType texturingType = UvMapType.Tiled; public MaterialList[] materials = new MaterialList[2]; public AtlasInfo atlasInfo; public float lightStyleOpacity = 1.0f; public float darkStyleOpacity = 1.0f; public Color colorStyleColor = Color.white; public SamplePalettes samplePalettes; public ScriptablePalette colorPalette; [SerializeField] public CustomStyleBundle customStyleOptions; public GeometryMaterialOptions() { materials = new MaterialList[2]; materials[0] = new MaterialList(); materials[1] = new MaterialList(); } /// /// Sets up default values for GeometryMaterial Options. /// If style is set to Custom, user defined values will be used. /// public void SetDefaultMaterialOptions() { string styleName = style.ToString(); if (customStyleOptions == null) { customStyleOptions = new CustomStyleBundle(); customStyleOptions.SetDefaultAssets(); } if (style == StyleTypes.Custom) { //nothing to do. Use custom settings } else { string samplePaletteName = samplePalettes.ToString(); string path = Path.Combine(Constants.Path.MAP_FEATURE_STYLES_SAMPLES, Path.Combine(styleName, Constants.Path.MAPBOX_STYLES_ASSETS_FOLDER)); StyleAssetPathBundle styleAssetPathBundle = new StyleAssetPathBundle(styleName, path, samplePaletteName); AssignAssets(styleAssetPathBundle); } switch (style) { case StyleTypes.Light: Color lightColor = materials[0].Materials[0].color; lightColor.a = lightStyleOpacity; materials[0].Materials[0].color = lightColor; lightColor = materials[1].Materials[0].color; lightColor.a = lightStyleOpacity; materials[1].Materials[0].color = lightColor; break; case StyleTypes.Dark: Color darkColor = materials[0].Materials[0].color; darkColor.a = darkStyleOpacity; materials[0].Materials[0].color = darkColor; darkColor = materials[1].Materials[0].color; darkColor.a = darkStyleOpacity; materials[1].Materials[0].color = darkColor; break; case StyleTypes.Color: Color color = colorStyleColor; materials[0].Materials[0].color = color; materials[1].Materials[0].color = color; break; default: break; } if (style == StyleTypes.Satellite) { texturingType = UvMapType.Tiled; } else { texturingType = (style != StyleTypes.Custom && style == StyleTypes.Simple) ? UvMapType.AtlasWithColorPalette : UvMapType.Atlas; } } private void AssignAssets(StyleAssetPathBundle styleAssetPathBundle) { Material topMaterial = Resources.Load(styleAssetPathBundle.topMaterialPath, typeof(Material)) as Material; Material sideMaterial = Resources.Load(styleAssetPathBundle.sideMaterialPath, typeof(Material)) as Material; AtlasInfo atlas = Resources.Load(styleAssetPathBundle.atlasPath, typeof(AtlasInfo)) as AtlasInfo; ScriptablePalette palette = Resources.Load(styleAssetPathBundle.palettePath, typeof(ScriptablePalette)) as ScriptablePalette; Material[] tempMaterials = new Material[2]; for (int i = 0; i < materials.Length; i++) { if (materials[i].Materials[0] != null) { tempMaterials[i] = materials[i].Materials[0]; materials[i].Materials[0] = null; } } materials[0].Materials[0] = new Material(topMaterial); materials[1].Materials[0] = new Material(sideMaterial); for (int i = 0; i < materials.Length; i++) { if (tempMaterials[i] != null) { tempMaterials[i].Destroy(); } } Resources.UnloadUnusedAssets(); atlasInfo = atlas; colorPalette = palette; } public void SetDefaultAssets(UvMapType mapType = UvMapType.Atlas) { StyleAssetPathBundle styleAssetPathBundle = new StyleAssetPathBundle("Default", Constants.Path.MAP_FEATURE_STYLES_DEFAULT_STYLE_ASSETS); texturingType = mapType; AssignAssets(styleAssetPathBundle); } /// /// Sets the type of the style. /// /// Style type. public void SetStyleType(StyleTypes styleType) { style = styleType; HasChanged = true; } /// /// Gets the type of style used in the layer. /// /// The style type. public virtual StyleTypes GetStyleType() { return style; } } [Serializable] public class UVModifierOptions : ModifierProperties { public override Type ModifierType { get { return typeof(PolygonMeshModifier); } } public StyleTypes style; public UvMapType texturingType = UvMapType.Tiled; public AtlasInfo atlasInfo; public GeometryExtrusionWithAtlasOptions ToGeometryExtrusionWithAtlasOptions() { return new GeometryExtrusionWithAtlasOptions(this); } } }