using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Rendering;
///
/// Custom editor for FullScreenPassRendererFeature class responsible for drawing unavailable by default properties
/// such as custom drop down items and additional properties.
///
[CustomEditor(typeof(FullScreenPassRendererFeature))]
public class FullScreenPassRendererFeatureEditor : Editor
{
private FullScreenPassRendererFeature m_AffectedFeature;
private EditorPrefBool m_ShowAdditionalProperties;
private int m_PassIndexToUse = 0;
///
/// A toggle that is responsible whether additional properties are shown.
/// This toggle also sets pass index to 0 when toggle's value changes.
///
public bool showAdditionalProperties
{
get => m_ShowAdditionalProperties.value;
set
{
if (value != m_ShowAdditionalProperties.value)
{
m_PassIndexToUse = 0;
}
m_ShowAdditionalProperties.value = value;
}
}
///
/// Implementation for a custom inspector
///
public override void OnInspectorGUI()
{
DrawPropertiesExcluding(serializedObject, "m_Script");
m_AffectedFeature = target as FullScreenPassRendererFeature;
if (showAdditionalProperties)
{
DrawAdditionalProperties();
}
m_AffectedFeature.passIndex = m_PassIndexToUse;
EditorUtility.SetDirty(target);
}
private void DrawAdditionalProperties()
{
List selectablePasses;
bool isMaterialValid = m_AffectedFeature.passMaterial != null;
selectablePasses = isMaterialValid ? GetPassIndexStringEntries(m_AffectedFeature) : new List() {"No material"};
// If material is invalid 0'th index is selected automatically, so it stays on "No material" entry
// It is invalid index, but FullScreenPassRendererFeature wont execute until material is valid
var choiceIndex = EditorGUILayout.Popup("Pass Index", m_AffectedFeature.passIndex, selectablePasses.ToArray());
m_PassIndexToUse = choiceIndex;
}
private List GetPassIndexStringEntries(FullScreenPassRendererFeature component)
{
List passIndexEntries = new List();
for (int i = 0; i < component.passMaterial.passCount; ++i)
{
// "Name of a pass (index)" - "PassAlpha (1)"
string entry = $"{component.passMaterial.GetPassName(i)} ({i})";
passIndexEntries.Add(entry);
}
return passIndexEntries;
}
}