Skip to content

Commit e7c6276

Browse files
Hd/add layer modification on generated emissive mesh for area light (#364)
* Add Layer modification of EmissiveMesh generated by area light Add Layer handling on Generated Emissive Mesh * Update CHANGELOG.md * Add "same as Light" hability for layer and make it default * Add destruction on move in hierarchy and retrieve existing to secure the NotEditable * Add sync on Static too * Also the copy the static drop down Co-authored-by: sebastienlagarde <sebastien@unity3d.com>
1 parent fb8e47d commit e7c6276

File tree

5 files changed

+211
-25
lines changed

5 files changed

+211
-25
lines changed

com.unity.render-pipelines.high-definition/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
121121
- Added an API in HDRP to override the camera within the rendering of a frame (mainly for custom pass).
122122
- Added a function (HDRenderPipeline.ResetRTHandleReferenceSize) to reset the reference size of RTHandle systems.
123123
- Added support for AxF measurements importing into texture resources tilings.
124+
- Added Layer parameter on Area Light to modify Layer of generated Emissive Mesh
124125

125126
### Fixed
126127
- Fix when rescale probe all direction below zero (1219246)

com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ sealed class Styles
8181
public readonly GUIContent displayAreaLightEmissiveMesh = new GUIContent("Display Emissive Mesh", "Generate an emissive mesh using the size, Color and Intensity of the Area Light.");
8282
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");
8383
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.");
84+
public readonly GUIContent areaLightEmissiveMeshSameLayer = new GUIContent("Same Layer", "If checked, use the same Layer than the Light one.");
85+
public readonly GUIContent areaLightEmissiveMeshCustomLayer = new GUIContent("Custom Layer", "Specify on which layer the generated Mesh live.");
8486
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.");
8587

8688
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.");

com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,6 @@ static HDLightUI()
104104
CED.FoldoutGroup(s_Styles.shapeHeader, Expandable.Shape, k_ExpandedState, DrawShapeContent),
105105
CED.Conditional((serialized, owner) => serialized.type == HDLightType.Directional && !serialized.settings.isCompletelyBaked,
106106
CED.FoldoutGroup(s_Styles.celestialBodyHeader, Expandable.CelestialBody, k_ExpandedState, DrawCelestialBodyContent)),
107-
//CED.TernaryConditional((serialized, owner) => serialized.type == HDLightType.Directional && !serialized.settings.isCompletelyBaked,
108-
// CED.AdvancedFoldoutGroup(s_Styles.shapeHeader, Expandable.Shape, k_ExpandedState,
109-
// (serialized, owner) => GetAdvanced(AdvancedMode.Shape, serialized, owner),
110-
// (serialized, owner) => SwitchAdvanced(AdvancedMode.Shape, serialized, owner),
111-
// DrawShapeContent,
112-
// DrawShapeAdvancedContent
113-
// ),
114-
// CED.FoldoutGroup(s_Styles.shapeHeader, Expandable.Shape, k_ExpandedState,
115-
// DrawShapeContent
116-
// )
117-
//),
118107
CED.AdvancedFoldoutGroup(s_Styles.emissionHeader, Expandable.Emission, k_ExpandedState,
119108
(serialized, owner) => GetAdvanced(AdvancedMode.Emission, serialized, owner),
120109
(serialized, owner) => SwitchAdvanced(AdvancedMode.Emission, serialized, owner),
@@ -825,6 +814,7 @@ static void DrawEmissionAdvancedContent(SerializedHDLight serialized, Editor own
825814
{
826815
serialized.UpdateAreaLightEmissiveMeshCastShadow(newCastShadow);
827816
}
817+
EditorGUI.showMixedValue = false;
828818

829819
lineRect = EditorGUILayout.GetControlRect();
830820
SerializedHDLight.MotionVector newMotionVector;
@@ -838,8 +828,62 @@ static void DrawEmissionAdvancedContent(SerializedHDLight serialized, Editor own
838828
{
839829
serialized.UpdateAreaLightEmissiveMeshMotionVectorGeneration(newMotionVector);
840830
}
831+
EditorGUI.showMixedValue = false;
841832

833+
EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues || serialized.lightLayer.hasMultipleDifferentValues;
834+
EditorGUI.BeginChangeCheck();
835+
bool toggle;
836+
using (new SerializedHDLight.AreaLightEmissiveMeshDrawScope(lineRect, s_Styles.areaLightEmissiveMeshSameLayer, showSubArea, serialized.areaLightEmissiveMeshLayer, serialized.deportedAreaLightEmissiveMeshLayer))
837+
{
838+
toggle = EditorGUILayout.Toggle(s_Styles.areaLightEmissiveMeshSameLayer, serialized.areaLightEmissiveMeshLayer.intValue == -1);
839+
}
840+
if (EditorGUI.EndChangeCheck())
841+
{
842+
serialized.UpdateAreaLightEmissiveMeshLayer(serialized.lightLayer.intValue);
843+
if (toggle)
844+
serialized.areaLightEmissiveMeshLayer.intValue = -1;
845+
}
842846
EditorGUI.showMixedValue = false;
847+
848+
++EditorGUI.indentLevel;
849+
if (toggle || serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues)
850+
{
851+
using (new EditorGUI.DisabledScope(true))
852+
{
853+
lineRect = EditorGUILayout.GetControlRect();
854+
EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues || serialized.lightLayer.hasMultipleDifferentValues;
855+
EditorGUI.LayerField(lineRect, s_Styles.areaLightEmissiveMeshCustomLayer, serialized.lightLayer.intValue);
856+
EditorGUI.showMixedValue = false;
857+
}
858+
}
859+
else
860+
{
861+
EditorGUI.showMixedValue = serialized.areaLightEmissiveMeshLayer.hasMultipleDifferentValues;
862+
lineRect = EditorGUILayout.GetControlRect();
863+
int layer;
864+
EditorGUI.BeginChangeCheck();
865+
using (new SerializedHDLight.AreaLightEmissiveMeshDrawScope(lineRect, s_Styles.areaLightEmissiveMeshCustomLayer, showSubArea, serialized.areaLightEmissiveMeshLayer, serialized.deportedAreaLightEmissiveMeshLayer))
866+
{
867+
layer = EditorGUI.LayerField(lineRect, s_Styles.areaLightEmissiveMeshCustomLayer, serialized.areaLightEmissiveMeshLayer.intValue);
868+
}
869+
if (EditorGUI.EndChangeCheck())
870+
{
871+
serialized.UpdateAreaLightEmissiveMeshLayer(layer);
872+
}
873+
// or if the value of layer got changed using the layer change including child mechanism (strangely apply even if object not editable),
874+
// discard the change: the child is not saved anyway so the value in HDAdditionalLightData is the only serialized one.
875+
else if (!EditorGUI.showMixedValue
876+
&& serialized.deportedAreaLightEmissiveMeshLayer != null
877+
&& !serialized.deportedAreaLightEmissiveMeshLayer.Equals(null)
878+
&& serialized.areaLightEmissiveMeshLayer.intValue != serialized.deportedAreaLightEmissiveMeshLayer.intValue)
879+
{
880+
GUI.changed = true; //force register change to handle update and apply later
881+
serialized.UpdateAreaLightEmissiveMeshLayer(layer);
882+
}
883+
EditorGUI.showMixedValue = false;
884+
}
885+
--EditorGUI.indentLevel;
886+
843887
--EditorGUI.indentLevel;
844888
}
845889

com.unity.render-pipelines.high-definition/Editor/Lighting/SerializedHDLight.cs

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ internal class SerializedHDLight
3232
public SerializedProperty deportedAreaLightEmissiveMeshCastShadow;
3333
public SerializedProperty areaLightEmissiveMeshMotionVector;
3434
public SerializedProperty deportedAreaLightEmissiveMeshMotionVector;
35+
public SerializedProperty areaLightEmissiveMeshLayer;
36+
public SerializedProperty deportedAreaLightEmissiveMeshLayer;
3537
public SerializedProperty renderingLayerMask;
3638
public SerializedProperty shadowNearPlane;
3739
public SerializedProperty blockerSampleCount;
@@ -98,12 +100,15 @@ internal class SerializedHDLight
98100
private SerializedProperty pointLightHDType;
99101
private SerializedProperty areaLightShapeProperty;
100102

101-
private IEnumerable<GameObject> emissiveMeshes;
103+
private GameObject[] emissiveMeshes;
102104

103105
public bool needUpdateAreaLightEmissiveMeshComponents = false;
104106

105107
public SerializedObject serializedObject;
106108

109+
public SerializedProperty lightLayer;
110+
private SerializedObject lightGameObject;
111+
107112
//contain serialized property that are mainly used to draw inspector
108113
public LightEditor.Settings settings;
109114

@@ -227,25 +232,50 @@ void System.IDisposable.Dispose()
227232
}
228233
}
229234

235+
struct AreaLightEmissiveMeshObjectEditionScope : System.IDisposable
236+
{
237+
SerializedHDLight m_Serialized;
238+
public AreaLightEmissiveMeshObjectEditionScope(SerializedHDLight serialized)
239+
{
240+
m_Serialized = serialized;
241+
foreach (GameObject emissiveMesh in m_Serialized.emissiveMeshes)
242+
{
243+
emissiveMesh.hideFlags &= ~HideFlags.NotEditable;
244+
}
245+
m_Serialized.areaLightEmissiveMeshLayer.serializedObject.Update();
246+
}
247+
248+
void System.IDisposable.Dispose()
249+
{
250+
m_Serialized.areaLightEmissiveMeshLayer.serializedObject.ApplyModifiedProperties();
251+
foreach (GameObject emissiveMesh in m_Serialized.emissiveMeshes)
252+
{
253+
emissiveMesh.hideFlags |= HideFlags.NotEditable;
254+
}
255+
m_Serialized.areaLightEmissiveMeshLayer.serializedObject.Update();
256+
}
257+
}
258+
230259
public struct AreaLightEmissiveMeshDrawScope : System.IDisposable
231260
{
232-
int propertyCount;
233-
bool oldEnableState;
261+
SerializedProperty[] m_Properties;
262+
bool m_OldEnableState;
234263
public AreaLightEmissiveMeshDrawScope(Rect rect, GUIContent label, bool enabler, params SerializedProperty[] properties)
235264
{
236-
propertyCount = properties.Count(p => p != null);
237-
foreach (var property in properties)
265+
m_Properties = properties;
266+
foreach (var property in m_Properties)
238267
if (property != null)
239268
EditorGUI.BeginProperty(rect, label, property);
240-
oldEnableState = GUI.enabled;
269+
m_OldEnableState = GUI.enabled;
241270
GUI.enabled = enabler;
242271
}
243272

244273
void System.IDisposable.Dispose()
245274
{
246-
GUI.enabled = oldEnableState;
247-
for (int i = 0; i < propertyCount; ++i)
248-
EditorGUI.EndProperty();
275+
GUI.enabled = m_OldEnableState;
276+
foreach (var property in m_Properties)
277+
if (property != null)
278+
EditorGUI.EndProperty();
249279
}
250280
}
251281

@@ -277,6 +307,16 @@ public void UpdateAreaLightEmissiveMeshMotionVectorGeneration(MotionVector motio
277307
}
278308
}
279309

