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(true); #else reflections = FindObjectsOfType(); #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(); } } }