391 lines
18 KiB
C#
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
|
|
}
|
|
}
|
|
}
|