Example #1
0
	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();

	}
Example #2
0
	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);
	}