UnityGame/Library/PackageCache/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowCaster2DEditor.cs
2024-10-27 10:53:47 +03:00

140 lines
6.1 KiB
C#

using UnityEditor.EditorTools;
using UnityEditor.Rendering.Universal.Path2D;
using UnityEngine;
using UnityEngine.Rendering.Universal;
namespace UnityEditor.Rendering.Universal
{
internal class ShadowCasterPath : ScriptablePath
{
internal Bounds GetBounds()
{
ShadowCaster2D shadowCaster = (ShadowCaster2D)owner;
Renderer m_Renderer = shadowCaster.GetComponent<Renderer>();
if (m_Renderer != null)
{
return m_Renderer.bounds;
}
else
{
Collider2D collider = shadowCaster.GetComponent<Collider2D>();
if (collider != null)
return collider.bounds;
}
return new Bounds(shadowCaster.transform.position, shadowCaster.transform.lossyScale);
}
public override void SetDefaultShape()
{
Clear();
Bounds bounds = GetBounds();
AddPoint(new ControlPoint(bounds.min));
AddPoint(new ControlPoint(new Vector3(bounds.min.x, bounds.max.y)));
AddPoint(new ControlPoint(bounds.max));
AddPoint(new ControlPoint(new Vector3(bounds.max.x, bounds.min.y)));
base.SetDefaultShape();
}
}
[CustomEditor(typeof(ShadowCaster2D))]
[CanEditMultipleObjects]
internal class ShadowCaster2DEditor : PathComponentEditor<ShadowCasterPath>
{
[EditorTool("Edit Shadow Caster Shape", typeof(ShadowCaster2D))]
class ShadowCaster2DShadowCasterShapeTool : ShadowCaster2DShapeTool {};
private static class Styles
{
public static GUIContent shadowShape2DProvider = EditorGUIUtility.TrTextContent("Shadow Shape 2D Provider", "");
public static GUIContent castsShadows = EditorGUIUtility.TrTextContent("Casts Shadows", "Specifies if this renderer will cast shadows");
public static GUIContent castingSourcePrefixLabel = EditorGUIUtility.TrTextContent("Casting Source", "Specifies the source used for projected shadows");
public static GUIContent sortingLayerPrefixLabel = EditorGUIUtility.TrTextContent("Target Sorting Layers", "Apply shadows to the specified sorting layers.");
public static GUIContent shadowShapeTrim = EditorGUIUtility.TrTextContent("Trim Edge", "This contracts the edge of the shape given by the shape provider by the specified amount");
public static GUIContent alphaCutoff = EditorGUIUtility.TrTextContent("Alpha Cutoff", "Required for correct unshadowed sprite overlap.");
public static GUIContent castingOption = EditorGUIUtility.TrTextContent("Casting Option", "Specifies how to draw the shadow used with the ShadowCaster2D");
public static GUIContent castingSource = EditorGUIUtility.TrTextContent("Casting Source", "Specifies the source of the shape used for projected shadows");
}
SerializedProperty m_CastingOption;
SerializedProperty m_CastsShadows;
SerializedProperty m_CastingSource;
SerializedProperty m_ShadowMesh;
SerializedProperty m_TrimEdge;
SerializedProperty m_AlphaCutoff;
SerializedProperty m_ShadowShape2DProvider;
SortingLayerDropDown m_SortingLayerDropDown;
CastingSourceDropDown m_CastingSourceDropDown;
public void OnEnable()
{
m_CastingOption = serializedObject.FindProperty("m_CastingOption");
m_CastsShadows = serializedObject.FindProperty("m_CastsShadows");
m_CastingSource = serializedObject.FindProperty("m_ShadowCastingSource");
m_ShadowMesh = serializedObject.FindProperty("m_ShadowMesh");
m_AlphaCutoff = serializedObject.FindProperty("m_AlphaCutoff");
m_TrimEdge = m_ShadowMesh.FindPropertyRelative("m_TrimEdge");
m_ShadowShape2DProvider = serializedObject.FindProperty("m_ShadowShape2DProvider");
m_SortingLayerDropDown = new SortingLayerDropDown();
m_SortingLayerDropDown.OnEnable(serializedObject, "m_ApplyToSortingLayers");
m_CastingSourceDropDown = new CastingSourceDropDown();
}
public void ShadowCaster2DSceneGUI()
{
ShadowCaster2D shadowCaster = target as ShadowCaster2D;
Transform t = shadowCaster.transform;
shadowCaster.DrawPreviewOutline();
}
public void ShadowCaster2DInspectorGUI<T>() where T : ShadowCaster2DShapeTool
{
DoEditButton<T>(PathEditorToolContents.icon, "Edit Shape");
DoPathInspector<T>();
DoSnappingInspector<T>();
}
public void OnSceneGUI()
{
if (m_CastsShadows.boolValue)
ShadowCaster2DSceneGUI();
}
public override void OnInspectorGUI()
{
serializedObject.Update();
m_CastingSourceDropDown.OnCastingSource(serializedObject, targets, Styles.castingSourcePrefixLabel);
EditorGUILayout.PropertyField(m_CastingOption, Styles.castingOption);
m_SortingLayerDropDown.OnTargetSortingLayers(serializedObject, targets, Styles.sortingLayerPrefixLabel, null);
bool usingShapeProvider = m_CastingSource.intValue == (int)ShadowCaster2D.ShadowCastingSources.ShapeProvider;
if (usingShapeProvider)
{
EditorGUILayout.PropertyField(m_TrimEdge, Styles.shadowShapeTrim);
if (m_TrimEdge.floatValue < 0)
m_TrimEdge.floatValue = 0;
EditorGUILayout.PropertyField(m_AlphaCutoff, Styles.alphaCutoff);
}
if ((ShadowCaster2D.ShadowCastingSources)m_CastingSource.intValue == ShadowCaster2D.ShadowCastingSources.ShapeEditor)
ShadowCaster2DInspectorGUI<ShadowCaster2DShadowCasterShapeTool>();
else if (EditorToolManager.IsActiveTool<ShadowCaster2DShadowCasterShapeTool>())
ToolManager.RestorePreviousTool();
EditorGUILayout.PropertyField(m_ShadowShape2DProvider, Styles.shadowShape2DProvider, true);
serializedObject.ApplyModifiedProperties();
}
}
}