You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.0 KiB
117 lines
4.0 KiB
using System.Collections.Generic; |
|
|
|
namespace UnityEngine.Rendering.Universal |
|
{ |
|
internal static class Light2DManager |
|
{ |
|
private static SortingLayer[] s_SortingLayers; |
|
|
|
public static List<Light2D> lights { get; } = new List<Light2D>(); |
|
|
|
// Called during OnEnable |
|
public static void RegisterLight(Light2D light) |
|
{ |
|
Debug.Assert(!lights.Contains(light)); |
|
lights.Add(light); |
|
ErrorIfDuplicateGlobalLight(light); |
|
} |
|
|
|
// Called during OnEnable |
|
public static void DeregisterLight(Light2D light) |
|
{ |
|
Debug.Assert(lights.Contains(light)); |
|
lights.Remove(light); |
|
} |
|
|
|
public static void ErrorIfDuplicateGlobalLight(Light2D light) |
|
{ |
|
if (light.lightType != Light2D.LightType.Global) |
|
return; |
|
|
|
foreach (var sortingLayer in light.affectedSortingLayers) |
|
{ |
|
// should this really trigger at runtime? |
|
if (ContainsDuplicateGlobalLight(sortingLayer, light.blendStyleIndex)) |
|
Debug.LogError("More than one global light on layer " + SortingLayer.IDToName(sortingLayer) + " for light blend style index " + light.blendStyleIndex); |
|
} |
|
} |
|
|
|
public static bool GetGlobalColor(int sortingLayerIndex, int blendStyleIndex, out Color color) |
|
{ |
|
var foundGlobalColor = false; |
|
color = Color.black; |
|
|
|
// This should be rewritten to search only global lights |
|
foreach (var light in lights) |
|
{ |
|
if (light.lightType != Light2D.LightType.Global || |
|
light.blendStyleIndex != blendStyleIndex || |
|
!light.IsLitLayer(sortingLayerIndex)) |
|
continue; |
|
|
|
var inCurrentPrefabStage = true; |
|
#if UNITY_EDITOR |
|
// If we found the first global light in our prefab stage |
|
inCurrentPrefabStage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage()?.IsPartOfPrefabContents(light.gameObject) ?? true; |
|
#endif |
|
|
|
if (inCurrentPrefabStage) |
|
{ |
|
color = light.color * light.intensity; |
|
return true; |
|
} |
|
else |
|
{ |
|
if (!foundGlobalColor) |
|
{ |
|
color = light.color * light.intensity; |
|
foundGlobalColor = true; |
|
} |
|
} |
|
} |
|
|
|
return foundGlobalColor; |
|
} |
|
|
|
private static bool ContainsDuplicateGlobalLight(int sortingLayerIndex, int blendStyleIndex) |
|
{ |
|
var globalLightCount = 0; |
|
|
|
// This should be rewritten to search only global lights |
|
foreach (var light in lights) |
|
{ |
|
if (light.lightType == Light2D.LightType.Global && |
|
light.blendStyleIndex == blendStyleIndex && |
|
light.IsLitLayer(sortingLayerIndex)) |
|
{ |
|
#if UNITY_EDITOR |
|
// If we found the first global light in our prefab stage |
|
if (UnityEditor.SceneManagement.PrefabStageUtility.GetPrefabStage(light.gameObject) == UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage()) |
|
#endif |
|
{ |
|
if (globalLightCount > 0) |
|
return true; |
|
|
|
globalLightCount++; |
|
} |
|
} |
|
} |
|
|
|
return false; |
|
} |
|
|
|
public static SortingLayer[] GetCachedSortingLayer() |
|
{ |
|
if (s_SortingLayers is null) |
|
{ |
|
s_SortingLayers = SortingLayer.layers; |
|
} |
|
#if UNITY_EDITOR |
|
// we should fix. Make a non allocating version of this |
|
if (!Application.isPlaying) |
|
s_SortingLayers = SortingLayer.layers; |
|
#endif |
|
return s_SortingLayers; |
|
} |
|
} |
|
}
|
|
|