144 lines
4.8 KiB
C#
144 lines
4.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
|
|
namespace UnityEngine.Rendering.Universal
|
|
{
|
|
#if UNITY_EDITOR
|
|
[InitializeOnLoadAttribute]
|
|
#endif
|
|
internal class ShadowCasterGroup2DManager
|
|
{
|
|
static List<ShadowCasterGroup2D> s_ShadowCasterGroups = null;
|
|
|
|
public static List<ShadowCasterGroup2D> shadowCasterGroups { get { return s_ShadowCasterGroups; } }
|
|
|
|
|
|
#if UNITY_EDITOR
|
|
static ShadowCasterGroup2DManager()
|
|
{
|
|
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
|
|
}
|
|
|
|
private static void OnPlayModeStateChanged(PlayModeStateChange state)
|
|
{
|
|
if (s_ShadowCasterGroups != null && (state == PlayModeStateChange.ExitingEditMode || state == PlayModeStateChange.ExitingPlayMode))
|
|
s_ShadowCasterGroups.Clear();
|
|
}
|
|
|
|
#endif
|
|
|
|
public static void CacheValues()
|
|
{
|
|
if (shadowCasterGroups != null)
|
|
{
|
|
for (int i = 0; i < shadowCasterGroups.Count; i++)
|
|
{
|
|
if (shadowCasterGroups[i] != null)
|
|
shadowCasterGroups[i].CacheValues();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void AddShadowCasterGroupToList(ShadowCasterGroup2D shadowCaster, List<ShadowCasterGroup2D> list)
|
|
{
|
|
if (list.Contains(shadowCaster))
|
|
return;
|
|
|
|
int positionToInsert = 0;
|
|
for (positionToInsert = 0; positionToInsert < list.Count; positionToInsert++)
|
|
{
|
|
if (shadowCaster.m_Priority < list[positionToInsert].m_Priority)
|
|
break;
|
|
}
|
|
|
|
list.Insert(positionToInsert, shadowCaster);
|
|
}
|
|
|
|
public static void RemoveShadowCasterGroupFromList(ShadowCasterGroup2D shadowCaster, List<ShadowCasterGroup2D> list)
|
|
{
|
|
list.Remove(shadowCaster);
|
|
}
|
|
|
|
static CompositeShadowCaster2D FindTopMostCompositeShadowCaster(ShadowCaster2D shadowCaster)
|
|
{
|
|
CompositeShadowCaster2D retGroup = null;
|
|
|
|
Transform transformToCheck = shadowCaster.transform.parent;
|
|
while (transformToCheck != null)
|
|
{
|
|
CompositeShadowCaster2D currentGroup;
|
|
if (transformToCheck.TryGetComponent<CompositeShadowCaster2D>(out currentGroup))
|
|
retGroup = currentGroup;
|
|
|
|
transformToCheck = transformToCheck.parent;
|
|
}
|
|
|
|
return retGroup;
|
|
}
|
|
|
|
|
|
public static int GetRendereringPriority(ShadowCaster2D shadowCaster)
|
|
{
|
|
int sortingOrder = 0;
|
|
// This should take sorting groups into account, but doesn't as there isn't a way to do this at the moment.
|
|
Renderer renderer;
|
|
if (shadowCaster.TryGetComponent<Renderer>(out renderer))
|
|
sortingOrder = renderer.sortingOrder;
|
|
|
|
return sortingOrder;
|
|
}
|
|
|
|
public static bool AddToShadowCasterGroup(ShadowCaster2D shadowCaster, ref ShadowCasterGroup2D shadowCasterGroup, ref int priority)
|
|
{
|
|
ShadowCasterGroup2D newShadowCasterGroup = FindTopMostCompositeShadowCaster(shadowCaster) as ShadowCasterGroup2D;
|
|
int newPriority = 0;
|
|
if (newShadowCasterGroup == null)
|
|
{
|
|
newPriority = GetRendereringPriority(shadowCaster);
|
|
shadowCaster.TryGetComponent<ShadowCasterGroup2D>(out newShadowCasterGroup);
|
|
}
|
|
|
|
if (newShadowCasterGroup != null && (shadowCasterGroup != newShadowCasterGroup || priority != newPriority))
|
|
{
|
|
newShadowCasterGroup.RegisterShadowCaster2D(shadowCaster);
|
|
shadowCasterGroup = newShadowCasterGroup;
|
|
priority = newPriority;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static void RemoveFromShadowCasterGroup(ShadowCaster2D shadowCaster, ShadowCasterGroup2D shadowCasterGroup)
|
|
{
|
|
if (shadowCasterGroup != null)
|
|
shadowCasterGroup.UnregisterShadowCaster2D(shadowCaster);
|
|
|
|
if (shadowCasterGroup == shadowCaster)
|
|
RemoveGroup(shadowCasterGroup);
|
|
}
|
|
|
|
public static void AddGroup(ShadowCasterGroup2D group)
|
|
{
|
|
if (group == null)
|
|
return;
|
|
|
|
if (s_ShadowCasterGroups == null)
|
|
s_ShadowCasterGroups = new List<ShadowCasterGroup2D>();
|
|
|
|
AddShadowCasterGroupToList(group, s_ShadowCasterGroups);
|
|
}
|
|
|
|
public static void RemoveGroup(ShadowCasterGroup2D group)
|
|
{
|
|
if (group != null && s_ShadowCasterGroups != null)
|
|
RemoveShadowCasterGroupFromList(group, s_ShadowCasterGroups);
|
|
}
|
|
}
|
|
}
|