310+
public void UpdateAreaLightEmissiveMeshLayer(int layer)
311+
{
312+
using (new AreaLightEmissiveMeshObjectEditionScope(this))
313+
{
314+
areaLightEmissiveMeshLayer.intValue = layer;
315+
if (deportedAreaLightEmissiveMeshLayer != null) //only possible while editing from prefab
316+
deportedAreaLightEmissiveMeshLayer.intValue = layer;
317+
}
318+
}
319+
280320
public SerializedHDLight(HDAdditionalLightData[] lightDatas, LightEditor.Settings settings)
281321
{
282322
serializedObject = new SerializedObject(lightDatas);
@@ -374,9 +414,13 @@ public SerializedHDLight(HDAdditionalLightData[] lightDatas, LightEditor.Setting
374414
// emission mesh
375415
areaLightEmissiveMeshCastShadow = o.Find("m_AreaLightEmissiveMeshShadowCastingMode");
376416
areaLightEmissiveMeshMotionVector = o.Find("m_AreaLightEmissiveMeshMotionVectorGenerationMode");
417+
areaLightEmissiveMeshLayer = o.Find("m_AreaLightEmissiveMeshLayer");
377418
}
378419

379420
RefreshEmissiveMeshReference();
421+
422+
lightGameObject = new SerializedObject(serializedObject.targetObjects.Select(ld => ((HDAdditionalLightData)ld).gameObject).ToArray());
423+
lightLayer = lightGameObject.FindProperty("m_Layer");
380424
}
381425

