Skip to content

Commit 8979309

Browse files
alekseiunityEvergreen
authored andcommitted
Added custom light data shadow and light layer sync with the main light.
Fixes - Setting shadow rendering layer is not changing shadow when using “shadowRenderingLayers” in the script https://jira.unity3d.com/browse/UUM-28061 Added logic similar to UI. Where we replace base light component renderingLayerMask with either shadow or light layers. Which later used for shadow drawing.
1 parent 5a11e97 commit 8979309

File tree

3 files changed

+100
-6
lines changed

3 files changed

+100
-6
lines changed

Packages/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalLightData.cs

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,25 @@ public bool usePipelineSettings
108108
/// </summary>
109109
public static readonly int AdditionalLightsShadowDefaultCustomResolution = 128;
110110

111+
[NonSerialized] private Light m_Light;
112+
113+
/// <summary>
114+
/// Returns the cached light component associated with the game object that owns this light data.
115+
/// </summary>
116+
#if UNITY_EDITOR
117+
internal new Light light
118+
#else
119+
internal Light light
120+
#endif
121+
{
122+
get
123+
{
124+
if (!m_Light)
125+
TryGetComponent(out m_Light);
126+
return m_Light;
127+
}
128+
}
129+
111130
/// <summary>
112131
/// The minimum shadow resolution for additional lights.
113132
/// </summary>
@@ -146,8 +165,18 @@ public LightLayerEnum lightLayerMask
146165
/// </summary>
147166
public uint renderingLayers
148167
{
149-
get { return m_RenderingLayers; }
150-
set { m_RenderingLayers = value; }
168+
get
169+
{
170+
return m_RenderingLayers;
171+
}
172+
set
173+
{
174+
if (m_RenderingLayers != value)
175+
{
176+
m_RenderingLayers = value;
177+
SyncLightAndShadowLayers();
178+
}
179+
}
151180
}
152181

153182
[SerializeField] bool m_CustomShadowLayers = false;
@@ -158,8 +187,18 @@ public uint renderingLayers
158187
/// </summary>
159188
public bool customShadowLayers
160189
{
161-
get { return m_CustomShadowLayers; }
162-
set { m_CustomShadowLayers = value; }
190+
get
191+
{
192+
return m_CustomShadowLayers;
193+
}
194+
set
195+
{
196+
if (m_CustomShadowLayers != value)
197+
{
198+
m_CustomShadowLayers = value;
199+
SyncLightAndShadowLayers();
200+
}
201+
}
163202
}
164203

165204
// The layer(s) used for shadow casting.
@@ -181,8 +220,18 @@ public LightLayerEnum shadowLayerMask
181220
/// </summary>
182221
public uint shadowRenderingLayers
183222
{
184-
get { return m_ShadowRenderingLayers; }
185-
set { m_ShadowRenderingLayers = value; }
223+
get
224+
{
225+
return m_ShadowRenderingLayers;
226+
}
227+
set
228+
{
229+
if (value != m_ShadowRenderingLayers)
230+
{
231+
m_ShadowRenderingLayers = value;
232+
SyncLightAndShadowLayers();
233+
}
234+
}
186235
}
187236

188237
/// <summary>
@@ -242,5 +291,11 @@ public void OnAfterDeserialize()
242291
m_Version = 3;
243292
}
244293
}
294+
295+
private void SyncLightAndShadowLayers()
296+
{
297+
if (light)
298+
light.renderingLayerMask = m_CustomShadowLayers ? (int)m_ShadowRenderingLayers : (int)m_RenderingLayers;
299+
}
245300
}
246301
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using NUnit.Framework;
2+
3+
namespace UnityEngine.Rendering.Universal.Tests
4+
{
5+
[TestFixture]
6+
class LightTests
7+
{
8+
[Test]
9+
public void TestMainLightRenderingLayerMaskSyncWithUniversalLightAndShadowLayers()
10+
{
11+
var lightObject = new GameObject("Light");
12+
var light = lightObject.AddComponent<Light>();
13+
var lightData = light.GetUniversalAdditionalLightData();
14+
15+
lightData.renderingLayers = (1 << 1);
16+
lightData.shadowRenderingLayers = (1 << 2);
17+
18+
lightData.customShadowLayers = false;
19+
Assert.AreEqual(light.renderingLayerMask, lightData.renderingLayers);
20+
21+
lightData.customShadowLayers = true;
22+
Assert.AreEqual(light.renderingLayerMask, lightData.shadowRenderingLayers);
23+
24+
lightData.customShadowLayers = false;
25+
lightData.renderingLayers = (1 << 3);
26+
lightData.shadowRenderingLayers = (1 << 4);
27+
Assert.AreEqual(light.renderingLayerMask, lightData.renderingLayers);
28+
29+
lightData.customShadowLayers = true;
30+
lightData.renderingLayers = (1 << 5);
31+
lightData.shadowRenderingLayers = (1 << 6);
32+
Assert.AreEqual(light.renderingLayerMask, lightData.shadowRenderingLayers);
33+
34+
Object.DestroyImmediate(lightObject);
35+
}
36+
}
37+
}

Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.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)