diff --git a/com.unity.render-pipelines.core/CHANGELOG.md b/com.unity.render-pipelines.core/CHANGELOG.md index 4627f7cd093..4bb7f49531b 100644 --- a/com.unity.render-pipelines.core/CHANGELOG.md +++ b/com.unity.render-pipelines.core/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fixed copy/pasting of Volume Components when loading a new scene - Fix LookDev's camera button layout. - Fix LookDev's layout vanishing on domain reload. +- Fixed null reference exception in LookDev when setting the SRP to one not implementing LookDev (case 1245086) +- Fix LookDev's undo/redo on EnvironmentLibrary (case 1234725) ## [7.3.0] - 2020-03-11 diff --git a/com.unity.render-pipelines.core/Editor/LookDev/Context.cs b/com.unity.render-pipelines.core/Editor/LookDev/Context.cs index 04f0300517e..7db4c4e799f 100644 --- a/com.unity.render-pipelines.core/Editor/LookDev/Context.cs +++ b/com.unity.render-pipelines.core/Editor/LookDev/Context.cs @@ -264,6 +264,18 @@ internal bool HasLibraryAssetChanged(EnvironmentLibrary environmentLibrary) return m_EnvironmentLibraryGUID != AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(environmentLibrary)); } + + internal void FullReimportEnvironmentLibrary() + { + if (environmentLibrary == null) + return; + + // refresh AssetDatabase in case of undo/redo creating/destructing environment subasset + string libraryPath = AssetDatabase.GetAssetPath(environmentLibrary); + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(environmentLibrary), ImportAssetOptions.DontDownloadFromCacheServer | ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate | ImportAssetOptions.ImportRecursive); + UpdateEnvironmentLibrary(AssetDatabase.LoadAssetAtPath(libraryPath)); + EditorUtility.SetDirty(environmentLibrary); + } } /// diff --git a/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs b/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs index 30d1e966387..5db3aba5723 100644 --- a/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs +++ b/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs @@ -463,5 +463,13 @@ void OnFocus() ((IEnvironmentDisplayer)this).Repaint(); } } + + void FullRefreshEnvironmentList() + { + if (LookDev.currentContext.environmentLibrary != null) + LookDev.currentContext.FullReimportEnvironmentLibrary(); + + ((IEnvironmentDisplayer)this).Repaint(); + } } } diff --git a/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.cs b/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.cs index a616701a681..12b7368fccc 100644 --- a/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.cs +++ b/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.cs @@ -3,6 +3,8 @@ using UnityEngine; using UnityEngine.UIElements; +using RenderPipelineManager = UnityEngine.Rendering.RenderPipelineManager; + namespace UnityEditor.Rendering.LookDev { /// Interface that must implement the viewer to communicate with the compositor and data management @@ -257,9 +259,15 @@ void OnEnable() ApplyLayout(viewLayout); ApplySidePanelChange(layout.showedSidePanel); + + Undo.undoRedoPerformed += FullRefreshEnvironmentList; } - void OnDisable() => OnClosedInternal?.Invoke(); + void OnDisable() + { + Undo.undoRedoPerformed -= FullRefreshEnvironmentList; + OnClosedInternal?.Invoke(); + } void CreateToolbar() { @@ -680,6 +688,17 @@ void OnGUI() rootVisualElement.styleSheets.Add(styleSheetLight); } + // [case 1245086] Guard in case the SRP asset is set to null (or to a not supported SRP) when the lookdev window is already open + // Note: After an editor reload, we might get a null OnUpdateRequestedInternal and null SRP for a couple of frames, hence the check. + if (!LookDev.supported && OnUpdateRequestedInternal !=null) + { + // Print an error and close the Lookdev window (to avoid spamming the console) + Debug.LogError($"LookDev is not supported by this Scriptable Render Pipeline: " + + (RenderPipelineManager.currentPipeline == null ? "No SRP in use" : RenderPipelineManager.currentPipeline.ToString())); + LookDev.Close(); + return; + } + OnUpdateRequestedInternal?.Invoke(); } } diff --git a/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs b/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs index 5540c59322a..c9e7e82e823 100644 --- a/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs +++ b/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs @@ -32,15 +32,21 @@ public class EnvironmentLibrary : ScriptableObject /// The created Environment public Environment Add() { + Undo.SetCurrentGroupName("Add Environment"); + int group = Undo.GetCurrentGroup(); + Environment environment = ScriptableObject.CreateInstance(); environment.name = "New Environment"; Undo.RegisterCreatedObjectUndo(environment, "Add Environment"); + Undo.RecordObject(this, "Add Environment"); environments.Add(environment); // Store this new environment as a subasset so we can reference it safely afterwards. AssetDatabase.AddObjectToAsset(environment, this); + Undo.CollapseUndoOperations(group); + // Force save / refresh. Important to do this last because SaveAssets can cause effect to become null! EditorUtility.SetDirty(this); AssetDatabase.SaveAssets(); @@ -54,11 +60,16 @@ public Environment Add() /// Index where to remove Environment public void Remove(int index) { + Undo.SetCurrentGroupName("Remove Environment"); + int group = Undo.GetCurrentGroup(); + Environment environment = environments[index]; Undo.RecordObject(this, "Remove Environment"); environments.RemoveAt(index); Undo.DestroyObjectImmediate(environment); + Undo.CollapseUndoOperations(group); + // Force save / refresh EditorUtility.SetDirty(this); AssetDatabase.SaveAssets(); diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 68e59b5fc20..6d0c865f1cd 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -86,6 +86,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - VFX: Removed irrelevant queues in render queue selection from HDRP outputs - VFX: Motion Vector are correctly renderered with MSAA [Case 1240754](https://issuetracker.unity3d.com/product/unity/issues/guid/1240754/) - Fixed a cause of NaN when a normal of 0-length is generated (usually via shadergraph). +- Fixed error when undo a Reflection Probe removal in a prefab instance. (case 1244047) +- Fixed various multi-editing issues when changing Emission parameters. +- Fixed issue that prevented cubemap thumbnails from rendering (only on D3D11 and Metal). ### Changed - Rejecting history for ray traced reflections based on a threshold evaluated on the neighborhood of the sampled history. diff --git a/com.unity.render-pipelines.high-definition/Documentation~/Frame-Settings-API.md b/com.unity.render-pipelines.high-definition/Documentation~/Frame-Settings-API.md new file mode 100644 index 00000000000..6a95b715d56 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Documentation~/Frame-Settings-API.md @@ -0,0 +1,112 @@ +# Frame Settings Scripting API + +In the High Definition Render Pipelines (HDRP), [Frame Settings](Frame-Settings.md) control how a rendering component, such as a [Camera](HDRP-Camera.md), [Reflection Probe](Reflection-Probe.md), or [Planar Reflection Probe](Planar-Reflection-Probe.md), renders a Scene. You can specify default Frame Settings for your entire Project and then override them for a particular rendering component. This means that each Frame Setting has a default value, set in the [HDRP Asset](HDRP-Asset.md), then each individual rendering component in your Scene can have an override for it. This is useful if you have lower priority rendering components that do not need to use certain effects. To specify which default Frame Settings a rendering component overrides, each rendering component contains an [override mask](../api/UnityEngine.Rendering.HighDefinition.FrameSettingsOverrideMask.html). A mask is an array of bits, where each bit represents one of two states (0 for disabled and 1 for enabled). Each bit in the override mask represents the override state of a particular Frame Setting. + +To get the final value of a Frame Setting for a particular rendering component, HDRP performs the following steps: + +1. Checks the Project-wide default value for the Frame Setting. In this step, HDRP checks the current value stored for the Frame Setting in the HDRP Asset. +2. Checks the rendering component's override mask to see if the bit that corresponds to the Frame Setting is set. The state of the Frame Setting's bit in the override mask corresponds to the state of the override checkbox to the left of the Frame Setting in the rendering component's Inspector. +3. Gets the Frame Setting's override value from the rendering component's custom Frame Settings. +4. Sanitizes the result. To lighten your Project, you can specify which features to use in the HDRP Asset. If the Frame Setting you try to modify affects an unavailable feature, Unity discards it in this final sanitization pass. To make sure it is not possible for HDRP to process features that are not available, you cannot access the sanitization process via scripting API. + +## Modifying default Frame Settings + +The Default Frame Settings are in the HDRP Asset, so it is not good practice to modify them at runtime. Instead, you can modify them in Edit mode in [Default Settings tab](Default-Settings-Window.md). + +Note that you can set individual default Frame Settings for three types of rendering component: + +- Cameras +- Realtime Reflection Probes and Realtime Planar Reflection Probes +- Baked/custom Reflection Probes and Baked/custom Planar Reflection Probe + +There is currently no scripting API to modify default Frame Settings. + +## Modifying Frame Settings for a particular rendering component + +HDRP stores the Frame Settings for rendering components in additional data components attached to the rendering component. The additional data components are: + +| **Rendering component** | **Additional data component** | +| ----------------------- | ----------------------------- | +| **Camera** | HDAdditionalCameraData | +| **Reflection Probe** | HDAdditionalReflectionData | + +To modify the value of a Frame Setting, the first step is to get a reference to the additional data component. To do this, either create a public variable and assign it in the Inspector, or use [GetComponent()](https://docs.unity3d.com/ScriptReference/GameObject.GetComponent.html) where T is the additional data component type. + +Next, access the Frame Settings override mask. This controls which Frame Settings to use overridden values for and is of type `FrameSettingsOverrideMask`. Accessing the Frame Settings override mask is different depending on whether you want to modify the Frame Settings of a Camera or a Reflection Probe: + +- **Camera**: `HDAdditionalCameraData.renderingPathCustomFrameSettingsOverrideMask` +- **Reflection Probe**: `HDAdditionalReflectionData.frameSettingsOverrideMask` + +For information on the API available for `FrameSettingsOverrideMask`, including how to set/unset a bit in the mask, see [FrameSettingsOverrideMask Scripting API](#framesettingsoverridemask-scripting-api). + +Finally, access the Frame Settings structure itself. This controls the actual value for each Frame Setting and is of type `FrameSettings`. Accessing the Frame Settings is also different depending on whether you want to modify the Frame Settings of a Camera or a Reflection Probe: + +- **Camera**: `HDAdditionalCameraData.renderingPathCustomFrameSettings` +- **Reflection Probe**: `HDAdditionalReflectionData.frameSettings` + +For information on the API available for `FrameSettings`, including how to edit the value of a Frame Setting, see [FrameSettings Scripting API](framesettings-scripting-api). + +## Frame Setting enumerations + +To make it easier to set the value of some Frame Settings, HDRP provides the following enum types. + +### LitShaderMode + +An enum which helps to switch a rendering component between deferred and forward rendering. + +For information on what each enum value does, see [LitShaderMode](../api/UnityEngine.Rendering.HighDefinition.LitShaderMode.html). + +### LODBiasMode + +An enum which defines how HDRP calculates a LOD bias. + +For information on what each enum value does, see [LODBiasMode](../api/UnityEngine.Rendering.HighDefinition.LODBiasMode.html). + +### MaximumLODLevelMode + +An enum which defines how HDRP calculates the maximum LOD level. + +For information on what each enum value does, see [MaximumLODLevelMode](../api/UnityEngine.Rendering.HighDefinition.MaximumLODLevelMode.html). + +### FrameSettingsField + +An enum where each entry represents a particular Frame Setting. For a list of entries in this enum, see [FrameSettingsField](../api/UnityEngine.Rendering.HighDefinition.FrameSettingsField.html). + +As well as an entry for each Frame Settings, this enum also includes the value `FrameSettingsField.None` that is set to **-1** for convenience and internal usage. + +## FrameSettingsOverrideMask Scripting API + +This is a structure that has a single field which stores the override mask. For more information about this structure and the API it contains, see [FrameSettingsOverrideMask](../api/UnityEngine.Rendering.HighDefinition.FrameSettingsOverrideMask.html). + +In the override mask, to allow you to easily access the bit for a given Frame Setting, HDRP provides the [FrameSettingsField](#framesettingsfield) enum. You can use this, for example, to find the bit responsible for overriding the **Opaque Objects** Frame Setting. To do this, you would do `this[(int)FrameSettingsField.OpaqueObjects]`. + +The following example shows how to compare the `humanizedData` from a rendering component's override mask with the rendering component's custom Frame Settings. There are some custom Frame Settings set, but the mask is all zeros which means that this rendering component uses the default Frame Settings. + +![](Images/FrameSettingsAPI-watch.png) + +## FrameSettings Scripting API + +This is a structure that contains information on how a rendering component should render the Scene. For more information about this structure and the API it contains, see [FrameSettings](../api/UnityEngine.Rendering.HighDefinition.FrameSettings.html). + +### Example + +The following example demonstrates a component that changes a Camera's Frame Settings so the Camera does not render opaque GameObjects. It has the public field `cameraToChange`, which represents the Camera to change the Frame Settings for, and the public function `RemoveOpaqueObjectsFromRendering`, which contains the logic to change the Camera's Frame Settings. + +``` +using UnityEngine; +using UnityEngine.Rendering.HighDefinition; + +public class ChangeFrameSettings : MonoBehaviour +{ + public Camera cameraToChange; + + public void RemoveOpaqueObjectsFromRendering() + { + HDAdditionalCameraData hdCameraData = cameraToChange.GetComponent(); + + hdCameraData.renderingPathCustomFrameSettingsOverrideMask.mask[(int)FrameSettingsField.OpaqueObjects] = true; + + hdCameraData.renderingPathCustomFrameSettings.SetEnabled(FrameSettingsField.OpaqueObjects, false); + } +} +``` \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Documentation~/Images/FrameSettingsAPI-watch.png b/com.unity.render-pipelines.high-definition/Documentation~/Images/FrameSettingsAPI-watch.png new file mode 100644 index 00000000000..7b6000f35dd --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Documentation~/Images/FrameSettingsAPI-watch.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e025291d565a2ce695ac45c8dc00c59c74ba0750da440e86245d4878c9b40a8b +size 9502 diff --git a/com.unity.render-pipelines.high-definition/Documentation~/System-Requirements.md b/com.unity.render-pipelines.high-definition/Documentation~/System-Requirements.md new file mode 100644 index 00000000000..d8f06030ca6 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Documentation~/System-Requirements.md @@ -0,0 +1,37 @@ +# Requirements and compatibility + +This page contains information on system requirements and compatibility of the High Definition Render Pipeline (HDRP) package. + +## Unity Editor compatibility + +The following table shows the compatibility of the High Definition Render Pipeline (HDRP) versions with different Unity Editor versions. + +| **Package version** | **Minimum Unity version** | **Maximum Unity version** | +| ------------------- | ------------------------- | ------------------------- | +| 10.x | 2020.2 | 2020.2 | +| 8.x / 9.x-preview | 2020.1 | 2020.1 | +| 7.x | 2019.3 | 2019.4 | +| 6.x | 2019.2 | 2019.2 | + +## Render pipeline compatibility + +Projects made using HDRP are not compatible with the Universal Render Pipeline (URP) or the Built-in Render Pipeline. Before you start development, you must decide which render pipeline to use in your Project. For information on choosing a render pipeline, see the [Render Pipelines](https://docs.unity3d.com/2019.3/Documentation/Manual/render-pipelines.html) section of the Unity Manual. + +## Unity Player system requirements + +This section describes the HDRP package’s target platform requirements. For platforms or use cases not covered in this section, general system requirements for the Unity Player apply. + +For more information, see [System requirements for Unity](https://docs.unity3d.com/Manual/system-requirements.html). + +HRDP is only compatible with the following platforms: + +- Windows and Windows Store, with DirectX 11 or DirectX 12 and Shader Model 5.0 +- Modern consoles (Sony PS4 and Microsoft Xbox One) +- MacOS (minimum version 10.13) using Metal graphics +- Linux and Windows platforms with Vulkan + +**Note: HDRP only works on these platforms if the device used supports Compute Shaders. HDRP does not support OpenGL or OpenGL ES devices.** + +### Ray tracing + +To use ray tracing in HDRP, there are hardware requirements you must meet. For information on these requirements, see [Getting started with ray tracing](Ray-Tracing-Getting-Started.md#HardwareRequirements). diff --git a/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md b/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md index 967712e4a3b..35655a3321b 100644 --- a/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md +++ b/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md @@ -3,6 +3,7 @@ * [Features List](HDRP-Features) * [Comparison with the Built-in Render Pipeline](Feature-Comparison) * Getting started + * [System Requirements](System-Requirements.md) * [Getting Started with HDRP](Getting-started-with-HDRP) * [Upgrading to HDRP](Upgrading-To-HDRP) * [Render Pipeline Wizard](Render-Pipeline-Wizard) @@ -152,5 +153,6 @@ * [Creating a Custom Sky](Creating-a-Custom-Sky) * [Creating a Custom Post-Process Effect](Custom-Post-Process) * [Creating a Custom Render Pass](Custom-Pass) + * [Editing Frame Settings at Runtime](Frame-Settings-API.md) * [HDRP Glossary](Glossary) * [Known Issues and How To Fix Them](Known-Issues) diff --git a/com.unity.render-pipelines.high-definition/Documentation~/index.md b/com.unity.render-pipelines.high-definition/Documentation~/index.md index b041030e01d..b066920f5ad 100644 --- a/com.unity.render-pipelines.high-definition/Documentation~/index.md +++ b/com.unity.render-pipelines.high-definition/Documentation~/index.md @@ -10,13 +10,4 @@ NOTE: Projects that you make with HDRP are not compatible with the Universal Ren This documentation contains the information you need to create applications using HDRP; including information on Lighting, Materials and Shaders, Cameras, and debugging. -HRDP is only supported on the following platforms: - -* Windows and Windows Store, with DirectX 11 or DirectX 12 and Shader Model 5.0 -* Modern consoles (Sony PS4 and Microsoft Xbox One) -* MacOS using Metal graphics -* Linux and Windows platforms with Vulkan - -**HDRP does not support OpenGL or OpenGL ES devices.** - -**Note: HDRP only works on these platforms if the device used supports Compute Shaders.** \ No newline at end of file +For information on platform support and system requirements, see [System Requirements](System-Requirements.md). diff --git a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDCubemapInspector.cs b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDCubemapInspector.cs index edb610fd6e2..48008d8f558 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDCubemapInspector.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDCubemapInspector.cs @@ -233,7 +233,12 @@ public override Texture2D RenderStaticPreview(string assetPath, Object[] subAsse m_PreviewUtility.ambientColor = Color.black; m_PreviewUtility.BeginStaticPreview(new Rect(0, 0, width, height)); m_PreviewUtility.DrawMesh(sphereMesh, Matrix4x4.identity, previewMaterial, 0); - m_PreviewUtility.camera.Render(); + // TODO: For now the following line is D3D11 + Metal only as it cause out of memory on both DX12 and Vulkan API. + // We will need to invest time to understand what is happening + // For now priority is to enable Yamato platform automation + // This mean that cubemap icon will render incorrectly on anything but D3D11 + if(SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D11 || SystemInfo.graphicsDeviceType == GraphicsDeviceType.Metal) + m_PreviewUtility.camera.Render(); var outTexture = m_PreviewUtility.EndStaticPreview(); diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/UIBlocks/EmissionUIBlock.cs b/com.unity.render-pipelines.high-definition/Editor/Material/UIBlocks/EmissionUIBlock.cs index 292ac8ea228..9630d51ad25 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/UIBlocks/EmissionUIBlock.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/UIBlocks/EmissionUIBlock.cs @@ -89,6 +89,31 @@ public override void OnGUI() } } + void UpdateEmissiveColorAndIntensity() + { + materialEditor.serializedObject.ApplyModifiedProperties(); + foreach (Material target in materials) + { + if (target.HasProperty(kEmissiveColorLDR) && target.HasProperty(kEmissiveIntensity) && target.HasProperty(kEmissiveColor)) + { + target.SetColor(kEmissiveColor, target.GetColor(kEmissiveColorLDR) * target.GetFloat(kEmissiveIntensity)); + } + } + materialEditor.serializedObject.Update(); + } + + void UpdateEmissionUnit(float newUnitFloat) + { + foreach (Material target in materials) + { + if (target.HasProperty(kEmissiveIntensityUnit) && target.HasProperty(kEmissiveIntensity)) + { + target.SetFloat(kEmissiveIntensityUnit, newUnitFloat); + } + } + materialEditor.serializedObject.Update(); + } + void DrawEmissionGUI() { EditorGUI.BeginChangeCheck(); @@ -106,35 +131,85 @@ void DrawEmissionGUI() else { EditorGUI.BeginChangeCheck(); + DoEmissiveTextureProperty(emissiveColorLDR); + // Normalize all emissive colors for each target separately + foreach (Material material in materials) { - DoEmissiveTextureProperty(emissiveColorLDR); - emissiveColorLDR.colorValue = NormalizeEmissionColor(ref updateEmissiveColor, emissiveColorLDR.colorValue); + if (material.HasProperty(kEmissiveColorLDR)) + material.SetColor(kEmissiveColorLDR, NormalizeEmissionColor(ref updateEmissiveColor, material.GetColor(kEmissiveColorLDR))); + } + if (EditorGUI.EndChangeCheck() || updateEmissiveColor) + UpdateEmissiveColorAndIntensity(); + float newUnitFloat; + float newIntensity = emissiveIntensity.floatValue; + bool unitIsMixed = emissiveIntensityUnit.hasMixedValue; + bool intensityIsMixed = unitIsMixed || emissiveIntensity.hasMixedValue; + bool intensityChanged = false; + bool unitChanged = false; + EditorGUI.BeginChangeCheck(); + { using (new EditorGUILayout.HorizontalScope()) { EmissiveIntensityUnit unit = (EmissiveIntensityUnit)emissiveIntensityUnit.floatValue; + EditorGUI.showMixedValue = intensityIsMixed; if (unit == EmissiveIntensityUnit.Nits) { using (var change = new EditorGUI.ChangeCheckScope()) { materialEditor.ShaderProperty(emissiveIntensity, Styles.emissiveIntensityText); - if (change.changed) - emissiveIntensity.floatValue = Mathf.Clamp(emissiveIntensity.floatValue, 0, float.MaxValue); + intensityChanged = change.changed; + if (intensityChanged) + newIntensity = Mathf.Clamp(emissiveIntensity.floatValue, 0, float.MaxValue); } } else { - float evValue = LightUtils.ConvertLuminanceToEv(emissiveIntensity.floatValue); - evValue = EditorGUILayout.FloatField(Styles.emissiveIntensityText, evValue); - evValue = Mathf.Clamp(evValue, 0, float.MaxValue); - emissiveIntensity.floatValue = LightUtils.ConvertEvToLuminance(evValue); + float value = emissiveIntensity.floatValue; + if (!intensityIsMixed) + { + float evValue = LightUtils.ConvertLuminanceToEv(emissiveIntensity.floatValue); + evValue = EditorGUILayout.FloatField(Styles.emissiveIntensityText, evValue); + newIntensity = Mathf.Clamp(evValue, 0, float.MaxValue); + emissiveIntensity.floatValue = LightUtils.ConvertEvToLuminance(evValue); + } + else + { + using (var change = new EditorGUI.ChangeCheckScope()) + { + newIntensity = EditorGUILayout.FloatField(Styles.emissiveIntensityText, value); + intensityChanged = change.changed; + } + } + } + EditorGUI.showMixedValue = false; + + EditorGUI.showMixedValue = emissiveIntensityUnit.hasMixedValue; + using (var change = new EditorGUI.ChangeCheckScope()) + { + newUnitFloat = (float)(EmissiveIntensityUnit)EditorGUILayout.EnumPopup(unit); + unitChanged = change.changed; } - emissiveIntensityUnit.floatValue = (float)(EmissiveIntensityUnit)EditorGUILayout.EnumPopup(unit); + EditorGUI.showMixedValue = false; } } if (EditorGUI.EndChangeCheck() || updateEmissiveColor) - emissiveColor.colorValue = emissiveColorLDR.colorValue * emissiveIntensity.floatValue; + { + if(unitChanged) + { + if (unitIsMixed) + UpdateEmissionUnit(newUnitFloat); + else + emissiveIntensityUnit.floatValue = newUnitFloat; + } + + // We don't allow changes on intensity if units are mixed + if (intensityChanged && !unitIsMixed) + emissiveIntensity.floatValue = newIntensity; + + UpdateEmissiveColorAndIntensity(); + } } materialEditor.ShaderProperty(emissiveExposureWeight, Styles.emissiveExposureWeightText); diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs index bd41dd2e4e1..8ecc4016043 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs @@ -221,17 +221,8 @@ static void Drawer_SectionCookies(SerializedHDRenderPipelineAsset serialized, Ed { GraphicsFormat cookieFormat = (GraphicsFormat)serialized.renderPipelineSettings.lightLoopSettings.cookieFormat.intValue; long currentCache = PowerOfTwoTextureAtlas.GetApproxCacheSizeInByte(1, serialized.renderPipelineSettings.lightLoopSettings.cookieAtlasSize.intValue, true, cookieFormat); - if (currentCache > HDRenderPipeline.k_MaxCacheSize) - { - int reserved = PowerOfTwoTextureAtlas.GetMaxCacheSizeForWeightInByte(HDRenderPipeline.k_MaxCacheSize, true, cookieFormat); - string message = string.Format(Styles.cacheErrorFormat, HDEditorUtils.HumanizeWeight(currentCache), reserved); - EditorGUILayout.HelpBox(message, MessageType.Error); - } - else - { - string message = string.Format(Styles.cacheInfoFormat, HDEditorUtils.HumanizeWeight(currentCache)); - EditorGUILayout.HelpBox(message, MessageType.Info); - } + string message = string.Format(Styles.cacheInfoFormat, HDEditorUtils.HumanizeWeight(currentCache)); + EditorGUILayout.HelpBox(message, MessageType.Info); } EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(serialized.renderPipelineSettings.lightLoopSettings.cookieAtlasLastValidMip, Styles.cookieAtlasLastValidMipContent); @@ -301,17 +292,8 @@ static void Drawer_SectionReflection(SerializedHDRenderPipelineAsset serialized, else { long currentCache = PlanarReflectionProbeCache.GetApproxCacheSizeInByte(1, serialized.renderPipelineSettings.lightLoopSettings.planarReflectionAtlasSize.intValue, GraphicsFormat.R16G16B16A16_UNorm); - if (currentCache > HDRenderPipeline.k_MaxCacheSize) - { - int reserved = PlanarReflectionProbeCache.GetMaxCacheSizeForWeightInByte(HDRenderPipeline.k_MaxCacheSize, GraphicsFormat.R16G16B16A16_UNorm); - string message = string.Format(Styles.cacheErrorFormat, HDEditorUtils.HumanizeWeight(currentCache), reserved); - EditorGUILayout.HelpBox(message, MessageType.Error); - } - else - { - string message = string.Format(Styles.cacheInfoFormat, HDEditorUtils.HumanizeWeight(currentCache)); - EditorGUILayout.HelpBox(message, MessageType.Info); - } + string message = string.Format(Styles.cacheInfoFormat, HDEditorUtils.HumanizeWeight(currentCache)); + EditorGUILayout.HelpBox(message, MessageType.Info); } EditorGUILayout.PropertyField(serialized.renderPipelineSettings.lightLoopSettings.maxPlanarReflectionOnScreen, Styles.maxPlanarReflectionOnScreen); diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightCookieManager.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightCookieManager.cs index 8de7e0f0406..d551020e17c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightCookieManager.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightCookieManager.cs @@ -63,9 +63,6 @@ public LightCookieManager(HDRenderPipelineAsset hdAsset, int maxCacheSize) cookieFormat = (GraphicsFormat)gLightLoopSettings.cookieFormat; cookieAtlasLastValidMip = gLightLoopSettings.cookieAtlasLastValidMip; - if (PowerOfTwoTextureAtlas.GetApproxCacheSizeInByte(1, cookieAtlasSize, true, cookieFormat) > HDRenderPipeline.k_MaxCacheSize) - cookieAtlasSize = PowerOfTwoTextureAtlas.GetMaxCacheSizeForWeightInByte(HDRenderPipeline.k_MaxCacheSize, true, cookieFormat); - m_CookieAtlas = new PowerOfTwoTextureAtlas(cookieAtlasSize, gLightLoopSettings.cookieAtlasLastValidMip, cookieFormat, name: "Cookie Atlas (Punctual Lights)", useMipMap: true); m_CubeToPanoMaterial = CoreUtils.CreateEngineMaterial(hdResources.shaders.cubeToPanoPS); diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDAdditionalReflectionData.Legacy.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDAdditionalReflectionData.Legacy.cs index 1b979ba2b23..1f446401766 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDAdditionalReflectionData.Legacy.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Reflection/HDAdditionalReflectionData.Legacy.cs @@ -30,6 +30,16 @@ public override void PrepareCulling() var tr = transform; var position = tr.position; var cubeProbe = reflectionProbe; + + if (cubeProbe == null || cubeProbe.Equals(null)) + { + // case 1244047 + // This can happen when removing the component from the editor and then undo the remove. + // The order of call maybe incorrect and the code flows here before the reflection probe + // is restored. + return; + } + switch (influence.shape) { case InfluenceShape.Box: