ElectricityBusinessHall_Dig.../Assets/ShinySSRR/Editor/RenderFeatureEditor.cs

182 lines
9.7 KiB
C#

using UnityEngine;
using UnityEditor;
namespace ShinySSRR {
[CustomEditor(typeof(ShinySSRR))]
public class RenderFeatureEditor : Editor {
SerializedProperty showInSceneView;
SerializedProperty smoothnessThreshold, reflectionsMultiplier, reflectionsMinIntensity, reflectionsMaxIntensity;
SerializedProperty downsampling, depthBias, outputMode, separationPos, lowPrecision, stopNaN;
SerializedProperty sampleCount, maxRayLength, thickness, binarySearchIterations, refineThickness, thicknessFine, decay, jitter, animatedJitter;
SerializedProperty fresnel, fuzzyness, contactHardening, minimumBlur;
SerializedProperty blurDownsampling, blurStrength, specularControl, specularSoftenPower, vignetteSize;
Reflections[] reflections;
public Texture bulbOnIcon, bulbOffIcon, deleteIcon, arrowRight;
private void OnEnable() {
showInSceneView = serializedObject.FindProperty("showInSceneView");
smoothnessThreshold = serializedObject.FindProperty("smoothnessThreshold");
reflectionsMultiplier = serializedObject.FindProperty("reflectionsMultiplier");
reflectionsMinIntensity = serializedObject.FindProperty("reflectionsMinIntensity");
reflectionsMaxIntensity = serializedObject.FindProperty("reflectionsMaxIntensity");
downsampling = serializedObject.FindProperty("downsampling");
depthBias = serializedObject.FindProperty("depthBias");
outputMode = serializedObject.FindProperty("outputMode");
separationPos = serializedObject.FindProperty("separationPos");
lowPrecision = serializedObject.FindProperty("lowPrecision");
stopNaN = serializedObject.FindProperty("stopNaN");
sampleCount = serializedObject.FindProperty("sampleCount");
maxRayLength = serializedObject.FindProperty("maxRayLength");
binarySearchIterations = serializedObject.FindProperty("binarySearchIterations");
thickness = serializedObject.FindProperty("thickness");
thicknessFine = serializedObject.FindProperty("thicknessFine");
refineThickness = serializedObject.FindProperty("refineThickness");
decay = serializedObject.FindProperty("decay");
fresnel = serializedObject.FindProperty("fresnel");
fuzzyness = serializedObject.FindProperty("fuzzyness");
contactHardening = serializedObject.FindProperty("contactHardening");
minimumBlur = serializedObject.FindProperty("minimumBlur");
jitter = serializedObject.FindProperty("jitter");
animatedJitter = serializedObject.FindProperty("animatedJitter");
blurDownsampling = serializedObject.FindProperty("blurDownsampling");
blurStrength = serializedObject.FindProperty("blurStrength");
specularControl = serializedObject.FindProperty("specularControl");
specularSoftenPower = serializedObject.FindProperty("specularSoftenPower");
vignetteSize = serializedObject.FindProperty("vignetteSize");
#if UNITY_2020_1_OR_NEWER
reflections = FindObjectsOfType<Reflections>(true);
#else
reflections = FindObjectsOfType<Reflections>();
#endif
}
public override void OnInspectorGUI() {
ShinySSRR shiny = (ShinySSRR)target;
int reflectionsCount = reflections != null ? reflections.Length : 0;
serializedObject.Update();
EditorGUILayout.PropertyField(showInSceneView);
EditorGUILayout.PropertyField(downsampling);
if (downsampling.intValue > 1 && !shiny.isDeferredActive) {
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(depthBias);
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(outputMode);
if (outputMode.intValue == (int)OutputMode.SideBySideComparison) {
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(separationPos);
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(lowPrecision);
EditorGUILayout.PropertyField(stopNaN, new GUIContent("Stop NaN"));
EditorGUILayout.Separator();
EditorGUILayout.LabelField("Raytracing Settings", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Apply Quality Preset:", GUILayout.Width(EditorGUIUtility.labelWidth));
ShinySSRR ssr = (ShinySSRR)target;
if (GUILayout.Button("Fast")) {
ssr.ApplyRaytracingPreset(RaytracingPreset.Fast);
}
if (GUILayout.Button("Medium")) {
ssr.ApplyRaytracingPreset(RaytracingPreset.Medium);
}
if (GUILayout.Button("High")) {
ssr.ApplyRaytracingPreset(RaytracingPreset.High);
}
if (GUILayout.Button("Superb")) {
ssr.ApplyRaytracingPreset(RaytracingPreset.Superb);
}
if (GUILayout.Button("Ultra")) {
ssr.ApplyRaytracingPreset(RaytracingPreset.Ultra);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.PropertyField(sampleCount);
EditorGUILayout.PropertyField(maxRayLength);
EditorGUILayout.PropertyField(thickness);
EditorGUILayout.PropertyField(binarySearchIterations);
EditorGUILayout.PropertyField(refineThickness);
if (refineThickness.boolValue) {
EditorGUILayout.PropertyField(thicknessFine);
}
EditorGUILayout.PropertyField(jitter);
EditorGUILayout.PropertyField(animatedJitter);
EditorGUILayout.PropertyField(smoothnessThreshold, new GUIContent("Smoothness Threshold", "Minimum smoothness to receive reflections"));
EditorGUILayout.PropertyField(reflectionsMultiplier, new GUIContent("Global Multiplier"));
EditorGUILayout.PropertyField(reflectionsMinIntensity, new GUIContent("Min Intensity"));
EditorGUILayout.PropertyField(reflectionsMaxIntensity, new GUIContent("Max Intensity"));
EditorGUILayout.PropertyField(fresnel);
EditorGUILayout.PropertyField(decay);
EditorGUILayout.PropertyField(specularControl);
if (specularControl.boolValue) {
EditorGUILayout.PropertyField(specularSoftenPower);
}
EditorGUILayout.PropertyField(vignetteSize);
EditorGUILayout.PropertyField(fuzzyness, new GUIContent("Fuzziness"));
EditorGUILayout.PropertyField(contactHardening);
EditorGUILayout.PropertyField(minimumBlur);
EditorGUILayout.PropertyField(blurDownsampling);
EditorGUILayout.PropertyField(blurStrength);
if (reflectionsCount > 0) {
if (!shiny.isDeferredActive) {
EditorGUILayout.HelpBox("Some settings may be overriden by Reflections scripts on specific objects.", MessageType.Info);
}
EditorGUILayout.Separator();
EditorGUILayout.LabelField("Reflections scripts in Scene", EditorStyles.helpBox);
if (shiny.isDeferredActive) {
EditorGUILayout.HelpBox("In deferred rendering path, only global SSR settings are used.", MessageType.Warning);
}
for (int k = 0; k < reflectionsCount; k++) {
Reflections refl = reflections[k];
if (refl == null) continue;
EditorGUILayout.BeginHorizontal();
GUI.enabled = refl.gameObject.activeInHierarchy;
if (GUILayout.Button(new GUIContent(refl.enabled ? bulbOnIcon : bulbOffIcon, "Toggle on/off this reflection"), EditorStyles.miniButton, GUILayout.Width(35))) {
refl.enabled = !refl.enabled;
}
GUI.enabled = true;
if (GUILayout.Button(new GUIContent(deleteIcon, "Remove this reflection script"), EditorStyles.miniButton, GUILayout.Width(35))) {
if (EditorUtility.DisplayDialog("Confirmation", "Remove the reflection script on " + refl.gameObject.name + "?", "Ok", "Cancel")) {
DestroyImmediate(refl);
reflections[k] = null;
continue;
}
}
if (GUILayout.Button(new GUIContent(arrowRight, "Select this reflection script"), EditorStyles.miniButton, GUILayout.Width(35), GUILayout.Width(40))) {
Selection.activeObject = refl.gameObject;
EditorGUIUtility.PingObject(refl.gameObject);
GUIUtility.ExitGUI();
}
GUI.enabled = refl.isActiveAndEnabled;
if (!refl.gameObject.activeInHierarchy) {
GUILayout.Label(refl.name + " (hidden gameobject)");
} else {
GUILayout.Label(refl.name);
}
GUI.enabled = true;
EditorGUILayout.EndHorizontal();
}
} else if (reflectionsCount == 0) {
if (!shiny.isDeferredActive) {
EditorGUILayout.Separator();
EditorGUILayout.LabelField("Reflections in Scene", EditorStyles.helpBox);
EditorGUILayout.HelpBox("In forward rendering path, add a Reflections script to any object or group of objects that you want to get reflections.", MessageType.Info);
}
}
serializedObject.ApplyModifiedProperties();
}
}
}