Skip to content

Commit 5c78f45

Browse files
svc-reach-platform-supportEvergreen
authored andcommitted
[Port] [6000.0] [UUM-109322][6000.3][URP 2D] Expose methods to add/remove sorting layers
1 parent 11567fc commit 5c78f45

File tree

4 files changed

+188
-2
lines changed

4 files changed

+188
-2
lines changed

Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using UnityEngine.Scripting.APIUpdating;
44
using UnityEngine.U2D;
55
using UnityEngine.Rendering.RenderGraphModule;
6+
using System.Collections.Generic;
67
#if UNITY_EDITOR
78
using System.Linq;
89
#endif
@@ -180,7 +181,6 @@ private enum ComponentVersions
180181
// We use Blue Channel of LightMesh's vertex color to indicate Slot Index.
181182
int m_BatchSlotIndex = 0;
182183
internal int batchSlotIndex { get { return m_BatchSlotIndex; } set { m_BatchSlotIndex = value; } }
183-
internal int[] affectedSortingLayers => m_ApplyToSortingLayers;
184184

185185
private int lightCookieSpriteInstanceID => lightCookieSprite?.GetInstanceID() ?? 0;
186186

@@ -338,6 +338,96 @@ public LightType lightType
338338
/// </summary>
339339
public bool renderVolumetricShadows => volumetricShadowsEnabled && shadowVolumeIntensity > 0;
340340

