Files
Shopping_UnityVR/Packages/com.baddog.rendering.arealight/Editor/AreaLightShadowSettingsDrawer.cs
2026-04-16 04:58:10 +09:00

137 lines
5.7 KiB
C#

using UnityEngine;
using UnityEditor;
namespace BadDog.Rendering.AreaLight
{
/// <summary>
/// Custom property drawer for AreaLightShadowSettings
/// </summary>
[CustomPropertyDrawer(typeof(AreaLightShadowSettings))]
public class AreaLightShadowSettingsDrawer : PropertyDrawer
{
private SerializedProperty m_ShadowAtlasResolution;
private SerializedProperty m_MaxShadowCastingLights;
private SerializedProperty m_ShadowFilter;
private SerializedProperty m_PcssShadowSoftness;
private SerializedProperty m_PcssBlockerSampleCount;
private SerializedProperty m_PcssFilterSampleCount;
private string m_CachedPropertyPath;
private void FindProperties(SerializedProperty property)
{
string currentPath = property.propertyPath;
if (m_CachedPropertyPath != currentPath)
{
m_ShadowAtlasResolution = property.FindPropertyRelative("shadowAtlasResolution");
m_MaxShadowCastingLights = property.FindPropertyRelative("maxShadowCastingLights");
m_ShadowFilter = property.FindPropertyRelative("shadowFilter");
m_PcssShadowSoftness = property.FindPropertyRelative("pcssShadowSoftness");
m_PcssBlockerSampleCount = property.FindPropertyRelative("pcssBlockerSampleCount");
m_PcssFilterSampleCount = property.FindPropertyRelative("pcssFilterSampleCount");
m_CachedPropertyPath = currentPath;
}
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
FindProperties(property);
EditorGUI.BeginProperty(position, label, property);
Rect foldoutRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight);
property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, label, true);
if (!property.isExpanded)
{
EditorGUI.EndProperty();
return;
}
EditorGUI.indentLevel++;
float yOffset = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
DrawProperty(m_ShadowAtlasResolution, ref yOffset, position);
DrawProperty(m_MaxShadowCastingLights, ref yOffset, position);
Rect shadowFilterRect = new Rect(position.x, position.y + yOffset, position.width, EditorGUIUtility.singleLineHeight);
EditorGUI.PropertyField(shadowFilterRect, m_ShadowFilter, new GUIContent("Shadow Filter"));
yOffset += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
if (m_ShadowFilter != null)
{
AreaLightShadowSettings.BGAreaLightShadowMode shadowFilterMode =
(AreaLightShadowSettings.BGAreaLightShadowMode)m_ShadowFilter.enumValueIndex;
if (shadowFilterMode == AreaLightShadowSettings.BGAreaLightShadowMode.PCSS)
{
Rect headerRect = new Rect(position.x, position.y + yOffset, position.width, EditorGUIUtility.singleLineHeight);
EditorGUI.LabelField(headerRect, "PCSS", EditorStyles.boldLabel);
yOffset += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
DrawProperty(m_PcssShadowSoftness, ref yOffset, position);
DrawProperty(m_PcssBlockerSampleCount, ref yOffset, position);
DrawProperty(m_PcssFilterSampleCount, ref yOffset, position);
}
}
EditorGUI.indentLevel--;
EditorGUI.EndProperty();
}
private void DrawProperty(SerializedProperty prop, ref float yOffset, Rect position)
{
if (prop != null)
{
Rect rect = new Rect(position.x, position.y + yOffset, position.width, EditorGUI.GetPropertyHeight(prop));
EditorGUI.PropertyField(rect, prop, true);
yOffset += EditorGUI.GetPropertyHeight(prop) + EditorGUIUtility.standardVerticalSpacing;
}
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
float height = EditorGUIUtility.singleLineHeight;
if (!property.isExpanded)
{
return height;
}
FindProperties(property);
height += GetPropertyHeight(m_ShadowAtlasResolution);
height += GetPropertyHeight(m_MaxShadowCastingLights);
if (m_ShadowFilter != null)
{
height += EditorGUI.GetPropertyHeight(m_ShadowFilter) + EditorGUIUtility.standardVerticalSpacing;
AreaLightShadowSettings.BGAreaLightShadowMode shadowFilterMode =
(AreaLightShadowSettings.BGAreaLightShadowMode)m_ShadowFilter.enumValueIndex;
if (shadowFilterMode == AreaLightShadowSettings.BGAreaLightShadowMode.PCSS)
{
height += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
height += GetPropertyHeight(m_PcssShadowSoftness);
height += GetPropertyHeight(m_PcssBlockerSampleCount);
height += GetPropertyHeight(m_PcssFilterSampleCount);
}
}
return height;
}
private float GetPropertyHeight(SerializedProperty prop)
{
if (prop != null)
{
return EditorGUI.GetPropertyHeight(prop) + EditorGUIUtility.standardVerticalSpacing;
}
return 0f;
}
}
}