예제 #1
0
    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);
            }
        }
    }
예제 #2
0
    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);
    }
예제 #3
0
    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);
        }
    }