public static void PreferencesGUI() { // Event.current.GetTypeForControl // // if(Event.current.type == EventType.KeyDown) // { // cachedEvent = new Event(Event.current); //// this.Repaint(); // } // // GUILayout.TextField(""); // // if(cachedEvent != null) // { // GUILayout.Label(cachedEvent.ToString()); // } // else // { // GUILayout.Label("No event"); // } GUILayout.Space(10); bool newHideGridInPerspective = GUILayout.Toggle(CurrentSettings.HideGridInPerspective, "Hide grid in perspective scene views"); if (newHideGridInPerspective != CurrentSettings.HideGridInPerspective) { SceneView.RepaintAll(); CurrentSettings.HideGridInPerspective = newHideGridInPerspective; } CurrentSettings.OverrideFlyCamera = GUILayout.Toggle(CurrentSettings.OverrideFlyCamera, "Linear fly camera"); EditorGUI.BeginChangeCheck(); CurrentSettings.ShowExcludedPolygons = GUILayout.Toggle(CurrentSettings.ShowExcludedPolygons, "Show excluded polygons"); if (EditorGUI.EndChangeCheck()) { // What's shown in the SceneView has potentially changed, so force it to repaint SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); CurrentSettings.ShowBrushesAsWireframes = GUILayout.Toggle(CurrentSettings.ShowBrushesAsWireframes, "Show brushes as wireframes"); if (EditorGUI.EndChangeCheck()) { // What's shown in the SceneView has potentially changed, so force it to repaint CSGModel.UpdateAllBrushesVisibility(); SceneView.RepaintAll(); } EditorGUI.BeginChangeCheck(); CurrentSettings.ShowBrushBoundsGuideLines = GUILayout.Toggle(CurrentSettings.ShowBrushBoundsGuideLines, "Show brush bounds guide lines"); if (EditorGUI.EndChangeCheck()) { // What's shown in the SceneView has potentially changed, so force it to repaint CSGModel.UpdateAllBrushesVisibility(); SceneView.RepaintAll(); } EditorGUILayout.Space(); EditorGUI.indentLevel = 1; EditorGUILayout.LabelField("Developer Options", EditorStyles.boldLabel); EditorGUI.indentLevel = 0; EditorGUILayout.Space(); EditorGUI.BeginChangeCheck(); CurrentSettings.ShowHiddenGameObjectsInHierarchy = GUILayout.Toggle(CurrentSettings.ShowHiddenGameObjectsInHierarchy, "Show hidden game objects in hierarchy"); if (EditorGUI.EndChangeCheck()) { // What's shown in the SceneView has potentially changed, so force it to repaint CSGModel.RebuildAllVolumes(); SceneView.RepaintAll(); } GUILayout.Space(10); if (GUILayout.Button("Change key mappings")) { Selection.activeObject = KeyMappings.Instance; // Show inspector EditorApplication.ExecuteMenuItem("Window/Inspector"); } // CurrentSettings.ReducedHandleThreshold = GUILayout.Toggle(CurrentSettings.ReducedHandleThreshold, "Reduced handle threshold"); GUILayout.Space(20); GUIStyle style = SabreGUILayout.GetForeStyle(); style.wordWrap = true; GUILayout.Label("Runtime CSG is a new experimental feature which allows you to create, alter and build brushes at runtime in your built applications.", style); BuildTargetGroup buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup); List <string> definesSplit = defines.Split(';').ToList(); bool enabled = definesSplit.Contains(RUNTIME_CSG_DEFINE); if (enabled) { if (GUILayout.Button("Disable Runtime CSG (Experimental)")) { definesSplit.Remove(RUNTIME_CSG_DEFINE); defines = string.Join(";", definesSplit.ToArray()); PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines); } } else { if (GUILayout.Button("Enable Runtime CSG (Experimental)")) { if (!definesSplit.Contains(RUNTIME_CSG_DEFINE)) { definesSplit.Add(RUNTIME_CSG_DEFINE); } defines = string.Join(";", definesSplit.ToArray()); PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines); } } GUILayout.FlexibleSpace(); GUILayout.Label("SabreCSG Version " + CSGModel.VERSION_STRING, SabreGUILayout.GetForeStyle()); }
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(); }
static void OnViewMenuGUI(int windowID) { float left_pad = 90f; EditorGUIUtility.labelWidth = 118f; GUILayout.Space(4); GUILayout.BeginHorizontal(); GUILayout.Label("Viewport Settings", EditorStyles.boldLabel); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); bool lastBrushesHidden = CurrentSettings.BrushesHidden; CurrentSettings.BrushesHidden = EditorGUILayout.Toggle( new GUIContent("Hide Brushes", "Hotkey: " + KeyMappings.Instance.ToggleBrushesHidden), CurrentSettings.BrushesHidden ); if (CurrentSettings.BrushesHidden != lastBrushesHidden) { // Has changed CSGModel.UpdateAllBrushesVisibility(); SceneView.RepaintAll(); } GUILayout.EndHorizontal(); bool lastMeshHidden = CurrentSettings.MeshHidden; CurrentSettings.MeshHidden = EditorGUILayout.Toggle("Hide Meshes", CurrentSettings.MeshHidden); if (CurrentSettings.MeshHidden != lastMeshHidden) { // Has changed CSGModel.UpdateAllBrushesVisibility(); SceneView.RepaintAll(); } GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Label("Grid Settings", EditorStyles.boldLabel); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Grid type", EditorStyles.label); GUILayout.FlexibleSpace(); GridMode lastMode = CurrentSettings.GridMode; CurrentSettings.GridMode = (GridMode)EditorGUILayout.EnumPopup(CurrentSettings.GridMode, GUILayout.Width(left_pad)); if (CurrentSettings.GridMode != lastMode) { OnSelectedGridOption(CurrentSettings.GridMode); } GUILayout.EndHorizontal(); // Projected grid bool lastProjectedGridEnabled = CurrentSettings.ProjectedGridEnabled; CurrentSettings.ProjectedGridEnabled = EditorGUILayout.Toggle( new GUIContent("Projected Grid", "Hotkey: " + KeyMappings.Instance.ToggleProjectedGrid.Replace("#", "Shift+")), CurrentSettings.ProjectedGridEnabled ); if (CurrentSettings.ProjectedGridEnabled != lastProjectedGridEnabled) { SceneView.RepaintAll(); } if (Event.current.type == EventType.Repaint) { gridRect = GUILayoutUtility.GetLastRect(); gridRect.width = 100; } // Position snapping UI CurrentSettings.PositionSnappingEnabled = EditorGUILayout.Toggle( new GUIContent("Grid snapping", "Hotkey: " + KeyMappings.Instance.TogglePosSnapping.Replace("#", "Shift+")), CurrentSettings.PositionSnappingEnabled ); // Position snapping UI CurrentSettings.AngleSnappingEnabled = EditorGUILayout.Toggle( new GUIContent("Rotation snapping", "Hotkey: " + KeyMappings.Instance.ToggleAngSnapping.Replace("#", "Shift+")), CurrentSettings.AngleSnappingEnabled ); // Rotation snapping UI GUILayout.BeginHorizontal(); GUILayout.Label(new GUIContent( "Rotation size", "Hotkeys: " + KeyMappings.Instance.DecreaseAngSnapping.Replace("#", "Shift+") + " " + KeyMappings.Instance.IncreaseAngSnapping.Replace("#", "Shift+") ), EditorStyles.label); GUILayout.FlexibleSpace(); // 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.EndHorizontal(); }