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(); }
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(); } 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()); }
public void DrawBrushTypeField() { GUILayout.BeginHorizontal(); PrimitiveBrushType[] selectedTypes = BrushTargets.Select(item => item.BrushType).ToArray(); if (overridenBrushType.HasValue) { selectedTypes = new PrimitiveBrushType[] { overridenBrushType.Value }; } PrimitiveBrushType?newType = SabreGUILayout.EnumPopupMixed("Brush Type", selectedTypes); if (newType.HasValue) { overridenBrushType = newType; if (newType.Value == PrimitiveBrushType.Prism) { GUILayout.Label("Sides", SabreGUILayout.GetForeStyle(), GUILayout.Width(30)); EditorGUILayout.PropertyField(prismSideCountProp, new GUIContent("")); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); } else if (newType.Value == PrimitiveBrushType.Cylinder) { GUILayout.Label("Sides", SabreGUILayout.GetForeStyle(), GUILayout.Width(30)); EditorGUILayout.PropertyField(cylinderSideCountProp, new GUIContent("")); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); } else if (newType.Value == PrimitiveBrushType.Sphere) { GUILayout.Label("Sides", SabreGUILayout.GetForeStyle(), GUILayout.Width(30)); EditorGUILayout.PropertyField(sphereSideCountProp, new GUIContent("")); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); } } if (GUILayout.Button("Reset Polygons")) { Undo.RecordObjects(targets, "Reset Polygons"); foreach (var thisBrush in targets) { if (overridenBrushType.HasValue) { ((PrimitiveBrush)thisBrush).BrushType = overridenBrushType.Value; } ((PrimitiveBrush)thisBrush).ResetPolygons(); ((PrimitiveBrush)thisBrush).Invalidate(true); } overridenBrushType = null; } GUILayout.EndHorizontal(); if (GUILayout.Button("Shell")) { List <GameObject> newSelection = new List <GameObject>(); foreach (var thisBrush in targets) { GameObject newObject = ((PrimitiveBrush)thisBrush).Duplicate(); Polygon[] polygons = newObject.GetComponent <PrimitiveBrush>().GetPolygons(); VertexUtility.DisplacePolygons(polygons, -CurrentSettings.PositionSnapDistance); Bounds newBounds = newObject.GetComponent <PrimitiveBrush>().GetBounds(); // Verify the new geometry if (GeometryHelper.IsBrushConvex(polygons) && newBounds.GetSmallestExtent() > 0) { Undo.RegisterCreatedObjectUndo(newObject, "Shell"); newSelection.Add(newObject); } else { // Produced a concave brush, delete it and pretend nothing happened GameObject.DestroyImmediate(newObject); Debug.LogWarning("Could not shell " + thisBrush.name + " as shelled geometry would not be valid. Try lowering Pos Snapping and attempt Shell again."); } } if (newSelection.Count > 0) { Selection.objects = newSelection.ToArray(); } } }
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(); }
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.AlwaysSnapToCurrentGrid = GUILayout.Toggle(CurrentSettings.AlwaysSnapToCurrentGrid, new GUIContent("Always snap to current grid size", "When position snapping is enabled, you can press " + KeyMappings.Instance.SnapSelectionToCurrentGrid + " to snap movement to the current grid size or tick this option to have it always on.")); 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.Space(20); GUILayout.Label("Debug mode executes additional code for verbose error checking. Used by SabreCSG developers.", style); buildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup); definesSplit = defines.Split(';').ToList(); enabled = definesSplit.Contains(SABRE_CSG_DEBUG_DEFINE); if (enabled) { if (GUILayout.Button("Disable Debug Mode (Recommended)")) { definesSplit.Remove(SABRE_CSG_DEBUG_DEFINE); defines = string.Join(";", definesSplit.ToArray()); PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines); } } else { if (GUILayout.Button("Enable Debug Mode (Not Recommended)")) { if (!definesSplit.Contains(SABRE_CSG_DEBUG_DEFINE)) { definesSplit.Add(SABRE_CSG_DEBUG_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(); // 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(); }
public static void PreferencesGUI() { // Commented out for 1.2.5 release as runtime code is currently not finished // GUIStyle style = SabreGUILayout.GetForeStyle(); // style.wordWrap = true; // GUILayout.Label("Runtime CSG 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")) // { // definesSplit.Remove(RUNTIME_CSG_DEFINE); // defines = string.Join(";", definesSplit.ToArray()); // PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines); // } // } // else // { // if(GUILayout.Button("Enable Runtime CSG")) // { // definesSplit.Add(RUNTIME_CSG_DEFINE); // defines = string.Join(";", definesSplit.ToArray()); // PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, defines); // } // } // 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"); // } 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"); GUILayout.FlexibleSpace(); GUILayout.Label("SabreCSG Version " + CSGModel.VERSION_STRING, SabreGUILayout.GetForeStyle()); }