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.

UniversalRenderPipelineAssetEditor.cs 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using UnityEditorInternal;
  2. using UnityEngine;
  3. using UnityEngine.Rendering.Universal;
  4. using Styles = UnityEditor.Rendering.Universal.UniversalRenderPipelineAssetUI.Styles;
  5. namespace UnityEditor.Rendering.Universal
  6. {
  7. /// <summary>
  8. /// Editor script for a <c>UniversalRenderPipelineAsset</c> class.
  9. /// </summary>
  10. [CustomEditor(typeof(UniversalRenderPipelineAsset)), CanEditMultipleObjects]
  11. public class UniversalRenderPipelineAssetEditor : Editor
  12. {
  13. SerializedProperty m_RendererDataProp;
  14. SerializedProperty m_DefaultRendererProp;
  15. internal ReorderableList rendererList => m_RendererDataList;
  16. ReorderableList m_RendererDataList;
  17. private SerializedUniversalRenderPipelineAsset m_SerializedURPAsset;
  18. /// <inheritdoc/>
  19. public override void OnInspectorGUI()
  20. {
  21. m_SerializedURPAsset.Update();
  22. UniversalRenderPipelineAssetUI.Inspector.Draw(m_SerializedURPAsset, this);
  23. m_SerializedURPAsset.Apply();
  24. }
  25. void OnEnable()
  26. {
  27. m_SerializedURPAsset = new SerializedUniversalRenderPipelineAsset(serializedObject);
  28. CreateRendererReorderableList();
  29. }
  30. void CreateRendererReorderableList()
  31. {
  32. m_RendererDataProp = serializedObject.FindProperty("m_RendererDataList");
  33. m_DefaultRendererProp = serializedObject.FindProperty("m_DefaultRendererIndex");
  34. m_RendererDataList = new ReorderableList(serializedObject, m_RendererDataProp, true, true, true, true)
  35. {
  36. drawElementCallback = OnDrawElement,
  37. drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, Styles.rendererHeaderText),
  38. onCanRemoveCallback = reorderableList => reorderableList.count > 1,
  39. onRemoveCallback = OnRemoveElement,
  40. onReorderCallbackWithDetails = (reorderableList, index, newIndex) => UpdateDefaultRendererValue(index, newIndex) // Need to update the default renderer index
  41. };
  42. }
  43. void OnRemoveElement(ReorderableList reorderableList)
  44. {
  45. bool shouldUpdateIndex = false;
  46. // Checking so that the user is not deleting the default renderer
  47. if (reorderableList.index != m_DefaultRendererProp.intValue)
  48. {
  49. // Need to add the undo to the removal of our assets here, for it to work properly.
  50. Undo.RecordObject(target, $"Deleting renderer at index {reorderableList.index}");
  51. shouldUpdateIndex = true;
  52. m_RendererDataProp.DeleteArrayElementAtIndex(reorderableList.index);
  53. }
  54. else
  55. {
  56. EditorUtility.DisplayDialog(Styles.rendererListDefaultMessage.text, Styles.rendererListDefaultMessage.tooltip, "Close");
  57. }
  58. if (shouldUpdateIndex)
  59. {
  60. UpdateDefaultRendererValue(reorderableList.index);
  61. }
  62. EditorUtility.SetDirty(target);
  63. }
  64. void OnDrawElement(Rect rect, int index, bool isActive, bool isFocused)
  65. {
  66. rect.y += 2;
  67. var indexRect = new Rect(rect.x, rect.y, 14, EditorGUIUtility.singleLineHeight);
  68. EditorGUI.LabelField(indexRect, index.ToString());
  69. using (var changeCheck = new EditorGUI.ChangeCheckScope())
  70. {
  71. var objectFieldWidth = rect.width - 110;
  72. var objRect = new Rect(rect.x + indexRect.width, rect.y, objectFieldWidth, EditorGUIUtility.singleLineHeight);
  73. EditorGUI.ObjectField(objRect, m_RendererDataProp.GetArrayElementAtIndex(index), GUIContent.none);
  74. if (changeCheck.changed)
  75. EditorUtility.SetDirty(target);
  76. }
  77. var isDefaultRenderer = index == m_DefaultRendererProp.intValue;
  78. using (new EditorGUI.DisabledScope(isDefaultRenderer))
  79. {
  80. var defaultButtonX = rect.width - 51;
  81. var defaultButtonRect = new Rect(defaultButtonX, rect.y, 86, EditorGUIUtility.singleLineHeight);
  82. if (GUI.Button(defaultButtonRect, !GUI.enabled ? Styles.rendererDefaultText : Styles.rendererSetDefaultText))
  83. {
  84. m_DefaultRendererProp.intValue = index;
  85. EditorUtility.SetDirty(target);
  86. }
  87. }
  88. // If object selector chose an object, assign it to the correct ScriptableRendererData slot.
  89. if (Event.current.commandName == "ObjectSelectorUpdated" && EditorGUIUtility.GetObjectPickerControlID() == index)
  90. {
  91. m_RendererDataProp.GetArrayElementAtIndex(index).objectReferenceValue = EditorGUIUtility.GetObjectPickerObject();
  92. }
  93. }
  94. void UpdateDefaultRendererValue(int index)
  95. {
  96. // If the index that is being removed is lower than the default renderer value,
  97. // the default prop value needs to be one lower.
  98. if (index < m_DefaultRendererProp.intValue)
  99. {
  100. m_DefaultRendererProp.intValue--;
  101. }
  102. }
  103. void UpdateDefaultRendererValue(int prevIndex, int newIndex)
  104. {
  105. // If we are moving the index that is the same as the default renderer we need to update that
  106. if (prevIndex == m_DefaultRendererProp.intValue)
  107. {
  108. m_DefaultRendererProp.intValue = newIndex;
  109. }
  110. // If newIndex is the same as default
  111. // then we need to know if newIndex is above or below the default index
  112. else if (newIndex == m_DefaultRendererProp.intValue)
  113. {
  114. m_DefaultRendererProp.intValue += prevIndex > newIndex ? 1 : -1;
  115. }
  116. // If the old index is lower than default renderer and
  117. // the new index is higher then we need to move the default renderer index one lower
  118. else if (prevIndex < m_DefaultRendererProp.intValue && newIndex > m_DefaultRendererProp.intValue)
  119. {
  120. m_DefaultRendererProp.intValue--;
  121. }
  122. else if (newIndex < m_DefaultRendererProp.intValue && prevIndex > m_DefaultRendererProp.intValue)
  123. {
  124. m_DefaultRendererProp.intValue++;
  125. }
  126. }
  127. }
  128. }