No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RenderObjectsPassFeatureEditor.cs 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. using System;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.Experimental.Rendering.Universal;
  5. using UnityEngine.Rendering.Universal;
  6. using System.Collections.Generic;
  7. using System.Reflection;
  8. namespace UnityEditor.Rendering.Universal
  9. {
  10. /// <summary>
  11. /// Editor script for the <c>RenderObjects</c> renderer feature.
  12. /// </summary>
  13. [CustomEditor(typeof(RenderObjects), true)]
  14. public class ScriptableRendererFeatureEditor : Editor
  15. {
  16. /// <inheritdoc/>
  17. public override void OnInspectorGUI()
  18. {
  19. DrawPropertiesExcluding(serializedObject, "m_Script");
  20. }
  21. }
  22. }
  23. namespace UnityEditor.Experimental.Rendering.Universal
  24. {
  25. [CustomPropertyDrawer(typeof(RenderObjects.RenderObjectsSettings), true)]
  26. internal class RenderObjectsPassFeatureEditor : PropertyDrawer
  27. {
  28. internal class Styles
  29. {
  30. public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
  31. public static GUIContent callback = new GUIContent("Event", "Choose at which point this render pass is executed in the frame.");
  32. //Headers
  33. public static GUIContent filtersHeader = new GUIContent("Filters", "Settings that control which objects should be rendered.");
  34. public static GUIContent renderHeader = new GUIContent("Overrides", "Different parts of the rendering that you can choose to override.");
  35. //Filters
  36. public static GUIContent renderQueueFilter = new GUIContent("Queue", "Only render objects in the selected render queue range.");
  37. public static GUIContent layerMask = new GUIContent("Layer Mask", "Only render objects in a layer that match the given layer mask.");
  38. public static GUIContent shaderPassFilter = new GUIContent("LightMode Tags", "Controls which shader passes to render by filtering by LightMode tag.");
  39. //Render Options
  40. public static GUIContent overrideMaterial = new GUIContent("Material", "Choose an override material, every renderer will be rendered with this material.");
  41. public static GUIContent overrideMaterialPass = new GUIContent("Pass Index", "The pass index for the override material to use.");
  42. public static GUIContent overrideShader = new GUIContent("Shader", "Choose an override shader, every renderer will be renderered with this shader and it's current material properties");
  43. public static GUIContent overrideShaderPass = new GUIContent("Pass Index", "The pass index for the override shader to use.");
  44. public static GUIContent overrideMode = new GUIContent("Override Mode", "Choose the material override mode. Material: override the material and all properties. Shader: override the shader and maintain current properties.");
  45. //Depth Settings
  46. public static GUIContent overrideDepth = new GUIContent("Depth", "Select this option to specify how this Renderer Feature affects or uses the values in the Depth buffer.");
  47. public static GUIContent writeDepth = new GUIContent("Write Depth", "Choose to write depth to the screen.");
  48. public static GUIContent depthState = new GUIContent("Depth Test", "Choose a new depth test function.");
  49. //Camera Settings
  50. public static GUIContent overrideCamera = new GUIContent("Camera", "Override camera matrices. Toggling this setting will make camera use perspective projection.");
  51. public static GUIContent cameraFOV = new GUIContent("Field Of View", "The camera's view angle measured in degrees along vertical axis.");
  52. public static GUIContent positionOffset = new GUIContent("Position Offset", "Position offset to apply to the original camera's position.");
  53. public static GUIContent restoreCamera = new GUIContent("Restore", "Restore to the original camera matrices after the execution of the render passes added by this feature.");
  54. }
  55. //Headers and layout
  56. private HeaderBool m_FiltersFoldout;
  57. private int m_FilterLines = 3;
  58. private HeaderBool m_RenderFoldout;
  59. private int m_MaterialLines = 2;
  60. private int m_DepthLines = 3;
  61. private int m_CameraLines = 4;
  62. // Serialized Properties
  63. private SerializedProperty m_Callback;
  64. private SerializedProperty m_PassTag;
  65. //Filter props
  66. private SerializedProperty m_FilterSettings;
  67. private SerializedProperty m_RenderQueue;
  68. private SerializedProperty m_LayerMask;
  69. private SerializedProperty m_ShaderPasses;
  70. //Render props
  71. private SerializedProperty m_OverrideMaterial;
  72. private SerializedProperty m_OverrideMaterialPass;
  73. private SerializedProperty m_OverrideShader;
  74. private SerializedProperty m_OverrideShaderPass;
  75. private SerializedProperty m_OverrideMode;
  76. //Depth props
  77. private SerializedProperty m_OverrideDepth;
  78. private SerializedProperty m_WriteDepth;
  79. private SerializedProperty m_DepthState;
  80. //Stencil props
  81. private SerializedProperty m_StencilSettings;
  82. //Caemra props
  83. private SerializedProperty m_CameraSettings;
  84. private SerializedProperty m_OverrideCamera;
  85. private SerializedProperty m_FOV;
  86. private SerializedProperty m_CameraOffset;
  87. private SerializedProperty m_RestoreCamera;
  88. private List<SerializedObject> m_properties = new List<SerializedObject>();
  89. static bool FilterRenderPassEvent(int evt) =>
  90. // Return all events higher or equal than before rendering prepasses
  91. evt >= (int)RenderPassEvent.BeforeRenderingPrePasses &&
  92. // filter obsolete events
  93. typeof(RenderPassEvent).GetField(Enum.GetName(typeof(RenderPassEvent), evt))?.GetCustomAttribute(typeof(ObsoleteAttribute)) == null;
  94. // Return all render pass event names that match filterRenderPassEvent
  95. private GUIContent[] m_EventOptionNames = Enum.GetValues(typeof(RenderPassEvent)).Cast<int>()
  96. .Where(FilterRenderPassEvent)
  97. .Select(x => new GUIContent(Enum.GetName(typeof(RenderPassEvent), x))).ToArray();
  98. // Return all render pass event options that match filterRenderPassEvent
  99. private int[] m_EventOptionValues = Enum.GetValues(typeof(RenderPassEvent)).Cast<int>()
  100. .Where(FilterRenderPassEvent).ToArray();
  101. private void Init(SerializedProperty property)
  102. {
  103. //Header bools
  104. var key = $"{this.ToString().Split('.').Last()}.{property.serializedObject.targetObject.name}";
  105. m_FiltersFoldout = new HeaderBool($"{key}.FiltersFoldout", true);
  106. m_RenderFoldout = new HeaderBool($"{key}.RenderFoldout");
  107. m_Callback = property.FindPropertyRelative("Event");
  108. m_PassTag = property.FindPropertyRelative("passTag");
  109. //Filter props
  110. m_FilterSettings = property.FindPropertyRelative("filterSettings");
  111. m_RenderQueue = m_FilterSettings.FindPropertyRelative("RenderQueueType");
  112. m_LayerMask = m_FilterSettings.FindPropertyRelative("LayerMask");
  113. m_ShaderPasses = m_FilterSettings.FindPropertyRelative("PassNames");
  114. //Render options
  115. m_OverrideMaterial = property.FindPropertyRelative("overrideMaterial");
  116. m_OverrideMaterialPass = property.FindPropertyRelative("overrideMaterialPassIndex");
  117. m_OverrideShader = property.FindPropertyRelative("overrideShader");
  118. m_OverrideShaderPass = property.FindPropertyRelative("overrideShaderPassIndex");
  119. m_OverrideMode = property.FindPropertyRelative("overrideMode");
  120. //Depth props
  121. m_OverrideDepth = property.FindPropertyRelative("overrideDepthState");
  122. m_WriteDepth = property.FindPropertyRelative("enableWrite");
  123. m_DepthState = property.FindPropertyRelative("depthCompareFunction");
  124. //Stencil
  125. m_StencilSettings = property.FindPropertyRelative("stencilSettings");
  126. //Camera
  127. m_CameraSettings = property.FindPropertyRelative("cameraSettings");
  128. m_OverrideCamera = m_CameraSettings.FindPropertyRelative("overrideCamera");
  129. m_FOV = m_CameraSettings.FindPropertyRelative("cameraFieldOfView");
  130. m_CameraOffset = m_CameraSettings.FindPropertyRelative("offset");
  131. m_RestoreCamera = m_CameraSettings.FindPropertyRelative("restoreCamera");
  132. m_properties.Add(property.serializedObject);
  133. }
  134. public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
  135. {
  136. rect.height = EditorGUIUtility.singleLineHeight;
  137. EditorGUI.BeginChangeCheck();
  138. EditorGUI.BeginProperty(rect, label, property);
  139. if (!m_properties.Contains(property.serializedObject))
  140. {
  141. Init(property);
  142. }
  143. var passName = property.serializedObject.FindProperty("m_Name").stringValue;
  144. if (passName != m_PassTag.stringValue)
  145. {
  146. m_PassTag.stringValue = passName;
  147. property.serializedObject.ApplyModifiedProperties();
  148. }
  149. //Forward Callbacks
  150. EditorGUI.BeginChangeCheck();
  151. int selectedValue = EditorGUI.IntPopup(rect, Styles.callback, m_Callback.intValue, m_EventOptionNames, m_EventOptionValues);
  152. if (EditorGUI.EndChangeCheck())
  153. m_Callback.intValue = selectedValue;
  154. rect.y += Styles.defaultLineSpace;
  155. DoFilters(ref rect);
  156. m_RenderFoldout.value = EditorGUI.Foldout(rect, m_RenderFoldout.value, Styles.renderHeader, true);
  157. SaveHeaderBool(m_RenderFoldout);
  158. rect.y += Styles.defaultLineSpace;
  159. if (m_RenderFoldout.value)
  160. {
  161. EditorGUI.indentLevel++;
  162. //Override material
  163. DoMaterialOverride(ref rect);
  164. rect.y += Styles.defaultLineSpace;
  165. //Override depth
  166. DoDepthOverride(ref rect);
  167. rect.y += Styles.defaultLineSpace;
  168. //Override stencil
  169. EditorGUI.PropertyField(rect, m_StencilSettings);
  170. rect.y += EditorGUI.GetPropertyHeight(m_StencilSettings);
  171. //Override camera
  172. DoCameraOverride(ref rect);
  173. rect.y += Styles.defaultLineSpace;
  174. EditorGUI.indentLevel--;
  175. }
  176. EditorGUI.EndProperty();
  177. if (EditorGUI.EndChangeCheck())
  178. property.serializedObject.ApplyModifiedProperties();
  179. }
  180. void DoFilters(ref Rect rect)
  181. {
  182. m_FiltersFoldout.value = EditorGUI.Foldout(rect, m_FiltersFoldout.value, Styles.filtersHeader, true);
  183. SaveHeaderBool(m_FiltersFoldout);
  184. rect.y += Styles.defaultLineSpace;
  185. if (m_FiltersFoldout.value)
  186. {
  187. EditorGUI.indentLevel++;
  188. //Render queue filter
  189. EditorGUI.PropertyField(rect, m_RenderQueue, Styles.renderQueueFilter);
  190. rect.y += Styles.defaultLineSpace;
  191. //Layer mask
  192. EditorGUI.PropertyField(rect, m_LayerMask, Styles.layerMask);
  193. rect.y += Styles.defaultLineSpace;
  194. //Shader pass list
  195. EditorGUI.PropertyField(rect, m_ShaderPasses, Styles.shaderPassFilter, true);
  196. rect.y += EditorGUI.GetPropertyHeight(m_ShaderPasses);
  197. EditorGUI.indentLevel--;
  198. }
  199. }
  200. void DoMaterialOverride(ref Rect rect)
  201. {
  202. EditorGUI.PropertyField(rect, m_OverrideMode, Styles.overrideMode);
  203. EditorGUI.indentLevel++;
  204. switch (m_OverrideMode.intValue)
  205. {
  206. case (int)RenderObjects.RenderObjectsSettings.OverrideMaterialMode.None:
  207. m_MaterialLines = 1;
  208. break;
  209. case (int)RenderObjects.RenderObjectsSettings.OverrideMaterialMode.Material:
  210. m_MaterialLines = 3;
  211. rect.y += Styles.defaultLineSpace;
  212. EditorGUI.PropertyField(rect, m_OverrideMaterial, Styles.overrideMaterial);
  213. rect.y += Styles.defaultLineSpace;
  214. EditorGUI.BeginChangeCheck();
  215. EditorGUI.PropertyField(rect, m_OverrideMaterialPass, Styles.overrideMaterialPass);
  216. if (EditorGUI.EndChangeCheck())
  217. m_OverrideMaterialPass.intValue = Mathf.Max(0, m_OverrideMaterialPass.intValue);
  218. break;
  219. case (int)RenderObjects.RenderObjectsSettings.OverrideMaterialMode.Shader:
  220. m_MaterialLines = 3;
  221. rect.y += Styles.defaultLineSpace;
  222. EditorGUI.PropertyField(rect, m_OverrideShader, Styles.overrideShader);
  223. rect.y += Styles.defaultLineSpace;
  224. EditorGUI.BeginChangeCheck();
  225. EditorGUI.PropertyField(rect, m_OverrideShaderPass, Styles.overrideShaderPass);
  226. if (EditorGUI.EndChangeCheck())
  227. m_OverrideShaderPass.intValue = Mathf.Max(0, m_OverrideShaderPass.intValue);
  228. break;
  229. }
  230. EditorGUI.indentLevel--;
  231. }
  232. void DoDepthOverride(ref Rect rect)
  233. {
  234. EditorGUI.PropertyField(rect, m_OverrideDepth, Styles.overrideDepth);
  235. if (m_OverrideDepth.boolValue)
  236. {
  237. rect.y += Styles.defaultLineSpace;
  238. EditorGUI.indentLevel++;
  239. //Write depth
  240. EditorGUI.PropertyField(rect, m_WriteDepth, Styles.writeDepth);
  241. rect.y += Styles.defaultLineSpace;
  242. //Depth testing options
  243. EditorGUI.PropertyField(rect, m_DepthState, Styles.depthState);
  244. EditorGUI.indentLevel--;
  245. }
  246. }
  247. void DoCameraOverride(ref Rect rect)
  248. {
  249. EditorGUI.PropertyField(rect, m_OverrideCamera, Styles.overrideCamera);
  250. if (m_OverrideCamera.boolValue)
  251. {
  252. rect.y += Styles.defaultLineSpace;
  253. EditorGUI.indentLevel++;
  254. //FOV
  255. EditorGUI.Slider(rect, m_FOV, 4f, 179f, Styles.cameraFOV);
  256. rect.y += Styles.defaultLineSpace;
  257. //Offset vector
  258. var offset = m_CameraOffset.vector4Value;
  259. EditorGUI.BeginChangeCheck();
  260. var newOffset = EditorGUI.Vector3Field(rect, Styles.positionOffset, new Vector3(offset.x, offset.y, offset.z));
  261. if (EditorGUI.EndChangeCheck())
  262. m_CameraOffset.vector4Value = new Vector4(newOffset.x, newOffset.y, newOffset.z, 1f);
  263. rect.y += Styles.defaultLineSpace;
  264. //Restore prev camera projections
  265. EditorGUI.PropertyField(rect, m_RestoreCamera, Styles.restoreCamera);
  266. rect.y += Styles.defaultLineSpace;
  267. EditorGUI.indentLevel--;
  268. }
  269. }
  270. public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
  271. {
  272. float height = Styles.defaultLineSpace;
  273. Init(property);
  274. height += Styles.defaultLineSpace * (m_FiltersFoldout.value ? m_FilterLines : 1);
  275. height += m_FiltersFoldout.value ? EditorGUI.GetPropertyHeight(m_ShaderPasses) : 0;
  276. height += Styles.defaultLineSpace; // add line for overrides dropdown
  277. if (m_RenderFoldout.value)
  278. {
  279. height += Styles.defaultLineSpace * m_MaterialLines;
  280. height += Styles.defaultLineSpace * (m_OverrideDepth.boolValue ? m_DepthLines : 1);
  281. height += EditorGUI.GetPropertyHeight(m_StencilSettings);
  282. height += Styles.defaultLineSpace * (m_OverrideCamera.boolValue ? m_CameraLines : 1);
  283. }
  284. return height;
  285. }
  286. private void SaveHeaderBool(HeaderBool boolObj)
  287. {
  288. EditorPrefs.SetBool(boolObj.key, boolObj.value);
  289. }
  290. class HeaderBool
  291. {
  292. public string key;
  293. public bool value;
  294. public HeaderBool(string _key, bool _default = false)
  295. {
  296. key = _key;
  297. if (EditorPrefs.HasKey(key))
  298. value = EditorPrefs.GetBool(key);
  299. else
  300. value = _default;
  301. EditorPrefs.SetBool(key, value);
  302. }
  303. }
  304. }
  305. }