Beispiel #1
0
        public override void DrawShaderGUI(MicroSplatShaderGUI shaderGUI, MicroSplatKeywords keywords, Material mat, MaterialEditor materialEditor, MaterialProperty[] props)
        {
            if (windParticulate != ParticulateMode.None || snowParticulate != ParticulateMode.None || glitter || snowGlitter)
            {
                if (MicroSplatUtilities.DrawRollup("Wind Particulate and Glitter") && mat.HasProperty("_GlitterWind"))
                {
                    var texProp = shaderGUI.FindProp("_GlitterWind", props);
                    MicroSplatUtilities.WarnLinear(texProp.textureValue as Texture2D);
                    materialEditor.TexturePropertySingleLine(CGlitterWind, texProp);
                    MicroSplatUtilities.EnforceDefaultTexture(texProp, "microsplat_def_windglitter");

                    if ((windParticulate != ParticulateMode.None || snowParticulate != ParticulateMode.None) && mat.HasProperty("_WindParticulateRotation"))
                    {
                        EditorGUILayout.BeginHorizontal();
                        var oldEnabled = GUI.enabled;
                        if (globalWindRotation)
                        {
                            GUI.enabled = false;
                        }
                        materialEditor.ShaderProperty(shaderGUI.FindProp("_WindParticulateRotation", props), CWindRotation);
                        GUI.enabled        = oldEnabled;
                        globalWindRotation = DrawGlobalToggle(GetFeatureName(DefineFeature._GLOBALPARTICULATEROTATION), keywords);
                        EditorGUILayout.EndHorizontal();


                        if (windParticulate != ParticulateMode.None && MicroSplatUtilities.DrawRollup("Wind", true, true) && mat.HasProperty("_WindParticulateColor"))
                        {
                            materialEditor.ShaderProperty(shaderGUI.FindProp("_WindParticulateColor", props), CWindColor);

                            EditorGUILayout.BeginHorizontal();
                            oldEnabled = GUI.enabled;
                            if (globalWindStrength)
                            {
                                GUI.enabled = false;
                            }

                            materialEditor.ShaderProperty(shaderGUI.FindProp("_WindParticulateStrength", props), CWindStrength);
                            GUI.enabled        = oldEnabled;
                            globalWindStrength = DrawGlobalToggle(GetFeatureName(DefineFeature._GLOBALWINDPARTICULATESTRENGTH), keywords);
                            EditorGUILayout.EndHorizontal();


                            EditorGUI.BeginChangeCheck();
                            Vector4 speedPow = shaderGUI.FindProp("_WindParticulateParams", props).vectorValue;
                            speedPow.w = EditorGUILayout.FloatField(CWindScale, speedPow.w);
                            speedPow.x = EditorGUILayout.FloatField(CWindSpeed, speedPow.x);
                            speedPow.y = EditorGUILayout.Slider(CWindContrast, speedPow.y, 0.4f, 4.0f);
                            speedPow.z = EditorGUILayout.FloatField(CWindStretch, speedPow.z);

                            if (EditorGUI.EndChangeCheck())
                            {
                                shaderGUI.FindProp("_WindParticulateParams", props).vectorValue = speedPow;
                            }

                            if (windParticulate == ParticulateMode.ParticulateWithShadows)
                            {
                                EditorGUI.BeginChangeCheck();
                                Vector4 shadow      = shaderGUI.FindProp("_WindParticulateShadow", props).vectorValue;
                                Color   shadowColor = shaderGUI.FindProp("_WindParticulateShadowColor", props).colorValue;
                                shadowColor = EditorGUILayout.ColorField(CWindShadowColor, shadowColor);
                                shadow.x    = EditorGUILayout.Slider(CWindShadowOffset, shadow.x, 0, 0.1f);
                                shadow.y    = EditorGUILayout.Slider(CWindShadowStrength, shadow.y, 0, 2.0f);

                                if (EditorGUI.EndChangeCheck())
                                {
                                    shaderGUI.FindProp("_WindParticulateShadow", props).vectorValue     = shadow;
                                    shaderGUI.FindProp("_WindParticulateShadowColor", props).colorValue = shadowColor;
                                }
                            }
                            if (mat.HasProperty("_WindParticulateHeightMask"))
                            {
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_WindParticulateHeightMask", props), CWindHeightMask);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_WindParticulateAngleMask", props), CWindAngleMask);
                                if (mat.HasProperty("_WindParticulateUpMask"))
                                {
                                    materialEditor.ShaderProperty(shaderGUI.FindProp("_WindParticulateUpMask", props), CUpFilterRange);
                                }
                            }

                            if (mat.HasProperty("_WindEmissive"))
                            {
                                Vector4 windEmis = shaderGUI.FindProp("_WindEmissive", props).vectorValue;
                                EditorGUI.BeginChangeCheck();
                                windEmis.x = EditorGUILayout.Slider(CWindEmissive, windEmis.x, 0, 1);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    shaderGUI.FindProp("_WindEmissive", props).vectorValue = windEmis;
                                }
                            }
                            if (mat.HasProperty("_WindParticulateOcclusionStrength"))
                            {
                                EditorGUI.BeginChangeCheck();
                                float ao = mat.GetFloat("_WindParticulateOcclusionStrength");
                                ao = EditorGUILayout.Slider(COcclusionStrength, ao, 0, 1);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    shaderGUI.FindProp("_WindParticulateOcclusionStrength", props).floatValue = ao;
                                }
                            }
                        }

                        if (snowParticulate != ParticulateMode.None && MicroSplatUtilities.DrawRollup("Snow Particulate Settings", true, true) && mat.HasProperty("_SnowParticulateColor"))
                        {
                            materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowParticulateColor", props), CWindColor);

                            EditorGUILayout.BeginHorizontal();
                            oldEnabled = GUI.enabled;
                            if (globalSnowStrength)
                            {
                                GUI.enabled = false;
                            }

                            materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowParticulateStrength", props), CWindStrength);
                            GUI.enabled        = oldEnabled;
                            globalSnowStrength = DrawGlobalToggle(GetFeatureName(DefineFeature._GLOBALSNOWPARTICULATESTRENGTH), keywords);
                            EditorGUILayout.EndHorizontal();

                            EditorGUI.BeginChangeCheck();
                            Vector4 speedPow = shaderGUI.FindProp("_SnowParticulateParams", props).vectorValue;
                            speedPow.w = EditorGUILayout.FloatField(CWindScale, speedPow.w);
                            speedPow.x = EditorGUILayout.FloatField(CWindSpeed, speedPow.x);
                            speedPow.y = EditorGUILayout.Slider(CWindContrast, speedPow.y, 0.4f, 4.0f);
                            speedPow.z = EditorGUILayout.FloatField(CWindStretch, speedPow.z);

                            if (EditorGUI.EndChangeCheck())
                            {
                                shaderGUI.FindProp("_SnowParticulateParams", props).vectorValue = speedPow;
                            }

                            if (snowParticulate == ParticulateMode.ParticulateWithShadows)
                            {
                                EditorGUI.BeginChangeCheck();
                                Vector4 shadow      = shaderGUI.FindProp("_SnowParticulateShadow", props).vectorValue;
                                Color   shadowColor = shaderGUI.FindProp("_SnowParticulateShadowColor", props).colorValue;
                                shadowColor = EditorGUILayout.ColorField(CWindShadowColor, shadowColor);
                                shadow.x    = EditorGUILayout.Slider(CWindShadowOffset, shadow.x, 0, 0.1f);
                                shadow.y    = EditorGUILayout.Slider(CWindShadowStrength, shadow.y, 0, 2.0f);

                                if (EditorGUI.EndChangeCheck())
                                {
                                    shaderGUI.FindProp("_SnowParticulateShadow", props).vectorValue     = shadow;
                                    shaderGUI.FindProp("_SnowParticulateShadowColor", props).colorValue = shadowColor;
                                }
                            }

                            if (mat.HasProperty("_SnowParticulateHeightMask"))
                            {
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowParticulateHeightMask", props), CWindHeightMask);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowParticulateAngleMask", props), CWindAngleMask);
                                if (mat.HasProperty("_SnowParticulateUpMask"))
                                {
                                    materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowParticulateUpMask", props), CUpFilterRange);
                                }
                            }

                            if (mat.HasProperty("_WindEmissive"))
                            {
                                Vector4 windEmis = shaderGUI.FindProp("_WindEmissive", props).vectorValue;
                                EditorGUI.BeginChangeCheck();
                                windEmis.y = EditorGUILayout.Slider(CWindEmissive, windEmis.y, 0, 1);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    shaderGUI.FindProp("_WindEmissive", props).vectorValue = windEmis;
                                }
                            }

                            if (mat.HasProperty("_SnowParticulateOcclusionStrength"))
                            {
                                EditorGUI.BeginChangeCheck();
                                float ao = mat.GetFloat("_SnowParticulateOcclusionStrength");
                                ao = EditorGUILayout.Slider(COcclusionStrength, ao, 0, 1);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    shaderGUI.FindProp("_SnowParticulateOcclusionStrength", props).floatValue = ao;
                                }
                            }
                        }
                    }
                    if ((glitter || snowGlitter))
                    {
                        if (glitter && mat.HasProperty("_GlitterUVScale"))
                        {
                            if (MicroSplatUtilities.DrawRollup("Glitter", true, true))
                            {
                                var     scale = shaderGUI.FindProp("_GlitterUVScale", props);
                                Vector2 scl   = scale.vectorValue;
                                EditorGUI.BeginChangeCheck();
                                scl = EditorGUILayout.Vector2Field(CGlitterUVScale, scl);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    scale.vectorValue = scl;
                                }

                                materialEditor.ShaderProperty(shaderGUI.FindProp("_GlitterGraininess", props), CGlitterGraininess);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_GlitterShininess", props), CGlitterShininess);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_GlitterViewDep", props), CGlitterViewDep);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_GlitterStrength", props), CGlitterStrength);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_GlitterThreshold", props), CGlitterThreshold);

                                if (mat.HasProperty("_GlitterDistFade"))
                                {
                                    Vector4 fade = mat.GetVector("_GlitterDistFade");
                                    EditorGUI.BeginChangeCheck();

                                    fade.x = EditorGUILayout.FloatField("Begin Fade", fade.x);
                                    fade.z = EditorGUILayout.Slider("Opacity At Begin", fade.z, 0, 1);
                                    fade.y = EditorGUILayout.FloatField("Fade Range", fade.y);
                                    fade.w = EditorGUILayout.Slider("Opacity At End", fade.w, 0, 1);

                                    if (EditorGUI.EndChangeCheck())
                                    {
                                        mat.SetVector("_GlitterDistFade", fade);
                                        EditorUtility.SetDirty(mat);
                                    }
                                }
                            }
                        }
                        if (snowGlitter && mat.HasProperty("_SnowGlitterUVScale"))
                        {
                            if (MicroSplatUtilities.DrawRollup("Snow Glitter", true, true))
                            {
                                var     scale = shaderGUI.FindProp("_SnowGlitterUVScale", props);
                                Vector2 scl   = scale.vectorValue;
                                EditorGUI.BeginChangeCheck();
                                scl = EditorGUILayout.Vector2Field(CGlitterUVScale, scl);
                                if (EditorGUI.EndChangeCheck())
                                {
                                    scale.vectorValue = scl;
                                }

                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowGlitterGraininess", props), CGlitterGraininess);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowGlitterShininess", props), CGlitterShininess);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowGlitterViewDep", props), CGlitterViewDep);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowGlitterStrength", props), CGlitterStrength);
                                materialEditor.ShaderProperty(shaderGUI.FindProp("_SnowGlitterThreshold", props), CGlitterThreshold);

                                if (mat.HasProperty("_SnowGlitterDistFade"))
                                {
                                    Vector4 fade = mat.GetVector("_SnowGlitterDistFade");
                                    EditorGUI.BeginChangeCheck();

                                    fade.x = EditorGUILayout.FloatField("Begin Fade", fade.x);
                                    fade.z = EditorGUILayout.Slider("Opacity At Begin", fade.z, 0, 1);
                                    fade.y = EditorGUILayout.FloatField("Fade Range", fade.y);
                                    fade.w = EditorGUILayout.Slider("Opacity At End", fade.w, 0, 1);

                                    if (EditorGUI.EndChangeCheck())
                                    {
                                        mat.SetVector("_SnowGlitterDistFade", fade);
                                        EditorUtility.SetDirty(mat);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        public override void DrawShaderGUI(MicroSplatShaderGUI shaderGUI, Material mat, MaterialEditor materialEditor, MaterialProperty[] props)
        {
            if (detailNoise)
            {
                if (MicroSplatUtilities.DrawRollup("Detail Noise"))
                {
                    if (mat.HasProperty("_DetailNoise"))
                    {
                        var texProp = shaderGUI.FindProp("_DetailNoise", props);
                        MicroSplatUtilities.WarnLinear(texProp.textureValue as Texture2D);
                        materialEditor.TexturePropertySingleLine(CDetailNoiseTex, texProp);
                        MicroSplatUtilities.EnforceDefaultTexture(texProp, "microsplat_def_detail_noise");

                        Vector4 scaleStr    = shaderGUI.FindProp("_DetailNoiseScaleStrengthFade", props).vectorValue;
                        Vector4 newScaleStr = scaleStr;
                        newScaleStr.x = EditorGUILayout.FloatField("Scale", scaleStr.x);
                        newScaleStr.y = EditorGUILayout.FloatField("Strength", scaleStr.y);
                        newScaleStr.z = EditorGUILayout.FloatField("Fade Distance", scaleStr.z);
                        if (newScaleStr != scaleStr)
                        {
                            shaderGUI.FindProp("_DetailNoiseScaleStrengthFade", props).vectorValue = newScaleStr;
                        }
                    }
                }
            }

            if (distanceNoise)
            {
                if (MicroSplatUtilities.DrawRollup("Distance Noise"))
                {
                    if (mat.HasProperty("_DistanceNoise"))
                    {
                        var texProp = shaderGUI.FindProp("_DistanceNoise", props);
                        MicroSplatUtilities.WarnLinear(texProp.textureValue as Texture2D);
                        materialEditor.TexturePropertySingleLine(CDistanceNoiseTex, texProp);
                        MicroSplatUtilities.EnforceDefaultTexture(texProp, "microsplat_def_detail_noise");

                        Vector4 scaleStr    = shaderGUI.FindProp("_DistanceNoiseScaleStrengthFade", props).vectorValue;
                        Vector4 newScaleStr = scaleStr;
                        newScaleStr.x = EditorGUILayout.FloatField("Scale", scaleStr.x);
                        newScaleStr.y = EditorGUILayout.FloatField("Strength", scaleStr.y);
                        newScaleStr.z = EditorGUILayout.FloatField("Fade Start", scaleStr.z);
                        newScaleStr.w = EditorGUILayout.FloatField("Fade End", scaleStr.w);
                        if (newScaleStr != scaleStr)
                        {
                            shaderGUI.FindProp("_DistanceNoiseScaleStrengthFade", props).vectorValue = newScaleStr;
                        }
                    }
                }
            }
            if (distanceResample != DistanceResampleMode.None && mat.HasProperty("_ResampleDistanceParams"))
            {
                if (MicroSplatUtilities.DrawRollup("Distance Resample"))
                {
                    if (distanceResampleFade == DistanceResampleFade.CrossFade && mat.HasProperty("_ResampleDistanceParams"))
                    {
                        EditorGUI.BeginChangeCheck();
                        Vector4 vec = mat.GetVector("_ResampleDistanceParams");
                        vec.x = EditorGUILayout.FloatField("Resample UV Scale", vec.x);

                        Vector2 xy = EditorGUILayout.Vector2Field("Resample Begin/End", new Vector2(vec.y, vec.z));
                        if (EditorGUI.EndChangeCheck())
                        {
                            vec.y = xy.x;
                            vec.z = xy.y;
                            mat.SetVector("_ResampleDistanceParams", vec);
                            EditorUtility.SetDirty(mat);
                        }
                    }
                    else
                    {
                        EditorGUI.BeginChangeCheck();
                        Vector4 vec = mat.GetVector("_ResampleDistanceParams");
                        vec.x = EditorGUILayout.FloatField("Resample UV Scale", vec.x);

                        if (EditorGUI.EndChangeCheck())
                        {
                            mat.SetVector("_ResampleDistanceParams", vec);
                            EditorUtility.SetDirty(mat);
                        }
                    }

                    if (distanceResampleFade == DistanceResampleFade.Constant || distanceResampleFade == DistanceResampleFade.Noise)
                    {
                        var prop = shaderGUI.FindProp("_DistanceResampleConstant", props);
                        materialEditor.RangeProperty(prop, "Distance Resample Constant");
                    }
                    if (distanceResampleFade == DistanceResampleFade.Noise)
                    {
                        var     prop = shaderGUI.FindProp("_DistanceResampleNoiseParams", props);
                        Vector2 vals = new Vector2(prop.vectorValue.x, prop.vectorValue.y);
                        EditorGUI.BeginChangeCheck();
                        vals = EditorGUILayout.Vector2Field("Noise Freq and Amp", vals);
                        if (EditorGUI.EndChangeCheck())
                        {
                            prop.vectorValue = new Vector4(vals.x, vals.y, 0, 0);
                        }
                    }
                }
            }
            if (noiseChannelCount != NormalNoiseChannels.Off && mat.HasProperty("_NormalNoiseScaleStrength"))
            {
                if (MicroSplatUtilities.DrawRollup("Normal Noise"))
                {
                    {
                        var texProp = shaderGUI.FindProp("_NormalNoise", props);
                        materialEditor.TexturePropertySingleLine(CNormalNoiseTex, texProp);
                        MicroSplatUtilities.EnforceDefaultTexture(texProp, "microsplat_def_detail_normal_01");

                        Vector4 scaleStr    = shaderGUI.FindProp("_NormalNoiseScaleStrength", props).vectorValue;
                        Vector4 newScaleStr = scaleStr;
                        newScaleStr.x = EditorGUILayout.FloatField("Scale", scaleStr.x);
                        newScaleStr.y = EditorGUILayout.FloatField("Strength", scaleStr.y);
                        if (newScaleStr != scaleStr)
                        {
                            shaderGUI.FindProp("_NormalNoiseScaleStrength", props).vectorValue = newScaleStr;
                        }
                    }
                    if (noiseChannelCount == NormalNoiseChannels.Two || noiseChannelCount == NormalNoiseChannels.Three)
                    {
                        if (mat.HasProperty("_NormalNoiseScaleStrength2"))
                        {
                            var texProp = shaderGUI.FindProp("_NormalNoise2", props);
                            materialEditor.TexturePropertySingleLine(CNormalNoiseTex, texProp);
                            MicroSplatUtilities.EnforceDefaultTexture(texProp, "microsplat_def_detail_normal_02");

                            Vector4 scaleStr    = shaderGUI.FindProp("_NormalNoiseScaleStrength2", props).vectorValue;
                            Vector4 newScaleStr = scaleStr;
                            newScaleStr.x = EditorGUILayout.FloatField("Scale", scaleStr.x);
                            newScaleStr.y = EditorGUILayout.FloatField("Strength", scaleStr.y);
                            if (newScaleStr != scaleStr)
                            {
                                shaderGUI.FindProp("_NormalNoiseScaleStrength2", props).vectorValue = newScaleStr;
                            }
                        }
                    }
                    if (noiseChannelCount == NormalNoiseChannels.Three)
                    {
                        if (mat.HasProperty("_NormalNoiseScaleStrength3"))
                        {
                            var texProp = shaderGUI.FindProp("_NormalNoise3", props);
                            materialEditor.TexturePropertySingleLine(CNormalNoiseTex, texProp);
                            MicroSplatUtilities.EnforceDefaultTexture(texProp, "microsplat_def_detail_normal_03");

                            Vector4 scaleStr    = shaderGUI.FindProp("_NormalNoiseScaleStrength3", props).vectorValue;
                            Vector4 newScaleStr = scaleStr;
                            newScaleStr.x = EditorGUILayout.FloatField("Scale", scaleStr.x);
                            newScaleStr.y = EditorGUILayout.FloatField("Strength", scaleStr.y);
                            if (newScaleStr != scaleStr)
                            {
                                shaderGUI.FindProp("_NormalNoiseScaleStrength3", props).vectorValue = newScaleStr;
                            }
                        }
                    }
                }
            }
            if (antiTileOptions != 0)
            {
                if (MicroSplatUtilities.DrawRollup("Anti Tile Array") && mat.HasProperty("_AntiTileArray"))
                {
                    var array = shaderGUI.FindProp("_AntiTileArray", props);
                    materialEditor.TexturePropertySingleLine(CAntiTileArray, array);

                    if (mat.HasProperty("_AntiTileNormalNoiseScaleStr") && (((int)antiTileOptions & (int)AntiTileOptions.NoiseNormal) != 0))
                    {
                        Vector4 scaleStr    = shaderGUI.FindProp("_AntiTileNormalNoiseScaleStr", props).vectorValue;
                        Vector4 newScaleStr = scaleStr;
                        newScaleStr.x = EditorGUILayout.FloatField("Normal Scale", scaleStr.x);
                        newScaleStr.y = EditorGUILayout.FloatField("Normal Strength", scaleStr.y);
                        if (newScaleStr != scaleStr)
                        {
                            shaderGUI.FindProp("_AntiTileNormalNoiseScaleStr", props).vectorValue = newScaleStr;
                        }
                        EditorGUILayout.Space();
                    }
                    if (mat.HasProperty("_AntiTileDetailNoiseScaleFadeStr") && (((int)antiTileOptions & (int)AntiTileOptions.DetailNoise) != 0))
                    {
                        Vector4 scaleStr    = shaderGUI.FindProp("_AntiTileDetailNoiseScaleFadeStr", props).vectorValue;
                        Vector4 newScaleStr = scaleStr;
                        newScaleStr.x = EditorGUILayout.FloatField("Detail Scale", scaleStr.x);
                        newScaleStr.y = EditorGUILayout.FloatField("Detail Fade Distance", scaleStr.y);
                        newScaleStr.z = EditorGUILayout.FloatField("Detail Strength", scaleStr.z);
                        if (newScaleStr != scaleStr)
                        {
                            shaderGUI.FindProp("_AntiTileDetailNoiseScaleFadeStr", props).vectorValue = newScaleStr;
                        }
                        EditorGUILayout.Space();
                    }
                    if (mat.HasProperty("_AntiTileDistanceNoiseScaleFadeStr") && (((int)antiTileOptions & (int)AntiTileOptions.DistanceNoise) != 0))
                    {
                        Vector4 scaleStr    = shaderGUI.FindProp("_AntiTileDistanceNoiseScaleFadeStr", props).vectorValue;
                        Vector4 newScaleStr = scaleStr;
                        newScaleStr.x = EditorGUILayout.FloatField("Distance Scale", scaleStr.x);
                        newScaleStr.y = EditorGUILayout.FloatField("Distance Fade Start", scaleStr.y);
                        newScaleStr.z = EditorGUILayout.FloatField("Distance Fade End", scaleStr.z);
                        newScaleStr.w = EditorGUILayout.FloatField("Distance Strength", scaleStr.w);
                        if (newScaleStr != scaleStr)
                        {
                            shaderGUI.FindProp("_AntiTileDistanceNoiseScaleFadeStr", props).vectorValue = newScaleStr;
                        }
                    }
                }
            }
        }