namespace Mapbox.Editor { using UnityEditor; using UnityEngine; using Mapbox.Unity; using Mapbox.Editor; using Mapbox.Unity.Map; using Mapbox.Unity.MeshGeneration.Data; using Mapbox.VectorTile.ExtensionMethods; using System.IO; using System.Collections.Generic; public class StyleIconBundle { public string path; public Texture texture; public void Load() { if (texture == null) { texture = Resources.Load(path) as Texture; } } public StyleIconBundle(string styleName, string paletteName = "") { path = Path.Combine(Constants.Path.MAP_FEATURE_STYLES_SAMPLES, Path.Combine(styleName, string.Format("{0}Icon", (styleName + paletteName)))); } } [CustomPropertyDrawer(typeof(GeometryMaterialOptions))] public class GeometryMaterialOptionsDrawer : PropertyDrawer { static float lineHeight = EditorGUIUtility.singleLineHeight; private string objectId = ""; bool showTexturing { get { return EditorPrefs.GetBool(objectId + "VectorSubLayerProperties_showTexturing"); } set { EditorPrefs.SetBool(objectId + "VectorSubLayerProperties_showTexturing", value); } } private Dictionary _styleIconBundles = new Dictionary() { {StyleTypes.Simple, new StyleIconBundle(StyleTypes.Simple.ToString())}, {StyleTypes.Realistic, new StyleIconBundle(StyleTypes.Realistic.ToString())}, {StyleTypes.Fantasy, new StyleIconBundle(StyleTypes.Fantasy.ToString())}, {StyleTypes.Light, new StyleIconBundle(StyleTypes.Light.ToString())}, {StyleTypes.Dark, new StyleIconBundle(StyleTypes.Dark.ToString())}, {StyleTypes.Color, new StyleIconBundle(StyleTypes.Color.ToString())}, {StyleTypes.Satellite, new StyleIconBundle(StyleTypes.Satellite.ToString())}, }; private Dictionary _paletteIconBundles = new Dictionary() { {SamplePalettes.City, new StyleIconBundle(StyleTypes.Simple.ToString(), SamplePalettes.City.ToString())}, {SamplePalettes.Cool, new StyleIconBundle(StyleTypes.Simple.ToString(), SamplePalettes.Cool.ToString())}, {SamplePalettes.Rainbow, new StyleIconBundle(StyleTypes.Simple.ToString(), SamplePalettes.Rainbow.ToString())}, {SamplePalettes.Urban, new StyleIconBundle(StyleTypes.Simple.ToString(), SamplePalettes.Urban.ToString())}, {SamplePalettes.Warm, new StyleIconBundle(StyleTypes.Simple.ToString(), SamplePalettes.Warm.ToString())}, }; /// /// Loads the default style icons. /// private void LoadDefaultStyleIcons() { foreach (var key in _styleIconBundles.Keys) { _styleIconBundles[key].Load(); } foreach (var key in _paletteIconBundles.Keys) { _paletteIconBundles[key].Load(); } } public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { objectId = property.serializedObject.targetObject.GetInstanceID().ToString(); showTexturing = EditorGUILayout.Foldout(showTexturing, new GUIContent { text = "Texturing", tooltip = "Material options to texture the generated building geometry" }); if (showTexturing) { LoadDefaultStyleIcons(); EditorGUI.BeginProperty(position, label, property); var styleTypeLabel = new GUIContent { text = "Style Type", tooltip = "Texturing style for feature; choose from sample style or create your own by choosing Custom. " }; var styleType = property.FindPropertyRelative("style"); GUIContent[] styleTypeGuiContent = new GUIContent[styleType.enumDisplayNames.Length]; for (int i = 0; i < styleType.enumDisplayNames.Length; i++) { styleTypeGuiContent[i] = new GUIContent { text = styleType.enumDisplayNames[i] }; } EditorGUI.BeginChangeCheck(); styleType.enumValueIndex = EditorGUILayout.Popup(styleTypeLabel, styleType.enumValueIndex, styleTypeGuiContent); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } EditorGUI.indentLevel++; if ((StyleTypes)styleType.enumValueIndex != StyleTypes.Custom) { GUILayout.BeginHorizontal(); var style = (StyleTypes)styleType.enumValueIndex; Texture2D thumbnailTexture = (Texture2D)_styleIconBundles[style].texture; if ((StyleTypes)styleType.enumValueIndex == StyleTypes.Simple) { var samplePaletteType = property.FindPropertyRelative("samplePalettes"); var palette = (SamplePalettes)samplePaletteType.enumValueIndex; thumbnailTexture = (Texture2D)_paletteIconBundles[palette].texture; } string descriptionLabel = EnumExtensions.Description(style); EditorGUILayout.LabelField(new GUIContent(" ", thumbnailTexture), Constants.GUI.Styles.EDITOR_TEXTURE_THUMBNAIL_STYLE, GUILayout.Height(60), GUILayout.Width(EditorGUIUtility.labelWidth - 60)); EditorGUILayout.TextArea(descriptionLabel, (GUIStyle)"wordWrappedLabel"); GUILayout.EndHorizontal(); EditorGUI.BeginChangeCheck(); switch ((StyleTypes)styleType.enumValueIndex) { case StyleTypes.Simple: var samplePaletteType = property.FindPropertyRelative("samplePalettes"); var samplePaletteTypeLabel = new GUIContent { text = "Palette Type", tooltip = "Palette type for procedural colorization; choose from sample palettes or create your own by choosing Custom. " }; GUIContent[] samplePaletteTypeGuiContent = new GUIContent[samplePaletteType.enumDisplayNames.Length]; for (int i = 0; i < samplePaletteType.enumDisplayNames.Length; i++) { samplePaletteTypeGuiContent[i] = new GUIContent { text = samplePaletteType.enumDisplayNames[i] }; } samplePaletteType.enumValueIndex = EditorGUILayout.Popup(samplePaletteTypeLabel, samplePaletteType.enumValueIndex, samplePaletteTypeGuiContent); break; case StyleTypes.Light: property.FindPropertyRelative("lightStyleOpacity").floatValue = EditorGUILayout.Slider("Opacity", property.FindPropertyRelative("lightStyleOpacity").floatValue, 0.0f, 1.0f); break; case StyleTypes.Dark: property.FindPropertyRelative("darkStyleOpacity").floatValue = EditorGUILayout.Slider("Opacity", property.FindPropertyRelative("darkStyleOpacity").floatValue, 0.0f, 1.0f); break; case StyleTypes.Color: property.FindPropertyRelative("colorStyleColor").colorValue = EditorGUILayout.ColorField("Color", property.FindPropertyRelative("colorStyleColor").colorValue); break; default: break; } if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } } else { var customStyleProperty = property.FindPropertyRelative("customStyleOptions"); var texturingType = customStyleProperty.FindPropertyRelative("texturingType"); int valIndex = texturingType.enumValueIndex == 0 ? 0 : texturingType.enumValueIndex + 1; var texturingTypeGUI = new GUIContent { text = "Texturing Type", tooltip = EnumExtensions.Description((UvMapType)valIndex) }; EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(texturingType, texturingTypeGUI); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } var matList = customStyleProperty.FindPropertyRelative("materials"); if (matList.arraySize == 0) { matList.arraySize = 2; } GUILayout.Space(-lineHeight); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(matList.GetArrayElementAtIndex(0), new GUIContent { text = "Top Material", tooltip = "Unity material to use for extruded top/roof mesh. " }); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } GUILayout.Space(-lineHeight); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(matList.GetArrayElementAtIndex(1), new GUIContent { text = "Side Material", tooltip = "Unity material to use for extruded side/wall mesh. " }); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } EditorGUI.BeginChangeCheck(); if ((UvMapType)texturingType.enumValueIndex + 1 == UvMapType.Atlas) { var atlasInfo = customStyleProperty.FindPropertyRelative("atlasInfo"); EditorGUILayout.ObjectField(atlasInfo, new GUIContent { text = "Altas Info", tooltip = "Atlas information scriptable object, this defines how the texture roof and wall texture atlases will be used. " }); } if ((UvMapType)texturingType.enumValueIndex + 1 == UvMapType.AtlasWithColorPalette) { var atlasInfo = customStyleProperty.FindPropertyRelative("atlasInfo"); EditorGUILayout.ObjectField(atlasInfo, new GUIContent { text = "Altas Info", tooltip = "Atlas information scriptable object, this defines how the texture roof and wall texture atlases will be used. " }); var colorPalette = customStyleProperty.FindPropertyRelative("colorPalette"); EditorGUILayout.ObjectField(colorPalette, new GUIContent { text = "Color Palette", tooltip = "Color palette scriptable object, allows texture features to be procedurally colored at runtime. Requires materials that use the MapboxPerRenderer shader. " }); EditorGUILayout.LabelField(new GUIContent { text = "Note: Atlas With Color Palette requires materials that use the MapboxPerRenderer shader." }, Constants.GUI.Styles.EDITOR_NOTE_STYLE); } if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } } EditorGUI.indentLevel--; EditorGUI.EndProperty(); } } } }