Ejemplo n.º 1
0
        private static void OnBottomToolbarGUI(int windowID)
        {
            GUILayout.BeginHorizontal();

            GUIStyle createBrushStyle = new GUIStyle(EditorStyles.toolbarButton);

            createBrushStyle.fixedHeight = 20;
            if (GUI.Button(new Rect(0, 0, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonCubeTexture, createBrushStyle))
            {
                CreatePrimitiveBrush(PrimitiveBrushType.Cube);
            }

            if (GUI.Button(new Rect(30, 0, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonPrismTexture, createBrushStyle))
            {
                CreatePrimitiveBrush(PrimitiveBrushType.Prism);
            }

            //if(GUI.Button(new Rect(60,0, 30, createBrushStyle.fixedHeight), "", createBrushStyle))
            //{
            //}

            if (GUI.Button(new Rect(60, 0, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonStairsTexture, createBrushStyle))
            {
                CreateCompoundBrush <StairBrush>();
            }

            if (GUI.Button(new Rect(90, 0, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonCurvedStairsTexture, createBrushStyle))
            {
                CreateCompoundBrush <CurvedStairBrush>();
            }

            GUILayout.Space(92 + 30);
#if DEBUG_SABRECSG_PERF
            // For debugging frame rate
            GUILayout.Label(((int)(1 / csgModel.CurrentFrameDelta)).ToString(), SabreGUILayout.GetLabelStyle());
#endif

            if (SabreGUILayout.Button("Rebuild"))
            {
                csgModel.Build(false, false);
            }

            if (SabreGUILayout.Button("Force Rebuild"))
            {
                csgModel.Build(true, false);
            }

            GUI.color = Color.white;

            if (csgModel.AutoRebuild)
            {
                GUI.color = Color.green;
            }
            csgModel.AutoRebuild = SabreGUILayout.Toggle(csgModel.AutoRebuild, "Auto Rebuild");
            GUI.color            = Color.white;

            GUILayout.Label(csgModel.BuildMetrics.BuildMetaData.ToString(), SabreGUILayout.GetForeStyle(), GUILayout.Width(140));

            bool lastBrushesHidden = CurrentSettings.BrushesHidden;
            if (lastBrushesHidden)
            {
                GUI.color = Color.red;
            }
            CurrentSettings.BrushesHidden = SabreGUILayout.Toggle(CurrentSettings.BrushesHidden, "Brushes Hidden");
            if (CurrentSettings.BrushesHidden != lastBrushesHidden)
            {
                // Has changed
                CSGModel.UpdateAllBrushesVisibility();
                SceneView.RepaintAll();
            }
            GUI.color = Color.white;


            bool lastMeshHidden = CurrentSettings.MeshHidden;
            if (lastMeshHidden)
            {
                GUI.color = Color.red;
            }
            CurrentSettings.MeshHidden = SabreGUILayout.Toggle(CurrentSettings.MeshHidden, "Mesh Hidden");
            if (CurrentSettings.MeshHidden != lastMeshHidden)
            {
                // Has changed
                CSGModel.UpdateAllBrushesVisibility();
                SceneView.RepaintAll();
            }

            GUI.color = Color.white;


            if (GUILayout.Button("Grid " + CurrentSettings.GridMode.ToString(), EditorStyles.toolbarDropDown, GUILayout.Width(90)))
            {
                GenericMenu menu = new GenericMenu();

                string[] names = Enum.GetNames(typeof(GridMode));

                for (int i = 0; i < names.Length; i++)
                {
                    GridMode value    = (GridMode)Enum.Parse(typeof(GridMode), names[i]);
                    bool     selected = false;
                    if (CurrentSettings.GridMode == value)
                    {
                        selected = true;
                    }
                    menu.AddItem(new GUIContent(names[i]), selected, OnSelectedGridOption, value);
                }

                menu.DropDown(gridRect);
            }

            if (Event.current.type == EventType.Repaint)
            {
                gridRect       = GUILayoutUtility.GetLastRect();
                gridRect.width = 100;
            }

            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();

            // Line Two
            GUILayout.BeginHorizontal();

            if (GUI.Button(new Rect(0, createBrushStyle.fixedHeight, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonCylinderTexture, createBrushStyle))
            {
                CreatePrimitiveBrush(PrimitiveBrushType.Cylinder);
            }

            if (GUI.Button(new Rect(30, createBrushStyle.fixedHeight, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonSphereTexture, createBrushStyle))
            {
                CreatePrimitiveBrush(PrimitiveBrushType.Sphere);
            }

            if (GUI.Button(new Rect(60, createBrushStyle.fixedHeight, 30, createBrushStyle.fixedHeight), SabreCSGResources.ButtonConeTexture, createBrushStyle))
            {
                CreatePrimitiveBrush(PrimitiveBrushType.Cone);
            }

            //if (GUI.Button(new Rect(60, createBrushStyle.fixedHeight, 30, createBrushStyle.fixedHeight), "", createBrushStyle))
            //{
            //}

            if (GUI.Button(new Rect(90, createBrushStyle.fixedHeight, 30, createBrushStyle.fixedHeight), "...", createBrushStyle))
            {
                GenericMenu menu = new GenericMenu();

                List <Type> compoundBrushTypes = CompoundBrush.FindAllInAssembly();
                for (int i = 0; i < compoundBrushTypes.Count; i++)
                {
                    menu.AddItem(new GUIContent(compoundBrushTypes[i].Name), false, CreateCompoundBrush, compoundBrushTypes[i]);
                }

                menu.DropDown(new Rect(60, createBrushStyle.fixedHeight, 100, createBrushStyle.fixedHeight));
            }

            GUILayout.Space(92 + 30);

            // Display brush count
            GUILayout.Label(csgModel.BrushCount.ToStringWithSuffix(" brush", " brushes"), SabreGUILayout.GetLabelStyle());
//			CurrentSettings.GridMode = (GridMode)EditorGUILayout.EnumPopup(CurrentSettings.GridMode, EditorStyles.toolbarPopup, GUILayout.Width(80));

            if (Selection.activeGameObject != null)
            {
                BrushBase        primaryBrush = Selection.activeGameObject.GetComponent <BrushBase>();
                List <BrushBase> brushes      = new List <BrushBase>();
                for (int i = 0; i < Selection.gameObjects.Length; i++)
                {
                    BrushBase brush = Selection.gameObjects[i].GetComponent <BrushBase>();
                    if (brush != null)
                    {
                        brushes.Add(brush);
                    }
                }
                if (primaryBrush != null)
                {
                    CSGMode brushMode = (CSGMode)EditorGUILayout.EnumPopup(primaryBrush.Mode, EditorStyles.toolbarPopup, GUILayout.Width(80));
                    if (brushMode != primaryBrush.Mode)
                    {
                        bool anyChanged = false;

                        foreach (BrushBase brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush To " + brushMode);
                            brush.Mode = brushMode;
                            anyChanged = true;
                        }
                        if (anyChanged)
                        {
                            // Need to update the icon for the csg mode in the hierarchy
                            EditorApplication.RepaintHierarchyWindow();
                        }
                    }


                    bool[] noCSGStates = brushes.Select(brush => brush.IsNoCSG).Distinct().ToArray();
                    bool   isNoCSG     = (noCSGStates.Length == 1) ? noCSGStates[0] : false;

                    bool newIsNoCSG = SabreGUILayout.ToggleMixed(noCSGStates, "NoCSG", GUILayout.Width(53));


                    bool[] collisionStates = brushes.Select(item => item.HasCollision).Distinct().ToArray();
                    bool   hasCollision    = (collisionStates.Length == 1) ? collisionStates[0] : false;

                    bool newHasCollision = SabreGUILayout.ToggleMixed(collisionStates, "Collision", GUILayout.Width(53));


                    bool[] visibleStates = brushes.Select(item => item.IsVisible).Distinct().ToArray();
                    bool   isVisible     = (visibleStates.Length == 1) ? visibleStates[0] : false;

                    bool newIsVisible = SabreGUILayout.ToggleMixed(visibleStates, "Visible", GUILayout.Width(53));

                    if (newIsNoCSG != isNoCSG)
                    {
                        foreach (BrushBase brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush NoCSG Mode");
                            brush.IsNoCSG = newIsNoCSG;
                        }
                        // Tell the brushes that they have changed and need to recalc intersections
                        foreach (BrushBase brush in brushes)
                        {
                            brush.Invalidate(true);
                        }

                        EditorApplication.RepaintHierarchyWindow();
                    }
                    if (newHasCollision != hasCollision)
                    {
                        foreach (BrushBase brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush Collision Mode");
                            brush.HasCollision = newHasCollision;
                        }
                        // Tell the brushes that they have changed and need to recalc intersections
                        foreach (BrushBase brush in brushes)
                        {
                            brush.Invalidate(true);
                        }
                    }
                    if (newIsVisible != isVisible)
                    {
                        foreach (BrushBase brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush Visible Mode");
                            brush.IsVisible = newIsVisible;
                        }
                        // Tell the brushes that they have changed and need to recalc intersections
                        foreach (BrushBase brush in brushes)
                        {
                            brush.Invalidate(true);
                        }
                        if (newIsVisible == false)
                        {
                            csgModel.NotifyPolygonsRemoved();
                        }
                    }
                }
            }

            GUILayout.Space(10);

            // Position snapping UI
            CurrentSettings.PositionSnappingEnabled = SabreGUILayout.Toggle(CurrentSettings.PositionSnappingEnabled, "Pos Snapping");
            CurrentSettings.PositionSnapDistance    = EditorGUILayout.FloatField(CurrentSettings.PositionSnapDistance, GUILayout.Width(50));

            if (SabreGUILayout.Button("-", EditorStyles.miniButtonLeft))
            {
                CurrentSettings.ChangePosSnapDistance(.5f);
            }
            if (SabreGUILayout.Button("+", EditorStyles.miniButtonRight))
            {
                CurrentSettings.ChangePosSnapDistance(2f);
            }

            // Rotation snapping UI
            CurrentSettings.AngleSnappingEnabled = SabreGUILayout.Toggle(CurrentSettings.AngleSnappingEnabled, "Ang Snapping");
            CurrentSettings.AngleSnapDistance    = EditorGUILayout.FloatField(CurrentSettings.AngleSnapDistance, GUILayout.Width(50));

            if (SabreGUILayout.Button("-", EditorStyles.miniButtonLeft))
            {
                if (CurrentSettings.AngleSnapDistance > 15)
                {
                    CurrentSettings.AngleSnapDistance -= 15;
                }
                else
                {
                    CurrentSettings.AngleSnapDistance -= 5;
                }
            }
            if (SabreGUILayout.Button("+", EditorStyles.miniButtonRight))
            {
                if (CurrentSettings.AngleSnapDistance >= 15)
                {
                    CurrentSettings.AngleSnapDistance += 15;
                }
                else
                {
                    CurrentSettings.AngleSnapDistance += 5;
                }
            }

            GUILayout.FlexibleSpace();

            if (SabreGUILayout.Button("Prefs"))
            {
                SabreCSGPreferences.CreateAndShow();
            }

            if (SabreGUILayout.Button("Disable"))
            {
                Selection.activeGameObject = null;
                csgModel.EditMode          = false;
            }

            GUILayout.EndHorizontal();
        }
Ejemplo n.º 2
0
        private void OnGenericKeyAction(SceneView sceneView, Event e)
        {
            if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ToggleMode)) ||
                KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ToggleModeBack)))
            {
                // Toggle mode - immediately (key down)
                if (e.type == EventType.KeyDown)
                {
                    int currentModeInt = (int)CurrentSettings.CurrentMode;
                    int count          = Enum.GetNames(typeof(MainMode)).Length;

                    if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ToggleModeBack)))
                    {
                        currentModeInt--;
                    }
                    else
                    {
                        currentModeInt++;
                    }

                    if (currentModeInt >= count)
                    {
                        currentModeInt = 0;
                    }
                    else if (currentModeInt < 0)
                    {
                        currentModeInt = count - 1;
                    }
                    SetCurrentMode((MainMode)currentModeInt);

                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.IncreasePosSnapping)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    CurrentSettings.ChangePosSnapDistance(2f);
                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.DecreasePosSnapping)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    CurrentSettings.ChangePosSnapDistance(.5f);
                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.TogglePosSnapping)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    CurrentSettings.PositionSnappingEnabled = !CurrentSettings.PositionSnappingEnabled;
                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.IncreaseAngSnapping)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    if (CurrentSettings.AngleSnapDistance >= 15)
                    {
                        CurrentSettings.AngleSnapDistance += 15;
                    }
                    else
                    {
                        CurrentSettings.AngleSnapDistance += 5;
                    }
                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.DecreaseAngSnapping)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    if (CurrentSettings.AngleSnapDistance > 15)
                    {
                        CurrentSettings.AngleSnapDistance -= 15;
                    }
                    else
                    {
                        CurrentSettings.AngleSnapDistance -= 5;
                    }
                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ToggleAngSnapping)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    CurrentSettings.AngleSnappingEnabled = !CurrentSettings.AngleSnappingEnabled;
                    SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ToggleBrushesHidden)) &&
                     !SabreGUIHelper.AnyControlFocussed)
            {
                if (e.type == EventType.KeyUp)
                {
                    CurrentSettings.BrushesHidden = !CurrentSettings.BrushesHidden;
                    UpdateBrushVisibility();
                    SceneView.RepaintAll();
                    //					SceneView.RepaintAll();
                }
                e.Use();
            }
            else if (!mouseIsHeld && (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ChangeBrushToAdditive)) ||
                                      KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ChangeBrushToAdditive2)))
                     )
            {
                if (e.type == EventType.KeyDown)
                {
                    bool anyChanged = false;

                    for (int i = 0; i < Selection.gameObjects.Length; i++)
                    {
                        Brush brush = Selection.gameObjects[i].GetComponent <Brush>();
                        if (brush != null)
                        {
                            Undo.RecordObject(brush, "Change Brush To Add");
                            brush.Mode = CSGMode.Add;
                            anyChanged = true;
                        }
                    }
                    if (anyChanged)
                    {
                        // Need to update the icon for the csg mode in the hierarchy
                        EditorApplication.RepaintHierarchyWindow();
                        SceneView.RepaintAll();
                    }
                }
                e.Use();
            }
            else if (!mouseIsHeld && (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ChangeBrushToSubtractive)) ||
                                      KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.ChangeBrushToSubtractive2)))
                     )
            {
                if (e.type == EventType.KeyDown)
                {
                    bool anyChanged = false;

                    for (int i = 0; i < Selection.gameObjects.Length; i++)
                    {
                        Brush brush = Selection.gameObjects[i].GetComponent <Brush>();
                        if (brush != null)
                        {
                            Undo.RecordObject(brush, "Change Brush To Subtract");
                            brush.Mode = CSGMode.Subtract;
                            anyChanged = true;
                        }
                    }
                    if (anyChanged)
                    {
                        // Need to update the icon for the csg mode in the hierarchy
                        EditorApplication.RepaintHierarchyWindow();
                        SceneView.RepaintAll();
                    }
                }
                e.Use();
            }
            else if (!mouseIsHeld && (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.Group)) &&
                                      !SabreGUIHelper.AnyControlFocussed)
                     )
            {
                if (e.type == EventType.KeyDown)
                {
                    if (Selection.activeTransform != null)
                    {
                        List <Transform> selectedTransforms = Selection.transforms.ToList();
                        selectedTransforms.Sort((x, y) => x.GetSiblingIndex().CompareTo(y.GetSiblingIndex()));

                        Transform rootTransform = Selection.activeTransform.parent;

                        int earliestSiblingIndex = Selection.activeTransform.GetSiblingIndex();

                        // Make sure we use the earliest sibling index for grouping, as they may select in reverse order up the hierarchy
                        for (int i = 0; i < selectedTransforms.Count; i++)
                        {
                            if (selectedTransforms[i].parent == rootTransform)
                            {
                                int siblingIndex = selectedTransforms[i].GetSiblingIndex();
                                if (siblingIndex < earliestSiblingIndex)
                                {
                                    earliestSiblingIndex = siblingIndex;
                                }
                            }
                        }

                        // Create group
                        GameObject groupObject = new GameObject("Group");
                        Undo.RegisterCreatedObjectUndo(groupObject, "Group");
                        Undo.SetTransformParent(groupObject.transform, rootTransform, "Group");

                        groupObject.transform.position   = Selection.activeTransform.position;
                        groupObject.transform.rotation   = Selection.activeTransform.rotation;
                        groupObject.transform.localScale = Selection.activeTransform.localScale;
                        // Ensure correct sibling index

                        groupObject.transform.SetSiblingIndex(earliestSiblingIndex);
                        // Renachor
                        for (int i = 0; i < selectedTransforms.Count; i++)
                        {
                            Undo.SetTransformParent(selectedTransforms[i], groupObject.transform, "Group");
                        }

                        Selection.activeGameObject = groupObject;
//						EditorApplication.RepaintHierarchyWindow();
//						SceneView.RepaintAll();
                    }
                }
                e.Use();
            }
            else if (!mouseIsHeld && (KeyMappings.EventsMatch(e, Event.KeyboardEvent(KeyMappings.Ungroup)) &&
                                      !SabreGUIHelper.AnyControlFocussed)
                     )
            {
                if (e.type == EventType.KeyDown)
                {
                    if (Selection.activeTransform != null && Selection.activeGameObject.GetComponents <MonoBehaviour>().Length == 0)
                    {
                        Transform rootTransform = Selection.activeTransform.parent;
                        int       siblingIndex  = Selection.activeTransform.GetSiblingIndex();

                        int childCount = Selection.activeTransform.childCount;
                        UnityEngine.Object[] newSelection = new UnityEngine.Object[childCount];

                        for (int i = 0; i < childCount; i++)
                        {
                            Transform childTransform = Selection.activeTransform.GetChild(0);
                            Undo.SetTransformParent(childTransform, rootTransform, "Ungroup");
                            childTransform.SetSiblingIndex(siblingIndex + i);

                            newSelection[i] = childTransform.gameObject;
                        }
                        Undo.DestroyObjectImmediate(Selection.activeGameObject);
                        //				GameObject.DestroyImmediate(Selection.activeGameObject);
                        Selection.objects = newSelection;
                    }
                }
                e.Use();
            }
        }
