223 lines
12 KiB
C#
223 lines
12 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace OccaSoftware.Altos.Editor
|
|
{
|
|
[CustomEditor(typeof(SkyboxDefinitionScriptableObject))]
|
|
[CanEditMultipleObjects]
|
|
public class SkyboxDefinitionEditor : UnityEditor.Editor
|
|
{
|
|
private Dictionary<string, SerializedProperty> serializedProperties;
|
|
private static GUILayoutOption miniButtonWidth = GUILayout.Width(20f);
|
|
private List<PeriodOfDay> periods;
|
|
|
|
|
|
private void OnEnable()
|
|
{
|
|
serializedProperties = new Dictionary<string, SerializedProperty>();
|
|
// Periods of Day
|
|
serializedProperties.Add("Periods of Day", serializedObject.FindProperty("periodsOfDay"));
|
|
|
|
// Time Settings
|
|
serializedProperties.Add("Time of Day", serializedObject.FindProperty("timeOfDay"));
|
|
serializedProperties.Add("Active Time of Day", serializedObject.FindProperty("activeTimeOfDay"));
|
|
serializedProperties.Add("Real Seconds to Game Hours", serializedObject.FindProperty("realSecondsToGameHours"));
|
|
|
|
// Sun Settings
|
|
serializedProperties.Add("Sun Base Rotation Y", serializedObject.FindProperty("sunBaseRotationY"));
|
|
serializedProperties.Add("Light Intensity", serializedObject.FindProperty("sunLightIntensity"));
|
|
serializedProperties.Add("Max Angle Below Horizon", serializedObject.FindProperty("sunMaxAngleBelowHorizon"));
|
|
serializedProperties.Add("Sun Size", serializedObject.FindProperty("sunSize"));
|
|
serializedProperties.Add("Sun Color", serializedObject.FindProperty("sunColor"));
|
|
|
|
|
|
// Cloud Settings
|
|
serializedProperties.Add("Cloud Texture 1", serializedObject.FindProperty("cloudTexture1"));
|
|
serializedProperties.Add("Texture 1 Zenith Tiling", serializedObject.FindProperty("texture1ZenithTiling"));
|
|
serializedProperties.Add("Texture 1 Horizon Tiling", serializedObject.FindProperty("texture1HorizonTiling"));
|
|
serializedProperties.Add("Cloud Texture 2", serializedObject.FindProperty("cloudTexture2"));
|
|
serializedProperties.Add("Texture 2 Zenith Tiling", serializedObject.FindProperty("texture2ZenithTiling"));
|
|
serializedProperties.Add("Texture 2 Horizon Tiling", serializedObject.FindProperty("texture2HorizonTiling"));
|
|
|
|
// Cloud Density Settings
|
|
serializedProperties.Add("Cloudiness", serializedObject.FindProperty("cloudiness"));
|
|
serializedProperties.Add("Cloud Speed", serializedObject.FindProperty("cloudSpeed"));
|
|
serializedProperties.Add("Cloud Sharpness", serializedObject.FindProperty("cloudSharpness"));
|
|
serializedProperties.Add("Cloud Color", serializedObject.FindProperty("cloudColor"));
|
|
serializedProperties.Add("Cloud Opacity", serializedObject.FindProperty("cloudOpacity"));
|
|
serializedProperties.Add("Cloud Shading Color", serializedObject.FindProperty("cloudShadingColor"));
|
|
serializedProperties.Add("Cloud Shading Threshold", serializedObject.FindProperty("cloudShadingThreshold"));
|
|
serializedProperties.Add("Cloud Shading Sharpness", serializedObject.FindProperty("cloudShadingSharpness"));
|
|
serializedProperties.Add("Cloud Shading Strength", serializedObject.FindProperty("cloudShadingStrength"));
|
|
serializedProperties.Add("Night Luminance Multiplier", serializedObject.FindProperty("cloudNightLuminanceMultiplier"));
|
|
|
|
// Cloud Distribution Settings
|
|
serializedProperties.Add("Alternate UVs at Zenith", serializedObject.FindProperty("alternateUVAtZenith"));
|
|
|
|
// Cloud Influence Settings
|
|
serializedProperties.Add("Sun Cloud Influence", serializedObject.FindProperty("sunCloudInfluence"));
|
|
serializedProperties.Add("Sky Color Cloud Influence", serializedObject.FindProperty("skyColorCloudInfluence"));
|
|
|
|
// Dither Settings
|
|
serializedProperties.Add("Dither Strength", serializedObject.FindProperty("ditherStrength"));
|
|
|
|
// Fog Settings
|
|
serializedProperties.Add("Fog Height Power", serializedObject.FindProperty("fogHeightPower"));
|
|
serializedProperties.Add("Horizon Color Fog Intensity", serializedObject.FindProperty("fogColorBlend"));
|
|
serializedProperties.Add("Base Fog Color", serializedObject.FindProperty("baseFogColor"));
|
|
serializedProperties.Add("Fog Start Distance", serializedObject.FindProperty("fogStart"));
|
|
serializedProperties.Add("Fog End Distance", serializedObject.FindProperty("fogEnd"));
|
|
serializedProperties.Add("Fog Dithering", serializedObject.FindProperty("fogDithering"));
|
|
}
|
|
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
serializedObject.Update();
|
|
if (Event.current.type == EventType.MouseUp)
|
|
{
|
|
ManageList();
|
|
}
|
|
|
|
Draw();
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
|
|
|
|
private void ManageList()
|
|
{
|
|
for (int i = 0; i < serializedProperties["Periods of Day"].arraySize - 1; i++)
|
|
{
|
|
SerializedProperty periodOfDay_c = serializedProperties["Periods of Day"].GetArrayElementAtIndex(i);
|
|
SerializedProperty periodOfDay_n = serializedProperties["Periods of Day"].GetArrayElementAtIndex(i + 1);
|
|
|
|
if (periodOfDay_n.FindPropertyRelative("startTime").floatValue < periodOfDay_c.FindPropertyRelative("startTime").floatValue)
|
|
{
|
|
serializedProperties["Periods of Day"].MoveArrayElement(i + 1, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Draw()
|
|
{
|
|
// Periods of Day Settings
|
|
EditorGUILayout.LabelField("Periods of Day Settings", EditorStyles.boldLabel);
|
|
for (int i = 0; i < serializedProperties["Periods of Day"].arraySize; i++)
|
|
{
|
|
EditorGUILayout.Space(5f);
|
|
SerializedProperty periodOfDay = serializedProperties["Periods of Day"].GetArrayElementAtIndex(i);
|
|
|
|
SerializedProperty description_Prop = periodOfDay.FindPropertyRelative("description");
|
|
SerializedProperty startTime_Prop = periodOfDay.FindPropertyRelative("startTime");
|
|
SerializedProperty horizonColor_Prop = periodOfDay.FindPropertyRelative("horizonColor");
|
|
SerializedProperty zenithColor_Prop = periodOfDay.FindPropertyRelative("zenithColor");
|
|
SerializedProperty groundColor_Prop = periodOfDay.FindPropertyRelative("groundColor");
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUILayout.PropertyField(description_Prop);
|
|
|
|
if (GUILayout.Button("-", EditorStyles.miniButtonRight, miniButtonWidth))
|
|
{
|
|
serializedProperties["Periods of Day"].DeleteArrayElementAtIndex(i);
|
|
}
|
|
else
|
|
{
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.PropertyField(startTime_Prop);
|
|
EditorGUILayout.PropertyField(horizonColor_Prop);
|
|
EditorGUILayout.PropertyField(zenithColor_Prop);
|
|
EditorGUILayout.PropertyField(groundColor_Prop);
|
|
}
|
|
}
|
|
EditorGUILayout.Space();
|
|
if (GUILayout.Button("+"))
|
|
{
|
|
serializedProperties["Periods of Day"].arraySize += 1;
|
|
}
|
|
EditorGUILayout.Space();
|
|
|
|
// Time Settings
|
|
EditorGUILayout.LabelField("Time Settings", EditorStyles.boldLabel);
|
|
if (!Application.isPlaying)
|
|
{
|
|
serializedProperties["Active Time of Day"].floatValue = serializedProperties["Time of Day"].floatValue;
|
|
}
|
|
System.TimeSpan timeSpan = System.TimeSpan.FromHours(serializedProperties["Active Time of Day"].floatValue);
|
|
EditorGUILayout.LabelField("Current in-game time: " + timeSpan.ToString("hh':'mm':'ss"), EditorStyles.boldLabel);
|
|
EditorGUILayout.Slider(serializedProperties["Time of Day"], 0f, 24f);
|
|
EditorGUILayout.Slider(serializedProperties["Real Seconds to Game Hours"], 0f, 3f);
|
|
EditorGUILayout.Space();
|
|
|
|
|
|
// Sun Settings
|
|
EditorGUILayout.LabelField("Sun Settings", EditorStyles.boldLabel);
|
|
EditorGUILayout.Slider(serializedProperties["Sun Base Rotation Y"], 0f, 360f);
|
|
EditorGUILayout.Slider(serializedProperties["Light Intensity"], 0f, 10f);
|
|
EditorGUILayout.Slider(serializedProperties["Max Angle Below Horizon"], 0f, 20f);
|
|
EditorGUILayout.Slider(serializedProperties["Sun Size"], 0f, 1f);
|
|
serializedProperties["Sun Color"].colorValue = EditorGUILayout.ColorField(new GUIContent("Sun Color"), serializedProperties["Sun Color"].colorValue, false, false, true);
|
|
EditorGUILayout.Space();
|
|
|
|
|
|
// Cloud Settings
|
|
EditorGUILayout.LabelField("Cloud Settings", EditorStyles.boldLabel);
|
|
EditorGUILayout.PropertyField(serializedProperties["Cloud Texture 1"]);
|
|
EditorGUILayout.PropertyField(serializedProperties["Texture 1 Zenith Tiling"]);
|
|
EditorGUILayout.PropertyField(serializedProperties["Texture 1 Horizon Tiling"]);
|
|
EditorGUILayout.PropertyField(serializedProperties["Cloud Texture 2"]);
|
|
EditorGUILayout.PropertyField(serializedProperties["Texture 2 Zenith Tiling"]);
|
|
EditorGUILayout.PropertyField(serializedProperties["Texture 2 Horizon Tiling"]);
|
|
EditorGUILayout.Space();
|
|
|
|
// Cloud Density Settings
|
|
EditorGUILayout.Slider(serializedProperties["Cloudiness"], 0f, 1f);
|
|
EditorGUILayout.Slider(serializedProperties["Cloud Speed"], 0f, 30f);
|
|
EditorGUILayout.Slider(serializedProperties["Cloud Sharpness"], 0f, 1f);
|
|
serializedProperties["Cloud Color"].colorValue = EditorGUILayout.ColorField(new GUIContent("Cloud Color"), serializedProperties["Cloud Color"].colorValue, false, false, true);
|
|
EditorGUILayout.Slider(serializedProperties["Cloud Opacity"], 0f, 1f);
|
|
serializedProperties["Cloud Shading Color"].colorValue = EditorGUILayout.ColorField(new GUIContent("Cloud Shading Color"), serializedProperties["Cloud Shading Color"].colorValue, false, false, true);
|
|
EditorGUILayout.Slider(serializedProperties["Cloud Shading Threshold"], 0f, 0.3f);
|
|
EditorGUILayout.Slider(serializedProperties["Cloud Shading Sharpness"], 0f, 1f);
|
|
EditorGUILayout.Slider(serializedProperties["Cloud Shading Strength"], 0f, 1f);
|
|
EditorGUILayout.Slider(serializedProperties["Night Luminance Multiplier"], 0f, 1f);
|
|
EditorGUILayout.Space();
|
|
|
|
// Cloud Distribution Settings
|
|
EditorGUILayout.Slider(serializedProperties["Alternate UVs at Zenith"], 0f, 1f);
|
|
EditorGUILayout.Space();
|
|
|
|
// Cloud Influence Settings
|
|
EditorGUILayout.Slider(serializedProperties["Sun Cloud Influence"], 0f, 1.0f);
|
|
EditorGUILayout.Slider(serializedProperties["Sky Color Cloud Influence"], 0f, 1f);
|
|
EditorGUILayout.Space();
|
|
|
|
|
|
// Dither Settings
|
|
EditorGUILayout.LabelField("Dither Settings", EditorStyles.boldLabel);
|
|
EditorGUILayout.Slider(serializedProperties["Dither Strength"], 0f, 1f);
|
|
EditorGUILayout.Space();
|
|
|
|
|
|
// Fog Settings
|
|
EditorGUILayout.LabelField("Fog Settings", EditorStyles.boldLabel);
|
|
float near = 0f;
|
|
float far = 1000f;
|
|
if(Camera.main != null)
|
|
{
|
|
near = Camera.main.nearClipPlane;
|
|
far = Camera.main.farClipPlane;
|
|
}
|
|
EditorGUILayout.Slider(serializedProperties["Fog Start Distance"], near, far);
|
|
EditorGUILayout.Slider(serializedProperties["Fog End Distance"], near, far);
|
|
EditorGUILayout.Slider(serializedProperties["Fog Height Power"], 0f, 30f);
|
|
EditorGUILayout.Slider(serializedProperties["Horizon Color Fog Intensity"], 0f, 1f);
|
|
serializedProperties["Base Fog Color"].colorValue = EditorGUILayout.ColorField(new GUIContent("Base Fog Color"), serializedProperties["Base Fog Color"].colorValue, false, false, true);
|
|
EditorGUILayout.Slider(serializedProperties["Fog Dithering"], 0f, 0.1f);
|
|
}
|
|
}
|
|
|
|
}
|