Rasagar/Packages/com.occasoftware.super-simple-skybox/Editor/SkyboxEditorGUI.cs
2024-09-01 23:42:24 +03:00

391 lines
18 KiB
C#

using UnityEngine;
using UnityEditor;
namespace OccaSoftware.SuperSimpleSkybox.Editor
{
public class SkyboxEditorGUI : ShaderGUI
{
Material t;
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
{
t = materialEditor.target as Material;
MaterialEditor e = materialEditor;
// Ground
MaterialProperty groundColor = FindProperty("_GroundColor", properties);
MaterialProperty groundEnabled = FindProperty("_GroundEnabled", properties);
MaterialProperty groundFadeAmount = FindProperty("_GroundFadeAmount", properties);
MaterialProperty groundHeight = FindProperty("_Ground_Height", properties);
// Sky Colors
MaterialProperty constantColorMode = FindProperty("_Constant_Color_Mode", properties);
MaterialProperty skyColorBlend = FindProperty("_SkyColorBlend", properties);
MaterialProperty horizonColorDay = FindProperty("_HorizonColorDay", properties);
MaterialProperty skyColorDay = FindProperty("_SkyColorDay", properties);
MaterialProperty horizonColorNight = FindProperty("_HorizonColorNight", properties);
MaterialProperty skyColorNight = FindProperty("_SkyColorNight", properties);
MaterialProperty horizonSaturationFalloff = FindProperty("_HorizonSaturationFalloff", properties);
MaterialProperty horizonSaturationAmount = FindProperty("_HorizonSaturationAmount", properties);
// Sun
MaterialProperty sunEnabled = FindProperty("_Sun_Enabled", properties);
MaterialProperty sunColorZenith = FindProperty("_SunColorZenith", properties);
MaterialProperty sunColorHorizon = FindProperty("_SunColorHorizon", properties);
MaterialProperty sunAngularDiameter = FindProperty("_SunAngularDiameter", properties);
MaterialProperty sunFalloffIntensity = FindProperty("_SunFalloffIntensity", properties);
MaterialProperty sunFalloff = FindProperty("_SunFalloff", properties);
MaterialProperty sunSkyLightingEnabled = FindProperty("_SunSkyLightingEnabled", properties);
// Sunset
MaterialProperty sunsetHorizontalFalloff = FindProperty("_SunsetHorizontalFalloff", properties);
MaterialProperty sunsetVerticalFalloff = FindProperty("_SunsetVerticalFalloff", properties);
MaterialProperty sunsetRadialFalloff = FindProperty("_SunsetRadialFalloff", properties);
MaterialProperty sunsetIntensity = FindProperty("_SunsetIntensity", properties);
// Clouds
MaterialProperty cloudsEnabled = FindProperty("_Clouds_Enabled", properties);
MaterialProperty cloudTexture = FindProperty("_CloudTexture", properties);
MaterialProperty cloudWindSpeed = FindProperty("_CloudWindSpeed", properties);
MaterialProperty cloudiness = FindProperty("_Cloudiness", properties);
MaterialProperty cloudOpacity = FindProperty("_CloudOpacity", properties);
MaterialProperty cloudSharpness = FindProperty("_CloudSharpness", properties);
MaterialProperty cloudShadingIntensity = FindProperty("_Shading_Intensity", properties);
MaterialProperty cloudFalloff = FindProperty("_CloudFalloff", properties);
MaterialProperty cloudScale = FindProperty("_CloudScale", properties);
MaterialProperty cloudColorDay = FindProperty("_CloudColorDay", properties);
MaterialProperty cloudColorNight = FindProperty("_CloudColorNight", properties);
MaterialProperty cloudIterations = FindProperty("_Cloud_Iterations", properties);
MaterialProperty cloudGain = FindProperty("_Cloud_Gain", properties);
MaterialProperty cloudLacunarity = FindProperty("_Cloud_Lacunarity", properties);
// Stars
MaterialProperty starsEnabled = FindProperty("_Stars_Enabled", properties);
MaterialProperty starTexture = FindProperty("_StarTexture", properties);
MaterialProperty starHorizonFalloff = FindProperty("_StarHorizonFalloff", properties);
MaterialProperty starScale = FindProperty("_StarScale", properties);
MaterialProperty starSpeed = FindProperty("_StarSpeed", properties);
MaterialProperty starIntensity = FindProperty("_StarIntensity", properties);
MaterialProperty starDaytimeBrightness = FindProperty("_StarDaytimeBrightness", properties);
MaterialProperty starSaturation = FindProperty("_StarSaturation", properties);
MaterialProperty proceduralStarsEnabled = FindProperty("_ProceduralStarsEnabled", properties);
MaterialProperty textureStarsEnabled = FindProperty("_Use_Texture_Stars", properties);
MaterialProperty textureStarTint = FindProperty("_Star_Texture_Tint", properties);
MaterialProperty starSharpness = FindProperty("_StarSharpness", properties);
MaterialProperty starFrequency = FindProperty("_StarFrequency", properties);
// Moon
MaterialProperty moonEnabled = FindProperty("_Moon_Enabled", properties);
MaterialProperty moonAngularDiameter = FindProperty("_MoonAngularDiameter", properties);
MaterialProperty moonFalloffAmount = FindProperty("_MoonFalloff", properties);
MaterialProperty moonColor = FindProperty("_MoonColor", properties);
ColorMode currentColorMode = (ColorMode)constantColorMode.floatValue;
DrawCommonProperties();
DrawGroundProperties();
DrawSkyProperties();
DrawSunProperties();
DrawMoonProperties();
DrawStarProperties();
DrawCloudProperties();
DrawLinks();
Validate();
void DrawCommonProperties()
{
EditorGUILayout.LabelField("Common Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
EditorGUI.BeginChangeCheck();
constantColorMode.floatValue = (float)(ColorMode)EditorGUILayout.EnumPopup("Color Mode", (ColorMode)constantColorMode.floatValue);
if (EditorGUI.EndChangeCheck())
{
e.PropertiesChanged();
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawGroundProperties()
{
EditorGUILayout.LabelField("Ground Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(groundEnabled, "Enabled");
if (groundEnabled.floatValue == 1)
{
e.ShaderProperty(groundColor, "Color");
e.ShaderProperty(groundHeight, "Height");
e.ShaderProperty(groundFadeAmount, "Fade Amount");
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawSkyProperties()
{
EditorGUILayout.LabelField("Sky Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(skyColorBlend, "Horizon-Sky Blend");
string title = currentColorMode == ColorMode.Constant ? "Colors" : "Day Colors";
EditorGUILayout.LabelField(title, EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(horizonColorDay, "Horizon");
e.ShaderProperty(skyColorDay, "Sky");
EditorGUI.indentLevel--;
if (currentColorMode == ColorMode.DayAndNightColors)
{
EditorGUILayout.LabelField("Night Colors", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(horizonColorNight, "Horizon");
e.ShaderProperty(skyColorNight, "Sky");
EditorGUI.indentLevel--;
}
EditorGUILayout.LabelField("Horizon Saturation", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(horizonSaturationAmount, "Amount");
if (horizonSaturationAmount.floatValue < 1.0f)
{
e.ShaderProperty(horizonSaturationFalloff, "Falloff");
}
EditorGUI.indentLevel--;
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawSunProperties()
{
// Sun
EditorGUILayout.LabelField("Sun Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(sunEnabled, "Sun Enabled");
if (sunEnabled.floatValue == 1.0f)
{
e.ShaderProperty(sunAngularDiameter, "Angular Diameter");
e.ShaderProperty(sunColorHorizon, "Horizon Color");
e.ShaderProperty(sunColorZenith, "Zenith Color");
e.ShaderProperty(sunSkyLightingEnabled, "Sky Lighting Enabled");
if (sunSkyLightingEnabled.floatValue == 1)
{
e.ShaderProperty(sunFalloff, "Falloff Amount");
e.ShaderProperty(sunFalloffIntensity, "Falloff Intensity");
EditorGUILayout.LabelField("Sunset Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(sunsetIntensity, "Intensity");
e.ShaderProperty(sunsetRadialFalloff, "Radial Falloff");
e.ShaderProperty(sunsetHorizontalFalloff, "Horizontal Falloff");
e.ShaderProperty(sunsetVerticalFalloff, "Vertical Falloff");
EditorGUI.indentLevel--;
}
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawMoonProperties()
{
EditorGUILayout.LabelField("Moon Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(moonEnabled, "Moon Enabled");
if (moonEnabled.floatValue == 1.0f)
{
e.ShaderProperty(moonAngularDiameter, "Angular Diameter");
e.ShaderProperty(moonColor, "Color");
e.ShaderProperty(moonFalloffAmount, "Falloff Amount");
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawStarProperties()
{
// Stars
EditorGUILayout.LabelField("Star Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(starsEnabled, "Stars Enabled");
if (starsEnabled.floatValue == 1.0f)
{
EditorGUILayout.LabelField("Common");
EditorGUI.indentLevel++;
e.ShaderProperty(starIntensity, "Brightness");
if (currentColorMode == ColorMode.DayAndNightColors)
{
e.ShaderProperty(starDaytimeBrightness, "Daytime Brightness");
}
e.ShaderProperty(starHorizonFalloff, "Horizon Falloff");
e.ShaderProperty(starSaturation, "Saturation");
EditorGUI.indentLevel--;
proceduralStarsEnabled.floatValue = EditorGUILayout.Toggle(
new GUIContent("Procedural Stars Enabled"),
proceduralStarsEnabled.floatValue == 1.0f ? true : false
)
? 1.0f
: 0.0f;
if (proceduralStarsEnabled.floatValue == 1.0f)
{
EditorGUI.indentLevel++;
e.ShaderProperty(starSharpness, "Sharpness");
e.ShaderProperty(starFrequency, "Amount");
EditorGUI.indentLevel--;
}
textureStarsEnabled.floatValue = EditorGUILayout.Toggle(
new GUIContent("Star Texture Enabled"),
textureStarsEnabled.floatValue == 1.0f ? true : false
)
? 1.0f
: 0.0f;
if (textureStarsEnabled.floatValue == 1.0f)
{
EditorGUI.indentLevel++;
starTexture.textureValue = (Texture)
EditorGUILayout.ObjectField(
"Texture",
starTexture.textureValue,
typeof(Texture),
true,
GUILayout.Height(EditorGUIUtility.singleLineHeight)
);
if (starTexture.textureValue != null)
{
e.ShaderProperty(textureStarTint, "Tint");
e.ShaderProperty(starScale, "Scale");
e.ShaderProperty(starSpeed, "Rotation Speed");
}
EditorGUI.indentLevel--;
}
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawCloudProperties()
{
EditorGUILayout.LabelField("Cloud Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(cloudsEnabled, "Clouds Enabled");
if (cloudsEnabled.floatValue == 1.0f)
{
EditorGUILayout.LabelField("Texture Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
Texture cachedTexture = cloudTexture.textureValue;
cloudTexture.textureValue = (Texture)
EditorGUILayout.ObjectField(
"Texture",
cloudTexture.textureValue,
typeof(Texture),
true,
GUILayout.Height(EditorGUIUtility.singleLineHeight)
);
if (cachedTexture == null && cloudTexture.textureValue != null)
cloudiness.floatValue = 0.5f;
if (cloudTexture.textureValue != null)
{
Vector2Int s = EditorGUILayout.Vector2IntField(
"Scale",
new Vector2Int((int)cloudScale.vectorValue.x, (int)cloudScale.vectorValue.y)
);
cloudScale.vectorValue = new Vector4(s.x, s.y, 0, 0);
cloudWindSpeed.vectorValue = EditorGUILayout.Vector2Field("Speed", cloudWindSpeed.vectorValue);
EditorGUI.indentLevel--;
EditorGUILayout.LabelField("Look Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
e.ShaderProperty(cloudiness, "Cloudiness");
e.ShaderProperty(cloudOpacity, "Opacity");
e.ShaderProperty(cloudSharpness, "Sharpness");
e.ShaderProperty(cloudShadingIntensity, "Shading Intensity");
e.ShaderProperty(cloudFalloff, "Zenith Falloff");
DrawIntegerProperty(cloudIterations, new GUIContent("Iterations"), 1, 4);
if (cloudIterations.floatValue >= 2)
{
EditorGUI.indentLevel++;
e.ShaderProperty(cloudGain, "Gain");
DrawIntegerProperty(cloudLacunarity, new GUIContent("Lacunarity"), 2, 5);
EditorGUI.indentLevel--;
}
EditorGUI.indentLevel--;
EditorGUILayout.LabelField("Color Settings", EditorStyles.boldLabel);
EditorGUI.indentLevel++;
string title = currentColorMode == ColorMode.Constant ? "Cloud Color" : "Day";
e.ShaderProperty(cloudColorDay, title);
if (currentColorMode == ColorMode.DayAndNightColors)
{
e.ShaderProperty(cloudColorNight, "Night");
}
EditorGUI.indentLevel--;
}
else
{
cloudiness.floatValue = 0;
}
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
void DrawLinks()
{
EditorGUILayout.BeginVertical();
if (EditorGUILayout.LinkButton("Manual"))
{
Application.OpenURL("https://www.occasoftware.com/assets/super-simple-skybox");
}
EditorGUILayout.Space();
EditorGUILayout.EndVertical();
}
void Validate()
{
sunAngularDiameter.floatValue = Mathf.Max(sunAngularDiameter.floatValue, 0);
sunFalloff.floatValue = Mathf.Max(sunFalloff.floatValue, 0);
sunFalloffIntensity.floatValue = Mathf.Max(sunFalloffIntensity.floatValue, 0);
moonAngularDiameter.floatValue = Mathf.Max(moonAngularDiameter.floatValue, 0);
moonFalloffAmount.floatValue = Mathf.Max(moonFalloffAmount.floatValue, 0);
starSaturation.floatValue = Mathf.Max(starSaturation.floatValue, 0);
}
void DrawIntegerProperty(MaterialProperty p, GUIContent c, int min, int max)
{
EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = p.hasMixedValue;
float v = EditorGUILayout.IntSlider(c, (int)p.floatValue, min, max);
if (EditorGUI.EndChangeCheck())
{
p.floatValue = v;
}
EditorGUI.showMixedValue = false;
}
}
private enum StarControlState
{
Texture,
Procedural
}
private enum ColorMode
{
DayAndNightColors,
Constant
}
}
}