Пример #1
0
        bool CreateNewPalette()
        {
            string filePath = EditorUtility.SaveFilePanelInProject("Create New Palette", "New Layer Palette.asset", "asset", "");

            if (string.IsNullOrEmpty(filePath))
            {
                return(false);
            }
            m_SelectedLayerPalette = CreateInstance <TerrainPalette>();
            foreach (var layer in m_PaletteLayers)
            {
                m_SelectedLayerPalette.PaletteLayers.Add(layer.AssignedLayer);
            }
            AssetDatabase.CreateAsset(m_SelectedLayerPalette, filePath);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            return(true);
        }
Пример #2
0
        void LayersGUI()
        {
            if (m_SelectedTerrain != null && m_SelectedTerrain.terrainData.terrainLayers.Length == 0)
            {
                EditorGUILayout.HelpBox(Styles.LayersWarning, MessageType.Warning);
            }

            // Layer Palette preset
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(Styles.PalettePreset, GUILayout.Width(EditorGUIUtility.labelWidth - 4.5f));
            EditorGUI.BeginChangeCheck();
            m_SelectedLayerPalette = (TerrainPalette)EditorGUILayout.ObjectField(m_SelectedLayerPalette, typeof(TerrainPalette), false, GUILayout.MinWidth(130));
            if (EditorGUI.EndChangeCheck() && m_SelectedLayerPalette != null)
            {
                if (EditorUtility.DisplayDialog("Confirm", "Load palette from selected?", "OK", "Cancel"))
                {
                    LoadPalette();
                }
            }
            if (GUILayout.Button(Styles.SavePaletteBtn))
            {
                if (GetPalette())
                {
                    m_SelectedLayerPalette.PaletteLayers.Clear();
                    foreach (var layer in m_PaletteLayers)
                    {
                        m_SelectedLayerPalette.PaletteLayers.Add(layer.AssignedLayer);
                    }
                    AssetDatabase.SaveAssets();
                }
            }
            if (GUILayout.Button(Styles.SaveAsPaletteBtn))
            {
                CreateNewPalette();
            }
            if (GUILayout.Button(Styles.RefreshPaletteBtn))
            {
                if (GetPalette())
                {
                    LoadPalette();
                }
            }
            EditorGUILayout.EndHorizontal();

            // Reorderable list view
            EditorGUILayout.BeginVertical("Box");
            if (m_LayerList == null)
            {
                m_LayerList = new ReorderableList(m_PaletteLayers, typeof(Layer), true, true, false, false);
                m_LayerList.elementHeight                = kElementHeight;
                m_LayerList.drawHeaderCallback           = DrawHeader;
                m_LayerList.drawElementCallback          = DrawLayerElement;
                m_LayerList.onSelectCallback             = OnSelectLayerElement;
                m_LayerList.onReorderCallbackWithDetails = OnReorderLayerElement;
            }

            CreateLayersIfNeeded();
            m_LayerList.DoLayoutList();

            // Layer creation
            if (Event.current.commandName == "ObjectSelectorClosed" &&
                EditorGUIUtility.GetObjectPickerControlID() == m_layerPickerWindowID)
            {
                m_PickedLayer = (TerrainLayer)EditorGUIUtility.GetObjectPickerObject();
            }

            if (m_PickedLayer != null && Event.current.type == EventType.Repaint)
            {
                TerrainLayer tempLayer = m_PickedLayer;
                m_PickedLayer = null;
                if (!LayerExists(tempLayer))
                {
                    AddLayerElement(tempLayer);
                }
            }

            if (Event.current.commandName == "ObjectSelectorClosed" &&
                EditorGUIUtility.GetObjectPickerControlID() == m_objPickerWindowID)
            {
                m_layerTexture = (Texture2D)EditorGUIUtility.GetObjectPickerObject();
            }

            if (m_layerTexture != null && Event.current.type == EventType.Repaint)
            {
                Texture2D tempTexture = m_layerTexture;
                m_layerTexture = null;
                CreateNewLayerWithTexture(tempTexture);
            }

            // Control buttons
            EditorGUILayout.BeginHorizontal();
            EditorGUI.BeginDisabledGroup(!CanAddLayerElement());
            if (GUILayout.Button("Add Layer", GUILayout.Height(20)))
            {
                m_layerPickerWindowID = EditorGUIUtility.GetControlID(FocusType.Passive) + 200;                 // had to bump this to make it unique
                EditorGUIUtility.ShowObjectPicker <TerrainLayer>(null, false, "", m_layerPickerWindowID);
            }
            EditorGUI.EndDisabledGroup();
            if (GUILayout.Button("Remove Layer", GUILayout.Height(20)) &&
                EditorUtility.DisplayDialog("Warning", "Splatmap data changed by this layer will be lost.", "OK", "Cancel"))
            {
                RemoveLayerElement();
            }
            if (GUILayout.Button(Styles.RemoveLayersBtn, GUILayout.Height(20)) &&
                EditorUtility.DisplayDialog("Error", "Splatmap data changed by these layers will be lost.", "OK", "Cancel"))
            {
                RemoveSelectedLayerElements();
            }
            EditorGUILayout.EndHorizontal();

            // Create new layer
            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            m_LayerName = EditorGUILayout.TextField(Styles.NewLayer, m_LayerName);
            if (GUILayout.Button(Styles.CreateLayersBtn, GUILayout.Width(85), GUILayout.Height(20)))
            {
                m_objPickerWindowID = EditorGUIUtility.GetControlID(FocusType.Passive) + 100;                 // had to bump this to make it unique
                EditorGUIUtility.ShowObjectPicker <Texture2D>(null, false, "", m_objPickerWindowID);
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.Space();
            EditorGUILayout.EndVertical();
        }