public void RestorePreset(GrassTextureDataPreset _preset) { GrassTextureDataPreset preset = ScriptableObject.Instantiate(_preset) as GrassTextureDataPreset; NewSourceTextures(); GrassTextureData.numSlices = preset.numSlices; GrassTextureData.numSourceBladesPerSlice = preset.numSourceBladesPerSlice; GrassTextureData.numSourceBladesOnBackground = preset.numSourceBladesOnBackground; GrassTextureData.sliceHeight = preset.sliceHeight; GrassTextureData.textureWidth = preset.textureWidth; GrassTextureData.BackColor = preset.BackColor; GrassTextureData.randomSeed = preset.randomSeed; GrassTextureData.fakeSelfShadowStrength = preset.fakeSelfShadowStrength; GrassTextureData.randomYOffset = preset.randomYOffset; // source textures and their properties GrassTextureData.grassBladesMod = GrassTextureData.grassBlades = preset.grassBlades; GrassTextureData.grassBladesTints = preset.grassBladesTints; GrassTextureData.grassBladesSaturations = preset.grassBladesSaturations; GrassTextureData.grassBladesWeights = preset.grassBladesWeights; Color grey = new Color(0.5f, 0.5f, 0.5f, 1); for (int i = 0; i < preset.grassBlades.Length; i++) { if (GrassTextureData.grassBladesSaturations[i] != 1 || GrassTextureData.grassBladesTints[i] != grey) { MakeTextureMod(i, true); } } }
public GrassTextureDataPreset GetPreset() { GrassTextureDataPreset preset = ScriptableObject.CreateInstance(typeof(GrassTextureDataPreset)) as GrassTextureDataPreset; preset.numSlices = GrassTextureData.numSlices; preset.numSourceBladesPerSlice = GrassTextureData.numSourceBladesPerSlice; preset.numSourceBladesOnBackground = GrassTextureData.numSourceBladesOnBackground; preset.sliceHeight = GrassTextureData.sliceHeight; preset.textureWidth = GrassTextureData.textureWidth; preset.BackColor = GrassTextureData.BackColor; preset.randomSeed = GrassTextureData.randomSeed; preset.fakeSelfShadowStrength = GrassTextureData.fakeSelfShadowStrength; preset.randomYOffset = GrassTextureData.randomYOffset; // source textures and their properties preset.grassBlades = GrassTextureData.grassBlades; preset.grassBladesTints = GrassTextureData.grassBladesTints; preset.grassBladesSaturations = GrassTextureData.grassBladesSaturations; preset.grassBladesWeights = GrassTextureData.grassBladesWeights; return(preset); }
void OnGUI() { if (GrassTextureData.grassBlades == null) { NewSourceTextures(); } GrassTextureDataPreset presetToRestore = null; Rect rect = this.position; scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false, GUILayout.Width(rect.width), GUILayout.Height(rect.height)); Color skin_color = GUI.color; if (acceptDrag) { GUI.color = new Color(0.8f, 1f, 0.8f, 1); } EditorGUILayout.HelpBox("\n Drag & drop textures here to add source textures.\n Drag & drop saved preset to load it.\n", MessageType.None); GUI.color = skin_color; dirtyFlag = false; DragAndDrop.visualMode = DragAndDropVisualMode.Generic; if (Event.current.type == EventType.DragUpdated) { if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition) || Event.current.mousePosition.y > screenBottom || GrassTextureData.grassBlades.Length == 0) { bool ok = false; for (int i = 0; i < DragAndDrop.objectReferences.Length; i++) { if (DragAndDrop.objectReferences[i] is Texture2D) { ok = true; break; } } if (acceptDrag != ok) { acceptDrag = ok; Repaint(); } } else { if (acceptDrag != false) { acceptDrag = false; Repaint(); } } } if (!acceptDrag && Event.current.type == EventType.DragPerform) { if (DragAndDrop.objectReferences.Length == 1 && DragAndDrop.objectReferences[0] is GrassTextureDataPreset) { presetToRestore = DragAndDrop.objectReferences[0] as GrassTextureDataPreset; } } if (Event.current.type == EventType.DragPerform && acceptDrag) { //Debug.Log (" "+Event.current.mousePosition); acceptDrag = false; int num = 0; for (int i = 0; i < DragAndDrop.objectReferences.Length; i++) { if (DragAndDrop.objectReferences[i] is Texture2D) { num++; } } Texture2D[] newTextures = new Texture2D[num]; num = 0; for (int i = 0; i < DragAndDrop.objectReferences.Length; i++) { if (DragAndDrop.objectReferences[i] is Texture2D) { newTextures[num++] = DragAndDrop.objectReferences[i] as Texture2D; } } AddSourceTextures(newTextures); Repaint(); GUILayout.EndScrollView(); return; } if (GrassTextureData.grassBlades.Length > 0) { if (GUILayout.Button("Save grass preset")) { Debug.Log(restored_preset_filename); string path = ""; if (restored_preset_filename != "") { path = EditorUtility.SaveFilePanel("Save preset", Path.GetDirectoryName(restored_preset_filename), Path.GetFileNameWithoutExtension(restored_preset_filename), "asset"); } else { path = EditorUtility.SaveFilePanel("Save preset", "Assets", "GrassTexturePreset", "asset"); } if (path != "") { int idx = path.IndexOf("/Assets/") + 1; if (idx > 0) { restored_preset_filename = path.Substring(path.IndexOf("Assets/")); path = path.Substring(idx); GrassTextureDataPreset savedPreset = GetPreset(); Debug.Log("Grass texture preset saved at " + path); if (AssetDatabase.LoadAssetAtPath(path, typeof(GrassTextureDataPreset)) != null) { AssetDatabase.DeleteAsset(path); } AssetDatabase.CreateAsset(savedPreset, path); } else { Debug.Log("Nothing saved..."); } } } GUILayout.Space(20); int thumbSize = 76; EditorGUILayout.LabelField("Target texture properties", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Slices count = " + (1 << GrassTextureData.numSlices), GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.numSlices, Mathf.RoundToInt(GUILayout.HorizontalSlider(GrassTextureData.numSlices, 0, 3)))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Slice height = " + (1 << GrassTextureData.sliceHeight), GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.sliceHeight, Mathf.RoundToInt(GUILayout.HorizontalSlider(GrassTextureData.sliceHeight, 5, 9)))) { } if (GrassTextureData.numSlices == 3 && GrassTextureData.sliceHeight > 8) { GrassTextureData.sliceHeight = 8; } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Texture width = " + (1 << GrassTextureData.textureWidth), GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.textureWidth, Mathf.RoundToInt(GUILayout.HorizontalSlider(GrassTextureData.textureWidth, 7, 11)))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Blades count per slice", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.numSourceBladesPerSlice, EditorGUILayout.IntField(GrassTextureData.numSourceBladesPerSlice))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Blades on background", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.numSourceBladesOnBackground, EditorGUILayout.IntField(GrassTextureData.numSourceBladesOnBackground))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Random seed", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.randomSeed, EditorGUILayout.IntField(GrassTextureData.randomSeed))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Average grass color", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.BackColor, EditorGUILayout.ColorField(GrassTextureData.BackColor))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Fake self-shadow", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.fakeSelfShadowStrength, EditorGUILayout.Slider(GrassTextureData.fakeSelfShadowStrength, 0, 0.9f))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Fake AO", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.backAODarkening, EditorGUILayout.Slider(GrassTextureData.backAODarkening, 0, 0.9f))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Random y offset", GUILayout.MinWidth(140), GUILayout.MaxWidth(140)); if (checkChange(ref GrassTextureData.randomYOffset, EditorGUILayout.Slider(GrassTextureData.randomYOffset, 0, 0.5f))) { } EditorGUILayout.EndHorizontal(); GUILayout.Space(15); EditorGUILayout.LabelField("Source grass textures", EditorStyles.boldLabel); int n; for (n = 0; n < GrassTextureData.grassBlades.Length; n++) { EditorGUILayout.BeginHorizontal(); GUI.SetNextControlName("tex" + n); Texture2D ntex = (Texture2D)EditorGUILayout.ObjectField(GrassTextureData.grassBladesMod[n], typeof(Texture2D), false, GUILayout.MinHeight(thumbSize), GUILayout.MinWidth(thumbSize), GUILayout.MaxWidth(thumbSize)); if (ntex != GrassTextureData.grassBladesMod[n]) { if (ntex == null) { GrassTextureData.grassBlades[n] = GrassTextureData.grassBladesMod[n] = null; } else { GrassTextureData.grassBladesSaturations[n] = 1; GrassTextureData.grassBladesTints[n] = new Color(0.5f, 0.5f, 0.5f, 1); GrassTextureData.grassBlades[n] = GrassTextureData.grassBladesMod[n] = ntex; } } EditorGUILayout.BeginVertical(); //GUI.color = new Color(1, 0.5f, 0.5f, 1); if (GUILayout.Button("Remove")) { GUI.FocusControl(""); RemoveSourceTextureAt(n); if (n >= GrassTextureData.grassBlades.Length) { EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); if (GrassTextureData.grassBlades.Length == 0) { NewSourceTextures(); } Repaint(); break; } Repaint(); } //GUI.color = skin_color; if (checkChange(ref GrassTextureData.grassBladesTints[n], EditorGUILayout.ColorField(GrassTextureData.grassBladesTints[n]))) { //if ((EditorApplication.timeSinceStartup-changedTime)>0.25) { MakeTextureMod(n); //} } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Saturation", GUILayout.MinWidth(70), GUILayout.MaxWidth(70)); if (checkChange(ref GrassTextureData.grassBladesSaturations[n], EditorGUILayout.Slider(GrassTextureData.grassBladesSaturations[n], 0f, 2f))) { //if ((EditorApplication.timeSinceStartup-changedTime)>0.25) { MakeTextureMod(n); //} } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Occurence", GUILayout.MinWidth(70), GUILayout.MaxWidth(70)); if (checkChange(ref GrassTextureData.grassBladesWeights[n], EditorGUILayout.IntSlider(GrassTextureData.grassBladesWeights[n], 0, 200))) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } GUILayout.Space(10); GUI.color = new Color(1, 0.5f, 0.5f, 1); if (GUILayout.Button("Clear All Source Textures")) { GUI.FocusControl(""); if (EditorUtility.DisplayDialog("Warning", "Are you sure ?", "Yes", "Cancel")) { NewSourceTextures(); } } GUI.color = skin_color; GUI.color = new Color(0.5f, 1, 0.5f, 1); if (GUILayout.Button("Prepare")) { GUI.FocusControl(""); Prepare(false); // blades Prepare(true); // blades back texture } GUI.color = skin_color; if (GrassTextureData.targetTexture != null) { int preview_width = Screen.width - 25; if (preview_width > GrassTextureData.targetTexture.width) { preview_width = GrassTextureData.targetTexture.width; } int preview_height = preview_width * GrassTextureData.targetTexture.height / GrassTextureData.targetTexture.width; EditorGUILayout.BeginHorizontal(); int left_pad = ((Screen.width - 25) - preview_width) / 2; if (left_pad > 0) { EditorGUILayout.LabelField("", GUILayout.Width(left_pad)); } EditorGUILayout.ObjectField(GrassTextureData.targetTexture, typeof(Texture2D), false, GUILayout.Height(preview_height), GUILayout.Width(preview_width)); EditorGUILayout.EndHorizontal(); //GUILayout.Label("", GUILayout.Width(256), GUILayout.Height(256)); //EditorGUI.DrawPreviewTexture(GUILayoutUtility.GetLastRect(),GrassTextureData.targetTexture); if (GUILayout.Button("Save grass texture")) { GUI.FocusControl(""); SaveTexture(ref GrassTextureData.target_filename, "GrassBlades", ref GrassTextureData.targetTexture); // blades } } if (GrassTextureData.targetBackTexture != null) { int preview_width = Screen.width - 25; if (preview_width > GrassTextureData.targetBackTexture.width) { preview_width = GrassTextureData.targetBackTexture.width; } int preview_height = preview_width * GrassTextureData.targetBackTexture.height / GrassTextureData.targetBackTexture.width; EditorGUILayout.BeginHorizontal(); int left_pad = ((Screen.width - 25) - preview_width) / 2; if (left_pad > 0) { EditorGUILayout.LabelField("", GUILayout.Width(left_pad)); } EditorGUILayout.ObjectField(GrassTextureData.targetBackTexture, typeof(Texture2D), false, GUILayout.Height(preview_height), GUILayout.Width(preview_width)); EditorGUILayout.EndHorizontal(); //GUILayout.Label("", GUILayout.Width(256), GUILayout.Height(256)); //EditorGUI.DrawPreviewTexture(GUILayoutUtility.GetLastRect(),GrassTextureData.targetBackTexture); if (GUILayout.Button("Save grass back texture")) { GUI.FocusControl(""); SaveTexture(ref GrassTextureData.target_back_filename, "GrassBladesBack", ref GrassTextureData.targetBackTexture); // back } } if (Event.current.type == EventType.Repaint) { screenBottom = GUILayoutUtility.GetLastRect().yMax; } } GUILayout.EndScrollView(); if (presetToRestore) { restored_preset_filename = AssetDatabase.GetAssetPath(presetToRestore); RestorePreset(presetToRestore); } }