Ejemplo n.º 3
0
        private static void OnBottomToolbarGUI(int windowID)
        {
            GUILayout.BeginHorizontal();

            GUIStyle createBrushStyle = new GUIStyle(EditorStyles.toolbarButton);

            createBrushStyle.fixedHeight = 20;
            if (GUILayout.Button(SabreCSGResources.ButtonCubeTexture, createBrushStyle))
            {
                CreatePrimitiveBrush(PrimitiveBrushType.Cube);
            }

            primitiveMenuShowing = GUILayout.Toggle(primitiveMenuShowing, primitiveMenuShowing?"▼": "▲", createBrushStyle);

#if DEBUG_SABRECSG_PERF
            // For debugging frame rate
            GUILayout.Label(((int)(1 / csgModel.CurrentFrameDelta)).ToString(), SabreGUILayout.GetLabelStyle());
#endif

            if (SabreGUILayout.Button("Rebuild", createBrushStyle))
            {
                csgModel.Build(false, false);
            }

            if (SabreGUILayout.Button("Force Rebuild", createBrushStyle))
            {
                csgModel.Build(true, false);
            }

            GUI.color = Color.white;

            csgModel.AutoRebuild = GUILayout.Toggle(csgModel.AutoRebuild, "Auto Rebuild", createBrushStyle);

            GUI.color = Color.white;
#if SABRE_CSG_DEBUG
            GUILayout.Label(csgModel.BuildMetrics.BuildMetaData.ToString(), SabreGUILayout.GetForeStyle(), GUILayout.Width(140));
#else
            EditorGUILayout.Space();
#endif

            if (showToolbarOnTwoLines)
            {
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
                GUILayout.BeginHorizontal();
            }


            GUILayout.FlexibleSpace();

            GUIStyle labelStyle = new GUIStyle(EditorStyles.label);
            labelStyle.fontSize    = 9;
            labelStyle.fixedHeight = 16;
            labelStyle.alignment   = TextAnchor.MiddleCenter;

            GUILayout.Label("Grid size", labelStyle);

            CurrentSettings.PositionSnapDistance = EditorGUILayout.FloatField(CurrentSettings.PositionSnapDistance, GUILayout.MaxWidth(70f), GUILayout.MinWidth(30f));

            if (SabreGUILayout.Button("-", EditorStyles.miniButtonLeft))
            {
                CurrentSettings.ChangePosSnapDistance(.5f);
            }
            if (SabreGUILayout.Button("+", EditorStyles.miniButtonRight))
            {
                CurrentSettings.ChangePosSnapDistance(2f);
            }

            viewMenuShowing = GUILayout.Toggle(viewMenuShowing, "Viewport settings", createBrushStyle);

            GUILayout.EndHorizontal();
        }
