using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditorInternal; [CustomEditor(typeof(FogVolumeRenderer))] public class FogVolumeRendererEditor : Editor { SerializedProperty ShowCamera; FogVolumeRenderer _target; private Texture2D InspectorImage; private GUIStyle HeaderStyle, BodyStyle; private static bool DebugTab { get { return EditorPrefs.GetBool("fvDebugTab"); } set { EditorPrefs.SetBool("fvDebugTab", value); } } private static bool ShowInspectorTooltips { get { return EditorPrefs.GetBool("ShowInspectorTooltips"); } set { EditorPrefs.SetBool("ShowInspectorTooltips", value); } } GUIContent VariableField(string VariableName, string Tooltip) { return new GUIContent(VariableName, ShowInspectorTooltips ? Tooltip : ""); } string[] layerMaskName; //int layerMaskNameIndex = 0; void OnEnable() { _target = (FogVolumeRenderer)target; ShowCamera = serializedObject.FindProperty("ShowCamera"); InspectorImage = Resources.Load("InspectorImage", typeof(Texture2D)) as Texture2D; HeaderStyle = new GUIStyle(); HeaderStyle.normal.background = InspectorImage; BodyStyle = new GUIStyle(); // BodyStyle.normal.background = (Texture2D)Resources.Load("RendererInspectorBody"); if (EditorGUIUtility.isProSkin) BodyStyle.normal.background = (Texture2D)Resources.Load("RendererInspectorBodyBlack"); else BodyStyle.normal.background = (Texture2D)Resources.Load("RendererInspectorBodyBright"); List layerMaskList = new List(); for (int i = 0; i < 32; i++) { string layerName = LayerMask.LayerToName(i); //if (layerName != "") //{ // if (layerName == _target.DepthLayersName) // layerMaskNameIndex = layerMaskList.Count; layerMaskList.Add(layerName); //} } layerMaskName = layerMaskList.ToArray(); } public override void OnInspectorGUI() { serializedObject.Update(); GUILayout.Space(10); // GUILayout.Box(InspectorImage, GUILayout.ExpandWidth(true)); GUILayout.BeginVertical(HeaderStyle); // EditorGUILayout.HelpBox(BodyStyle.name, MessageType.None); GUILayout.Space(EditorGUIUtility.currentViewWidth / 4 - 10); //end header GUILayout.EndVertical(); //begin body GUILayout.Space(1); GUILayout.BeginVertical(BodyStyle); EditorGUI.BeginChangeCheck(); Undo.RecordObject(_target, "Fog volume Renderer parameter"); GUILayout.Space(20); // GUILayout.BeginVertical("box"); _target._Downsample = EditorGUILayout.IntSlider("Downscale", _target._Downsample, 1, 16); //if (_target._Downsample>1) // _target.RenderableInSceneView = EditorGUILayout.Toggle(VariableField("Render In Scene View", "Makes it visible for reflection probes and Scene viewport"), _target.RenderableInSceneView); //GUILayout.EndVertical();//end box if (_target._Downsample > 1) _target._BlendMode = (FogVolumeRenderer.BlendMode)EditorGUILayout.EnumPopup("Blend Mode", _target._BlendMode); EditorGUILayout.HelpBox("Resolution: " + _target.FogVolumeResolution, MessageType.None); if (_target._Downsample > 1) { GUILayout.BeginVertical("box"); _target.GenerateDepth = EditorGUILayout.Toggle(VariableField("Depth", "Compute Depth when rendered in low-res and textured volumes collide with scene elements"), _target.GenerateDepth); if (_target.GenerateDepth) { //GUILayout.BeginHorizontal(); //EditorGUILayout.LabelField("Exclude layer"); //int newLayerMaskNameIndex = EditorGUILayout.Popup(layerMaskNameIndex, layerMaskName); //if (newLayerMaskNameIndex != layerMaskNameIndex) //{ // layerMaskNameIndex = newLayerMaskNameIndex; // _target.DepthLayersName = layerMaskName[layerMaskNameIndex]; //} //GUILayout.EndHorizontal(); // GUILayout.BeginHorizontal(); // EditorGUILayout.LabelField("Depth layers"); _target.DepthLayer2 = EditorGUILayout.MaskField(VariableField("Depth layers", "Select the layers used to collide with FV\n(Experimental feature)"), _target.DepthLayer2, layerMaskName); //_target.DepthLayer2 = EditorGUILayout.LayerField("Depth layers", _target.DepthLayer2); //GUILayout.EndHorizontal(); GUILayout.BeginVertical("box"); _target.useBilateralUpsampling = EditorGUILayout.Toggle(VariableField("Edge-aware upscale", "Minimize the aliasing at the edges of colliding elements"), _target.useBilateralUpsampling); if (_target.useBilateralUpsampling) { _target.upsampleDepthThreshold = EditorGUILayout.Slider("Depth Threshold", _target.upsampleDepthThreshold, 0, .01f); _target.showBilateralEdge = EditorGUILayout.Toggle("Show edge mask", _target.showBilateralEdge); _target.upsampleMode = (FogVolumeRenderer.UpsampleMode)EditorGUILayout.EnumPopup("Method", _target.upsampleMode); } GUILayout.EndVertical();//end box } GUILayout.EndVertical();//end box #region DeNoise if (_target._Downsample > 1) { GUILayout.BeginVertical("box"); _target.TAA = EditorGUILayout.Toggle(VariableField("DeNoise", "Performs Playdead's TAA to minimize noise when using jitter. Note: effect works only in 5.5"), _target.TAA); if (_target.TAA && _target.HDR) EditorGUILayout.HelpBox("Color output is in LDR", MessageType.None); GUILayout.EndVertical();//end box } #endregion // #region Stereo //if ( _target._Downsample > 0) //{ // GUILayout.BeginVertical("box"); // _target.useRectangularStereoRT = EditorGUILayout.Toggle("Rectangular stereo", _target.useRectangularStereoRT); // GUILayout.EndVertical();//end box //} // #endregion if (GUILayout.Button("Debug", EditorStyles.toolbarButton)) DebugTab = !DebugTab; if (DebugTab) { GUILayout.BeginVertical("box"); { EditorGUILayout.PropertyField(ShowCamera, new GUIContent("Show camera", "Unhide the camera used to render FV in low resolution")); } GUILayout.EndVertical(); } } EditorGUI.EndChangeCheck(); EditorGUILayout.HelpBox("Fog Volume 3.4 July 2018", MessageType.None); GUILayout.EndVertical(); if (GUI.changed) { EditorUtility.SetDirty(_target); } serializedObject.ApplyModifiedProperties(); } }