From 9dd59d8a5c2a043dff3b36138c4f310de64b6087 Mon Sep 17 00:00:00 2001 From: RSlysz Date: Tue, 5 May 2020 14:30:03 +0200 Subject: [PATCH 1/6] Add Layer modification of EmissiveMesh generated by area light Add Layer handling on Generated Emissive Mesh --- .../Editor/Lighting/HDLightUI.Skin.cs | 1 + .../Editor/Lighting/HDLightUI.cs | 38 +++++++---- .../Editor/Lighting/SerializedHDLight.cs | 63 ++++++++++++++++--- .../Lighting/Light/HDAdditionalLightData.cs | 24 ++++++- 4 files changed, 103 insertions(+), 23 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs index 8ae052f9be6..b42542fb174 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs @@ -81,6 +81,7 @@ sealed class Styles public readonly GUIContent displayAreaLightEmissiveMesh = new GUIContent("Display Emissive Mesh", "Generate an emissive mesh using the size, Color and Intensity of the Area Light."); public readonly GUIContent areaLightEmissiveMeshCastShadow = new GUIContent("Cast Shadows", "Specify wether the generated geometry create shadow or not when a shadow casting Light shines on it"); public readonly GUIContent areaLightEmissiveMeshMotionVector = new GUIContent("Motion Vectors", "Specify wether the generated Mesh renders 'Per Object Motion', 'Camera Motion' or 'No Motion' vectors to the Camera Motion Vector Texture."); + public readonly GUIContent areaLightEmissiveMeshLayer = new GUIContent("Layer", "Specify on which layer the generated Mesh live."); public readonly GUIContent lightLayer = new GUIContent("Light Layer", "Specifies the current Light Layers that the Light affects. This Light illuminates corresponding Renderers with the same Light Layer flags."); public readonly GUIContent interactsWithSky = new GUIContent("Affect Physically Based Sky", "Check this option to make the light and the Physically Based sky affect one another."); diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs index f50088760ca..71d8cbcdcba 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs @@ -104,17 +104,6 @@ static HDLightUI() CED.FoldoutGroup(s_Styles.shapeHeader, Expandable.Shape, k_ExpandedState, DrawShapeContent), CED.Conditional((serialized, owner) => serialized.type == HDLightType.Directional && !serialized.settings.isCompletelyBaked, CED.FoldoutGroup(s_Styles.celestialBodyHeader, Expandable.CelestialBody, k_ExpandedState, DrawCelestialBodyContent)), - //CED.TernaryConditional((serialized, owner) => serialized.type == HDLightType.Directional && !serialized.settings.isCompletelyBaked, - // CED.AdvancedFoldoutGroup(s_Styles.shapeHeader, Expandable.Shape, k_ExpandedState, - // (serialized, owner) => GetAdvanced(AdvancedMode.Shape, serialized, owner), - // (serialized, owner) => SwitchAdvanced(AdvancedMode.Shape, serialized, owner), - // DrawShapeContent, - // DrawShapeAdvancedContent - // ), - // CED.FoldoutGroup(s_Styles.shapeHeader, Expandable.Shape, k_ExpandedState, - // DrawShapeContent - // ) - //), CED.AdvancedFoldoutGroup(s_Styles.emissionHeader, Expandable.Emission, k_ExpandedState, (serialized, owner) => GetAdvanced(AdvancedMode.Emission, serialized, owner), (serialized, owner) => SwitchAdvanced(AdvancedMode.Emission, serialized, owner), @@ -825,6 +814,7 @@ static void DrawEmissionAdvancedContent(SerializedHDLight serialized, Editor own { serialized.UpdateAreaLightEmissiveMeshCastShadow(newCastShadow); } + EditorGUI.showMixedValue = false; lineRect = EditorGUILayout.GetControlRect(); SerializedHDLight.MotionVector newMotionVector; @@ -838,8 +828,34 @@ static void DrawEmissionAdvancedContent(SerializedHDLight serialized, Editor own { serialized.UpdateAreaLightEmissiveMeshMotionVectorGeneration(newMotionVector); } + EditorGUI.showMixedValue = false; + lineRect = EditorGUILayout.GetControlRect(); + int layer; + EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues; + EditorGUI.BeginChangeCheck(); + using (new SerializedHDLight.AreaLightEmissiveMeshDrawScope(lineRect, s_Styles.areaLightEmissiveMeshLayer, showSubArea, serialized.areaLightEmissiveMeshLayer, serialized.deportedAreaLightEmissiveMeshLayer)) + { + layer = EditorGUI.LayerField(lineRect, s_Styles.areaLightEmissiveMeshLayer, serialized.areaLightEmissiveMeshLayer.intValue); + } + if (EditorGUI.EndChangeCheck()) + { + serialized.UpdateAreaLightEmissiveMeshLayer(layer); + } + // or if the value of layer got changed using the layer change including child mechanism (strangely apply even if object not editable), + // discard the change: the child is not saved anyway so the value in HDAdditionalLightData is the only serialized one. + if (!EditorGUI.showMixedValue + && serialized.areaLightEmissiveMeshLayer != null + && !serialized.areaLightEmissiveMeshLayer.Equals(null) + && serialized.deportedAreaLightEmissiveMeshLayer != null + && !serialized.deportedAreaLightEmissiveMeshLayer.Equals(null) + && serialized.areaLightEmissiveMeshLayer.intValue != serialized.deportedAreaLightEmissiveMeshLayer.intValue) + { + GUI.changed = true; //force register change to handle update and apply later + serialized.UpdateAreaLightEmissiveMeshLayer(layer); + } EditorGUI.showMixedValue = false; + --EditorGUI.indentLevel; } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs index 5b04f3949e6..2f93bcb49f4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs @@ -32,6 +32,8 @@ internal class SerializedHDLight public SerializedProperty deportedAreaLightEmissiveMeshCastShadow; public SerializedProperty areaLightEmissiveMeshMotionVector; public SerializedProperty deportedAreaLightEmissiveMeshMotionVector; + public SerializedProperty areaLightEmissiveMeshLayer; + public SerializedProperty deportedAreaLightEmissiveMeshLayer; public SerializedProperty renderingLayerMask; public SerializedProperty shadowNearPlane; public SerializedProperty blockerSampleCount; @@ -98,7 +100,7 @@ internal class SerializedHDLight private SerializedProperty pointLightHDType; private SerializedProperty areaLightShapeProperty; - private IEnumerable emissiveMeshes; + private GameObject[] emissiveMeshes; public bool needUpdateAreaLightEmissiveMeshComponents = false; @@ -227,25 +229,50 @@ void System.IDisposable.Dispose() } } + struct AreaLightEmissiveMeshObjectEditionScope : System.IDisposable + { + SerializedHDLight m_Serialized; + public AreaLightEmissiveMeshObjectEditionScope(SerializedHDLight serialized) + { + m_Serialized = serialized; + foreach (GameObject emissiveMesh in m_Serialized.emissiveMeshes) + { + emissiveMesh.hideFlags &= ~HideFlags.NotEditable; + } + m_Serialized.areaLightEmissiveMeshLayer.serializedObject.Update(); + } + + void System.IDisposable.Dispose() + { + m_Serialized.areaLightEmissiveMeshLayer.serializedObject.ApplyModifiedProperties(); + foreach (GameObject emissiveMesh in m_Serialized.emissiveMeshes) + { + emissiveMesh.hideFlags |= HideFlags.NotEditable; + } + m_Serialized.areaLightEmissiveMeshLayer.serializedObject.Update(); + } + } + public struct AreaLightEmissiveMeshDrawScope : System.IDisposable { - int propertyCount; - bool oldEnableState; + SerializedProperty[] m_Properties; + bool m_OldEnableState; public AreaLightEmissiveMeshDrawScope(Rect rect, GUIContent label, bool enabler, params SerializedProperty[] properties) { - propertyCount = properties.Count(p => p != null); - foreach (var property in properties) + m_Properties = properties; + foreach (var property in m_Properties) if (property != null) EditorGUI.BeginProperty(rect, label, property); - oldEnableState = GUI.enabled; + m_OldEnableState = GUI.enabled; GUI.enabled = enabler; } void System.IDisposable.Dispose() { - GUI.enabled = oldEnableState; - for (int i = 0; i < propertyCount; ++i) - EditorGUI.EndProperty(); + GUI.enabled = m_OldEnableState; + foreach (var property in m_Properties) + if (property != null) + EditorGUI.EndProperty(); } } @@ -277,6 +304,16 @@ public void UpdateAreaLightEmissiveMeshMotionVectorGeneration(MotionVector motio } } + public void UpdateAreaLightEmissiveMeshLayer(int layer) + { + using (new AreaLightEmissiveMeshObjectEditionScope(this)) + { + areaLightEmissiveMeshLayer.intValue = layer; + if (deportedAreaLightEmissiveMeshLayer != null) //only possible while editing from prefab + deportedAreaLightEmissiveMeshLayer.intValue = layer; + } + } + public SerializedHDLight(HDAdditionalLightData[] lightDatas, LightEditor.Settings settings) { serializedObject = new SerializedObject(lightDatas); @@ -374,6 +411,7 @@ public SerializedHDLight(HDAdditionalLightData[] lightDatas, LightEditor.Setting // emission mesh areaLightEmissiveMeshCastShadow = o.Find("m_AreaLightEmissiveMeshShadowCastingMode"); areaLightEmissiveMeshMotionVector = o.Find("m_AreaLightEmissiveMeshMotionVectorGenerationMode"); + areaLightEmissiveMeshLayer = o.Find("m_AreaLightEmissiveMeshLayer"); } RefreshEmissiveMeshReference(); @@ -388,9 +426,11 @@ void RefreshEmissiveMeshReference() SerializedObject meshRendererSerializedObject = new SerializedObject(meshRenderers.ToArray()); deportedAreaLightEmissiveMeshCastShadow = meshRendererSerializedObject.FindProperty("m_CastShadows"); deportedAreaLightEmissiveMeshMotionVector = meshRendererSerializedObject.FindProperty("m_MotionVectors"); + SerializedObject gameObjectSerializedObject = new SerializedObject(emissiveMeshes); + deportedAreaLightEmissiveMeshLayer = gameObjectSerializedObject.FindProperty("m_Layer"); } else - deportedAreaLightEmissiveMeshCastShadow = deportedAreaLightEmissiveMeshMotionVector = null; + deportedAreaLightEmissiveMeshCastShadow = deportedAreaLightEmissiveMeshMotionVector = deportedAreaLightEmissiveMeshLayer = null; } public void FetchAreaLightEmissiveMeshComponents() @@ -425,7 +465,10 @@ void ApplyInternal(bool withDeportedEmissiveMeshData) serializedObject.ApplyModifiedProperties(); settings.ApplyModifiedProperties(); if (withDeportedEmissiveMeshData) + { deportedAreaLightEmissiveMeshMotionVector?.serializedObject.ApplyModifiedProperties(); + deportedAreaLightEmissiveMeshLayer?.serializedObject.ApplyModifiedProperties(); + } } public void Apply() => ApplyInternal(withDeportedEmissiveMeshData: true); diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index f35359935df..fb0087072b6 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -511,7 +511,7 @@ public bool applyRangeAttenuation /// /// If enabled, display an emissive mesh rect synchronized with the intensity and color of the light. /// - internal bool displayAreaLightEmissiveMesh + public bool displayAreaLightEmissiveMesh { get => m_DisplayAreaLightEmissiveMesh; set @@ -1502,6 +1502,7 @@ void CreateChildEmissiveMeshViewerIfNeeded() m_ChildEmissiveMeshViewer.transform.localPosition = Vector3.zero; m_ChildEmissiveMeshViewer.transform.localRotation = Quaternion.identity; m_ChildEmissiveMeshViewer.transform.localScale = Vector3.one; + m_ChildEmissiveMeshViewer.layer = m_AreaLightEmissiveMeshLayer; m_EmissiveMeshFilter = m_ChildEmissiveMeshViewer.GetComponent(); emissiveMeshRenderer = m_ChildEmissiveMeshViewer.GetComponent(); @@ -1525,6 +1526,8 @@ void DestroyChildEmissiveMeshViewer() ShadowCastingMode m_AreaLightEmissiveMeshShadowCastingMode = ShadowCastingMode.Off; [SerializeField] MotionVectorGenerationMode m_AreaLightEmissiveMeshMotionVectorGenerationMode; + [SerializeField] + int m_AreaLightEmissiveMeshLayer = 0; //Default /// Change the Shadow Casting Mode of the generated emissive mesh for Area Light public ShadowCastingMode areaLightEmissiveMeshShadowCastingMode @@ -1559,7 +1562,24 @@ public MotionVectorGenerationMode areaLightEmissiveMeshMotionVectorGenerationMod } } } - + + /// Change the Layer of the generated emissive mesh for Area Light + public int areaLightEmissiveMeshLayer + { + get => m_AreaLightEmissiveMeshLayer; + set + { + if (m_AreaLightEmissiveMeshLayer == value) + return; + + m_AreaLightEmissiveMeshLayer = value; + if (emissiveMeshRenderer != null && !emissiveMeshRenderer.Equals(null)) + { + emissiveMeshRenderer.gameObject.layer = m_AreaLightEmissiveMeshLayer; + } + } + } + private void DisableCachedShadowSlot() { if (WillRenderShadowMap() && !ShadowIsUpdatedEveryFrame()) From 7bff2da61871134c4b8688e6608594a8b301f6fe Mon Sep 17 00:00:00 2001 From: RSlysz Date: Tue, 5 May 2020 14:32:58 +0200 Subject: [PATCH 2/6] Update CHANGELOG.md --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index ac2cdd2ba4c..b0cff3f172e 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -118,6 +118,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Added a DisplayInfo attribute to specify a name override and a display order for Volume Component fields (used only in default inspector for now). - Added Min distance to contact shadows. - Added support for Depth of Field in path tracing (by sampling the lens aperture). +- Added Layer parameter on Area Light to modify Layer of generated Emissive Mesh ### Fixed - Fix when rescale probe all direction below zero (1219246) From ebae1f2c293f5c01ace7a32b0814ce0665685111 Mon Sep 17 00:00:00 2001 From: RSlysz Date: Tue, 5 May 2020 17:53:18 +0200 Subject: [PATCH 3/6] Add "same as Light" hability for layer and make it default --- .../Editor/Lighting/HDLightUI.Skin.cs | 3 +- .../Editor/Lighting/HDLightUI.cs | 62 ++++++++++++++----- .../Editor/Lighting/SerializedHDLight.cs | 10 +++ .../Lighting/Light/HDAdditionalLightData.cs | 10 ++- 4 files changed, 64 insertions(+), 21 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs index b42542fb174..0e48300f445 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs @@ -81,7 +81,8 @@ sealed class Styles public readonly GUIContent displayAreaLightEmissiveMesh = new GUIContent("Display Emissive Mesh", "Generate an emissive mesh using the size, Color and Intensity of the Area Light."); public readonly GUIContent areaLightEmissiveMeshCastShadow = new GUIContent("Cast Shadows", "Specify wether the generated geometry create shadow or not when a shadow casting Light shines on it"); public readonly GUIContent areaLightEmissiveMeshMotionVector = new GUIContent("Motion Vectors", "Specify wether the generated Mesh renders 'Per Object Motion', 'Camera Motion' or 'No Motion' vectors to the Camera Motion Vector Texture."); - public readonly GUIContent areaLightEmissiveMeshLayer = new GUIContent("Layer", "Specify on which layer the generated Mesh live."); + public readonly GUIContent areaLightEmissiveMeshSameLayer = new GUIContent("Same Layer", "If checked, use the same Layer than the Light one."); + public readonly GUIContent areaLightEmissiveMeshCustomLayer = new GUIContent("Custom Layer", "Specify on which layer the generated Mesh live."); public readonly GUIContent lightLayer = new GUIContent("Light Layer", "Specifies the current Light Layers that the Light affects. This Light illuminates corresponding Renderers with the same Light Layer flags."); public readonly GUIContent interactsWithSky = new GUIContent("Affect Physically Based Sky", "Check this option to make the light and the Physically Based sky affect one another."); diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs index 71d8cbcdcba..fe6def1919f 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs @@ -830,31 +830,59 @@ static void DrawEmissionAdvancedContent(SerializedHDLight serialized, Editor own } EditorGUI.showMixedValue = false; - lineRect = EditorGUILayout.GetControlRect(); - int layer; - EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues; + EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues || serialized.lightLayer.hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); - using (new SerializedHDLight.AreaLightEmissiveMeshDrawScope(lineRect, s_Styles.areaLightEmissiveMeshLayer, showSubArea, serialized.areaLightEmissiveMeshLayer, serialized.deportedAreaLightEmissiveMeshLayer)) + bool toggle; + using (new SerializedHDLight.AreaLightEmissiveMeshDrawScope(lineRect, s_Styles.areaLightEmissiveMeshSameLayer, showSubArea, serialized.areaLightEmissiveMeshLayer, serialized.deportedAreaLightEmissiveMeshLayer)) { - layer = EditorGUI.LayerField(lineRect, s_Styles.areaLightEmissiveMeshLayer, serialized.areaLightEmissiveMeshLayer.intValue); + toggle = EditorGUILayout.Toggle(s_Styles.areaLightEmissiveMeshSameLayer, serialized.areaLightEmissiveMeshLayer.intValue == -1); } if (EditorGUI.EndChangeCheck()) { - serialized.UpdateAreaLightEmissiveMeshLayer(layer); + serialized.UpdateAreaLightEmissiveMeshLayer(serialized.lightLayer.intValue); + if (toggle) + serialized.areaLightEmissiveMeshLayer.intValue = -1; } - // or if the value of layer got changed using the layer change including child mechanism (strangely apply even if object not editable), - // discard the change: the child is not saved anyway so the value in HDAdditionalLightData is the only serialized one. - if (!EditorGUI.showMixedValue - && serialized.areaLightEmissiveMeshLayer != null - && !serialized.areaLightEmissiveMeshLayer.Equals(null) - && serialized.deportedAreaLightEmissiveMeshLayer != null - && !serialized.deportedAreaLightEmissiveMeshLayer.Equals(null) - && serialized.areaLightEmissiveMeshLayer.intValue != serialized.deportedAreaLightEmissiveMeshLayer.intValue) + EditorGUI.showMixedValue = false; + + ++EditorGUI.indentLevel; + if (toggle || serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues) { - GUI.changed = true; //force register change to handle update and apply later - serialized.UpdateAreaLightEmissiveMeshLayer(layer); + using (new EditorGUI.DisabledScope(true)) + { + lineRect = EditorGUILayout.GetControlRect(); + EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues || serialized.lightLayer.hasMultipleDifferentValues; + EditorGUI.LayerField(lineRect, s_Styles.areaLightEmissiveMeshCustomLayer, serialized.lightLayer.intValue); + EditorGUI.showMixedValue = false; + } } - EditorGUI.showMixedValue = false; + else + { + EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues; + lineRect = EditorGUILayout.GetControlRect(); + int layer; + EditorGUI.BeginChangeCheck(); + using (new SerializedHDLight.AreaLightEmissiveMeshDrawScope(lineRect, s_Styles.areaLightEmissiveMeshCustomLayer, showSubArea, serialized.areaLightEmissiveMeshLayer, serialized.deportedAreaLightEmissiveMeshLayer)) + { + layer = EditorGUI.LayerField(lineRect, s_Styles.areaLightEmissiveMeshCustomLayer, serialized.areaLightEmissiveMeshLayer.intValue); + } + if (EditorGUI.EndChangeCheck()) + { + serialized.UpdateAreaLightEmissiveMeshLayer(layer); + } + // or if the value of layer got changed using the layer change including child mechanism (strangely apply even if object not editable), + // discard the change: the child is not saved anyway so the value in HDAdditionalLightData is the only serialized one. + else if (!EditorGUI.showMixedValue + && serialized.deportedAreaLightEmissiveMeshLayer != null + && !serialized.deportedAreaLightEmissiveMeshLayer.Equals(null) + && serialized.areaLightEmissiveMeshLayer.intValue != serialized.deportedAreaLightEmissiveMeshLayer.intValue) + { + GUI.changed = true; //force register change to handle update and apply later + serialized.UpdateAreaLightEmissiveMeshLayer(layer); + } + EditorGUI.showMixedValue = false; + } + --EditorGUI.indentLevel; --EditorGUI.indentLevel; } diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs index 2f93bcb49f4..10d310391e7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs @@ -106,6 +106,9 @@ internal class SerializedHDLight public SerializedObject serializedObject; + public SerializedProperty lightLayer; + private SerializedObject lightGameObject; + //contain serialized property that are mainly used to draw inspector public LightEditor.Settings settings; @@ -415,6 +418,9 @@ public SerializedHDLight(HDAdditionalLightData[] lightDatas, LightEditor.Setting } RefreshEmissiveMeshReference(); + + lightGameObject = new SerializedObject(serializedObject.targetObjects.Select(ld => ((HDAdditionalLightData)ld).gameObject).ToArray()); + lightLayer = lightGameObject.FindProperty("m_Layer"); } void RefreshEmissiveMeshReference() @@ -458,6 +464,10 @@ public void Update() serializedObject.Update(); settings.Update(); + + lightGameObject.Update(); + deportedAreaLightEmissiveMeshMotionVector?.serializedObject.Update(); + deportedAreaLightEmissiveMeshLayer?.serializedObject.Update(); } void ApplyInternal(bool withDeportedEmissiveMeshData) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index fb0087072b6..a9eb59af88d 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -1502,7 +1502,7 @@ void CreateChildEmissiveMeshViewerIfNeeded() m_ChildEmissiveMeshViewer.transform.localPosition = Vector3.zero; m_ChildEmissiveMeshViewer.transform.localRotation = Quaternion.identity; m_ChildEmissiveMeshViewer.transform.localScale = Vector3.one; - m_ChildEmissiveMeshViewer.layer = m_AreaLightEmissiveMeshLayer; + m_ChildEmissiveMeshViewer.layer = areaLightEmissiveMeshLayer == -1 ? gameObject.layer : areaLightEmissiveMeshLayer; m_EmissiveMeshFilter = m_ChildEmissiveMeshViewer.GetComponent(); emissiveMeshRenderer = m_ChildEmissiveMeshViewer.GetComponent(); @@ -1527,7 +1527,7 @@ void DestroyChildEmissiveMeshViewer() [SerializeField] MotionVectorGenerationMode m_AreaLightEmissiveMeshMotionVectorGenerationMode; [SerializeField] - int m_AreaLightEmissiveMeshLayer = 0; //Default + int m_AreaLightEmissiveMeshLayer = -1; //Special value that means we need to grab the one in the Light for initialization (for migration purpose) /// Change the Shadow Casting Mode of the generated emissive mesh for Area Light public ShadowCastingMode areaLightEmissiveMeshShadowCastingMode @@ -2137,7 +2137,11 @@ void LateUpdate() if (!m_Animated) return; #endif - + if (areaLightEmissiveMeshLayer == -1 + && m_ChildEmissiveMeshViewer != null && !m_ChildEmissiveMeshViewer.Equals(null) + && m_ChildEmissiveMeshViewer.gameObject.layer != gameObject.layer) + m_ChildEmissiveMeshViewer.gameObject.layer = gameObject.layer; + // Delayed cleanup when removing emissive mesh from timeline if (needRefreshEmissiveMeshesFromTimeLineUpdate) { From 537d0e9a225eddab37836cfbfdb755bd2c5d647b Mon Sep 17 00:00:00 2001 From: RSlysz Date: Tue, 5 May 2020 19:51:15 +0200 Subject: [PATCH 4/6] Add destruction on move in hierarchy and retrieve existing to secure the NotEditable --- .../Lighting/Light/HDAdditionalLightData.cs | 59 ++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index a9eb59af88d..6724a5fd503 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -1492,9 +1492,53 @@ void CreateChildEmissiveMeshViewerIfNeeded() if (PrefabUtility.IsPartOfPrefabAsset(this)) return; #endif + bool here = m_ChildEmissiveMeshViewer != null && !m_ChildEmissiveMeshViewer.Equals(null); - //if not here, create it - if (m_ChildEmissiveMeshViewer == null || m_ChildEmissiveMeshViewer.Equals(null)) +#if UNITY_EDITOR + //if not parented anymore, destroy it + if (here && m_ChildEmissiveMeshViewer.transform.parent != transform) + { + if (Application.isPlaying) + Destroy(m_ChildEmissiveMeshViewer); + else + DestroyImmediate(m_ChildEmissiveMeshViewer); + m_ChildEmissiveMeshViewer = null; + m_EmissiveMeshFilter = null; + here = false; + } +#endif + + //if not here, try to find it first + if (!here) + { + foreach (Transform child in transform) + { + var test = child.GetComponents(typeof(Component)); + if (child.name == k_EmissiveMeshViewerName + && child.hideFlags == (HideFlags.NotEditable | HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor) + && child.GetComponents(typeof(MeshFilter)).Length == 1 + && child.GetComponents(typeof(MeshRenderer)).Length == 1 + && child.GetComponents(typeof(Component)).Length == 3) // Transform + MeshFilter + MeshRenderer + { + m_ChildEmissiveMeshViewer = child.gameObject; + m_ChildEmissiveMeshViewer.transform.localPosition = Vector3.zero; + m_ChildEmissiveMeshViewer.transform.localRotation = Quaternion.identity; + m_ChildEmissiveMeshViewer.transform.localScale = Vector3.one; + m_ChildEmissiveMeshViewer.layer = areaLightEmissiveMeshLayer == -1 ? gameObject.layer : areaLightEmissiveMeshLayer; + + m_EmissiveMeshFilter = m_ChildEmissiveMeshViewer.GetComponent(); + emissiveMeshRenderer = m_ChildEmissiveMeshViewer.GetComponent(); + emissiveMeshRenderer.shadowCastingMode = m_AreaLightEmissiveMeshShadowCastingMode; + emissiveMeshRenderer.motionVectorGenerationMode = m_AreaLightEmissiveMeshMotionVectorGenerationMode; + + here = true; + break; + } + } + } + + //if still not here, create it + if (!here) { m_ChildEmissiveMeshViewer = new GameObject(k_EmissiveMeshViewerName, typeof(MeshFilter), typeof(MeshRenderer)); m_ChildEmissiveMeshViewer.hideFlags = HideFlags.NotEditable | HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor; @@ -2137,6 +2181,17 @@ void LateUpdate() if (!m_Animated) return; #endif + +#if UNITY_EDITOR + //if not parented anymore, refresh it + if (m_ChildEmissiveMeshViewer != null && !m_ChildEmissiveMeshViewer.Equals(null) && m_ChildEmissiveMeshViewer.transform.parent != transform) + { + CreateChildEmissiveMeshViewerIfNeeded(); + UpdateAreaLightEmissiveMesh(); + } +#endif + + //auto change layer on emissive mesh if (areaLightEmissiveMeshLayer == -1 && m_ChildEmissiveMeshViewer != null && !m_ChildEmissiveMeshViewer.Equals(null) && m_ChildEmissiveMeshViewer.gameObject.layer != gameObject.layer) From d18cffcee85a3e3d5b786b9cf97fffd3774270eb Mon Sep 17 00:00:00 2001 From: Remi Slysz <40034005+RSlysz@users.noreply.github.com> Date: Wed, 6 May 2020 16:58:51 +0200 Subject: [PATCH 5/6] Add sync on Static too --- .../Runtime/Lighting/Light/HDAdditionalLightData.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index 6724a5fd503..be51f74be11 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -2184,10 +2184,15 @@ void LateUpdate() #if UNITY_EDITOR //if not parented anymore, refresh it - if (m_ChildEmissiveMeshViewer != null && !m_ChildEmissiveMeshViewer.Equals(null) && m_ChildEmissiveMeshViewer.transform.parent != transform) + if (m_ChildEmissiveMeshViewer != null && !m_ChildEmissiveMeshViewer.Equals(null)) { - CreateChildEmissiveMeshViewerIfNeeded(); - UpdateAreaLightEmissiveMesh(); + if (m_ChildEmissiveMeshViewer.transform.parent != transform) + { + CreateChildEmissiveMeshViewerIfNeeded(); + UpdateAreaLightEmissiveMesh(); + } + if (m_ChildEmissiveMeshViewer.gameObject.isStatic != gameObject.isStatic) + m_ChildEmissiveMeshViewer.gameObject.isStatic = gameObject.isStatic; } #endif From 4dc36a57461f14c79266ac92920aeaae1cee60aa Mon Sep 17 00:00:00 2001 From: Remi Slysz <40034005+RSlysz@users.noreply.github.com> Date: Wed, 6 May 2020 17:44:23 +0200 Subject: [PATCH 6/6] Also the copy the static drop down --- .../Runtime/Lighting/Light/HDAdditionalLightData.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index be51f74be11..1ddd8c08256 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -2193,6 +2193,8 @@ void LateUpdate() } if (m_ChildEmissiveMeshViewer.gameObject.isStatic != gameObject.isStatic) m_ChildEmissiveMeshViewer.gameObject.isStatic = gameObject.isStatic; + if (GameObjectUtility.GetStaticEditorFlags(m_ChildEmissiveMeshViewer.gameObject) != GameObjectUtility.GetStaticEditorFlags(gameObject)) + GameObjectUtility.SetStaticEditorFlags(m_ChildEmissiveMeshViewer.gameObject, GameObjectUtility.GetStaticEditorFlags(gameObject)); } #endif