Ejemplo n.º 1
0
        public void OnInspectorGUI()
        {
            GUILayout.BeginVertical("box");
            {
                EditorGUILayout.LabelField("Terrain Trees", GUIStyles.BoxTitleStyle);

                if (this.editor.GetPainter().brushSettings.targetTerrain == null)
                {
                    editor.SetErrorBackgroundColor();
                }

                EditorGUILayout.PropertyField(targetTerrain, new GUIContent("Target Terrain", "The terrain to work with"));

                editor.SetDefaultBackgroundColor();


                EditorGUILayout.Space();

                EditorGUILayout.BeginHorizontal();
                {
                    if (GUILayout.Button(new GUIContent("Extract Prefabs", "Replace the prefabs with the ones from the Unity terrain"), GUILayout.Width(100)))
                    {
                        CreatePrefabSettingsFromUnityTerrain();
                    }

                    if (GUILayout.Button(new GUIContent("Clear Prefabs", "Remove all prefab settings"), GUILayout.Width(100)))
                    {
                        ClearPrefabs();
                    }

                    if (GUILayout.Button(new GUIContent("Log Info", "Log terrain info to the console"), GUILayout.Width(100)))
                    {
                        LogInfo();
                    }

                    if (GUILayout.Button(new GUIContent("Clear Terrain", "Remove all trees from the terrain"), GUILayout.Width(120)))
                    {
                        RemoveAll();
                    }
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.HelpBox("Terrain Trees is highly experimental and not fully implemented yet! Backup your project!", MessageType.Warning);
            }
            GUILayout.EndVertical();
        }
        public void OnInspectorGUI()
        {
            GUILayout.BeginVertical("box");
            {
                EditorGUILayout.LabelField("Prefabs", GUIStyles.BoxTitleStyle);

                #region template drop targets
                GUILayout.BeginHorizontal();
                {
                    GUILayout.BeginVertical();
                    {
                        // change background color in case there are no prefabs yet
                        if (editorTarget.prefabSettingsList.Count == 0)
                        {
                            EditorGUILayout.HelpBox("Drop prefabs on the prefab template boxes in order to use them.", MessageType.Info);

                            editor.SetErrorBackgroundColor();
                        }

                        int gridRows = Mathf.CeilToInt((float)templateCollection.templates.Count / Constants.PrefabTemplateGridColumnCount);

                        for (int row = 0; row < gridRows; row++)
                        {
                            GUILayout.BeginHorizontal();
                            {
                                for (int column = 0; column < Constants.PrefabTemplateGridColumnCount; column++)
                                {
                                    int index = column + row * Constants.PrefabTemplateGridColumnCount;

                                    PrefabSettingsTemplate template = index < templateCollection.templates.Count ? templateCollection.templates[index] : defaultTemplate;

                                    // drop area
                                    Rect prefabDropArea = GUILayoutUtility.GetRect(0.0f, 34.0f, GUIStyles.DropAreaStyle, GUILayout.ExpandWidth(true));

                                    bool hasDropArea = index < templateCollection.templates.Count;
                                    if (hasDropArea)
                                    {
                                        // drop area box with background color and info text
                                        GUI.color = GUIStyles.DropAreaBackgroundColor;
                                        GUI.Box(prefabDropArea, template.templateName, GUIStyles.DropAreaStyle);
                                        GUI.color = GUIStyles.DefaultBackgroundColor;

                                        Event evt = Event.current;
                                        switch (evt.type)
                                        {
                                        case EventType.DragUpdated:
                                        case EventType.DragPerform:

                                            if (prefabDropArea.Contains(evt.mousePosition))
                                            {
                                                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

                                                if (evt.type == EventType.DragPerform)
                                                {
                                                    DragAndDrop.AcceptDrag();

                                                    // list of new prefabs that should be created via drag/drop
                                                    // we can't do it in the drag/drop code itself, we'd get exceptions like
                                                    //   ArgumentException: Getting control 12's position in a group with only 12 controls when doing dragPerform. Aborting
                                                    // followed by
                                                    //   Unexpected top level layout group! Missing GUILayout.EndScrollView/EndVertical/EndHorizontal? UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
                                                    // they must be added when everything is done (currently at the end of this method)
                                                    editor.newDraggedPrefabs = new List <PrefabSettings>();

                                                    foreach (Object droppedObject in DragAndDrop.objectReferences)
                                                    {
                                                        // allow only prefabs
                                                        if (PrefabUtility.GetPrefabAssetType(droppedObject) == PrefabAssetType.NotAPrefab)
                                                        {
                                                            Debug.Log("Not a prefab: " + droppedObject);
                                                            continue;
                                                        }

                                                        // add the prefab to the list using the template
                                                        AddPrefab(droppedObject as GameObject, template);
                                                    }
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                            GUILayout.EndHorizontal();
                        }

                        editor.SetDefaultBackgroundColor();
                    }
                    GUILayout.EndVertical();
                }
                GUILayout.EndHorizontal();

                #endregion template drop targets

                if (editorTarget.prefabSettingsList.Count > 0)
                {
                    EditorGUILayout.Space();
                }

                for (int i = 0; i < editorTarget.prefabSettingsList.Count; i++)
                {
                    // horizontal separator
                    editor.AddGUISeparator(i == 0 ? 0f : 10f, 10f);

                    PrefabSettings prefabSettings = this.editorTarget.prefabSettingsList[i];

                    GUILayout.BeginHorizontal();
                    {
                        // preview

                        // try to get the asset preview
                        Texture2D previewTexture = AssetPreview.GetAssetPreview(prefabSettings.prefab);

                        // if no asset preview available, try to get the mini thumbnail
                        if (!previewTexture)
                        {
                            previewTexture = AssetPreview.GetMiniThumbnail(prefabSettings.prefab);
                        }

                        // if a preview is available, paint it
                        if (previewTexture)
                        {
                            //GUILayout.Label(previewTexture, EditorStyles.objectFieldThumb, GUILayout.Width(50), GUILayout.Height(50)); // without border, but with size
                            GUILayout.Label(previewTexture, GUILayout.Width(50), GUILayout.Height(50)); // without border, but with size

                            //GUILayout.Box(previewTexture); // with border
                            //GUILayout.Label(previewTexture); // no border
                            //GUILayout.Box(previewTexture, GUILayout.Width(50), GUILayout.Height(50)); // with border and size
                            //EditorGUI.DrawPreviewTexture(new Rect(25, 60, 100, 100), previewTexture); // draws it in absolute coordinates
                        }

                        // right align the buttons
                        GUILayout.FlexibleSpace();

                        if (GUILayout.Button("Add", EditorStyles.miniButton))
                        {
                            this.editorTarget.prefabSettingsList.Insert(i + 1, new PrefabSettings());
                        }
                        if (GUILayout.Button("Duplicate", EditorStyles.miniButton))
                        {
                            PrefabSettings newPrefabSettings = prefabSettings.Clone();
                            this.editorTarget.prefabSettingsList.Insert(i + 1, newPrefabSettings);
                        }
                        if (GUILayout.Button("Reset", EditorStyles.miniButton))
                        {
                            // remove existing
                            this.editorTarget.prefabSettingsList.RemoveAt(i);

                            // add new
                            this.editorTarget.prefabSettingsList.Insert(i, new PrefabSettings());
                        }
                        if (GUILayout.Button("Remove", EditorStyles.miniButton))
                        {
                            this.editorTarget.prefabSettingsList.Remove(prefabSettings);
                        }
                    }
                    GUILayout.EndHorizontal();

                    GUILayout.Space(4);

                    prefabSettings.prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefabSettings.prefab, typeof(GameObject), true);

                    prefabSettings.active      = EditorGUILayout.Toggle("Active", prefabSettings.active);
                    prefabSettings.probability = EditorGUILayout.Slider("Probability", prefabSettings.probability, 0, 1);

                    // scale
                    if (editorTarget.brushSettings.distribution == BrushSettings.Distribution.Fluent)
                    {
                        // use the brush scale, hide the change scale option
                    }
                    else
                    {
                        prefabSettings.changeScale = EditorGUILayout.Toggle("Change Scale", prefabSettings.changeScale);

                        if (prefabSettings.changeScale)
                        {
                            prefabSettings.scaleMin = EditorGUILayout.FloatField("Scale Min", prefabSettings.scaleMin);
                            prefabSettings.scaleMax = EditorGUILayout.FloatField("Scale Max", prefabSettings.scaleMax);
                        }
                    }
                    // position
                    prefabSettings.positionOffset = EditorGUILayout.Vector3Field("Position Offset", prefabSettings.positionOffset);

                    // rotation
                    prefabSettings.rotationOffset = EditorGUILayout.Vector3Field("Rotation Offset", prefabSettings.rotationOffset);
                    GUILayout.BeginHorizontal();
                    {
                        prefabSettings.randomRotation = EditorGUILayout.Toggle("Random Rotation", prefabSettings.randomRotation);

                        // right align the buttons
                        GUILayout.FlexibleSpace();

                        if (GUILayout.Button("X", EditorStyles.miniButton))
                        {
                            QuickRotationSetting(prefabSettings, 1f, 0f, 0f);
                        }
                        if (GUILayout.Button("Y", EditorStyles.miniButton))
                        {
                            QuickRotationSetting(prefabSettings, 0f, 1f, 0f);
                        }
                        if (GUILayout.Button("Z", EditorStyles.miniButton))
                        {
                            QuickRotationSetting(prefabSettings, 0f, 0f, 1f);
                        }
                        if (GUILayout.Button("XYZ", EditorStyles.miniButton))
                        {
                            QuickRotationSetting(prefabSettings, 1f, 1f, 1f);
                        }

                        if (GUILayout.Button(prefabSettings.rotationRange.GetDisplayName(), EditorStyles.miniButton))
                        {
                            prefabSettings.rotationRange = prefabSettings.rotationRange.GetNext();
                        }
                    }
                    GUILayout.EndHorizontal();

                    // rotation limits
                    if (prefabSettings.randomRotation)
                    {
                        float min = prefabSettings.rotationRange.GetMinimum();
                        float max = prefabSettings.rotationRange.GetMaximum();

                        EditorGuiUtilities.MinMaxEditor("  Rotation Limit X", ref prefabSettings.rotationMinX, ref prefabSettings.rotationMaxX, min, max);
                        EditorGuiUtilities.MinMaxEditor("  Rotation Limit Y", ref prefabSettings.rotationMinY, ref prefabSettings.rotationMaxY, min, max);
                        EditorGuiUtilities.MinMaxEditor("  Rotation Limit Z", ref prefabSettings.rotationMinZ, ref prefabSettings.rotationMaxZ, min, max);
                    }

                    // VS Pro Id
#if VEGETATION_STUDIO_PRO
                    EditorGUI.BeginDisabledGroup(true);
                    EditorGUILayout.TextField("Asset GUID", prefabSettings.assetGUID);
                    EditorGUILayout.TextField("VSPro Id", prefabSettings.vspro_VegetationItemID);
                    EditorGUI.EndDisabledGroup();
#endif
                }
            }

            GUILayout.EndVertical();
        }
Ejemplo n.º 3
0
        public override void OnInspectorGUI()
        {
            // Update the serializedProperty - always do this in the beginning of OnInspectorGUI.
            editor.serializedObject.Update();

            newDraggedPrefabs = null;

            // draw default inspector elements
            DrawDefaultInspector();

            ///
            /// Version Info
            ///
            EditorGUILayout.HelpBox("Prefab Painter v0.9 (Beta)", MessageType.Info);

            ///
            /// General settings
            ///


            GUILayout.BeginVertical("box");
            {
                EditorGUILayout.LabelField("General Settings", GUIStyles.BoxTitleStyle);

                EditorGUILayout.BeginHorizontal();

                // container
                EditorGUILayout.PrefixLabel("");

                if (this.editorTarget.container == null)
                {
                    editor.SetErrorBackgroundColor();
                }

                EditorGUILayout.PropertyField(container);

                editor.SetDefaultBackgroundColor();

                if (GUILayout.Button("New", EditorStyles.miniButton, GUILayout.Width(50)))
                {
                    GameObject newContainer = new GameObject();

                    string name = editorTarget.name + " Container" + " (" + (this.editorTarget.transform.childCount + 1) + ")";
                    newContainer.name = name;

                    // set parent; reset position & rotation
                    newContainer.transform.SetParent(this.editorTarget.transform, false);

                    // set as new value
                    container.objectReferenceValue = newContainer;
                }

                if (GUILayout.Button("Clear", EditorStyles.miniButton, GUILayout.Width(50)))
                {
                    if (container != null)
                    {
                        this.toolsModule.RemoveContainerChildren();
                    }
                }

                EditorGUILayout.EndHorizontal();
            }
            GUILayout.EndVertical();

            ///
            /// mode
            ///

            GUILayout.BeginVertical("box");
            {
                EditorGUILayout.LabelField("Mode", GUIStyles.BoxTitleStyle);

                EditorGUILayout.BeginHorizontal();

                EditorGUI.BeginChangeCheck();
                {
                    mode.intValue = GUILayout.Toolbar(mode.intValue, modeButtons);
                }
                if (EditorGUI.EndChangeCheck())
                {
                    brushModule.ModeChanged((PrefabPainter.Mode)mode.intValue);
                }

                EditorGUILayout.EndHorizontal();
            }
            GUILayout.EndVertical();

            ///
            /// Mode dependent
            ///

            switch (this.editorTarget.mode)
            {
            case PrefabPainter.Mode.Brush:

                brushModule.OnInspectorGUI();

                // spawn
                spawnModule.OnInspectorGUI();

                // filter
                filterModule.OnInspectorGUI();

                /// Prefabs
                this.prefabModule.OnInspectorGUI();

                break;

            case PrefabPainter.Mode.Spline:

                splineModule.OnInspectorGUI();

                // spawn
                if (editorTarget.splineSettings.spawnMechanism == SplineSettings.SpawnMechanism.Manual)
                {
                    spawnModule.OnInspectorGUI();
                }

                /// Prefabs
                this.prefabModule.OnInspectorGUI();

                break;

            case PrefabPainter.Mode.Interaction:

                interactionModule.OnInspectorGUI();

                // spawn
                spawnModule.OnInspectorGUI();

                break;

            case PrefabPainter.Mode.Container:
                containerModule.OnInspectorGUI();

                /// Physics
                this.physicsModule.OnInspectorGUI();

                /// Copy/Paste
                this.copyPasteModule.OnInspectorGUI();

                // Selection
                this.selectionModule.OnInspectorGUI();

                // Tools
                this.toolsModule.OnInspectorGUI();
                break;
            }



            // add new prefabs
            if (newDraggedPrefabs != null)
            {
                this.editorTarget.prefabSettingsList.AddRange(newDraggedPrefabs);
            }

            // Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI.
            editor.serializedObject.ApplyModifiedProperties();
        }