diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalLightData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalLightData.cs
index a84d63a39d6..25f80c2fc09 100644
--- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalLightData.cs
+++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalLightData.cs
@@ -108,6 +108,25 @@ public bool usePipelineSettings
///
public static readonly int AdditionalLightsShadowDefaultCustomResolution = 128;
+ [NonSerialized] private Light m_Light;
+
+ ///
+ /// Returns the cached light component associated with the game object that owns this light data.
+ ///
+#if UNITY_EDITOR
+ internal new Light light
+#else
+ internal Light light
+#endif
+ {
+ get
+ {
+ if (!m_Light)
+ TryGetComponent(out m_Light);
+ return m_Light;
+ }
+ }
+
///
/// The minimum shadow resolution for additional lights.
///
@@ -146,8 +165,18 @@ public LightLayerEnum lightLayerMask
///
public uint renderingLayers
{
- get { return m_RenderingLayers; }
- set { m_RenderingLayers = value; }
+ get
+ {
+ return m_RenderingLayers;
+ }
+ set
+ {
+ if (m_RenderingLayers != value)
+ {
+ m_RenderingLayers = value;
+ SyncLightAndShadowLayers();
+ }
+ }
}
[SerializeField] bool m_CustomShadowLayers = false;
@@ -158,8 +187,18 @@ public uint renderingLayers
///
public bool customShadowLayers
{
- get { return m_CustomShadowLayers; }
- set { m_CustomShadowLayers = value; }
+ get
+ {
+ return m_CustomShadowLayers;
+ }
+ set
+ {
+ if (m_CustomShadowLayers != value)
+ {
+ m_CustomShadowLayers = value;
+ SyncLightAndShadowLayers();
+ }
+ }
}
// The layer(s) used for shadow casting.
@@ -181,8 +220,18 @@ public LightLayerEnum shadowLayerMask
///
public uint shadowRenderingLayers
{
- get { return m_ShadowRenderingLayers; }
- set { m_ShadowRenderingLayers = value; }
+ get
+ {
+ return m_ShadowRenderingLayers;
+ }
+ set
+ {
+ if (value != m_ShadowRenderingLayers)
+ {
+ m_ShadowRenderingLayers = value;
+ SyncLightAndShadowLayers();
+ }
+ }
}
///
@@ -242,5 +291,11 @@ public void OnAfterDeserialize()
m_Version = 3;
}
}
+
+ private void SyncLightAndShadowLayers()
+ {
+ if (light)
+ light.renderingLayerMask = m_CustomShadowLayers ? (int)m_ShadowRenderingLayers : (int)m_RenderingLayers;
+ }
}
}
diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs
new file mode 100644
index 00000000000..0055383c902
--- /dev/null
+++ b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs
@@ -0,0 +1,37 @@
+using NUnit.Framework;
+
+namespace UnityEngine.Rendering.Universal.Tests
+{
+ [TestFixture]
+ class LightTests
+ {
+ [Test]
+ public void TestMainLightRenderingLayerMaskSyncWithUniversalLightAndShadowLayers()
+ {
+ var lightObject = new GameObject("Light");
+ var light = lightObject.AddComponent();
+ var lightData = light.GetUniversalAdditionalLightData();
+
+ lightData.renderingLayers = (1 << 1);
+ lightData.shadowRenderingLayers = (1 << 2);
+
+ lightData.customShadowLayers = false;
+ Assert.AreEqual(light.renderingLayerMask, lightData.renderingLayers);
+
+ lightData.customShadowLayers = true;
+ Assert.AreEqual(light.renderingLayerMask, lightData.shadowRenderingLayers);
+
+ lightData.customShadowLayers = false;
+ lightData.renderingLayers = (1 << 3);
+ lightData.shadowRenderingLayers = (1 << 4);
+ Assert.AreEqual(light.renderingLayerMask, lightData.renderingLayers);
+
+ lightData.customShadowLayers = true;
+ lightData.renderingLayers = (1 << 5);
+ lightData.shadowRenderingLayers = (1 << 6);
+ Assert.AreEqual(light.renderingLayerMask, lightData.shadowRenderingLayers);
+
+ Object.DestroyImmediate(lightObject);
+ }
+ }
+}
diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs.meta b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs.meta
new file mode 100644
index 00000000000..3d8d014c4f3
--- /dev/null
+++ b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 3db6f9b04a31ea949aa7369a94fbbb8e
\ No newline at end of file