Ejemplo n.º 4
0
        private static void OnBottomToolbarGUI(int windowID)
        {
            GUILayout.BeginHorizontal();

            // For debugging frame rate
//			GUILayout.Label(((int)(1 / csgModel.CurrentFrameDelta)).ToString(), SabreGUILayout.GetLabelStyle());

            if (GUILayout.Button("Create", EditorStyles.toolbarDropDown))
            {
                GenericMenu menu = new GenericMenu();

                string[] names = Enum.GetNames(typeof(PrimitiveBrushType));

                for (int i = 0; i < names.Length; i++)
                {
                    if (names[i] != "Custom")
                    {
                        menu.AddItem(new GUIContent(names[i]), false, OnSelectedCreateOption, Enum.Parse(typeof(PrimitiveBrushType), names[i]));
                    }
                }

                menu.DropDown(createRect);
            }

            if (Event.current.type == EventType.Repaint)
            {
                createRect       = GUILayoutUtility.GetLastRect();
                createRect.width = 100;
            }


            if (SabreGUILayout.Button("Rebuild"))
            {
                csgModel.Build(false);
            }

            if (SabreGUILayout.Button("Force Rebuild"))
            {
                csgModel.Build(true);
            }

            GUI.color = Color.white;

            if (csgModel.AutoRebuild)
            {
                GUI.color = Color.green;
            }
            csgModel.AutoRebuild = SabreGUILayout.Toggle(csgModel.AutoRebuild, "Auto Rebuild");
            GUI.color            = Color.white;

            GUILayout.Label(csgModel.BuildMetrics.BuildMetaData.ToString(), SabreGUILayout.GetForeStyle(), GUILayout.Width(140));

            bool lastBrushesHidden = CurrentSettings.BrushesHidden;

            if (lastBrushesHidden)
            {
                GUI.color = Color.red;
            }
            CurrentSettings.BrushesHidden = SabreGUILayout.Toggle(CurrentSettings.BrushesHidden, "Brushes Hidden");
            if (CurrentSettings.BrushesHidden != lastBrushesHidden)
            {
                // Has changed
                csgModel.UpdateBrushVisibility();
                SceneView.RepaintAll();
            }
            GUI.color = Color.white;


            bool lastMeshHidden = CurrentSettings.MeshHidden;

            if (lastMeshHidden)
            {
                GUI.color = Color.red;
            }
            CurrentSettings.MeshHidden = SabreGUILayout.Toggle(CurrentSettings.MeshHidden, "Mesh Hidden");
            if (CurrentSettings.MeshHidden != lastMeshHidden)
            {
                // Has changed
                csgModel.UpdateBrushVisibility();
                SceneView.RepaintAll();
            }

            GUI.color = Color.white;


            if (GUILayout.Button("Grid " + CurrentSettings.GridMode.ToString(), EditorStyles.toolbarDropDown, GUILayout.Width(90)))
            {
                GenericMenu menu = new GenericMenu();

                string[] names = Enum.GetNames(typeof(GridMode));

                for (int i = 0; i < names.Length; i++)
                {
                    GridMode value    = (GridMode)Enum.Parse(typeof(GridMode), names[i]);
                    bool     selected = false;
                    if (CurrentSettings.GridMode == value)
                    {
                        selected = true;
                    }
                    menu.AddItem(new GUIContent(names[i]), selected, OnSelectedGridOption, value);
                }

                menu.DropDown(gridRect);
            }

            if (Event.current.type == EventType.Repaint)
            {
                gridRect       = GUILayoutUtility.GetLastRect();
                gridRect.width = 100;
            }

            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();

            // Line Two
            GUILayout.BeginHorizontal();

            // Display brush count
            GUILayout.Label(csgModel.BrushCount.ToStringWithSuffix(" brush", " brushes"), SabreGUILayout.GetLabelStyle());
//			CurrentSettings.GridMode = (GridMode)EditorGUILayout.EnumPopup(CurrentSettings.GridMode, EditorStyles.toolbarPopup, GUILayout.Width(80));

            if (Selection.activeGameObject != null)
            {
                Brush        primaryBrush = Selection.activeGameObject.GetComponent <Brush>();
                List <Brush> brushes      = new List <Brush>();
                for (int i = 0; i < Selection.gameObjects.Length; i++)
                {
                    Brush brush = Selection.gameObjects[i].GetComponent <Brush>();
                    if (brush != null)
                    {
                        brushes.Add(brush);
                    }
                }
                if (primaryBrush != null)
                {
                    CSGMode brushMode = (CSGMode)EditorGUILayout.EnumPopup(primaryBrush.Mode, EditorStyles.toolbarPopup, GUILayout.Width(80));
                    if (brushMode != primaryBrush.Mode)
                    {
                        bool anyChanged = false;

                        foreach (Brush brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush To " + brushMode);
                            brush.Mode = brushMode;
                            anyChanged = true;
                        }
                        if (anyChanged)
                        {
                            // Need to update the icon for the csg mode in the hierarchy
                            EditorApplication.RepaintHierarchyWindow();
                        }
                    }


                    bool[] noCSGStates = brushes.Select(brush => brush.IsNoCSG).Distinct().ToArray();
                    bool   isNoCSG     = (noCSGStates.Length == 1) ? noCSGStates[0] : false;

                    bool newIsNoCSG = SabreGUILayout.ToggleMixed(noCSGStates, "NoCSG", GUILayout.Width(53));


                    bool[] collisionStates = brushes.Select(item => item.HasCollision).Distinct().ToArray();
                    bool   hasCollision    = (collisionStates.Length == 1) ? collisionStates[0] : false;

                    bool newHasCollision = SabreGUILayout.ToggleMixed(collisionStates, "Collision", GUILayout.Width(53));


                    bool[] visibleStates = brushes.Select(item => item.IsVisible).Distinct().ToArray();
                    bool   isVisible     = (visibleStates.Length == 1) ? visibleStates[0] : false;

                    bool newIsVisible = SabreGUILayout.ToggleMixed(visibleStates, "Visible", GUILayout.Width(53));

                    if (newIsNoCSG != isNoCSG)
                    {
                        foreach (Brush brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush NoCSG Mode");
                            brush.IsNoCSG = newIsNoCSG;
                        }
                        // Tell the brushes that they have changed and need to recalc intersections
                        foreach (Brush brush in brushes)
                        {
                            brush.Invalidate(true);
                        }
                    }
                    if (newHasCollision != hasCollision)
                    {
                        foreach (Brush brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush Collision Mode");
                            brush.HasCollision = newHasCollision;
                        }
                        // Tell the brushes that they have changed and need to recalc intersections
                        foreach (Brush brush in brushes)
                        {
                            brush.Invalidate(true);
                        }
                    }
                    if (newIsVisible != isVisible)
                    {
                        foreach (Brush brush in brushes)
                        {
                            Undo.RecordObject(brush, "Change Brush Visible Mode");
                            brush.IsVisible = newIsVisible;
                        }
                        // Tell the brushes that they have changed and need to recalc intersections
                        foreach (Brush brush in brushes)
                        {
                            brush.Invalidate(true);
                        }
                        if (newIsVisible == false)
                        {
                            csgModel.NotifyPolygonsRemoved();
                        }
                    }
                }
            }

            GUILayout.Space(10);

            // Position snapping UI
            CurrentSettings.PositionSnappingEnabled = SabreGUILayout.Toggle(CurrentSettings.PositionSnappingEnabled, "Pos Snapping");
            CurrentSettings.PositionSnapDistance    = EditorGUILayout.FloatField(CurrentSettings.PositionSnapDistance, GUILayout.Width(50));

            if (SabreGUILayout.Button("-", EditorStyles.miniButtonLeft))
            {
                CurrentSettings.ChangePosSnapDistance(.5f);
            }
            if (SabreGUILayout.Button("+", EditorStyles.miniButtonRight))
            {
                CurrentSettings.ChangePosSnapDistance(2f);
            }

            // Rotation snapping UI
            CurrentSettings.AngleSnappingEnabled = SabreGUILayout.Toggle(CurrentSettings.AngleSnappingEnabled, "Ang Snapping");
            CurrentSettings.AngleSnapDistance    = EditorGUILayout.FloatField(CurrentSettings.AngleSnapDistance, GUILayout.Width(50));

            if (SabreGUILayout.Button("-", EditorStyles.miniButtonLeft))
            {
                if (CurrentSettings.AngleSnapDistance > 15)
                {
                    CurrentSettings.AngleSnapDistance -= 15;
                }
                else
                {
                    CurrentSettings.AngleSnapDistance -= 5;
                }
            }
            if (SabreGUILayout.Button("+", EditorStyles.miniButtonRight))
            {
                if (CurrentSettings.AngleSnapDistance >= 15)
                {
                    CurrentSettings.AngleSnapDistance += 15;
                }
                else
                {
                    CurrentSettings.AngleSnapDistance += 5;
                }
            }

// Disabled test build options
//			CurrentSettings.RestoreOriginalPolygons = SabreGUILayout.Toggle(CurrentSettings.RestoreOriginalPolygons, "Restore Original Polygons", GUILayout.Width(153));
//			CurrentSettings.RemoveHiddenGeometry = SabreGUILayout.Toggle(CurrentSettings.RemoveHiddenGeometry, "Remove Hidden Geometry", GUILayout.Width(153));

            GUILayout.FlexibleSpace();

//            if (CurrentSettings.CurrentMode != MainMode.Free)
//			{
//				if( Tools.current == UnityEditor.Tool.View && Tools.viewTool == ViewTool.Pan)
//				{
//					GUI.color = Color.yellow;
//				}
//			}

            if (SabreGUILayout.Button("Prefs"))
            {
                SabreCSGPreferences.CreateAndShow();
            }

            if (SabreGUILayout.Button("Disable"))
            {
                Selection.activeGameObject = null;
                csgModel.EditMode          = false;
            }

            GUILayout.EndHorizontal();
        }