void drawHelpText()
 {
     XSStyles.Separator();
     dHelpText = XSStyles.ShurikenFoldout("Information", dHelpText);
     if (dHelpText)
     {
         scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
         XSStyles.HelpBox("You can use this to create a custom shadow ramp in realtime. \nIf you do not save, the ramp will be reverted back to what it was previously. \n\n - Click the Gradient box. \n - Choose resolution of the texture. \n - Save.", MessageType.Info);
         XSStyles.HelpBox("Ramp textures support up to 5 ramps in one texture. That means you can have up to 5 ramps on a single material. You will need to author a ramp mask to choose which ramp to sample from. \n\nA texture that is fully black would sample from the bottom ramp, a texture that is fully white would sample from the top ramp, and a texture that is half gray would sample from the middle ramp. \n\n A quick tip would be that you can sample from each of the 5 ramps with 0, 0.25, 0.5, 0.75, and 1 on the texture. \n\nThe order of the gradients on the UI is the order that they will be on the texture.", MessageType.Info);
         EditorGUILayout.EndScrollView();
     }
 }
    //static bool disableOutlinePass = false;
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
    {
        XSStyles.setupIcons();
        Material material = materialEditor.target as Material;

        {
            //Find all the properties within the shader
            shadowRamp           = ShaderGUI.FindProperty("_ShadowRamp", props);
            specMap              = ShaderGUI.FindProperty("_SpecularMap", props);
            specPattern          = ShaderGUI.FindProperty("_SpecularPattern", props);
            tint                 = ShaderGUI.FindProperty("_Color", props);
            mainTex              = ShaderGUI.FindProperty("_MainTex", props);
            normal               = ShaderGUI.FindProperty("_Normal", props);
            specIntensity        = ShaderGUI.FindProperty("_SpecularIntensity", props);
            specArea             = ShaderGUI.FindProperty("_SpecularArea", props);
            rimWidth             = ShaderGUI.FindProperty("_RimWidth", props);
            rimIntensity         = ShaderGUI.FindProperty("_RimIntensity", props);
            emissiveToggle       = ShaderGUI.FindProperty("_Emissive", props);
            emissiveTex          = ShaderGUI.FindProperty("_EmissiveTex", props);
            emissiveColor        = ShaderGUI.FindProperty("_EmissiveColor", props);
            alphaCutoff          = ShaderGUI.FindProperty("_Cutoff", props);
            culling              = ShaderGUI.FindProperty("_Culling", props);
            rimStyle             = ShaderGUI.FindProperty("_RimlightType", props);
            advMode              = ShaderGUI.FindProperty("_advMode", props);
            reflSmooth           = ShaderGUI.FindProperty("_ReflSmoothness", props);
            metal                = ShaderGUI.FindProperty("_Metallic", props);
            metalMap             = ShaderGUI.FindProperty("_MetallicMap", props);
            roughMap             = ShaderGUI.FindProperty("_RoughMap", props);
            bakedCube            = ShaderGUI.FindProperty("_BakedCube", props);
            shadowType           = ShaderGUI.FindProperty("_ShadowType", props);
            reflType             = ShaderGUI.FindProperty("_ReflType", props);
            saturation           = ShaderGUI.FindProperty("_Saturation", props);
            useRefl              = ShaderGUI.FindProperty("_UseReflections", props);
            matcapStyle          = ShaderGUI.FindProperty("_MatcapStyle", props);
            stylizedType         = ShaderGUI.FindProperty("_StylizedReflStyle", props);
            rampColor            = ShaderGUI.FindProperty("_RampColor", props);
            rimColor             = ShaderGUI.FindProperty("_RimColor", props);
            aX                   = ShaderGUI.FindProperty("_anistropicAX", props);
            aY                   = ShaderGUI.FindProperty("_anistropicAY", props);
            specStyle            = ShaderGUI.FindProperty("_SpecularStyle", props);
            detailNormal         = ShaderGUI.FindProperty("_DetailNormal", props);
            detailMask           = ShaderGUI.FindProperty("_DetailMask", props);
            normalStrength       = ShaderGUI.FindProperty("_NormalStrength", props);
            detailNormalStrength = ShaderGUI.FindProperty("_DetailNormalStrength", props);
            occlusionMap         = ShaderGUI.FindProperty("_OcclusionMap", props);
            occlusionStrength    = ShaderGUI.FindProperty("_OcclusionStrength", props);
            ThicknessMap         = ShaderGUI.FindProperty("_ThicknessMap", props);
            SSSDist              = ShaderGUI.FindProperty("_SSSDist", props);
            SSSPow               = ShaderGUI.FindProperty("_SSSPow", props);
            SSSIntensity         = ShaderGUI.FindProperty("_SSSIntensity", props);
            SSSCol               = ShaderGUI.FindProperty("_SSSCol", props);
            invertThickness      = ShaderGUI.FindProperty("_invertThickness", props);
            ThicknessMapPower    = ShaderGUI.FindProperty("_ThicknessMapPower", props);
            UseSSS               = ShaderGUI.FindProperty("_UseSSS", props);
            UseSpecular          = ShaderGUI.FindProperty("_UseSpecular", props);
            UseUV2Emiss          = ShaderGUI.FindProperty("_EmissUv2", props);
            EmissScaleWithLight  = ShaderGUI.FindProperty("_ScaleWithLight", props);
            EmissTintToColor     = ShaderGUI.FindProperty("_EmissTintToColor", props);
            EmissionPower        = ShaderGUI.FindProperty("_EmissionPower", props);
            if (material.shader.name.Contains("Outlined"))      //Shader.Find("Xiexe/Toon/XSToonCutoutOutlined") || material.shader == Shader.Find("Xiexe/Toon/XSToonOutlined") || material.shader == Shader.Find("Xiexe/Toon/XSToonTransparentDitheredOUTLINED"))
            {
                OutlineColor      = ShaderGUI.FindProperty("_OutlineColor", props);
                OutlineThickness  = ShaderGUI.FindProperty("_OutlineThickness", props);
                OutlineTextureMap = ShaderGUI.FindProperty("_OutlineTextureMap", props);
                _LitOutline       = ShaderGUI.FindProperty("_LitOutlines", props);
                outlined          = true;
            }
            else
            {
                outlined = false;
                outlines = false;
            }

            _AORAMPMODE_ON  = ShaderGUI.FindProperty("_AORAMPMODE_ON", props);
            _OcclusionColor = ShaderGUI.FindProperty("_OcclusionColor", props);

            _DetailNormalUv2    = ShaderGUI.FindProperty("_DetailNormalUv2", props);
            _NormalUv2          = ShaderGUI.FindProperty("_NormalUv2", props);
            _MetallicUv2        = ShaderGUI.FindProperty("_MetallicUv2", props);
            _SpecularUv2        = ShaderGUI.FindProperty("_SpecularUv2", props);
            _SpecularPatternUv2 = ShaderGUI.FindProperty("_SpecularPatternUv2", props);
            _AOUV2 = ShaderGUI.FindProperty("_AOUV2", props);

            //advanced options
            colorMask    = ShaderGUI.FindProperty("_colormask", props);
            stencil      = ShaderGUI.FindProperty("_Stencil", props);
            stencilComp  = ShaderGUI.FindProperty("_StencilComp", props);
            stencilOp    = ShaderGUI.FindProperty("_StencilOp", props);
            stencilFail  = ShaderGUI.FindProperty("_StencilFail", props);
            stencilZFail = ShaderGUI.FindProperty("_StencilZFail", props);
            zwrite       = ShaderGUI.FindProperty("_ZWrite", props);
            ztest        = ShaderGUI.FindProperty("_ZTest", props);

            RampBaseAnchor = ShaderGUI.FindProperty("_RampBaseAnchor", props);
            //
            //Show Properties in Inspector
            //materialEditor.ShaderProperty(, .displayName);

            EditorGUI.BeginChangeCheck();
            {
                EditorGUI.BeginChangeCheck();

                EditorGUI.showMixedValue = advMode.hasMixedValue;
                var aMode = (DisplayType)advMode.floatValue;

                EditorGUI.BeginChangeCheck();
                aMode = (DisplayType)EditorGUILayout.Popup("Shader Mode", (int)aMode, Enum.GetNames(typeof(DisplayType)));

                if (EditorGUI.EndChangeCheck())
                {
                    materialEditor.RegisterPropertyChangeUndo("Shader Mode");
                    advMode.floatValue       = (float)aMode;
                    EditorGUI.showMixedValue = false;
                }

                materialEditor.ShaderProperty(culling, culling.displayName);

                //main
                //Rect rect = (0,0);
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                materialEditor.TexturePropertySingleLine(Styles.MainTexText, mainTex, tint);
                XSStyles.helpPopup(XSStyles.mainURL);
                EditorGUILayout.EndHorizontal();
                GUI.skin = null;
                materialEditor.ShaderProperty(saturation, Styles.Saturation, 3);
                materialEditor.TextureScaleOffsetProperty(mainTex);

                //cutoff
                if (material.shader.name.Contains("Cutout") && !material.shader.name.Contains("AlphaToMask"))
                {
                    materialEditor.ShaderProperty(alphaCutoff, Styles.cutoutText);
                }
                if (material.shader.name.Contains("AlphaToMask"))
                {
                    //So that a fallback to standard works as intended.
                    material.SetFloat("_Cutoff", 0.5f);
                }
                //-----

                //outlines
                if (outlined == true)
                {
                    XSStyles.Separator();
                    EditorGUILayout.BeginHorizontal();
                    outlines = EditorGUILayout.Foldout(outlines, "OUTLINES", true);
                    XSStyles.helpPopup(XSStyles.outlineURL);
                    EditorGUILayout.EndHorizontal();
                    GUI.skin = null;
                    if (outlines)
                    {
                        XSStyles.SeparatorThin();
                        materialEditor.ShaderProperty(_LitOutline, "Outline Light Mode");
                        materialEditor.TexturePropertySingleLine(Styles.outlineTex, OutlineTextureMap);
                        materialEditor.ShaderProperty(OutlineColor, "Outline Color");
                        materialEditor.ShaderProperty(OutlineThickness, "Outline Scale");
                    }
                }
                //-----

                //normal map
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                normals = EditorGUILayout.Foldout(normals, "NORMAL MAPS", true);
                XSStyles.helpPopup(XSStyles.normalsURL);
                EditorGUILayout.EndHorizontal();
                GUI.skin = null;
                if (normals)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.TexturePropertySingleLine(Styles.normalText, normal, normalStrength);
                    materialEditor.TextureScaleOffsetProperty(normal);
                    materialEditor.TexturePropertySingleLine(Styles.detailNormal, detailNormal, detailNormalStrength);
                    materialEditor.TextureScaleOffsetProperty(detailNormal);
                    materialEditor.TexturePropertySingleLine(Styles.detailMask, detailMask);
                    materialEditor.ShaderProperty(_NormalUv2, "Normal UV");
                    materialEditor.ShaderProperty(_DetailNormalUv2, "Detail UV");
                }
                //-----

                //shadows
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                shadows = EditorGUILayout.Foldout(shadows, "SHADOWS", true);
                XSStyles.helpPopup(XSStyles.shadowsURL);
                EditorGUILayout.EndHorizontal();
                GUI.skin = null;
                if (shadows)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.TexturePropertySingleLine(Styles.rampText, shadowRamp);
                    materialEditor.ShaderProperty(rampColor, "Ramp Mode", 2);
                    materialEditor.ShaderProperty(shadowType, Styles.shadowTypeText, 2);
                    materialEditor.TexturePropertySingleLine(Styles.occlusionMap, occlusionMap);
                    materialEditor.ShaderProperty(_AORAMPMODE_ON, "AO Style", 2);

                    if (material.GetTexture("_OcclusionMap") && _AORAMPMODE_ON.floatValue == 1)
                    {
                        materialEditor.ShaderProperty(occlusionStrength, "Strength", 3);
                    }
                    else
                    {
                        material.SetFloat("_OcclusionStrength", 1);
                    }

                    if (_AORAMPMODE_ON.floatValue == 0)
                    {
                        materialEditor.ShaderProperty(_OcclusionColor, "AO Color", 2);
                    }

                    materialEditor.ShaderProperty(_AOUV2, "Occlusion UV");

                    XSStyles.callGradientEditor();
                }
                //ambient
                //ramp
                //mixed
                if (rampColor.floatValue == 0)
                {
                    material.SetFloat("_WORLDSHADOWCOLOR_ON", 1);
                    material.SetFloat("_MIXEDSHADOWCOLOR_ON", 0);
                }
                if (rampColor.floatValue == 1)
                {
                    material.SetFloat("_WORLDSHADOWCOLOR_ON", 0);
                    material.SetFloat("_MIXEDSHADOWCOLOR_ON", 0);
                }
                if (rampColor.floatValue == 2)
                {
                    material.SetFloat("_WORLDSHADOWCOLOR_ON", 0);
                    material.SetFloat("_MIXEDSHADOWCOLOR_ON", 1);
                }
                //-----

                //Rimlighting
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                rimlighting = EditorGUILayout.Foldout(rimlighting, "RIMLIGHT", true);
                XSStyles.helpPopup(XSStyles.rimlightURL);
                EditorGUILayout.EndHorizontal();
                GUI.skin = null;
                if (rimlighting)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.ShaderProperty(rimStyle, Styles.rimLightTypeText);

                    if (rimStyle.floatValue == 0)
                    {
                        materialEditor.ShaderProperty(rimWidth, Styles.rimWidthText, 2);
                        materialEditor.ShaderProperty(rimIntensity, Styles.rimIntText, 2);
                        materialEditor.ShaderProperty(rimColor, "Rimlight Tint", 2);
                    }

                    if (rimStyle.floatValue == 1)
                    {
                        materialEditor.ShaderProperty(rimWidth, Styles.rimWidthText, 2);
                        materialEditor.ShaderProperty(rimIntensity, Styles.rimIntText, 2);
                        materialEditor.ShaderProperty(rimColor, "Rimlight Tint", 2);
                    }

                    if (rimStyle.floatValue == 2)
                    {
                        material.SetFloat("_RimIntensity", 0);
                    }
                }
                //----

                //emission
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                emission = EditorGUILayout.Foldout(emission, "EMISSION", true);
                XSStyles.helpPopup(XSStyles.emissionsURL);
                EditorGUILayout.EndHorizontal();
                GUI.skin = null;
                if (emission)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.ShaderProperty(emissiveToggle, "Emission");
                    if (emissiveToggle.floatValue == 0)
                    {
                        materialEditor.TexturePropertySingleLine(Styles.emissText, emissiveTex, emissiveColor);
                        materialEditor.ShaderProperty(EmissTintToColor, "Tint To Diffuse");
                        materialEditor.ShaderProperty(EmissScaleWithLight, "Scale With Light");
                        if (EmissScaleWithLight.floatValue == 0)
                        {
                            materialEditor.ShaderProperty(EmissionPower, "Threshold", 2);
                        }
                        materialEditor.ShaderProperty(UseUV2Emiss, "Emission UV");
                    }
                    else
                    {
                        material.SetColor("_EmissiveColor", Color.black);
                    }
                }
                //-----

                //specular
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                specular = EditorGUILayout.Foldout(specular, "SPECULAR", true);
                XSStyles.helpPopup(XSStyles.specularURL);
                EditorGUILayout.EndHorizontal();
                EditorGUI.BeginChangeCheck();
                if (specular)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.ShaderProperty(UseSpecular, "Specular");
                    if (UseSpecular.floatValue == 0)
                    {
                        materialEditor.TexturePropertySingleLine(Styles.specMapText, specMap);
                        GUI.skin = null;
                        materialEditor.TextureScaleOffsetProperty(specMap);
                        materialEditor.TexturePropertySingleLine(Styles.specPatternText, specPattern);
                        materialEditor.TextureScaleOffsetProperty(specPattern);
                        materialEditor.ShaderProperty(stylizedType, "Specular Type");
                        materialEditor.ShaderProperty(specStyle, "Specular Style");
                        if (stylizedType.floatValue == 1)
                        {
                            material.SetFloat("_ANISTROPIC_ON", 1);
                            materialEditor.ShaderProperty(aX, "Length", 3);
                            materialEditor.ShaderProperty(aY, "Width", 3);
                        }
                        else
                        {
                            material.SetFloat("_ANISTROPIC_ON", 0);
                            materialEditor.ShaderProperty(specArea, Styles.SmoothnessText, 3);
                        }
                        materialEditor.ShaderProperty(specIntensity, Styles.sintensityText, 3);
                        materialEditor.ShaderProperty(_SpecularUv2, "Specular UV");
                        materialEditor.ShaderProperty(_SpecularPatternUv2, "Pattern UV");
                    }
                    else
                    {
                        material.SetFloat("_SpecularIntensity", 0);
                    }
                }
                //-----

                //metallic
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                reflections = EditorGUILayout.Foldout(reflections, "REFLECTIONS", true);
                XSStyles.helpPopup(XSStyles.reflURL);
                EditorGUILayout.EndHorizontal();
                GUI.skin = null;
                if (reflections)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.ShaderProperty(useRefl, "Reflections");
                    if (useRefl.floatValue == 0)
                    {
                        materialEditor.ShaderProperty(reflType, "Reflection Style");
                        material.EnableKeyword("_REFLECTIONS_ON");
                        //pbr
                        if (reflType.floatValue == 0)
                        {
                            materialEditor.TexturePropertySingleLine(Styles.bakedCube, bakedCube);
                            material.SetFloat("_PBRREFL_ON", 1);
                            material.SetFloat("_MATCAP_ON", 0);
                            material.SetFloat("_MATCAP_CUBEMAP_ON", 0);
                            materialEditor.TexturePropertySingleLine(Styles.MetalMap, metalMap);

                            if (!material.GetTexture("_MetallicMap"))
                            {
                                materialEditor.ShaderProperty(metal, "Metallic", 2);
                            }
                            else
                            {
                                material.SetFloat("_Metallic", 1);
                            }

                            materialEditor.ShaderProperty(reflSmooth, "Smoothness", 2);
                            materialEditor.ShaderProperty(_MetallicUv2, "Metal/Rough UV");
                        }
                        //matcap
                        if (reflType.floatValue == 1)
                        {
                            material.SetFloat("_MATCAP_ON", 1);
                            material.SetFloat("_MATCAP_CUBEMAP_ON", 0);
                            material.SetFloat("_PBRREFL_ON", 0);
                            materialEditor.ShaderProperty(matcapStyle, "Blend Mode");
                            materialEditor.TexturePropertySingleLine(Styles.Matcap, metalMap);
                            materialEditor.TexturePropertySingleLine(Styles.MatcapMask, roughMap);
                            materialEditor.ShaderProperty(metal, "Intensity", 2);
                            materialEditor.ShaderProperty(reflSmooth, "Blur", 2);
                        }
                        //bakedcubemap
                        if (reflType.floatValue == 2)
                        {
                            material.SetFloat("_MATCAP_CUBEMAP_ON", 1);
                            material.SetFloat("_MATCAP_ON", 0);
                            material.SetFloat("_PBRREFL_ON", 0);
                            materialEditor.TexturePropertySingleLine(Styles.bakedCube, bakedCube);
                            materialEditor.TexturePropertySingleLine(Styles.MetalMap, metalMap);

                            if (!material.GetTexture("_MetallicMap"))
                            {
                                materialEditor.ShaderProperty(metal, "Metallic", 2);
                            }
                            else
                            {
                                material.SetFloat("_Metallic", 1);
                            }

                            materialEditor.ShaderProperty(reflSmooth, "Smoothness", 2);
                            materialEditor.ShaderProperty(_MetallicUv2, "UVSet");
                        }
                    }
                    else
                    {
                        material.DisableKeyword("_REFLECTIONS_ON");
                        material.SetFloat("_PBRREFL_ON", 0);
                        material.SetFloat("_MATCAP_ON", 0);
                        material.SetFloat("_MATCAP_CUBEMAP_ON", 0);
                    }
                }
                //-----

                //Subsurface Scattering
                XSStyles.Separator();
                EditorGUILayout.BeginHorizontal();
                subsurface = EditorGUILayout.Foldout(subsurface, "SUBSURFACE SCATTERING", true);
                XSStyles.helpPopup(XSStyles.sssURL);
                GUI.skin = null;
                EditorGUILayout.EndHorizontal();
                if (subsurface)
                {
                    XSStyles.SeparatorThin();
                    materialEditor.ShaderProperty(UseSSS, "Subsurface Scattering");
                    if (UseSSS.floatValue == 0)
                    {
                        materialEditor.TexturePropertySingleLine(Styles.thicknessMap, ThicknessMap);
                        materialEditor.ShaderProperty(invertThickness, "Invert", 3);
                        materialEditor.ShaderProperty(ThicknessMapPower, "Power", 3);
                        materialEditor.ShaderProperty(SSSCol, "Subsurface Color", 2);
                        materialEditor.ShaderProperty(SSSDist, "Displacement", 2);
                        materialEditor.ShaderProperty(SSSPow, "Sharpness", 2);
                        materialEditor.ShaderProperty(SSSIntensity, "Intensity", 2);
                    }
                    else
                    {
                        material.SetFloat("_SSSIntensity", 0);
                    }
                }
                else
                {
                    if (UseSSS.floatValue == 1)
                    {
                        material.SetFloat("_SSSIntensity", 0);
                    }
                }
                //-----



                GUI.skin = null;
                if (advMode.floatValue == 1)
                {
                    XSStyles.Separator();
                    advancedSettings = EditorGUILayout.Foldout(advancedSettings, "ADVANCED SETTINGS", true);
                    if (advancedSettings)
                    {
                        XSStyles.SeparatorThin();
                        // GUILayout.Label(Styles.advancedOptions, EditorStyles.boldLabel);
                        //Stencil
                        GUILayout.Label("Stencil Buffer", EditorStyles.boldLabel);
                        materialEditor.ShaderProperty(colorMask, colorMask.displayName, 2);
                        materialEditor.ShaderProperty(stencil, stencil.displayName, 2);
                        materialEditor.ShaderProperty(stencilComp, stencilComp.displayName, 2);
                        materialEditor.ShaderProperty(stencilOp, stencilOp.displayName, 2);
                        materialEditor.ShaderProperty(stencilFail, stencilFail.displayName, 2);
                        materialEditor.ShaderProperty(stencilZFail, stencilZFail.displayName, 2);
                        materialEditor.ShaderProperty(ztest, ztest.displayName, 2);
                        materialEditor.ShaderProperty(zwrite, zwrite.displayName, 2);
                        materialEditor.ShaderProperty(RampBaseAnchor, "Ramp Anchor", 2);

                        // Reset ZWrite/ZTest
                        XSStyles.ResetAdv(material);
                        XSStyles.ResetAdvAll(material);

                        // disable pass toggle
                        // disableOutlinePass = EditorGUILayout.Toggle("Disable Outline Pass", disableOutlinePass);
                        // if(disableOutlinePass == true)
                        //     material.SetShaderPassEnabled("Always", false);
                        // else
                        //     material.SetShaderPassEnabled("Always", true);
                    }
                }
                if (advMode.floatValue == 0)
                {
                    XSStyles.CallResetAdv(material);
                }
            }
        }
        DoFooter();
    }
