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