Exemplo n.º 1
0
	private void OnTexturingInspectorGUI(TerrainToolkit terrain)
	{
		Rect buttonRect;
		
		Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain));
		if (ter == null) {
			return;
		}
		TerrainData terData = ter.terrainData;
		terrain.splatPrototypes = terData.splatPrototypes;
		EditorGUILayout.Separator();
		float mouseX;
		EditorGUILayout.BeginHorizontal();
		GUI.skin = terrain.guiSkin;
		GUILayout.Label("Texture Slope");
		GUI.skin = null;
		EditorGUILayout.EndHorizontal();		
		Rect gradientRect = EditorGUILayout.BeginHorizontal();
		float gradientWidth = gradientRect.width - 55;
		gradientRect.width = 15;
		gradientRect.height = 19;
		GUI.skin = terrain.guiSkin;
		// Slope stop 1...
		if (dragControl == "slopeStop1" && Event.current.type == EventType.MouseDrag) {
			mouseX = Event.current.mousePosition.x - 7;
			if (mouseX < 20) {
				mouseX = 20;
			} else if (mouseX > 19 + gradientWidth * (terrain.slopeBlendMaxAngle / 90)) {
				mouseX = 19 + gradientWidth * (terrain.slopeBlendMaxAngle / 90);
			}
			gradientRect.x = mouseX;
			terrain.slopeBlendMinAngle = ((mouseX - 20) / (gradientWidth + 1)) * 90;
		} else {
			gradientRect.x = 20 + gradientWidth * (terrain.slopeBlendMinAngle / 90);
		}
		if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) {
			dragControl = "slopeStop1";
		}
		if (dragControl == "slopeStop1" && Event.current.type == EventType.MouseUp) {
			dragControl = "";
		}		
		GUI.Box(gradientRect, "", "slopeStop1");
		// Slope stop 2...
		if (dragControl == "slopeStop2" && Event.current.type == EventType.MouseDrag) {
			mouseX = Event.current.mousePosition.x - 7;
			if (mouseX < 21 + gradientWidth * (terrain.slopeBlendMinAngle / 90)) {
				mouseX = 21 + gradientWidth * (terrain.slopeBlendMinAngle / 90);
			} else if (mouseX > 21 + gradientWidth) {
				mouseX = 21 + gradientWidth;
			}
			gradientRect.x = mouseX;
			terrain.slopeBlendMaxAngle = ((mouseX - 20) / (gradientWidth + 1)) * 90;
		} else {
			gradientRect.x = 20 + gradientWidth * (terrain.slopeBlendMaxAngle / 90);
		}
		if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) {
			dragControl = "slopeStop2";
		}
		if (dragControl == "slopeStop2" && Event.current.type == EventType.MouseUp) {
			dragControl = "";
		}
		GUI.Box(gradientRect, "", "slopeStop2");
		gradientRect.y += 19;
		gradientRect.width = gradientWidth * (terrain.slopeBlendMinAngle / 90);
		gradientRect.x = 27;
		GUI.Box(gradientRect, "", "black");
		gradientRect.width = gradientWidth * ((terrain.slopeBlendMaxAngle / 90) - (terrain.slopeBlendMinAngle / 90));
		gradientRect.x = 27 + gradientWidth * (terrain.slopeBlendMinAngle / 90);
		GUI.Box(gradientRect, "", "blackToWhite");
		gradientRect.width = gradientWidth - gradientWidth * (terrain.slopeBlendMaxAngle / 90);
		gradientRect.x = 27 + gradientWidth * (terrain.slopeBlendMaxAngle / 90);
		GUI.Box(gradientRect, "", "white");
		GUI.skin = null;
		EditorGUILayout.EndHorizontal();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		EditorGUILayout.BeginHorizontal();
		EditorGUILayout.PrefixLabel("Cliff start");
		terrain.slopeBlendMinAngle = EditorGUILayout.FloatField(terrain.slopeBlendMinAngle);
		EditorGUILayout.EndHorizontal();
		EditorGUILayout.BeginHorizontal();
		EditorGUILayout.PrefixLabel("Cliff end");
		terrain.slopeBlendMaxAngle = EditorGUILayout.FloatField(terrain.slopeBlendMaxAngle);
		EditorGUILayout.EndHorizontal();
		EditorGUILayout.BeginHorizontal();
		GUI.skin = terrain.guiSkin;
		GUILayout.Label("Texture Height");
		GUI.skin = null;
		EditorGUILayout.EndHorizontal();
		gradientRect = EditorGUILayout.BeginHorizontal();
		gradientWidth = gradientRect.width - 55;
		gradientRect.width = 15;
		gradientRect.height = 19;
		Rect gradientRect2 = gradientRect;
		gradientRect2.y += 19;
		GUI.skin = terrain.guiSkin;
		string[] gradientStyles = new string[9];
		gradientStyles[0] = "red";
		gradientStyles[1] = "redToYellow";
		gradientStyles[2] = "yellow";
		gradientStyles[3] = "yellowToGreen";
		gradientStyles[4] = "green";
		gradientStyles[5] = "greenToCyan";
		gradientStyles[6] = "cyan";
		gradientStyles[7] = "cyanToBlue";
		gradientStyles[8] = "blue";
		List<float> heightBlendPoints = terrain.heightBlendPoints;
		int numPoints = heightBlendPoints.Count;
		float firstLimit = 1;
		if (numPoints > 0) {
			firstLimit = (float) heightBlendPoints[0];
		} else {
			gradientRect.x = 20;
			GUI.Box(gradientRect, "", "greyStop");
			gradientRect.x = 20 + gradientWidth;
			GUI.Box(gradientRect, "", "greyStop");
		}
		gradientRect2.width = gradientWidth * firstLimit;
		gradientRect2.x = 27;
		if (terrain.splatPrototypes.Length < 2) {
			GUI.Box(gradientRect2, "", "grey");
		} else {
			GUI.Box(gradientRect2, "", "red");
		}
		for (i = 0; i < numPoints; i++) {
			// Height stop...
			float lowerLimit = 0;
			float upperLimit = 1;
			if (i > 0) {
				lowerLimit = (float) heightBlendPoints[i - 1];
			}
			if (i < numPoints - 1) {
				upperLimit = (float) heightBlendPoints[i + 1];
			}
			if (dragControl == "heightStop"+i && Event.current.type == EventType.MouseDrag) {
				mouseX = Event.current.mousePosition.x - 7;
				if (mouseX < 20 + gradientWidth * lowerLimit) {
					mouseX = 20 + gradientWidth * lowerLimit;
				} else if (mouseX > 19 + gradientWidth * upperLimit) {
					mouseX = 19 + gradientWidth * upperLimit;
				}
				gradientRect.x = mouseX;
				heightBlendPoints[i] = (mouseX - 20) / (gradientWidth + 1);
			} else {
				gradientRect.x = 20 + gradientWidth * (float) heightBlendPoints[i];
			}
			if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) {
				dragControl = "heightStop"+i;
			}
			if (dragControl == "heightStop"+i && Event.current.type == EventType.MouseUp) {
				dragControl = "";
			}
			int stopNum = (int) Mathf.Ceil((float) i / 2) + 1;
			if (i % 2 == 0) {
				GUI.Box(gradientRect, ""+stopNum, "blackStop");
			} else {
				GUI.Box(gradientRect, ""+stopNum, "whiteStop");
			}
			gradientRect2.width = gradientWidth * (upperLimit - (float) heightBlendPoints[i]);
			gradientRect2.x = 27 + gradientWidth * (float) heightBlendPoints[i];
			GUI.Box(gradientRect2, "", gradientStyles[i + 1]);
		}
		GUI.skin = null;
		EditorGUILayout.EndHorizontal();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		string startOrEnd = "end";
		for (i = 0; i < numPoints; i++) {
			EditorGUILayout.BeginHorizontal();
			int floatFieldNum = (int) Mathf.Ceil((float) i / 2) + 1;
			EditorGUILayout.PrefixLabel("Texture "+floatFieldNum+" "+startOrEnd);
			heightBlendPoints[i] = EditorGUILayout.FloatField((float) heightBlendPoints[i]);
			EditorGUILayout.EndHorizontal();
			if (startOrEnd == "end") {
				startOrEnd = "start";
			} else {
				startOrEnd = "end";
			}
		}
		terrain.heightBlendPoints = heightBlendPoints;
		EditorGUILayout.BeginHorizontal();
		GUI.skin = terrain.guiSkin;
		GUILayout.Label("Textures");
		GUI.skin = null;
		EditorGUILayout.EndHorizontal();
		int nTextures = 0;
		EditorGUILayout.Separator();
		if (GUI.changed) {
			EditorUtility.SetDirty(terrain);
		}
		GUI.changed = false;
		EditorGUILayout.BeginHorizontal();
		EditorGUIUtility.LookLikeControls(80, 0);
		foreach (SplatPrototype splatPrototype in terrain.splatPrototypes) {
			Rect textureRect = EditorGUILayout.BeginHorizontal();
			if (nTextures == 0) {
				splatPrototype.texture = EditorGUILayout.ObjectField("Cliff texture", splatPrototype.texture, typeof(Texture2D), false) as Texture2D;
			} else {
				splatPrototype.texture = EditorGUILayout.ObjectField("Texture "+nTextures, splatPrototype.texture, typeof(Texture2D), false) as Texture2D;
			}
			GUI.skin = terrain.guiSkin;
			textureRect.x += 146;
			textureRect.width = 18;
			textureRect.height = 18;
			if (GUI.Button(textureRect, "", "deleteButton")) {
				GUI.changed = true;
				terrain.deleteSplatPrototype(terrain.tempTexture, nTextures);
				EditorUtility.SetDirty(terrain);
			}
			GUI.skin = null;
			EditorGUILayout.EndHorizontal();
			if (nTextures % 2 == 1) {
				EditorGUILayout.EndHorizontal();
				EditorGUILayout.Separator();
				EditorGUILayout.BeginHorizontal();
			}
			nTextures++;
			if (nTextures > 5) {
				break;
			}
		}
		EditorGUIUtility.LookLikeControls();
		EditorGUILayout.EndHorizontal();
		if (GUI.changed) {
			terData.splatPrototypes = terrain.splatPrototypes;
		}
		if (nTextures == 0 && !assignTexture) {
			EditorGUILayout.BeginHorizontal();
			GUI.skin = terrain.guiSkin;
			GUILayout.Label("No textures have been assigned! Assign a texture.", "errorText");
			GUI.skin = null;
			EditorGUILayout.EndHorizontal();
			EditorGUILayout.Separator();
		}
		if (nTextures < 6) {
			EditorGUILayout.Separator();
			buttonRect = EditorGUILayout.BeginHorizontal();
			buttonRect.x = buttonRect.width / 2 - 50;
			buttonRect.width = 100;
			buttonRect.height = 18;
			if (GUI.Button(buttonRect, "Add texture")) {
				terrain.addSplatPrototype(terrain.defaultTexture, nTextures);
				terData.splatPrototypes = terrain.splatPrototypes;
				EditorUtility.SetDirty(terrain);
			}
			EditorGUILayout.EndHorizontal();
			EditorGUILayout.Separator();
			EditorGUILayout.Separator();
		}
		EditorGUILayout.Separator();
		buttonRect = EditorGUILayout.BeginHorizontal();
		buttonRect.x = buttonRect.width / 2 - 100;
		buttonRect.width = 200;
		buttonRect.height = 18;
		GUI.skin = terrain.guiSkin;
		if (nTextures < 2) {
			GUI.Box(buttonRect, "Apply procedural texture", "disabledButton");
			EditorGUILayout.EndHorizontal();
			EditorGUILayout.Separator();
			EditorGUILayout.Separator();
			EditorGUILayout.Separator();
			EditorGUILayout.BeginHorizontal();
			GUILayout.Label("This feature is disabled! You must assign at least 2 textures.", "errorText");
		} else {
			if (GUI.Button(buttonRect, "Apply procedural texture")) {
				// Undo not supported!
				TerrainToolkit.TextureProgressDelegate textureProgressDelegate = new TerrainToolkit.TextureProgressDelegate(updateTextureProgress);
				terrain.textureTerrain(textureProgressDelegate);
				EditorUtility.ClearProgressBar();
				GUIUtility.ExitGUI();
			}
		}
		GUI.skin = null;
		EditorGUILayout.EndHorizontal();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		EditorGUILayout.Separator();
		drawAdvancedSettingsGUI();
		// If the user has added or removed textures in the Terrain component, correct the number of blend points...
		if (Event.current.type == EventType.Repaint) {
			if (numPoints % 2 != 0) {
				terrain.deleteAllBlendPoints();
			}
			int correctNumPoints = (nTextures - 2) * 2;
			if (nTextures < 3) {
				correctNumPoints = 0;
			}
			if (numPoints < correctNumPoints) {
				terrain.addBlendPoints();
			} else if (numPoints > correctNumPoints) {
				terrain.deleteBlendPoints();
			}
		}
	}