90 lines
4.2 KiB
C#
90 lines
4.2 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.Collections.Generic;
|
|
using UnityEditorInternal;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
using System.Linq;
|
|
using System;
|
|
|
|
namespace UnityEditor.Rendering.HighDefinition
|
|
{
|
|
/// <summary>
|
|
/// FullScreen custom pass drawer
|
|
/// </summary>
|
|
[CustomPassDrawerAttribute(typeof(FullScreenCustomPass))]
|
|
class FullScreenCustomPassDrawer : CustomPassDrawer
|
|
{
|
|
private class Styles
|
|
{
|
|
public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
|
public static float helpBoxHeight = EditorGUIUtility.singleLineHeight * 2;
|
|
|
|
public static GUIContent fullScreenPassMaterial = new GUIContent("FullScreen Material", "FullScreen Material used for the full screen DrawProcedural.");
|
|
public static GUIContent materialPassName = new GUIContent("Pass Name", "The shader pass to use for your fullscreen pass.");
|
|
public static GUIContent fetchColorBuffer = new GUIContent("Fetch Color Buffer", "Tick this if your effect sample/fetch the camera color buffer");
|
|
|
|
public readonly static string writeAndFetchColorBufferWarning = "Fetching and Writing to the camera color buffer at the same time is not supported on most platforms.";
|
|
}
|
|
|
|
// Fullscreen pass
|
|
SerializedProperty m_FullScreenPassMaterial;
|
|
SerializedProperty m_MaterialPassName;
|
|
SerializedProperty m_FetchColorBuffer;
|
|
SerializedProperty m_TargetColorBuffer;
|
|
|
|
CustomPass.TargetBuffer targetColorBuffer => (CustomPass.TargetBuffer)m_TargetColorBuffer.intValue;
|
|
|
|
protected override void Initialize(SerializedProperty customPass)
|
|
{
|
|
m_FullScreenPassMaterial = customPass.FindPropertyRelative("fullscreenPassMaterial");
|
|
m_MaterialPassName = customPass.FindPropertyRelative("materialPassName");
|
|
m_FetchColorBuffer = customPass.FindPropertyRelative("fetchColorBuffer");
|
|
m_TargetColorBuffer = customPass.FindPropertyRelative("targetColorBuffer");
|
|
}
|
|
|
|
protected override void DoPassGUI(SerializedProperty customPass, Rect rect)
|
|
{
|
|
EditorGUI.PropertyField(rect, m_FetchColorBuffer, Styles.fetchColorBuffer);
|
|
rect.y += Styles.defaultLineSpace;
|
|
|
|
if (m_FetchColorBuffer.boolValue && targetColorBuffer == CustomPass.TargetBuffer.Camera)
|
|
{
|
|
// We add a warning to prevent fetching and writing to the same render target
|
|
Rect helpBoxRect = rect;
|
|
helpBoxRect.height = Styles.helpBoxHeight;
|
|
EditorGUI.HelpBox(helpBoxRect, Styles.writeAndFetchColorBufferWarning, MessageType.Warning);
|
|
rect.y += Styles.helpBoxHeight;
|
|
}
|
|
|
|
EditorGUI.PropertyField(rect, m_FullScreenPassMaterial, Styles.fullScreenPassMaterial);
|
|
rect.y += Styles.defaultLineSpace;
|
|
if (m_FullScreenPassMaterial.objectReferenceValue is Material mat)
|
|
{
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
EditorGUI.BeginProperty(rect, Styles.materialPassName, m_MaterialPassName);
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
int index = mat.FindPass(m_MaterialPassName.stringValue);
|
|
index = EditorGUI.IntPopup(rect, Styles.materialPassName, index, GetMaterialPassNames(mat), Enumerable.Range(0, mat.passCount).ToArray());
|
|
if (EditorGUI.EndChangeCheck())
|
|
m_MaterialPassName.stringValue = mat.GetPassName(index);
|
|
}
|
|
EditorGUI.EndProperty();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override float GetPassHeight(SerializedProperty customPass)
|
|
{
|
|
int lineCount = (m_FullScreenPassMaterial.objectReferenceValue is Material ? 3 : 2);
|
|
int height = (int)(Styles.defaultLineSpace * lineCount);
|
|
|
|
height += (m_FetchColorBuffer.boolValue && targetColorBuffer == CustomPass.TargetBuffer.Camera) ? (int)Styles.helpBoxHeight : 0;
|
|
|
|
return height;
|
|
}
|
|
}
|
|
}
|