using System; using UnityEngine; using UnityEngine.Rendering.PostProcessing; namespace UnityEditor.Rendering.PostProcessing { /// /// The base class for all post-processing effect related editors. If you want to customize the /// look of a custom post-processing effect, inherit from /// instead. /// /// public class PostProcessEffectBaseEditor { internal PostProcessEffectSettings target { get; private set; } internal SerializedObject serializedObject { get; private set; } internal SerializedProperty baseProperty; internal SerializedProperty activeProperty; SerializedProperty m_Enabled; Editor m_Inspector; internal PostProcessEffectBaseEditor() { } /// /// Repaints the inspector. /// public void Repaint() { m_Inspector.Repaint(); } internal void Init(PostProcessEffectSettings target, Editor inspector) { this.target = target; m_Inspector = inspector; serializedObject = new SerializedObject(target); m_Enabled = serializedObject.FindProperty("enabled.value"); activeProperty = serializedObject.FindProperty("active"); OnEnable(); } /// /// Called when the editor is initialized. /// public virtual void OnEnable() { } /// /// Called when the editor is de-initialized. /// public virtual void OnDisable() { } internal void OnInternalInspectorGUI() { serializedObject.Update(); TopRowFields(); OnInspectorGUI(); EditorGUILayout.Space(); serializedObject.ApplyModifiedProperties(); } /// /// Called every time the inspector is being redrawn. This is where you should add your UI /// drawing code. /// public virtual void OnInspectorGUI() { } /// /// Returns the label to use as the effect title. You can override this to return a custom /// label, else it will use the effect type as the title. /// /// The label to use as the effect title public virtual string GetDisplayTitle() { return ObjectNames.NicifyVariableName(target.GetType().Name); } void TopRowFields() { using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button(EditorUtilities.GetContent("All|Toggle all overrides on. To maximize performances you should only toggle overrides that you actually need."), Styling.miniLabelButton, GUILayout.Width(17f), GUILayout.ExpandWidth(false))) SetAllOverridesTo(true); if (GUILayout.Button(EditorUtilities.GetContent("None|Toggle all overrides off."), Styling.miniLabelButton, GUILayout.Width(32f), GUILayout.ExpandWidth(false))) SetAllOverridesTo(false); GUILayout.FlexibleSpace(); bool enabled = m_Enabled.boolValue; enabled = GUILayout.Toggle(enabled, EditorUtilities.GetContent("On|Enable this effect."), EditorStyles.miniButtonLeft, GUILayout.Width(35f), GUILayout.ExpandWidth(false)); enabled = !GUILayout.Toggle(!enabled, EditorUtilities.GetContent("Off|Disable this effect."), EditorStyles.miniButtonRight, GUILayout.Width(35f), GUILayout.ExpandWidth(false)); m_Enabled.boolValue = enabled; } } void SetAllOverridesTo(bool state) { Undo.RecordObject(target, "Toggle All"); target.SetAllOverridesTo(state); serializedObject.Update(); } /// /// Draws a property UI element. /// /// The property to draw protected void PropertyField(SerializedParameterOverride property) { var title = EditorUtilities.GetContent(property.displayName); PropertyField(property, title); } /// /// Draws a property UI element with a custom title and/or tooltip. /// /// The property to draw /// A custom title and/or tooltip protected void PropertyField(SerializedParameterOverride property, GUIContent title) { // Check for DisplayNameAttribute first var displayNameAttr = property.GetAttribute(); if (displayNameAttr != null) title.text = displayNameAttr.displayName; // Add tooltip if it's missing and an attribute is available if (string.IsNullOrEmpty(title.tooltip)) { var tooltipAttr = property.GetAttribute(); if (tooltipAttr != null) title.tooltip = tooltipAttr.tooltip; } // Look for a compatible attribute decorator AttributeDecorator decorator = null; Attribute attribute = null; foreach (var attr in property.attributes) { // Use the first decorator we found if (decorator == null) { decorator = EditorUtilities.GetDecorator(attr.GetType()); attribute = attr; } // Draw unity built-in Decorators (Space, Header) if (attr is PropertyAttribute) { if (attr is SpaceAttribute) { EditorGUILayout.GetControlRect(false, (attr as SpaceAttribute).height); } else if (attr is HeaderAttribute) { var rect = EditorGUILayout.GetControlRect(false, 24f); rect.y += 8f; rect = EditorGUI.IndentedRect(rect); EditorGUI.LabelField(rect, (attr as HeaderAttribute).header, Styling.headerLabel); } } } bool invalidProp = false; if (decorator != null && !decorator.IsAutoProperty()) { if (decorator.OnGUI(property.value, property.overrideState, title, attribute)) return; // Attribute is invalid for the specified property; use default unity field instead invalidProp = true; } using (new EditorGUILayout.HorizontalScope()) { // Override checkbox var overrideRect = GUILayoutUtility.GetRect(17f, 17f, GUILayout.ExpandWidth(false)); overrideRect.yMin += 4f; EditorUtilities.DrawOverrideCheckbox(overrideRect, property.overrideState); // Property using (new EditorGUI.DisabledScope(!property.overrideState.boolValue)) { if (decorator != null && !invalidProp) { if (decorator.OnGUI(property.value, property.overrideState, title, attribute)) return; } // Default unity field if (property.value.hasVisibleChildren && property.value.propertyType != SerializedPropertyType.Vector2 && property.value.propertyType != SerializedPropertyType.Vector3) { GUILayout.Space(12f); EditorGUILayout.PropertyField(property.value, title, true); } else { EditorGUILayout.PropertyField(property.value, title); } } } } } }