private bool drawCurTip = false; //this is set false on each redraw and checked at the end of OnGUI - set by DoTipCheck if a control with a tip is currently moused over #endregion //static bool useGrid = false; //static bool showGrid = false; //static float gridSpacing = 1f; //static bool gridFoldout = true; //static float baseSpacing = 1f; //static float spacingRandomRange = 0f; //static bool spacingFoldout = true; void OnGUI() { UpdateGroups(); BuildStyles(); drawCurTip = false; EditorGUILayout.Space(); EditorGUILayout.BeginVertical(masterVerticalStyle,GUILayout.Width(280)); //Begin Master Vertical EditorGUILayout.BeginHorizontal();//Brush Toggles Section Begin Texture2D brushIndicatorTexture = null; switch(brushMode) { case BrushMode.Off: if(brushDirection == true) { brushIndicatorTexture = brushIcon_Inactive; } if(brushDirection == false) { brushIndicatorTexture = eraserIcon_Inactive; } break; case BrushMode.On: if(placementModifier) brushIndicatorTexture = placementIcon_Active; else { if(brushDirection == true) { brushIndicatorTexture = brushIcon_Active; } if(brushDirection == false) { brushIndicatorTexture = eraserIcon_Active; } } break; } GUILayout.Label(brushIndicatorTexture,picButtonStyle,GUILayout.Width(32),GUILayout.Height(32)); DoTipCheck("Brush On/Off Indicator"); EditorGUI.BeginDisabledGroup(true); GUILayout.Label("Use Brush:" + System.Environment.NewLine + "Precise Place:" + System.Environment.NewLine + "Toggle Eraser:",tipLabelStyle,GUILayout.Width(90),GUILayout.Height(32)); DoTipCheck("Brush On/Off Indicator" + System.Environment.NewLine + "hold ctrl to paint"); GUILayout.Label("ctrl+click/drag mouse"+ System.Environment.NewLine + "ctrl+shift+click/drag mouse" + System.Environment.NewLine + "ctrl+x" ,tipLabelStyle,GUILayout.Width(146),GUILayout.Height(32)); DoTipCheck("Brush On/Off Indicator" + System.Environment.NewLine + "hold ctrl to paint"); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); // Brush Toggles Section End #region Prefab Picker List<Object> newPrefabs = new List<Object>(); removalList = new List<int>(); EditorGUILayout.BeginHorizontal(); if(prefabGroup.Length == 0) { EditorGUILayout.BeginVertical(GUILayout.Height(78)); newPrefabs = PrefabDragBox(274,addPrefabFieldTexture,"Drag & Drop Prefabs Here"); DoTipCheck("Drag & Drop Prefab Here To Add"); EditorGUILayout.EndVertical(); } else { newPrefabs = PrefabDragBox(30,addPrefabTexture,""); DoTipCheck("Drag & Drop Prefab Here To Add"); prefabFieldScrollPosition = EditorGUILayout.BeginScrollView(prefabFieldScrollPosition,GUILayout.Height(78)); EditorGUILayout.BeginHorizontal(); //Prefab Objects can be dragged or selected in this horizontal list for(int i = 0; i < prefabGroup.Length; i++) { EditorGUILayout.BeginHorizontal(prefabFieldStyle,GUILayout.Height(60), GUILayout.Width(70)); prefabGroup[i].weight = GUILayout.VerticalSlider(prefabGroup[i].weight,1f,0.001f,prefabAmountSliderStyle,prefabAmountSliderThumbStyle,GUILayout.Height(50)); DoTipCheck("Likelyhood that this object will be placed vs the others in the list"); EditorGUILayout.BeginVertical(); Texture2D previewTexture = null; #if UNITY_3_5 previewTexture = EditorUtility.GetAssetPreview(prefabGroup[i].prefab); #else previewTexture = AssetPreview.GetAssetPreview(prefabGroup[i].prefab); #endif prefabPreviewWindowStyle.normal.background = previewTexture;//previewTexture; GUILayout.Label("",prefabPreviewWindowStyle,GUILayout.Height(50),GUILayout.Width(50)); Rect prefabButtonRect = GUILayoutUtility.GetLastRect(); Rect xControlRect = new Rect(prefabButtonRect.xMax - 14,prefabButtonRect.yMin,14,14); if(GUI.Button(xControlRect,"",prefabRemoveXStyle)) { removalList.Add(i); Event.current.Use(); } DoTipCheck("'Red X' = remove prefab from list" + System.Environment.NewLine + "'Green Check' = mark to place exclusively"); Rect checkControlRect = new Rect(prefabButtonRect.xMax - 14,prefabButtonRect.yMax - 14,14,14); if(selectedPrefabIndex == i) prefabSelectCheckStyle.normal.background = selectPrefabCheckTexture_hover; else prefabSelectCheckStyle.normal.background = selectPrefabCheckTexture_normal; if(GUI.Button(checkControlRect,"",prefabSelectCheckStyle)) { if(selectedPrefabIndex != i) selectedPrefabIndex = i; else selectedPrefabIndex = -1; } //DoTipCheck("Click to mark object as selected - it will be placed exclusively"); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndScrollView(); } EditorGUILayout.EndHorizontal(); if(removalList.Count > 0) { foreach(int index in removalList) { if(selectedPrefabIndex > index) { selectedPrefabIndex -= 1; } else if(selectedPrefabIndex == index) { selectedPrefabIndex = -1; } ArrayUtility.RemoveAt(ref prefabGroup,index); } // EditorUtility.SetDirty(prefabGroup); } if(newPrefabs.Count > 0) { foreach(Object newPrefab in newPrefabs) { ArrayUtility.Add(ref prefabGroup,new qb_PrefabObject(newPrefab,1f)); } // added = true; // EditorUtility.SetDirty(prefabGroup); } #endregion topScroll = EditorGUILayout.BeginScrollView(topScroll,GUILayout.Width(280)); EditorGUILayout.BeginVertical(GUILayout.Width(260)); #region Stroke Properties brushSettingsFoldout = EditorGUILayout.Foldout(brushSettingsFoldout,"Brush Settings:"); DoTipCheck("Brush and Stroke settings"); if(brushSettingsFoldout == true) { EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Brush Radius",GUILayout.Width(100)); DoTipCheck("The Size of the brush"); brushRadius = EditorGUILayout.Slider(brushRadius,brushRadiusMin,brushRadiusMax); DoTipCheck("The Size of the brush"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Min",GUILayout.Width(70)); DoTipCheck("Minimum Slider Value"); float tryRadiusMin = EditorGUILayout.FloatField(brushRadiusMin,floatFieldCompressedStyle); DoTipCheck("Minimum Slider Value"); brushRadiusMin = tryRadiusMin < brushRadiusMax ? tryRadiusMin : brushRadiusMax; EditorGUILayout.LabelField("Max",GUILayout.Width(70)); DoTipCheck("Maximum Slider Value"); float tryRadiusMax = EditorGUILayout.FloatField(brushRadiusMax,floatFieldCompressedStyle); DoTipCheck("Maximum Slider Value"); brushRadiusMax = tryRadiusMax > brushRadiusMin ? tryRadiusMax : brushRadiusMin; EditorGUILayout.EndHorizontal(); // EditorGUILayout.EndVertical(); // EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Scatter Amount",GUILayout.Width(100)); DoTipCheck("How closely should scattering match brush radius"); scatterRadius = EditorGUILayout.Slider(scatterRadius,0f,1f); DoTipCheck("How closely should scattering match total brush radius"); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Stroke Spacing",GUILayout.Width(100)); DoTipCheck("Distance between brush itterations"); brushSpacing = EditorGUILayout.Slider(brushSpacing,brushSpacingMin,brushSpacingMax); DoTipCheck("Distance between brush itterations"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Min",GUILayout.Width(70)); DoTipCheck("Minimum Slider Value"); float trySpacingMin = EditorGUILayout.FloatField(brushSpacingMin,floatFieldCompressedStyle); DoTipCheck("Minimum Slider Value"); brushSpacingMin = trySpacingMin < brushSpacingMax ? trySpacingMin : brushSpacingMax; EditorGUILayout.LabelField("Max",GUILayout.Width(70)); DoTipCheck("Maximum Slider Value"); float trySpacingMax = EditorGUILayout.FloatField(brushSpacingMax,floatFieldCompressedStyle); DoTipCheck("Maximum Slider Value"); brushSpacingMax = trySpacingMax > brushSpacingMin ? trySpacingMax : brushSpacingMin; EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } #endregion EditorGUILayout.Space(); sortingFoldout = EditorGUILayout.Foldout(sortingFoldout,"Sorting Settings:"); DoTipCheck("Grouping and Layer settings"); if(sortingFoldout == true) { #region Layers EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); //A toggle determining whether to isolate painting to specific layers paintToLayer = EditorGUILayout.Toggle("Paint to Layer", paintToLayer,EditorStyles.toggle); DoTipCheck("Restrict painting to specific layer?"); //A dropdown where the user can check off which layers to paint to EditorGUI.BeginDisabledGroup(!paintToLayer); layerIndex = EditorGUILayout.LayerField("Choose Layer",layerIndex ); DoTipCheck("The layer of surfaces you would like to paint prefabs onto"); EditorGUI.EndDisabledGroup(); paintToSelection = EditorGUILayout.Toggle("Paint to Selection", paintToSelection); DoTipCheck("Restrinct painting to selected objects in the scene"); EditorGUILayout.EndVertical(); #endregion #region Groups EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); groupObjects = EditorGUILayout.Toggle("Group Placed Objects",groupObjects); DoTipCheck("Parent placed objects to an in-scene group object?"); EditorGUI.BeginDisabledGroup(!groupObjects); groupDropdownIndex = EditorGUILayout.Popup("Choose Existing Group",groupDropdownIndex,groupNames.ToArray()); DoTipCheck("Pick a previously created group already in the scene"); if(groups.Count != 0) curGroup = groups[groupDropdownIndex]; EditorGUILayout.BeginHorizontal(); newGroupName = EditorGUILayout.TextField("Name New Group",newGroupName,GUILayout.Width(210)); DoTipCheck("Enter a name for a new group you'd like to add"); EditorGUI.BeginDisabledGroup(newGroupName == ""); if(GUILayout.Button("Add",GUILayout.Width(38))) { CreateGroup(newGroupName); newGroupName = ""; } DoTipCheck("Create your newly named group in the scene"); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndVertical(); #endregion } EditorGUILayout.Space(); #region Rotation rotationFoldout = EditorGUILayout.Foldout(rotationFoldout,"Mesh Rotation:"); DoTipCheck("Settings for Offsetting the rotation of placed objects"); if(rotationFoldout == true) { EditorGUILayout.BeginVertical(); EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); alignToNormal = EditorGUILayout.Toggle("Align to Surface",alignToNormal); DoTipCheck("Placed objects orient based on the surface normals of the painting surface"); alignToStroke = EditorGUILayout.Toggle("Align to Stroke",alignToStroke); DoTipCheck("Placed objects face in the direction of painting"); EditorGUILayout.EndVertical(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(260)); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Offset X",GUILayout.Width(100)); DoTipCheck("Upper limit (in degrees) to randomly offset object rotation around the X axis"); rotationRange.x = EditorGUILayout.Slider(rotationRange.x,0f,179f); DoTipCheck("Upper limit (in degrees) to randomly offset object rotation around the X axis"); rotationRange.x = (float)System.Math.Round(rotationRange.x,0); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Offset Y (up)",GUILayout.Width(100)); DoTipCheck("Upper limit (in degrees) to randomly offset object rotation around the Y axis"); rotationRange.y = EditorGUILayout.Slider(rotationRange.y,0f,179f); DoTipCheck("Upper limit (in degrees) to randomly offset object rotation around the Y axis"); rotationRange.y = (float)System.Math.Round(rotationRange.y,0); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Offset Z",GUILayout.Width(100)); DoTipCheck("Upper limit (in degrees) to randomly offset object rotation around the Z axis"); rotationRange.z = EditorGUILayout.Slider(rotationRange.z,0f,179f); DoTipCheck("Upper limit (in degrees) to randomly offset object rotation around the Z axis"); rotationRange.z = (float)System.Math.Round(rotationRange.z,0); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } #endregion EditorGUILayout.Space(); #region Scale scaleFoldout = EditorGUILayout.Foldout(scaleFoldout,"Mesh Scale Range:",EditorStyles.foldout); DoTipCheck("Settings for Offsetting the scale of placed objects"); if(scaleFoldout == true) { EditorGUILayout.BeginHorizontal(); scaleUniform = EditorGUILayout.Toggle(scaleUniform,toggleButtonStyle,GUILayout.Width(15)); DoTipCheck("Placed models are scaled the same on all axes"); GUILayout.Label("Uniform Scale"); DoTipCheck("Placed models are scaled the same on all axes"); EditorGUILayout.EndHorizontal(); EditorGUI.BeginDisabledGroup(!scaleUniform); EditorGUILayout.BeginHorizontal(GUILayout.Width(260)); EditorGUILayout.BeginVertical(menuBlockStyle,GUILayout.Width(78)); EditorGUILayout.LabelField(scaleRandMinUniform + " to " + scaleRandMaxUniform,GUILayout.Width(78)); DoTipCheck("Random Scaling Range Split Slider (Min/Max)"); EditorGUILayout.MinMaxSlider(ref scaleRandMinUniform,ref scaleRandMaxUniform,scaleMin,scaleMax); DoTipCheck("Random Scaling Range Split Slider (Min/Max)"); scaleRandMinUniform = (float)System.Math.Round(scaleRandMinUniform,1); scaleRandMaxUniform = (float)System.Math.Round(scaleRandMaxUniform,1); scaleRandMinUniform = Mathf.Clamp(scaleRandMinUniform,scaleMin,scaleMax); scaleRandMaxUniform = Mathf.Clamp(scaleRandMaxUniform,scaleMin,scaleMax); if(scaleUniform) { scaleRandMin = new Vector3(scaleRandMinUniform,scaleRandMinUniform,scaleRandMinUniform); scaleRandMax = new Vector3(scaleRandMaxUniform,scaleRandMaxUniform,scaleRandMaxUniform); } EditorGUILayout.EndVertical(); EditorGUI.EndDisabledGroup(); EditorGUILayout.BeginVertical(menuBlockStyle, GUILayout.Width(170), GUILayout.MaxWidth(170)); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Min",GUILayout.Width(108)); DoTipCheck("Slider Minimum Value"); scaleMin = EditorGUILayout.FloatField(scaleMin,floatFieldCompressedStyle); DoTipCheck("Slider Minimum Value"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Max",GUILayout.Width(108)); DoTipCheck("Slider Maximum Value"); scaleMax = EditorGUILayout.FloatField(scaleMax,floatFieldCompressedStyle); DoTipCheck("Slider Maximum Value"); EditorGUILayout.EndHorizontal(); scaleMin = (float)System.Math.Round(scaleMin,1); scaleMax = (float)System.Math.Round(scaleMax,1); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); //------------------------- EditorGUILayout.Space(); //------------------------- EditorGUILayout.BeginHorizontal(); scaleUniform = !EditorGUILayout.Toggle(!scaleUniform,toggleButtonStyle,GUILayout.Width(15)); DoTipCheck("Placed models are scaled separately on each axis"); GUILayout.Label("Per Axis Scale"); DoTipCheck("Placed models are scaled separately on each axis"); EditorGUILayout.EndHorizontal(); EditorGUI.BeginDisabledGroup(scaleUniform); EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(menuBlockStyle); scaleRandMin.x = Mathf.Clamp(scaleRandMin.x,scaleMin,scaleMax); EditorGUILayout.LabelField("X " + scaleRandMin.x.ToString("0.0") + " to " + scaleRandMax.x.ToString("0.0"),GUILayout.Width(76)); DoTipCheck("X Axis Random Scaling Range Split Slideer (Min/Max)"); EditorGUILayout.MinMaxSlider(ref scaleRandMin.x,ref scaleRandMax.x,scaleMin,scaleMax); DoTipCheck("X Axis Random Scaling Range Split Slideer (Min/Max)"); scaleRandMin.x = (float)System.Math.Round(scaleRandMin.x,1); scaleRandMax.x = (float)System.Math.Round(scaleRandMax.x,1); scaleRandMin.x = Mathf.Clamp(scaleRandMin.x,scaleMin,scaleMax); scaleRandMax.x = Mathf.Clamp(scaleRandMax.x,scaleMin,scaleMax); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(menuBlockStyle); scaleRandMin.y = Mathf.Clamp(scaleRandMin.y,scaleMin,scaleMax); EditorGUILayout.LabelField("Y " + scaleRandMin.y.ToString("0.0") + " to " + scaleRandMax.y.ToString("0.0"),GUILayout.Width(76)); DoTipCheck("Y Axis Random Scaling Range Split Slideer (Min/Max)"); EditorGUILayout.MinMaxSlider(ref scaleRandMin.y,ref scaleRandMax.y,scaleMin,scaleMax); DoTipCheck("Y Axis Random Scaling Range Split Slideer (Min/Max)"); scaleRandMin.y = (float)System.Math.Round(scaleRandMin.y,1); scaleRandMax.y = (float)System.Math.Round(scaleRandMax.y,1); scaleRandMin.y = Mathf.Clamp(scaleRandMin.y,scaleMin,scaleMax); scaleRandMax.y = Mathf.Clamp(scaleRandMax.y,scaleMin,scaleMax); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(menuBlockStyle); scaleRandMin.z = Mathf.Clamp(scaleRandMin.z,scaleMin,scaleMax); EditorGUILayout.LabelField("Z " + scaleRandMin.z.ToString("0.0") + " to " + scaleRandMax.z.ToString("0.0"),GUILayout.Width(76)); DoTipCheck("Z Axis Random Scaling Range Split Slideer (Min/Max)"); EditorGUILayout.MinMaxSlider(ref scaleRandMin.z,ref scaleRandMax.z,scaleMin,scaleMax); DoTipCheck("Z Axis Random Scaling Range Split Slideer (Min/Max)"); scaleRandMin.z = (float)System.Math.Round(scaleRandMin.z,1); scaleRandMax.z = (float)System.Math.Round(scaleRandMax.z,1); scaleRandMin.z = Mathf.Clamp(scaleRandMin.z,scaleMin,scaleMax); scaleRandMax.z = Mathf.Clamp(scaleRandMax.z,scaleMin,scaleMax); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUI.EndDisabledGroup(); } EditorGUILayout.EndVertical(); //Overall Vertical Container End EditorGUILayout.EndScrollView(); // Overall Scroll View End #endregion /* #region Grid gridFoldout = EditorGUILayout.Foldout(gridFoldout,"Grid"); if(gridFoldout == true) { EditorGUILayout.BeginVertical(); useGrid = EditorGUILayout.Toggle("Use Grid:",useGrid); gridSpacing = EditorGUILayout.FloatField("",gridSpacing); //Default is 1f showGrid = EditorGUILayout.Toggle("Show Grid:",useGrid); EditorGUILayout.EndVertical(); } #endregion */ // EditorGUILayout.EndVertical(); if(GUILayout.Button("Restore Defaults")) { LoadDefaultSettings(); SaveSettings(); } string tipToDraw = drawCurTip ? curTip : string.Empty; //EditorGUILayout.BeginVertical(GUILayout.Width(280));//,GUILayout.MaxWidth(280)); EditorGUILayout.HelpBox(tipToDraw,MessageType.Info); EditorGUILayout.EndVertical();//Master Vertical End this.Repaint(); }
private static void CreateGroup(string groupName) { GameObject newGroupObject = new GameObject("QB_Group_" + groupName); curGroup = newGroupObject.AddComponent<qb_Group>(); curGroup.groupName = groupName; groups.Add(curGroup); groupNames.Add(groupName); }