ShadowsMidtonesHighlightsEditor.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.Universal;
  4. namespace UnityEditor.Rendering.Universal
  5. {
  6. // TODO: handle retina / EditorGUIUtility.pixelsPerPoint
  7. [VolumeComponentEditor(typeof(ShadowsMidtonesHighlights))]
  8. sealed class ShadowsMidtonesHighlightsEditor : VolumeComponentEditor
  9. {
  10. SerializedDataParameter m_Shadows;
  11. SerializedDataParameter m_Midtones;
  12. SerializedDataParameter m_Highlights;
  13. SerializedDataParameter m_ShadowsStart;
  14. SerializedDataParameter m_ShadowsEnd;
  15. SerializedDataParameter m_HighlightsStart;
  16. SerializedDataParameter m_HighlightsEnd;
  17. readonly TrackballUIDrawer m_TrackballUIDrawer = new TrackballUIDrawer();
  18. // Curve drawing utilities
  19. Rect m_CurveRect;
  20. Material m_Material;
  21. RenderTexture m_CurveTex;
  22. public override void OnEnable()
  23. {
  24. var o = new PropertyFetcher<ShadowsMidtonesHighlights>(serializedObject);
  25. m_Shadows = Unpack(o.Find(x => x.shadows));
  26. m_Midtones = Unpack(o.Find(x => x.midtones));
  27. m_Highlights = Unpack(o.Find(x => x.highlights));
  28. m_ShadowsStart = Unpack(o.Find(x => x.shadowsStart));
  29. m_ShadowsEnd = Unpack(o.Find(x => x.shadowsEnd));
  30. m_HighlightsStart = Unpack(o.Find(x => x.highlightsStart));
  31. m_HighlightsEnd = Unpack(o.Find(x => x.highlightsEnd));
  32. m_Material = new Material(Shader.Find("Hidden/Universal Render Pipeline/Editor/Shadows Midtones Highlights Curve"));
  33. }
  34. public override void OnInspectorGUI()
  35. {
  36. if (UniversalRenderPipeline.asset?.postProcessingFeatureSet == PostProcessingFeatureSet.PostProcessingV2)
  37. {
  38. EditorGUILayout.HelpBox(UniversalRenderPipelineAssetEditor.Styles.postProcessingGlobalWarning, MessageType.Warning);
  39. return;
  40. }
  41. using (new EditorGUILayout.HorizontalScope())
  42. {
  43. m_TrackballUIDrawer.OnGUI(m_Shadows.value, m_Shadows.overrideState, EditorGUIUtility.TrTextContent("Shadows"), GetWheelValue);
  44. GUILayout.Space(4f);
  45. m_TrackballUIDrawer.OnGUI(m_Midtones.value, m_Midtones.overrideState, EditorGUIUtility.TrTextContent("Midtones"), GetWheelValue);
  46. GUILayout.Space(4f);
  47. m_TrackballUIDrawer.OnGUI(m_Highlights.value, m_Highlights.overrideState, EditorGUIUtility.TrTextContent("Highlights"), GetWheelValue);
  48. }
  49. EditorGUILayout.Space();
  50. // Reserve GUI space
  51. using (new GUILayout.HorizontalScope())
  52. {
  53. GUILayout.Space(EditorGUI.indentLevel * 15f);
  54. m_CurveRect = GUILayoutUtility.GetRect(128, 80);
  55. }
  56. if (Event.current.type == EventType.Repaint)
  57. {
  58. float alpha = GUI.enabled ? 1f : 0.4f;
  59. var limits = new Vector4(m_ShadowsStart.value.floatValue, m_ShadowsEnd.value.floatValue, m_HighlightsStart.value.floatValue, m_HighlightsEnd.value.floatValue);
  60. m_Material.SetVector("_ShaHiLimits", limits);
  61. m_Material.SetVector("_Variants", new Vector4(alpha, Mathf.Max(m_HighlightsEnd.value.floatValue, 1f), 0f, 0f));
  62. CheckCurveRT((int)m_CurveRect.width, (int)m_CurveRect.height);
  63. var oldRt = RenderTexture.active;
  64. Graphics.Blit(null, m_CurveTex, m_Material, EditorGUIUtility.isProSkin ? 0 : 1);
  65. RenderTexture.active = oldRt;
  66. GUI.DrawTexture(m_CurveRect, m_CurveTex);
  67. Handles.DrawSolidRectangleWithOutline(m_CurveRect, Color.clear, Color.white * 0.4f);
  68. }
  69. EditorGUILayout.Space();
  70. EditorGUILayout.LabelField("Shadow Limits", EditorStyles.miniLabel);
  71. PropertyField(m_ShadowsStart, EditorGUIUtility.TrTextContent("Start"));
  72. m_ShadowsStart.value.floatValue = Mathf.Min(m_ShadowsStart.value.floatValue, m_ShadowsEnd.value.floatValue);
  73. PropertyField(m_ShadowsEnd, EditorGUIUtility.TrTextContent("End"));
  74. m_ShadowsEnd.value.floatValue = Mathf.Max(m_ShadowsStart.value.floatValue, m_ShadowsEnd.value.floatValue);
  75. EditorGUILayout.Space();
  76. EditorGUILayout.LabelField("Highlight Limits", EditorStyles.miniLabel);
  77. PropertyField(m_HighlightsStart, EditorGUIUtility.TrTextContent("Start"));
  78. m_HighlightsStart.value.floatValue = Mathf.Min(m_HighlightsStart.value.floatValue, m_HighlightsEnd.value.floatValue);
  79. PropertyField(m_HighlightsEnd, EditorGUIUtility.TrTextContent("End"));
  80. m_HighlightsEnd.value.floatValue = Mathf.Max(m_HighlightsStart.value.floatValue, m_HighlightsEnd.value.floatValue);
  81. }
  82. void CheckCurveRT(int width, int height)
  83. {
  84. if (m_CurveTex == null || !m_CurveTex.IsCreated() || m_CurveTex.width != width || m_CurveTex.height != height)
  85. {
  86. CoreUtils.Destroy(m_CurveTex);
  87. m_CurveTex = new RenderTexture(width, height, 0, RenderTextureFormat.ARGB32);
  88. m_CurveTex.hideFlags = HideFlags.HideAndDontSave;
  89. }
  90. }
  91. static Vector3 GetWheelValue(Vector4 v)
  92. {
  93. float w = v.w * (Mathf.Sign(v.w) < 0f ? 1f : 4f);
  94. return new Vector3(
  95. Mathf.Max(v.x + w, 0f),
  96. Mathf.Max(v.y + w, 0f),
  97. Mathf.Max(v.z + w, 0f)
  98. );
  99. }
  100. }
  101. }