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; } } } } }