Beispiel #3
0
    public void OnGUI()
    {
        if (gradient == null)
        {
            gradient = new Gradient();
        }
        EditorGUI.BeginChangeCheck();
        SerializedObject   serializedGradient = new SerializedObject(this);
        SerializedProperty colorGradient      = serializedGradient.FindProperty("gradient");

        EditorGUILayout.PropertyField(colorGradient, true, null);
        serializedGradient.ApplyModifiedProperties();

        int width  = 128;
        int height = 8;

        res = (resolutions)EditorGUILayout.EnumPopup("Resolution: ", res);

        switch (res)
        {
        case resolutions.Large512x8:
            width = 512;
            break;

        case resolutions.Medium256x8:
            width = 256;
            break;

        case resolutions.Small128x8:
            width = 128;
            break;

        case resolutions.Tiny64x8:
            width = 64;
            break;
        }

        if (gradient != null)
        {
            Texture2D tex = new Texture2D(width, height, TextureFormat.RGBA32, false);


            for (int y = 0; y < tex.height; y++)
            {
                for (int x = 0; x < tex.width; x++)
                {
                    tex.SetPixel(x, y, gradient.Evaluate((float)x / (float)width));
                }
            }


            XSStyles.Separator();
            if (GUILayout.Button("Save Ramp"))
            {
                XSStyles.findAssetPath(finalFilePath);
                string path = EditorUtility.SaveFilePanel("Save Ramp as PNG", finalFilePath + "/Textures/Shadow Ramps/Generated", "gradient.png", "png");
                if (path.Length != 0)
                {
                    GenTexture(tex, path);
                }
            }
        }

        XSStyles.HelpBox("You can use this to create a custom shadow ramp. \nYou must save the asset with the save button to apply changes. \n\n - Click the Gradient box. \n - Choose resolution. \n - Save. \n - Drag texture into slot.", MessageType.Info);
    }
    public void OnGUI()
    {
        if (gradient == null)
        {
            gradient = new Gradient();
        }
        if (oldGradient == null)
        {
            oldGradient = new Gradient();
        }

        if (focusedMat != null && gradient != null)
        {
            XSStyles.ShurikenHeader("Current Material: " + focusedMat.name);
        }
        else
        {
            XSStyles.ShurikenHeader("Current Material: None");
        }

        SerializedObject   serializedGradient = new SerializedObject(this);
        SerializedProperty colorGradient      = serializedGradient.FindProperty("gradient");

        EditorGUILayout.PropertyField(colorGradient, true, null);
        serializedGradient.ApplyModifiedProperties();

        bool changed = !CompareGradients(oldGradient, gradient);

        if (oldFocusedMat != focusedMat)
        {
            changed = true;
            if (this.oldTexture != null)
            {
                if (this.oldTexture == EditorGUIUtility.whiteTexture)
                {
                    this.oldTexture = null;
                }
                oldFocusedMat.SetTexture("_Ramp", this.oldTexture);
                this.oldTexture = null;
            }
            oldFocusedMat = focusedMat;
        }

        if (changed)
        {
            oldGradient.SetKeys(gradient.colorKeys, gradient.alphaKeys);
            oldGradient.mode = gradient.mode;
        }

        Resolutions oldRes = res;

        res = (Resolutions)EditorGUILayout.EnumPopup("Resolution: ", res);
        if (oldRes != res)
        {
            changed = true;
        }

        int width  = (int)res;
        int height = 8;

        isLinear = GUILayout.Toggle(isLinear, "Make Linear Texture");

        if (gradient != null)
        {
            Texture2D tex = new Texture2D(width, height, TextureFormat.RGBA32, false);

            for (int y = 0; y < tex.height; y++)
            {
                for (int x = 0; x < tex.width; x++)
                {
                    tex.SetPixel(x, y, gradient.Evaluate((float)x / (float)width));
                }
            }

            if (focusedMat != null)
            {
                if (changed)
                {
                    if (focusedMat.HasProperty("_Ramp"))
                    {
                        if (this.oldTexture == null)
                        {
                            if (focusedMat.GetTexture("_Ramp") == null)
                            {
                                this.oldTexture = EditorGUIUtility.whiteTexture;
                            }
                            else
                            {
                                this.oldTexture = focusedMat.GetTexture("_Ramp");
                            }
                        }
                        tex.wrapMode = TextureWrapMode.Clamp;
                        tex.Apply(false);
                        focusedMat.SetTexture("_Ramp", tex);
                    }
                }
            }

            XSStyles.Separator();
            if (GUILayout.Button("Save Ramp"))
            {
                finalFilePath = XSStyles.findAssetPath(finalFilePath);
                string path = EditorUtility.SaveFilePanel("Save Ramp as PNG", finalFilePath + "/Textures/Shadow Ramps/Generated", "gradient.png", "png");
                if (path.Length != 0)
                {
                    bool success = GenTexture(tex, path);
                    if (success)
                    {
                        if (focusedMat != null)
                        {
                            string  s    = path.Substring(path.IndexOf("Assets"));
                            Texture ramp = AssetDatabase.LoadAssetAtPath <Texture>(s);
                            if (ramp != null)
                            {
                                focusedMat.SetTexture("_Ramp", ramp);
                                this.oldTexture = null;
                            }
                        }
                    }
                }
            }
        }

        XSStyles.HelpBox("You can use this to create a custom shadow ramp in realtime. \nIf you do not save, the ramp will be reverted back to what it was previously. \n\n - Click the Gradient box. \n - Choose resolution of the texture. \n - Save.", MessageType.Info);
    }
    public void OnGUI()
    {
        changed = false;
        if (focusedMat != null)
        {
            XSStyles.ShurikenHeader("Current Material: " + focusedMat.name);
        }
        else
        {
            XSStyles.ShurikenHeader("Current Material: None");
        }

        if (preButton == null)
        {
            iconToolbarPlus  = EditorGUIUtility.IconContent("Toolbar Plus", "Add Gradient");
            iconToolbarMinus = EditorGUIUtility.IconContent("Toolbar Minus", "Remove Gradient");
            preButton        = new GUIStyle("RL FooterButton");
            buttonBackground = new GUIStyle("RL Header");
        }

        if (gradients.Count == 0)
        {
            gradients.Add(new Gradient());
            gradients.Add(new Gradient());
            gradients.Add(new Gradient());
            gradients.Add(new Gradient());
            gradients.Add(new Gradient());
        }

        if (grad_index_reorderable == null)
        {
            makeReorderedList();
        }

        GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        Rect  r         = EditorGUILayout.GetControlRect();
        float rightEdge = r.xMax;
        float leftEdge  = rightEdge - 48f;

        r = new Rect(leftEdge, r.y, rightEdge - leftEdge, r.height);
        if (Event.current.type == EventType.Repaint)
        {
            buttonBackground.Draw(r, false, false, false, false);
        }
        leftEdge += 18f;
        EditorGUI.BeginDisabledGroup(gradients_index.Count == 5);
        bool addE = GUI.Button(new Rect(leftEdge + 4, r.y, 25, 13), iconToolbarPlus, preButton);

        EditorGUI.EndDisabledGroup();
        EditorGUI.BeginDisabledGroup(gradients_index.Count == 1);
        bool removeE = GUI.Button(new Rect(leftEdge - 19, r.y, 25, 13), iconToolbarMinus, preButton);

        EditorGUI.EndDisabledGroup();

        if (addE)
        {
            grad_index_reorderable.index++;
            int wat = 0;
            for (int i = 0; i < 5; i++)
            {
                if (!gradients_index.Contains(i))
                {
                    wat = i;
                    break;
                }
            }
            gradients_index.Add(wat);
            changed = true;
        }
        if (removeE)
        {
            gradients_index.Remove(gradients_index[gradients_index.Count - 1]);
            grad_index_reorderable.index--;
            changed = true;
        }

        GUIStyle button = new GUIStyle(EditorStyles.miniButton);

        button.normal = !reorder ? EditorStyles.miniButton.normal : EditorStyles.miniButton.onNormal;
        if (GUILayout.Button(new GUIContent("Reorder", "Don't use Reorder if you want to undo a gradient change"), button, GUILayout.ExpandWidth(false)))
        {
            reorder = !reorder;
        }
        GUILayout.EndHorizontal();

        SerializedObject serializedObject = new SerializedObject(this);

        if (reorder)
        {
            grad_index_reorderable.DoLayoutList();
        }
        else
        {
            SerializedProperty colorGradients = serializedObject.FindProperty("gradients");
            if (colorGradients.arraySize == 5)
            {
                for (int i = 0; i < gradients_index.Count; i++)
                {
                    Rect _r = EditorGUILayout.GetControlRect();
                    _r.x      += 16f;
                    _r.width  -= 2f + 16f;
                    _r.height += 5f;
                    _r.y      += 2f + (3f * i);
                    EditorGUI.PropertyField(_r, colorGradients.GetArrayElementAtIndex(gradients_index[i]), new GUIContent(""));
                }
                GUILayout.Space(Mathf.Lerp(9f, 24f, gradients_index.Count / 5f));
            }
        }
        if (serializedObject.ApplyModifiedProperties())
        {
            changed = true;
        }

        if (oldFocusedMat != focusedMat)
        {
            changed = true;
            if (this.oldTexture != null)
            {
                if (this.oldTexture == EditorGUIUtility.whiteTexture)
                {
                    this.oldTexture = null;
                }
                oldFocusedMat.SetTexture(rampProperty, this.oldTexture);
                this.oldTexture = null;
            }
            oldFocusedMat = focusedMat;
        }

        Resolutions oldRes = res;

        res = (Resolutions)EditorGUILayout.EnumPopup("Resolution: ", res);
        if (oldRes != res)
        {
            changed = true;
        }

        int width  = (int)res;
        int height = 30;

        if (gradients_index.Count == 1)
        {
            height = 8;
        }
        else
        {
            height = 150;
        }
        if (tex == null)
        {
            tex = new Texture2D(width, height, TextureFormat.RGBA32, false);
        }

        bool old_isLinear = isLinear;

        drawAdvancedOptions();
        if (old_isLinear != isLinear)
        {
            changed = true;
        }

        if (manualMaterial)
        {
            focusedMat = (Material)EditorGUILayout.ObjectField(new GUIContent("", ""), focusedMat, typeof(Material), true);
        }

        if (focusedMat != null)
        {
            if (focusedMat.HasProperty("_Ramp"))
            {
                rampProperty = "_Ramp";
            }
            else
            {
                rampProperty = EditorGUILayout.TextField("Ramp Property Name", rampProperty);
                if (!focusedMat.HasProperty(rampProperty))
                {
                    GUILayout.Label("Property not found!");
                }
            }
        }

        if (changed)
        {
            updateTexture(width, height);
            if (focusedMat != null)
            {
                if (focusedMat.HasProperty(rampProperty))
                {
                    if (this.oldTexture == null)
                    {
                        if (focusedMat.GetTexture(rampProperty) == null)
                        {
                            this.oldTexture = EditorGUIUtility.whiteTexture;
                        }
                        else
                        {
                            this.oldTexture = focusedMat.GetTexture(rampProperty);
                        }
                    }
                    tex.wrapMode = TextureWrapMode.Clamp;
                    tex.Apply(false, false);
                    focusedMat.SetTexture(rampProperty, tex);
                }
            }
        }

        XSStyles.Separator();
        drawMGInputOutput();


        if (GUILayout.Button("Save Ramp"))
        {
            finalFilePath = XSStyles.findAssetPath(finalFilePath);
            string path = EditorUtility.SaveFilePanel("Save Ramp as PNG", finalFilePath + "/Textures/Shadow Ramps/Generated", "gradient", "png");
            if (path.Length != 0)
            {
                updateTexture(width, height);
                bool success = GenTexture(tex, path);
                if (success)
                {
                    if (focusedMat != null)
                    {
                        string  s    = path.Substring(path.IndexOf("Assets"));
                        Texture ramp = AssetDatabase.LoadAssetAtPath <Texture>(s);
                        if (ramp != null)
                        {
                            focusedMat.SetTexture(rampProperty, ramp);
                            this.oldTexture = null;
                        }
                    }
                }
            }
        }
        drawHelpText();
    }