From a0dbcb4f200fae038a83bcc6ed4b04dce0959936 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Thu, 18 Apr 2024 05:04:44 +0000 Subject: [PATCH] [Port] [2023.2] Added custom light data shadow and light layer sync with the main light. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../Runtime/UniversalAdditionalLightData.cs | 67 +++++++++++++++++-- .../Tests/Runtime/LightTests.cs | 37 ++++++++++ .../Tests/Runtime/LightTests.cs.meta | 2 + 3 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs create mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightTests.cs.meta 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