341+
/// <summary>
342+
/// Gets or sets the target sorting layers for the light. Contains an array of sorting layer IDs.
343+
/// </summary>
344+
public int[] targetSortingLayers
345+
{
346+
get => m_ApplyToSortingLayers;
347+
set
348+
{
349+
var layers = new List<int>();
350+
foreach (var layerID in value)
351+
{
352+
if (SortingLayer.IsValid(layerID))
353+
layers.Add(layerID);
354+
}
355+
m_ApplyToSortingLayers = layers.ToArray();
356+
}
357+
}
358+
359+
bool IsValidLayer(string name)
360+
{
361+
// Have this check as SortingLayer.NameToID returns 0 (default layer) if layer is not found
362+
foreach (var layer in Light2DManager.GetCachedSortingLayer())
363+
{
364+
if (layer.name == name)
365+
return true;
366+
}
367+
368+
return false;
369+
}
370+
371+
/// <summary>
372+
/// Adds a target sorting layer to the light.
373+
/// </summary>
374+
/// <param name="layerName">The sorting layer name to be added.</param>
375+
/// <returns>Returns true if the sorting layer is added. Returns false if the layer name is invalid or has already been added.</returns>
376+
public bool AddTargetSortingLayer(string layerName)
377+
{
378+
var layers = new List<int>(m_ApplyToSortingLayers);
379+
var id = SortingLayer.NameToID(layerName);
380+
381+
// Invalid or duplicate layerID
382+
if (!IsValidLayer(layerName) || layers.Contains(id))
383+
return false;
384+
385+
layers.Add(id);
386+
m_ApplyToSortingLayers = layers.ToArray();
387+
388+
return true;
389+
}
390+
391+
/// <summary>
392+
/// Adds a target sorting layer to the light.
393+
/// </summary>
394+
/// <param name="layerID">The sorting layer ID to be added.</param>
395+
/// <returns>Returns true if the sorting layer is added. Returns false if the layer ID is invalid or has already been added.</returns>
396+
public bool AddTargetSortingLayer(int layerID)
397+
{
398+
return AddTargetSortingLayer(SortingLayer.IDToName(layerID));
399+
}
400+
401+
/// <summary>
402+
/// Removes a target sorting layer from the light.
403+
/// </summary>
404+
/// <param name="layerName">The sorting layer name to be removed.</param>
405+
/// <returns>Returns true if the sorting layer is removed. Returns false if the layer name is invalid or doesn't exist.</returns>
406+
public bool RemoveTargetSortingLayer(string layerName)
407+
{
408+
var layers = new List<int>(m_ApplyToSortingLayers);
409+
var id = SortingLayer.NameToID(layerName);
410+
411+
// Invalid or layerID does not exist
412+
if (!IsValidLayer(layerName) || !layers.Contains(id))
413+
return false;
414+
415+
layers.Remove(id);
416+
m_ApplyToSortingLayers = layers.ToArray();
417+
418+
return true;
419+
}
420+
421+
/// <summary>
422+
/// Removes a target sorting layer from the light.
423+
/// </summary>
424+
/// <param name="layerID">The sorting layer ID to be removed.</param>
425+
/// <returns>Returns true if the sorting layer is removed. Returns false if the layer ID is invalid or doesn't exist.</returns>
426+
public bool RemoveTargetSortingLayer(int layerID)
427+
{
428+
return RemoveTargetSortingLayer(SortingLayer.IDToName(layerID));
429+
}
430+
341431
internal void MarkForUpdate()
342432
{
343433
forceUpdate = true;

Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2DManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static void ErrorIfDuplicateGlobalLight(Light2D light)
4242
if (light.lightType != Light2D.LightType.Global)
4343
return;
4444

45-
foreach (var sortingLayer in light.affectedSortingLayers)
45+
foreach (var sortingLayer in light.targetSortingLayers)
4646
{
4747
// should this really trigger at runtime?
4848
if (ContainsDuplicateGlobalLight(sortingLayer, light.blendStyleIndex))
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
using NUnit.Framework;
2+
using UnityEngine;
3+
using UnityEngine.Rendering.Universal;
4+
5+
[TestFixture]
6+
class Light2DTests
7+
{
8+
GameObject m_BaseObj;
9+
Light2D m_Light;
10+
11+
[SetUp]
12+
public void Setup()
13+
{
14+
m_BaseObj = new GameObject();
15+
m_Light = m_BaseObj.AddComponent<Light2D>();
16+
}
17+
18+
[TearDown]
19+
public void Cleanup()
20+
{
21+
Object.DestroyImmediate(m_BaseObj);
22+
}
23+
24+
[Test]
25+
public void TargetSortingLayer_Getter()
26+
{
27+
Assert.IsNotNull(m_Light.targetSortingLayers);
28+
Assert.IsNotEmpty(m_Light.targetSortingLayers);
29+
}
30+
31+
[Test]
32+
public void TargetSortingLayer_Setter()
33+
{
34+
// Empty
35+
m_Light.targetSortingLayers = new int[] { };
36+
Assert.IsEmpty(m_Light.targetSortingLayers);
37+
38+
// Add default layer
39+
m_Light.targetSortingLayers = new int[] { SortingLayer.NameToID("Default") };
40+
Assert.IsTrue(m_Light.targetSortingLayers.Length == 1);
41+
}
42+
43+
[Test]
44+
public void TargetSortingLayer_IsValid()
45+
{
46+
foreach (var layer in m_Light.targetSortingLayers)
47+
Assert.IsTrue(SortingLayer.IsValid(layer));
48+
}
49+
50+
[Test]
51+
public void TargetSortingLayer_AddValidLayer()
52+
{
53+
var layers = m_Light.targetSortingLayers;
54+
55+
m_Light.targetSortingLayers = new int[] { };
56+
57+
// Add back layers
58+
foreach (var layer in layers)
59+
Assert.IsTrue(m_Light.AddTargetSortingLayer(layer));
60+
61+
Assert.IsTrue(m_Light.targetSortingLayers.Length == layers.Length);
62+
}
63+
64+
[Test]
65+
public void TargetSortingLayer_AddInvalidLayer()
66+
{
67+
// Add an invalid layer returns false
68+
Assert.IsFalse(m_Light.AddTargetSortingLayer("Invalid"));
69+
// Add random layerID
70+
Assert.IsFalse(m_Light.AddTargetSortingLayer(234393945));
71+
72+
}
73+
74+
[Test]
75+
public void TargetSortingLayer_RemoveValidLayer()
76+
{
77+
var layers = m_Light.targetSortingLayers;
78+
79+
// Remove layers
80+
foreach (var layer in layers)
81+
Assert.IsTrue(m_Light.RemoveTargetSortingLayer(layer));
82+
83+
Assert.IsEmpty(m_Light.targetSortingLayers);
84+
}
85+
86+
[Test]
87+
public void TargetSortingLayer_RemoveInvalidLayer()
88+
{
89+
// Remove an invalid layer returns false
90+
Assert.IsFalse(m_Light.RemoveTargetSortingLayer("Invalid"));
91+
// Remove random layerID
92+
Assert.IsFalse(m_Light.AddTargetSortingLayer(234393945));
93+
}
94+
}

Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Test/Runtime/Light2DTests.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)