382426
void RefreshEmissiveMeshReference()
@@ -388,9 +432,11 @@ void RefreshEmissiveMeshReference()
388432
SerializedObject meshRendererSerializedObject = new SerializedObject(meshRenderers.ToArray());
389433
deportedAreaLightEmissiveMeshCastShadow = meshRendererSerializedObject.FindProperty("m_CastShadows");
390434
deportedAreaLightEmissiveMeshMotionVector = meshRendererSerializedObject.FindProperty("m_MotionVectors");
435+
SerializedObject gameObjectSerializedObject = new SerializedObject(emissiveMeshes);
436+
deportedAreaLightEmissiveMeshLayer = gameObjectSerializedObject.FindProperty("m_Layer");
391437
}
392438
else
393-
deportedAreaLightEmissiveMeshCastShadow = deportedAreaLightEmissiveMeshMotionVector = null;
439+
deportedAreaLightEmissiveMeshCastShadow = deportedAreaLightEmissiveMeshMotionVector = deportedAreaLightEmissiveMeshLayer = null;
394440
}
395441

396442
public void FetchAreaLightEmissiveMeshComponents()
@@ -418,14 +464,21 @@ public void Update()
418464

419465
serializedObject.Update();
420466
settings.Update();
467+
468+
lightGameObject.Update();
469+
deportedAreaLightEmissiveMeshMotionVector?.serializedObject.Update();
470+
deportedAreaLightEmissiveMeshLayer?.serializedObject.Update();
421471
}
422472

423473
void ApplyInternal(bool withDeportedEmissiveMeshData)
424474
{
425475
serializedObject.ApplyModifiedProperties();
426476
settings.ApplyModifiedProperties();
427477
if (withDeportedEmissiveMeshData)
478+
{
428479
deportedAreaLightEmissiveMeshMotionVector?.serializedObject.ApplyModifiedProperties();
480+
deportedAreaLightEmissiveMeshLayer?.serializedObject.ApplyModifiedProperties();
481+
}
429482
}
430483

431484
public void Apply() => ApplyInternal(withDeportedEmissiveMeshData: true);

0 commit comments

Comments
 (0)