From d29bc67db435c74b1d215c00e0853b66def97fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Slysz?= Date: Mon, 29 Apr 2024 16:46:20 +0000 Subject: [PATCH 01/67] [URP] Fix in use renderer destruction from other UniversalRPAsset inspector Some fields use shared data through different renderer instances. Was not able to produce it on my computer at all, but was able to produce it on Kirill ones and we pair debugged it on 6000. The root of issue is in the end that the Renderer is shared between the RPAsset in use and the RPAsset edited through the inspector. To assess the compatibility of the renderer, it need to be constructed again with the current architecture. And then when the inspector is modified we destroy the constructed copy. It could have work but they share some data that got destroyed and caused the null reference if the rendering occures between shared data is recreated. Note that the architecture is as is since the implementation of Renderer as an asset. So changing anything here is really touchy. Aggregated test seems to be green but this _require extended QA tests_. --- .../Runtime/Data/UniversalRenderPipelineAsset.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs index b4d4e849c71..b7ee71c8711 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs @@ -832,18 +832,6 @@ void DestroyRenderer(ref ScriptableRenderer renderer) } } - /// - /// Unity calls this function when it loads the asset or when the asset is changed with the Inspector. - /// - protected override void OnValidate() - { - DestroyRenderers(); - - // This will call RenderPipelineManager.CleanupRenderPipeline that in turn disposes the render pipeline instance and - // assign pipeline asset reference to null - base.OnValidate(); - } - /// /// Unity calls this function when the asset is disabled. /// From 7378bc45ef089d9b689aeac7f85fbef32f20857e Mon Sep 17 00:00:00 2001 From: Adrien de Tocqueville Date: Mon, 29 Apr 2024 16:46:31 +0000 Subject: [PATCH 02/67] [APV] Bunch of bugfixes * Significant performance optimization for loading scenes. On the avalanche demo scene, APV loading goes from **15 minutes** to a few seconds. * Fixed subdivision that would create bricks of unwanted subdivision level when using the max amount of subdivisions. * Fixed file writing error occuring randomly that would make the bake result not be written to disk * Fixed validity sampling not taking light layers into account * Fixed rounding error in probe volume sampling * Fixed floating point issue when computing the size of cells during baking which would lead to asserts during runtime * Minor optimization of runtime sampling code * Fixed error with sample gi node in builtin * Improve debug views by adding NdotL to probes --- .../ProbeVolume/ProbeGIBaking.Invalidation.cs | 2 +- .../ProbeVolume/ProbeGIBaking.Placement.cs | 2 +- .../Lighting/ProbeVolume/ProbePlacement.cs | 5 +- .../ShaderGenerator/ShaderTypeGeneration.cs | 8 +- .../Debug/ProbeVolumeDebugFunctions.hlsl | 3 +- .../ProbeVolumeBakingSet.Editor.cs | 4 +- .../ShaderVariablesProbeVolumes.cs | 3 +- .../ShaderVariablesProbeVolumes.cs.hlsl | 1 + .../Reflection/HDBakedReflectionSystem.cs | 189 +++++++++--------- .../Sky/HDLightingWindowEnvironmentSection.cs | 11 +- .../Runtime/Sky/StaticLightingSky.cs | 4 + 11 files changed, 130 insertions(+), 102 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Invalidation.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Invalidation.cs index 842bd04247e..842f2a857b4 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Invalidation.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Invalidation.cs @@ -15,7 +15,7 @@ internal static Vector3Int GetSampleOffset(int i) return new Vector3Int(i & 1, (i >> 1) & 1, (i >> 2) & 1); } - const float k_MinValidityForLeaking = 0.05f; + const float k_MinValidityForLeaking = APVDefinitions.probeValidityThreshold; internal static uint PackValidity(float[] validity) { diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Placement.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Placement.cs index fd14e0aa31b..36b15a79f96 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Placement.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.Placement.cs @@ -314,7 +314,7 @@ static internal ProbeSubdivisionResult BakeBricks(ProbeSubdivisionContext ctx, i if (filteredContributors.Count == 0 && !overlappingProbeVolumes.Any(v => v.component.fillEmptySpaces)) continue; - var bricks = ProbePlacement.SubdivideCell(cell.bounds, ctx, gpuResources, filteredContributors, overlappingProbeVolumes); + var bricks = ProbePlacement.SubdivideCell(cell.position, cell.bounds, ctx, gpuResources, filteredContributors, overlappingProbeVolumes); if (bricks.Length == 0) continue; diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs index 91648519177..931edf3dc6c 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbePlacement.cs @@ -204,7 +204,7 @@ static Material voxelizeMaterial } } - public static Brick[] SubdivideCell(Bounds cellBounds, ProbeSubdivisionContext subdivisionCtx, GPUSubdivisionContext ctx, GIContributors contributors, List<(ProbeVolume component, ProbeReferenceVolume.Volume volume, Bounds bounds)> probeVolumes) + public static Brick[] SubdivideCell(Vector3Int cellPosition, Bounds cellBounds, ProbeSubdivisionContext subdivisionCtx, GPUSubdivisionContext ctx, GIContributors contributors, List<(ProbeVolume component, ProbeReferenceVolume.Volume volume, Bounds bounds)> probeVolumes) { Brick[] finalBricks; HashSet brickSet = new HashSet(); @@ -279,6 +279,7 @@ public static Brick[] SubdivideCell(Bounds cellBounds, ProbeSubdivisionContext s // In case there is at least one brick in the sub-cell, we need to spawn the parent brick. if (hasMaxSizedBricks) { + int cellSizeInBricks = ProbeReferenceVolume.CellSize(ctx.maxSubdivisionLevel); float minBrickSize = subdivisionCtx.profile.minBrickSize; Vector3 cellID = cellBounds.min / minBrickSize; float parentSubdivLevel = 3.0f; @@ -288,7 +289,7 @@ public static Brick[] SubdivideCell(Bounds cellBounds, ProbeSubdivisionContext s // Add the sub-cell offset: int brickSize = (int)Mathf.Pow(3, i + 1); Vector3Int subCellPosInt = new Vector3Int(Mathf.FloorToInt(subCellPos.x), Mathf.FloorToInt(subCellPos.y), Mathf.FloorToInt(subCellPos.z)) * brickSize; - Vector3Int parentSubCellPos = new Vector3Int(Mathf.RoundToInt(cellID.x), Mathf.RoundToInt(cellID.y), Mathf.RoundToInt(cellID.z)) + subCellPosInt; + Vector3Int parentSubCellPos = cellPosition * cellSizeInBricks + subCellPosInt; // Find the corner in bricks of the parent volume: brickSet.Add(new Brick(parentSubCellPos, i + 1)); diff --git a/Packages/com.unity.render-pipelines.core/Editor/ShaderGenerator/ShaderTypeGeneration.cs b/Packages/com.unity.render-pipelines.core/Editor/ShaderGenerator/ShaderTypeGeneration.cs index 8a27910ee99..4898ad33afb 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/ShaderGenerator/ShaderTypeGeneration.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/ShaderGenerator/ShaderTypeGeneration.cs @@ -1129,7 +1129,13 @@ public bool Generate() name = name.Substring(2); } string defineName = name.ToUpper(); - m_Statics[defineName] = field.GetValue(null).ToString(); + string value; + if (fieldType == typeof(float)) + value = ((float)field.GetValue(null)).ToString(System.Globalization.CultureInfo.InvariantCulture); + else + value = field.GetValue(null).ToString(); + + m_Statics[defineName] = value; } continue; } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debug/ProbeVolumeDebugFunctions.hlsl b/Packages/com.unity.render-pipelines.core/Runtime/Debug/ProbeVolumeDebugFunctions.hlsl index cbb9831a05f..6c6340cf31d 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debug/ProbeVolumeDebugFunctions.hlsl +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debug/ProbeVolumeDebugFunctions.hlsl @@ -93,7 +93,8 @@ else if (_ShadingMode == DEBUGPROBESHADINGMODE_VALIDITY) { float validity = UNITY_ACCESS_INSTANCED_PROP(Props, _Validity); - return lerp(float4(0, 1, 0, 1), float4(1, 0, 0, 1), validity); + float threshold = PROBE_VALIDITY_THRESHOLD; + return lerp(float4(0, 1, 0, 1), float4(1, 0, 0, 1), validity > threshold); } else if (_ShadingMode == DEBUGPROBESHADINGMODE_VALIDITY_OVER_DILATION_THRESHOLD) { diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs index 31a699aa6b0..26fdca19124 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs @@ -422,9 +422,9 @@ static internal int MaxSubdivLevelInProbeVolume(Vector3 volumeSize, int maxSubdi { float maxSizedDim = Mathf.Max(volumeSize.x, Mathf.Max(volumeSize.y, volumeSize.z)); float maxSideInBricks = maxSizedDim / ProbeReferenceVolume.instance.MinDistanceBetweenProbes(); - int subdiv = Mathf.FloorToInt(Mathf.Log(maxSideInBricks, 3)) - 1; + int subdiv = Mathf.FloorToInt(Mathf.Log(maxSideInBricks, 3)); - return Mathf.Min(subdiv, maxSubdiv); + return Mathf.Max(subdiv, maxSubdiv) - 1; } static void InflateBound(ref Bounds bounds, ProbeVolume pv) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs index e3cbec01191..9f6bab388dd 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs @@ -6,8 +6,9 @@ namespace UnityEngine.Rendering class APVDefinitions { public static int probeIndexChunkSize = ProbeBrickIndex.kIndexChunkSize; - public static int probeMaxRegionCount = 4; + public const float probeValidityThreshold = 0.05f; + public static int probeMaxRegionCount = 4; public static Color32[] layerMaskColors = new Color32[] { new Color32(230, 159, 0, 255), new Color32(0, 158, 115, 255), diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs.hlsl b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs.hlsl index 48b10197867..fa4090416a1 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs.hlsl +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ShaderVariablesProbeVolumes.cs.hlsl @@ -15,6 +15,7 @@ // UnityEngine.Rendering.APVDefinitions: static fields // #define PROBE_INDEX_CHUNK_SIZE (243) +#define PROBE_VALIDITY_THRESHOLD (0.05) #define PROBE_MAX_REGION_COUNT (4) // Generated from UnityEngine.Rendering.ShaderVariablesProbeVolumes diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs index ebf9ee76495..a8016dff51a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDBakedReflectionSystem.cs @@ -5,6 +5,7 @@ using System.Reflection; using Unity.Collections.LowLevel.Unsafe; using UnityEditor.VersionControl; +using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Assertions; @@ -23,8 +24,8 @@ public struct ProbeBakingHash : CoreUnsafeUtils.IKeyGetter(bakedTexturePath); + Assert.IsNotNull(bakedTexture, "The baked texture was imported before, " + + "so it must exists in AssetDatabase"); + + probe.SetTexture(ProbeSettings.Mode.Baked, bakedTexture); + EditorUtility.SetDirty(probe); } AssetDatabase.StopAssetEditing(); } - // Import assets - AssetDatabase.StartAssetEditing(); - for (int i = 0; i < toBakeIndicesList.Count; ++i) - { - var index = toBakeIndicesList.GetUnchecked(i); - var instanceId = states[index].instanceID; - var probe = (HDProbe)EditorUtility.InstanceIDToObject(instanceId); - if (string.IsNullOrEmpty(probe.gameObject.scene.path)) - continue; - - var bakedTexturePath = HDBakingUtilities.GetBakedTextureFilePath(probe); - var bakedTexture = AssetDatabase.LoadAssetAtPath(bakedTexturePath); - Assert.IsNotNull(bakedTexture, "The baked texture was imported before, " + - "so it must exists in AssetDatabase"); - - probe.SetTexture(ProbeSettings.Mode.Baked, bakedTexture); - EditorUtility.SetDirty(probe); - } - AssetDatabase.StopAssetEditing(); // == 5. == @@ -680,7 +691,7 @@ internal static void RenderAndWriteToFile(HDProbe probe, string targetFile, Rend { Debug.Assert(probeRT.dimension == TextureDimension.Cube); - var positionSettings = ProbeCapturePositionSettings.ComputeFrom(probe, null); + var positionSettings = ProbeCapturePositionSettings.ComputeFrom(probe, null); HDRenderUtilities.Render(probe.settings, positionSettings, probeRT, out cameraSettings, out cameraPositionSettings, forceFlipY: true, @@ -798,27 +809,21 @@ static void ComputeProbeInstanceID(IEnumerable probes, HDProbeBakingSta } } - static void ComputeProbeSettingsHashes(IEnumerable probes, HDProbeBakingState* states) + static void ComputeProbeBakingHashes(IEnumerable probes, Hash128 allProbeDependencyHash, Hash128 reflectionBouncesHash, HDProbeBakingState* states) { var i = 0; foreach (var probe in probes) { var positionSettings = ProbeCapturePositionSettings.ComputeFrom(probe, null); var positionSettingsHash = positionSettings.ComputeHash(); - // TODO: make ProbeSettings and unmanaged type so its hash can be the hash of its memory var probeSettingsHash = probe.settings.ComputeHash(); - HashUtilities.AppendHash(ref positionSettingsHash, ref probeSettingsHash); - states[i].probeSettingsHash = probeSettingsHash; - ++i; - } - } - static void ComputeProbeBakingHashes(int count, Hash128 allProbeDependencyHash, HDProbeBakingState* states) - { - for (int i = 0; i < count; ++i) - { - states[i].probeBakingHash = states[i].probeSettingsHash; - HashUtilities.ComputeHash128(ref allProbeDependencyHash, ref states[i].probeBakingHash); + HashUtilities.AppendHash(ref positionSettingsHash, ref states[i].probeBakingHashNoBounce); + HashUtilities.AppendHash(ref allProbeDependencyHash, ref states[i].probeBakingHashNoBounce); + + states[i].probeBakingHash = states[i].probeBakingHashNoBounce; + HashUtilities.AppendHash(ref reflectionBouncesHash, ref states[i].probeBakingHash); + ++i; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/HDLightingWindowEnvironmentSection.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/HDLightingWindowEnvironmentSection.cs index 3e8ac5b2c3f..3a38e9109e0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/HDLightingWindowEnvironmentSection.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/HDLightingWindowEnvironmentSection.cs @@ -34,6 +34,8 @@ class SerializedStaticLightingSky public SerializedProperty skyUniqueID; public SerializedProperty cloudUniqueID; public SerializedProperty volumetricCloudsToggle; + public SerializedProperty numberOfBounces; + public VolumeProfile volumeProfile { get => (serializedObject.targetObject as StaticLightingSky).profile; @@ -46,6 +48,7 @@ public SerializedStaticLightingSky(StaticLightingSky staticLightingSky) skyUniqueID = serializedObject.FindProperty("m_StaticLightingSkyUniqueID"); cloudUniqueID = serializedObject.FindProperty("m_StaticLightingCloudsUniqueID"); volumetricCloudsToggle = serializedObject.FindProperty("m_StaticLightingVolumetricClouds"); + numberOfBounces = serializedObject.FindProperty("bounces"); } public void Apply() => serializedObject.ApplyModifiedProperties(); @@ -94,7 +97,7 @@ public override void OnDisable() void OnActiveSceneChange(Scene current, Scene next) => m_SerializedActiveSceneLightingSky = new SerializedStaticLightingSky(GetStaticLightingSkyForScene(next)); - StaticLightingSky GetStaticLightingSkyForScene(Scene scene) + static internal StaticLightingSky GetStaticLightingSkyForScene(Scene scene) { StaticLightingSky result = null; foreach (var go in scene.GetRootGameObjects()) @@ -205,6 +208,12 @@ void DrawGUI() EditorGUILayout.PropertyField(m_SerializedActiveSceneLightingSky.volumetricCloudsToggle, EditorGUIUtility.TrTextContent("Static Lighting Volumetric Clouds", "Specify if volumetric clouds should be used for static ambient in the referenced profile for active scene.")); } + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("Reflection Probes"); + using (new EditorGUI.IndentLevelScope()) + EditorGUILayout.PropertyField(m_SerializedActiveSceneLightingSky.numberOfBounces); + --EditorGUI.indentLevel; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/StaticLightingSky.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/StaticLightingSky.cs index db6512ec698..ee04eea0f21 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/StaticLightingSky.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/StaticLightingSky.cs @@ -37,6 +37,10 @@ public class StaticLightingSky : MonoBehaviour VolumetricClouds m_VolumetricClouds; VolumetricClouds m_VolumetricCloudSettingsFromProfile; + // Reflection Probes + [SerializeField, Range(1, 5), Tooltip("Controls how many times a reflection includes other reflections. A value of 1 results in the Scene being rendered once so mirrored reflections will be black.")] + internal int bounces = 1; + internal SkySettings skySettings { get From 3e88f98d49b83b9345bd29c3c694011db0508e06 Mon Sep 17 00:00:00 2001 From: Antoine Cohade Date: Mon, 29 Apr 2024 17:25:20 +0000 Subject: [PATCH 03/67] Fix bug with non square cached shadow atlas and remove redundant blits This fixes a bug where Blit scale was incorrectly computed assuming a square shadow atlas (e.g. width == height). While fixing this issue, I also noticed that we were redundantly bliting the cached shadows since the introduction of HDShadowRequestsUpdateJob.cs (l. 189 shadowManager.cascadeShadowAtlas.mixedRequestsPendingBlits.Add(shadowRequestSetHandle[index]); ) : ![image](https://media.github.cds.internal.unity3d.com/user/5918/files/35a3a92e-ebbc-4209-8c96-221b76af0d26) This PR also remove the redundant blit: ![image](https://media.github.cds.internal.unity3d.com/user/5918/files/0aa944a1-1345-4c0c-b417-7d5aea36ecba) --- .../Lighting/Shadow/HDDynamicShadowAtlas.cs | 4 ++-- .../Runtime/Lighting/Shadow/HDShadowManager.cs | 16 ++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDDynamicShadowAtlas.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDDynamicShadowAtlas.cs index 519e26142f7..2afd5bdb1c7 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDDynamicShadowAtlas.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDDynamicShadowAtlas.cs @@ -234,7 +234,7 @@ internal struct ShadowBlitParameters } - public unsafe void BlitCachedIntoAtlas(RenderGraph renderGraph, TextureHandle cachedAtlasTexture, int cachedAtlasSize, Material blitMaterial, string passName, HDProfileId profileID) + public unsafe void BlitCachedIntoAtlas(RenderGraph renderGraph, TextureHandle cachedAtlasTexture, Vector2Int cachedAtlasSize, Material blitMaterial, string passName, HDProfileId profileID) { if (m_MixedRequestsPendingBlits.Length > 0) { @@ -242,7 +242,7 @@ public unsafe void BlitCachedIntoAtlas(RenderGraph renderGraph, TextureHandle ca { passData.requestsWaitingBlits = m_MixedRequestsPendingBlits; passData.blitMaterial = blitMaterial; - passData.cachedShadowAtlasSize = new Vector2Int(cachedAtlasSize, cachedAtlasSize); + passData.cachedShadowAtlasSize = cachedAtlasSize; passData.sourceCachedAtlas = builder.ReadTexture(cachedAtlasTexture); passData.atlasTexture = builder.WriteTexture(GetShadowMapDepthTexture(renderGraph)); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.cs index 1ae0aa74fd8..8bd8233abac 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.cs @@ -1316,14 +1316,12 @@ internal void RenderShadows(RenderGraph renderGraph, in ShaderVariablesGlobal gl { // Punctual result.cachedPunctualShadowResult = cachedShadowManager.punctualShadowAtlas.RenderShadows(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Cached Punctual Lights Shadows rendering"); - cachedShadowManager.punctualShadowAtlas.AddBlitRequestsForUpdatedShadows(m_Atlas); BlitCachedShadows(renderGraph, ShadowMapType.PunctualAtlas); result.punctualShadowResult = m_Atlas.RenderShadows(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Punctual Lights Shadows rendering"); if (ShaderConfig.s_AreaLights == 1) { cachedShadowManager.areaShadowAtlas.RenderShadowMaps(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Cached Area Lights Shadows rendering"); - cachedShadowManager.areaShadowAtlas.AddBlitRequestsForUpdatedShadows(m_AreaLightShadowAtlas); BlitCachedShadows(renderGraph, ShadowMapType.AreaLightAtlas); m_AreaLightShadowAtlas.RenderShadowMaps(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Area Light Shadows rendering"); result.areaShadowResult = m_AreaLightShadowAtlas.BlurShadows(renderGraph); @@ -1337,8 +1335,6 @@ internal void RenderShadows(RenderGraph renderGraph, in ShaderVariablesGlobal gl { cachedShadowManager.UpdateDirectionalCacheTexture(renderGraph); cachedShadowManager.directionalLightAtlas.RenderShadows(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Cached Directional Lights Shadows rendering"); - - cachedShadowManager.directionalLightAtlas.AddBlitRequestsForUpdatedShadows(m_CascadeAtlas); } BlitCachedShadows(renderGraph, ShadowMapType.CascadedDirectional); } @@ -1434,26 +1430,26 @@ internal static void BindDefaultShadowGlobalResources(RenderGraph renderGraph) void BlitCachedShadows(RenderGraph renderGraph) { - m_Atlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.punctualShadowAtlas.GetOutputTexture(renderGraph), cachedShadowManager.punctualShadowAtlas.width, m_BlitShadowMaterial, "Blit Punctual Mixed Cached Shadows", HDProfileId.BlitPunctualMixedCachedShadowMaps); + m_Atlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.punctualShadowAtlas.GetOutputTexture(renderGraph), new Vector2Int(cachedShadowManager.punctualShadowAtlas.width, cachedShadowManager.punctualShadowAtlas.height), m_BlitShadowMaterial, "Blit Punctual Mixed Cached Shadows", HDProfileId.BlitPunctualMixedCachedShadowMaps); if (cachedShadowManager.DirectionalHasCachedAtlas()) { - m_CascadeAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.directionalLightAtlas.GetOutputTexture(renderGraph), cachedShadowManager.directionalLightAtlas.width, m_BlitShadowMaterial, "Blit Directional Mixed Cached Shadows", HDProfileId.BlitDirectionalMixedCachedShadowMaps); + m_CascadeAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.directionalLightAtlas.GetOutputTexture(renderGraph), new Vector2Int(cachedShadowManager.directionalLightAtlas.width, cachedShadowManager.directionalLightAtlas.height), m_BlitShadowMaterial, "Blit Directional Mixed Cached Shadows", HDProfileId.BlitDirectionalMixedCachedShadowMaps); } if (ShaderConfig.s_AreaLights == 1) { - m_AreaLightShadowAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.areaShadowAtlas.GetOutputTexture(renderGraph), cachedShadowManager.areaShadowAtlas.width, m_BlitShadowMaterial, "Blit Area Mixed Cached Shadows", HDProfileId.BlitAreaMixedCachedShadowMaps); + m_AreaLightShadowAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.areaShadowAtlas.GetOutputTexture(renderGraph), new Vector2Int(cachedShadowManager.areaShadowAtlas.width, cachedShadowManager.areaShadowAtlas.height), m_BlitShadowMaterial, "Blit Area Mixed Cached Shadows", HDProfileId.BlitAreaMixedCachedShadowMaps); } } void BlitCachedShadows(RenderGraph renderGraph, ShadowMapType shadowAtlas) { if (shadowAtlas == ShadowMapType.PunctualAtlas) - m_Atlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.punctualShadowAtlas.GetOutputTexture(renderGraph), cachedShadowManager.punctualShadowAtlas.width, m_BlitShadowMaterial, "Blit Punctual Mixed Cached Shadows", HDProfileId.BlitPunctualMixedCachedShadowMaps); + m_Atlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.punctualShadowAtlas.GetOutputTexture(renderGraph), new Vector2Int(cachedShadowManager.punctualShadowAtlas.width, cachedShadowManager.punctualShadowAtlas.height), m_BlitShadowMaterial, "Blit Punctual Mixed Cached Shadows", HDProfileId.BlitPunctualMixedCachedShadowMaps); if (shadowAtlas == ShadowMapType.CascadedDirectional && cachedShadowManager.DirectionalHasCachedAtlas()) - m_CascadeAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.directionalLightAtlas.GetOutputTexture(renderGraph), cachedShadowManager.directionalLightAtlas.width, m_BlitShadowMaterial, "Blit Directional Mixed Cached Shadows", HDProfileId.BlitDirectionalMixedCachedShadowMaps); + m_CascadeAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.directionalLightAtlas.GetOutputTexture(renderGraph), new Vector2Int(cachedShadowManager.directionalLightAtlas.width, cachedShadowManager.directionalLightAtlas.height), m_BlitShadowMaterial, "Blit Directional Mixed Cached Shadows", HDProfileId.BlitDirectionalMixedCachedShadowMaps); if (shadowAtlas == ShadowMapType.AreaLightAtlas && ShaderConfig.s_AreaLights == 1) - m_AreaLightShadowAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.areaShadowAtlas.GetShadowMapDepthTexture(renderGraph), cachedShadowManager.areaShadowAtlas.width, m_BlitShadowMaterial, "Blit Area Mixed Cached Shadows", HDProfileId.BlitAreaMixedCachedShadowMaps); + m_AreaLightShadowAtlas.BlitCachedIntoAtlas(renderGraph, cachedShadowManager.areaShadowAtlas.GetShadowMapDepthTexture(renderGraph), new Vector2Int(cachedShadowManager.areaShadowAtlas.width, cachedShadowManager.areaShadowAtlas.height), m_BlitShadowMaterial, "Blit Area Mixed Cached Shadows", HDProfileId.BlitAreaMixedCachedShadowMaps); } } } From 5e1b03a9f377345bd08b005d27c689e3eadc2c47 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Tue, 30 Apr 2024 00:33:29 +0000 Subject: [PATCH 04/67] [VFX/SG] Fix Gradient in blackboard This issue has been introduced with https://github.cds.internal.unity3d.com/unity/unity/pull/38694 landed in 2023.3.0a17 Technically, it wasn't a regression because gradient wasn't available before this version. **Before** ![image](https://media.github.cds.internal.unity3d.com/user/42/files/2cd692dc-d9a7-495a-b1c6-9d046bd437c6) **After** ![image](https://media.github.cds.internal.unity3d.com/user/42/files/c4336250-03f8-4121-abcb-d1bac2ce3316) --- .../Data/Graphs/AbstractShaderProperty.cs | 3 ++- .../VFXSG_Gradient_Repro_69751.unitypackage | 3 +++ ...XSG_Gradient_Repro_69751.unitypackage.meta | 7 ++++++ .../Tests/Editor/VFXCodeGenerationTest.cs | 24 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage.meta diff --git a/Packages/com.unity.shadergraph/Editor/Data/Graphs/AbstractShaderProperty.cs b/Packages/com.unity.shadergraph/Editor/Data/Graphs/AbstractShaderProperty.cs index 2624b8eea1f..2f73ee25a15 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Graphs/AbstractShaderProperty.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Graphs/AbstractShaderProperty.cs @@ -277,7 +277,8 @@ public bool IsObjectType() type == HLSLType._Texture2D || type == HLSLType._Texture3D || type == HLSLType._TextureCube || - type == HLSLType._Texture2DArray; + type == HLSLType._Texture2DArray || + type == HLSLType._CUSTOM; } public string GetValueTypeString() diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage new file mode 100644 index 00000000000..d17c27af77e --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f5063bdedcb3648b3725447544c8c5b3c347844cad2969ec7540306b1be8c89 +size 19250 diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage.meta b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage.meta new file mode 100644 index 00000000000..ce17965b707 --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0d75573d9c78e4d4ba3f31452f2abb80 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXCodeGenerationTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXCodeGenerationTest.cs index 49581d506e3..a156f81ab29 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXCodeGenerationTest.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXCodeGenerationTest.cs @@ -297,5 +297,29 @@ public IEnumerator Combinatory_Collision_Shape() yield return yield; } } + + [UnityTest, Description("UUM-69751")] + public IEnumerator ShaderGraph_With_Gradient_In_Blackboard() + { + var packagePath = "Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/VFXSG_Gradient_Repro_69751.unitypackage"; + AssetDatabase.ImportPackageImmediately(packagePath); + AssetDatabase.SaveAssets(); + yield return null; + + var scenePath = VFXTestCommon.tempBasePath + "Repro_69751.unity"; + SceneManagement.EditorSceneManager.OpenScene(scenePath); + for (int i = 0; i < 4; i++) + yield return null; + + var vfxPath = VFXTestCommon.tempBasePath + "Repro_69751.vfx"; + var objets = AssetDatabase.LoadAllAssetsAtPath(vfxPath); + + var shaders = objets.OfType().ToArray(); + Assert.AreEqual(2u, shaders.Length); + foreach (var shader in shaders) + { + Assert.IsFalse(ShaderUtil.ShaderHasError(shader)); + } + } } } From b233aa51453c1768cf00d1bedbb7c4c3ca878208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Tue, 30 Apr 2024 00:58:12 +0000 Subject: [PATCH 05/67] [Graphics] Preferences quality audit UX Figma: https://www.figma.com/file/09QezXCuo6EramfROpo6R3/Additional-Setting-Audit?type=design&node-id=65-64&mode=design&t=hlS0jj9dAj1gsSEr-0 JIRA: https://jira.unity3d.com/browse/UUM-59559 Before we had per editor visibility and a global state visibility Now we just have one setting that is applied everywhere: ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/a33da607-0421-48ba-b986-9c8a53b58460) On Context menus of the components that were using the Show Additional Properties... is being replaced to Open Graphics Preferences: ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/b474b87d-67da-4470-ad8b-426c09c5939e) Core Render Pipeline Preferences and HDRP preferences are now unified into a single place: ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/d15d2a66-f85d-411a-afa9-198457b37dbe) Fixed HDRP Water Surface component to show the additional properties option and use the highlighter. ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/d05a3f81-7b9b-49ac-9208-ed9d857080e1) SDF Baker Tool, has one single burger menu, with show advanced properties, and also use the highlighter. ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/1a76fa65-8528-4e8b-9a7b-6f1d513495bd) Modified the docs of additional properties to be advanced properties, and live in the core documentation. ### Mat Cap Changes. Now mat cap default values are under Preferences > Graphics > HDRender Pipeline > Mat Cap Mode Default Values. Those values are the ones used when the Scene View Lighting Mode is disabled. And are the default values for the Rendering Debugger. Now the Rendering Debugger can modify the MatCap values that are being used into the scene and into the game view: ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/b2bf90b0-087e-4704-8e7d-d4ee05c3de36) Fixing also that standalone Rendering Debugger was not able to modify the values of the intensity of the Mat Cap functionality ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/b51579d1-078e-47d7-8407-51567105e656) ### Decal Gizmo Color For URP we are exposing as HDRP was doing the color of the decal projector gizmo, now they are in sync. ![imagen](https://media.github.cds.internal.unity3d.com/user/3279/files/af2e3a13-c398-436b-91f5-99099b172abe) --- .../AdvancedProperties_Settings.png | Bin 0 -> 4531 bytes .../Preferences/HDRP_WaterSurface_General.png | Bin 0 -> 19567 bytes .../HDRP_WaterSurface_General_Visible.png | Bin 0 -> 17600 bytes .../Images/Preferences/PopUpAdvanced.png | Bin 0 -> 10348 bytes .../Documentation~/advanced-properties.md | 36 +++++ .../Editor/AdditionalPropertiesPreferences.cs | 104 ------------- .../Editor/CoreEditorDrawers.cs | 22 ++- .../Editor/CoreEditorUtils.cs | 23 +-- .../Editor/CoreRenderPipelinePreferences.cs | 18 ++- .../Editor/Deprecated.cs | 9 ++ .../Editor/EditorPrefBoolFlags.cs | 10 +- .../ICoreRenderPipelinePreferencesProvider.cs | 12 +- .../ProbeAdjustmentVolumeEditor.cs | 19 --- .../Editor/Material/DecalPreferences.cs | 47 ++++++ .../Editor/Material/DecalPreferences.cs.meta | 2 + .../Editor/Properties.meta | 8 + .../AdditionalPropertiesState.cs | 51 ++----- .../AdditionalPropertiesState.cs.meta | 0 .../Editor/Properties/AdvancedProperties.cs | 138 ++++++++++++++++++ .../Properties/AdvancedProperties.cs.meta | 3 + .../Properties/AdvancedPropertiesObserver.cs | 30 ++++ .../AdvancedPropertiesObserver.cs.meta | 3 + .../PropertiesPreferencesProvider.cs | 27 ++++ .../PropertiesPreferencesProvider.cs.meta} | 0 .../Settings/DefaultVolumeProfileEditor.cs | 6 +- .../Editor/Volume/VolumeComponentEditor.cs | 43 +----- .../Volume/VolumeComponentListEditor.cs | 8 +- .../Editor/Volume/VolumeProfileUtils.cs | 8 +- .../Editor/Volume/VolumesPreferences.cs | 7 +- .../Runtime/Common/Observable.cs | 48 ++++++ .../Runtime/Common/Observable.cs.meta | 3 + .../Documentation~/HDRP-Features.md | 2 +- .../Documentation~/Images/MatCap_Settings.png | Bin 0 -> 7295 bytes .../Lighting-Mode-Shadowmask.md | 2 +- .../Documentation~/Planar-Reflection-Probe.md | 6 +- .../Documentation~/Post-Processing-Bloom.md | 8 +- .../Post-Processing-Depth-of-Field.md | 2 +- .../Post-Processing-Motion-Blur.md | 2 +- .../Documentation~/Reflection-Probe.md | 2 +- .../debug-materials-and-shaders-matcap.md | 13 +- .../expose-all-additional-properties.md | 29 ---- .../hdri-sky-volume-override-reference.md | 2 +- .../reference-light-component.md | 42 +++--- .../HDRenderPipelinePreferencesProvider.cs | 42 ++++++ ...DRenderPipelinePreferencesProvider.cs.meta | 3 + .../Lighting/HDLightUI.ContextualMenu.cs | 2 +- .../Editor/Lighting/HDLightUI.cs | 9 -- .../Editor/Lighting/Reflection/HDProbeUI.cs | 9 -- .../Reflection/HDReflectionProbeEditor.cs | 9 +- .../Material/Decal/DecalProjectorEditor.cs | 2 +- .../Camera/HDCameraUI.Rendering.Drawers.cs | 11 +- .../WaterSurfaceEditor.Appearance.cs | 7 +- .../WaterSurfaceEditor.Simulation.cs | 18 ++- .../Water/WaterSurface/WaterSurfaceEditor.cs | 60 +++----- .../Runtime/Debug/DebugDisplay.cs | 28 ++++ .../Runtime/Debug/LightingDebug.cs | 16 ++ .../RenderPipeline/HDRenderPipeline.Debug.cs | 42 ++++-- .../Utilities/HDRenderPipelinePreferences.cs | 84 ++--------- .../Editor/Decal/DecalProjectorEditor.cs | 2 +- .../FullScreenPassRendererFeatureEditor.cs | 6 +- .../Editor/ScriptableRendererDataEditor.cs | 6 +- .../UniversalRenderPipelineAssetUI.Drawers.cs | 9 -- .../FullScreenPassRendererFeature.cs | 2 - .../sdf-bake-tool-additional-properties.png | Bin 16559 -> 39778 bytes .../Documentation~/sdf-bake-tool-window.md | 4 +- .../Utilities/SDF/BakeTool/SDFBakeTool.cs | 39 ++--- 66 files changed, 661 insertions(+), 544 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/AdvancedProperties_Settings.png create mode 100644 Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/HDRP_WaterSurface_General.png create mode 100644 Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/HDRP_WaterSurface_General_Visible.png create mode 100644 Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/PopUpAdvanced.png create mode 100644 Packages/com.unity.render-pipelines.core/Documentation~/advanced-properties.md delete mode 100644 Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesPreferences.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Properties.meta rename Packages/com.unity.render-pipelines.core/Editor/{ => Properties}/AdditionalPropertiesState.cs (83%) rename Packages/com.unity.render-pipelines.core/Editor/{ => Properties}/AdditionalPropertiesState.cs.meta (100%) create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Properties/PropertiesPreferencesProvider.cs rename Packages/com.unity.render-pipelines.core/Editor/{AdditionalPropertiesPreferences.cs.meta => Properties/PropertiesPreferencesProvider.cs.meta} (100%) create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs.meta create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/MatCap_Settings.png delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/expose-all-additional-properties.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs create mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/AdvancedProperties_Settings.png b/Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/AdvancedProperties_Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8d359e731812ca3d1da60fc19d5d96d48b8486 GIT binary patch literal 4531 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 U*8cthJS2?4)78&qol`;+0No&kxc~qF literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/HDRP_WaterSurface_General_Visible.png b/Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/HDRP_WaterSurface_General_Visible.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf56d0a318f67061a8b3bba65a411f127fae62e GIT binary patch literal 17600 zcmb8XcRbbq|2JNuj#Sn=ly!(h93*?sLS}?xZ?Zd9wodj4kz+h{qFTkmoD8@Qk2)cbcsL_ z{JS1<75uF|QT`5mx$LT`AbY8#mu>}oAheNDmAP~Y6GL)lMg%?+zfjb3y>#hTEB?>r zPUk$!OPA!emE>ifc^Yp_t&A8wO1`+5k@_4Lx_3{PbA0rd-R%Tx4aFOLikEJaB`<%C zl1{QrZ~X@=&O#VRW=%#6eXT`mzkl)bqT{$kw`$~ATkuqEvyE_bcK26P@3g>1!T9Mj zzXNUe-u(;QfD~?k@Zx;yf^7prR%`8+1^2aef-}DVcM0(0$>pf*P9JNc1iv{^yRrINerk zIcn#DEoTIrM};x=gi@-DBVA_v4ppc9PdB<082$LYmfydGkxCx@65RD2OY=JzD{dB= ze9`*c7k}kuVgI96Mm1xv#e|S~3_l;nfT&;Q8a+Qp)b(wP<6BZ^f4b&lq$Ir#r(UuN z&G_zGwnyAnbt7Z!lRRBtNV13?Ix_ z;BGnF>B_h`Tkg`QCE;m&q0hiMByl*&H&%?14%bgyR^YU=&0_jRo)y<`=3bob1h4F`W#ljmJx=s%`J2^;`V? zA`{WS^lF@pIG2COk-ir{`TbFK!SLmjd;HAVlF&wq{cw>jnrYW1!ypc5Z4t*Eovq{ViW4?>kww`8)w39dqI_(F!#uIOou_>N*>=wdA-8{CE2rZf$2wyDCS zero2}^#LZuuzML3rvl?mhtpzXWoE5zrEghlC=>+kFTe^rwopwpdbv{aN(j2mAUo-` zP;CW!fsAJ#60``qcBV@MaBI~tk#8+lJ?Jjm-1maF6?dLBy>lH<6%rt!VA`AZ*%Cnh zgZc*q{5OfEMro|N|4uwC);GHS&=A>v+p(0~Y%tWs?dKz|$$qM}xF!Ws@jucPtH0i9 zsoAbY9Z)%{LotFY4@UCNie$@}d{m(Kbxw%)Rck??p1?dr6XhYrQjMe6(;^g_uMsg*COsOV39{4Y*t z)Fp9y1J!OzBhTSd2}^k&qf;iqc6GE6G?Se~_=~NVwOaq9NO&uAe$v`0wcIF>h8fM> zuwG83043LIk}fBoph#WIk6~@jBvMNMyD+moo$9B{>wRYzg}BKS)E>S4qqbJ!Em&G`BvrHRDTK-44f5xau%Hta zSQohIjY}4RaY^*zKWppcw``Eyv+53=*qYAXB@(7}QL1;+qPyStQfI0-OB>5? zCRx~8lZ4hx#!h-nIDXu2xE}2cV#_23du9e)H{(KltlX-{a;QMt zRg)db)n-M;7tF$#GwR#NZd8p3wmfb*o!WxgkCePO^j^sssBPG+FH}8Gla;zS+ua!Zr+0g=-hE9! z>7fZoQwQrh&B?#cjyD^&($i0SL1hZuINeHnu8CfA94*V#OXA%4E;J(!61PR9L5n|* zzmLq(Dko0OKqR|Fcy2vfZ1Xufi!I&LywGYtAHnyW&_k20q(_f53Vzl)7GtmYKM;cr#hJywdvD zp6!o^ipe+9d>RBziQ_X~c`YT|jHec!sY@PPQa+f|DMI{&T_1V)dHUsypQDZMki}OG zD7pFSHYfouDND1Vj81{#opo0goex*7UceyAjpUJ_pgfDz5*lGEDM%xG@Q-3p>|(*J zKLgKgd>I6=Y}LCb~?<|td+JjC(PD8 zOW#9xhF!r1mwAG^Ra4MPla5q=Rb<5a;Q9GRwnj50jhsMDVMvgX|1H|^nrR2e8B4Ua)jjez`mZo_TGMw#5%o2Fd zUb&t2g?Fa;uOXCG7w>0UI6duyCJ8b8>ZU>-dSXUt_8{CyxWrYvz=~bo5CY<>KR7Z3 zp3tfavc_`s8pEz&Y9_jE$_rhB3SYhteU&NA{0d=pQug}QcH^le2Iht4j1~wI2t+Wi z`q@C=EY_D#e(lj$R@_HZ%moYNbnn7jwmWDCc9Z`|yi}E4Xt_9TF`&0E+x+c|Hh#&8fGMw$t6amYVm)!|I`*pz$}L!?jG9ZXgD~#P#7#@D`lS^6Py5^`w{hEC z)qxZ@MASk}FU$Pda@9La1GPT50QtnrZUVy;>tyW7A=)KQ)Titj2d6&u-=x$ z6MUTOqya~Ar_trnUlpJjMQsszB3_N<3RL?rNq@lkazOP~<5tytGxutToqRUtI*En0 zOEE8se^_URcjJW$bR|B5_F=sAj*$(oiyuyvY@a~s;+YXADT#ox(G0`#1jTcvpbN$s z3*`;gXu6m;7VWRe6c489T)*)e1mAfDPbDY0$dfiFXZBEGARH~OnI6B|o1>gqU9-rG zvgEmDCO5eE?m4Z63X~q8vSNC|y94z~(nm?sJCD28jj@iNj?c#N`=RJ|z;TaB%7>NK zQjjsKSr(2DZz#{-DfQGbAeeID&Ybt+5+6bThF_tL6>ml75u*a+p%76D=+(vF$E=W`|UOb1N4i3MwLPNHUQqlZt@{~5>8b1c|vct zMvL$6(ijP|^Oo3YVRPAwJJ(stV#`cD$)VQbKJwQ{vOS#*VXi$Y>GxMu7TO5Em??D! z@$}{j2`rKwHB&anpi6FORFEs8vA)Y4Mf%-k3pwI5PZ!G&U2>oGUhfzQJtn)`7EMh* zLrI{-VC$C%VvALL1lrd4ip;3{kiK-S?=f^GRaRs*d!wYd51w-~ag@$L(v4?Os|7=I zrxYUL_+w-&j~*NSl!wLwDM2C&B`1-Osu2wgx!mO+QaFxq}a;5c^A9+kq5{FhY0o<;EgCe*v4h zKcC>esSPzl-HZg_4f$rMe1n-PYqY8IFsSS`TO3f6tK)dO#J7S_tjsOdJ7>gfn(#t$ z8uXgAy-dNI`L-wR)Xnqhjw8%%5VU_QYfqv*BANrkGWoJwS({7m4lN=Tq!K@aaE_V$ zh}1XItBGxm9ookfAc2o zZTAvWIhS9}rBI(u}b@uFFWQXj=~DJ zf9i$}Jx=r4UTc+wG@t?WpyCLk*=}!}F+e|o-uZC4$FvTapip!r;<<)-2U@x3%&|+t z2NZf#H2SX~ELryn?w{SGxwKSYp-JAkB0P3q{Y0I`u`vQ;bGc~qKb(q z8d=Ef#pv|;Jv{n*m9IMPic5503i|WNOq`$FI^F{kN#p#4Tmdw~0>{Y#kVv{KpI?~L zoOZ4x{~_Hr^f{vTX~qi2(kqX&UX1?9$drSam0&&)_PK~qP`1DN~Td} z#H!pNqNt(vEj+%pKWp)aq(g}-z=H1HZo}}Y7Hyyb>3N@Uy?bxp-5JMLH*f=16{ds~ z*DzP7@c3NB-|d@MvCt4^&xC&!WBolP|H|b1MbIoc^}=E~4m9f*=4Bj1h2X`LO&YeSfP?|=ee`C(Dp2ahMxW*!<>=$0BcX^W~o z?M8?^6kVm0|HcZRNMTot+*Ez;obI5LFJ40c@U z&nfm_^`As`I^L$Hf`KqdfB!vIsD_n)dco`MvXzM_4`bs(1;e)6Rx-X{PSN$>mM0}W zrWJB>u=OSFxl_0&e&#A$ILT#DU8z1pyA66#-Q9(YUa_r8-zLflGTEan1Q|h>w9}8F z50aB2q-TN#BB147OAXY$QuD=ku{&X)QfS)KB69vPYWWYoi{(mV!`-A6RKfS*A!{!f zPC>)2#sDg(hq3WNB9F;*k$jBQxo0XngjsTMP<@&sRC>1E;7)%M;h_7*c-8lPMC~%rPtEzu+J~fD(s&_9=*H%L$ zIjBRyWfWBNJa6f-Un~cl+qeM4qwdsvyksr2)9BS4mSha|8V;wE{Td0t+D_uZ{Y_A^ z>}HEptz>p^7DQC%ol@r*zw7bCFAGX7AWZA*9r-P|4d;(xv^^CdU&xr+e&30AmHiTA zLg)5FMpcDO+Des|#-~Amn2h)8UIgE$kE@{GJL&RVB|7_<%SLs*TaCND)s?@J+PimT zh605Pt$36j+BCQ@4iAK7Sn{u|Ipq*D1-(Zt`mjd_y~$~R{g0x`{#7HI7vY(OCG`b*(GV2&l_S{! ztY>m2QHc(Z+O<&GH)i4DpcCy~ka=EP{ioSCNjfZx7sb*`VVuAk6(%+pc5j^F=Keiv z4*#!7(#&~?&vvc#N<}BZ(&cc3Ef;k;bAF&(YklgUlg0Y7KS^(-nKe14UB(=U;->r6{R#M{_!hpQUaMF#yt3|{}Tu2fO$~%i{LR5 z2M9{eDtW@WSL{%62T4K2ktGY-xDBQ9BI`?3x~T<@AF9tDzxt*F6{$uI^`YtI>h=eG z2)Y|fl?N7!M;x*NHv0wI|y0egG@`t*zlQD z+m@BFX*y=q2i{oaHC-EdlBd`m=H8U-%ZBOn!iwmmoNmdDfYZy!V@WuKgx&GN!xC65>4 z^QBMzw35Colr~>++iZDzR^Cq%xwXi6{wK7$QAa8w&jn=qNb@fc7CN7G%m%e!5lc|l zAGRI&nw{%TLN0Ynv-? z-(v1sMu-2A?5$hw<>d{QEE(QCoi`hAKEuAuk~+jmGg8SyOjt;sK)=5XOT5jg zQ(5DfTGZL^Ksu*(2d>w8A;N(g3=MAoo+N!8P#h@!+_FY1J?!{z#F;}`V{R1Y;(@t# zg!FZZtFMF$0ZmaHUNKHaC33pe5^!o3xHyCXh@6aywxgBt?AJ9%UpiW$NWg|r37>A% z%q-B(9CcW3H67k!3VIX+=nY{(;{#9;@dU{YP+IYn3Juv`Dl3S7sSvQi3!Em$-IgHs zl63Pb>SL<%|79N`Vr|W*n-d4SAcsoE2jE5m-s|S=0*-NL{K0TF^IwJ%{LD!6K~+~x z^M3Ku%MTefUOLj)8<79!>~k3x#~BL2oxZZP9pgIRNKkE$ATJp$jw;wPnkdJNZYDC6 z@KWiz)1Da8VxN|{SxoQN$Mk=lWJu;B^cDtR?O0{D;IIzy7G1ph*jMxm1t88uPD@vG;!Sw!K*-X8NWcLeSMy zFB0BrAM#4lsRUp)O;Q;wu>)fV(wdkk0}gi@K3>k4p_@EE>XdRaUr2N9we9pXCWxFz zq@SGrVIWumhnISKNw#GE_T#nu&+)<9NSVzBWS*%ZZGnF^-cv$cTvZXVQb!aMt@l!E!vY-|A9@ zoSk}q0HCx1$>xdVMYW0Hre4lWMSEddHmWC5;uZyFK7Xs1M-&;>+ftwx0aq*OA*;ake1`Dn3{_k1D;1S{a(*;#GpTN9gu zdLOTA?3EKP@H+JOT#c$hRjZB2Coa_BGPysfbv4yR`c(xYtxdbVVr=;G!MRm6Vr=iX zJ!%o7N~8yApy=DyAiMe28tx1+JO4?-(m_yoH%$73BKeK9eucFvl3_MGgmrB>M(5OnQ_5Gc`+Xoe^7qTIdX53))-9A< zzY<%Oupv+^1|)PW2)Z64m_^wZJqQPxAbHG$D9Uk|8?|r*XsDz~w*gg0uQz{Ii2CuQ^j{SrsZy|{2{8YB z*R%C0XekwOGuJ0U#okDX?j($RGqN*y)xjsmfxT39l3da3WxVP*6Pz0WcWA>Cs7TBH zu))M<)k}J!6>pQ1@*5xV#D+zaN}ZJji)<0axhk9aZ$DPl(@g4mZAq+R0LkD*WpmF} zF1Ayfr0Ku29?w=Kt1A)A5A?uTK7t1GM4Ww-3Tl@Fj}Syt@TNaFhvhVo&LCR0om{I* zCRqci#{aC*irWk>$eI=s#`D(whs?Dq(RT@9(#Xx+vtF)>{76>r;rs3)_^RKxo>SOz z=>?ZhWHxJwVPM#ORNGy*Dfbc8lBR?4>P$lhcDeTn_td$TzvyE;l>|F>0x{nQdX9%1mzV3$#6=RINP7}uLP6`Skc`#kZiB3C`&Icd{)C6vi92jRmiTc zH*7V>13|&ZID*Ap=f5Slkk6*Um}deR8p|8u_>SX$%C8Tg|7J-uY0$KgBn2EN1|+Z7 zEvLsz9E@7%D0228^guU~gcu~~YB7%q4!vk?$&3yTJ#HOoIp2qQcKEM~hE(oE;Sow? zxYxbd+6hFR%i_Y9Ym5&5-)dKWVJ+Yr4!=qQWAb+L1!-$HJ|hgj1l*N!sMz<@QFH2? zYgQc0JZnSwP&7~Nxn^*G<2lQASAjT^cy)AxI?&$MNTw*hUJA0q4qo8kIf8AfOW`U- ztTx#8=}{Mg(e}h8V~DsT{aw-#yx1oAs2}ugQg|UQH+{e6noJJE;@CycUzOvQqjSSX zwQZ6&QuHgMVTRy09y}Lswwy#wuo6P+l=PR*1DaSF*C`o$&7@1u!b?EcE=;=iz5g^{ zq^+O6(Fb^1Tj8xkn75j}UKCx0B9h&}xI^UgA`M#OZAR7V-hjF@66BR%3t)?8TxaP7 zL~(EBS-LTl+_>fVyYt<&scGNc?^?@M{VvZ6>9<-g{5j)4j&Xzrs_(y3!1dhW)@8x! zdHU{5o2Ys8iLMptID0`pXIeeUAd~F>&1sf4S}({e4;AsaX}hnUbEUI!Jj-|EZOPoA z(M5it{nrVDpOZp|>S;dNCAX)N)Ly96S*9vhe1~MWtNa=B=OC3Nhv`PI za^!qR7XTuoLD9nTCx122-S0vMjjZ*2y}}>$vf-ghat>$bhbH3gtDm>>u^w2AnSF_QJ|_5;d1O@nReE{G$< z>8d}u_U0FmhI4VsD%v>gCKEo&J)*ssViDZKMS25m!Nh0yvJvm2r=}*p-6ps~aWgs` zVyiOPPevMWIx&;-<6&lMCCEkmMeO}#COnOQWGNq`w-J8bud`JMa!V}$4unvkX+~II zBbo=}S)(2W=b6^&S3BsRB6Y89)1k_~7b9MtFhasIoB@`kb|2%xo&m)TWSkG4=y(&@_Mo{`H3}-4 zJz5Y;mA0S{+&E`9p&v?MEj-~`XZYW7OpJC#=xl3LcOI%t$7ao!AVtBc$>xJmOF38f--DDV$WR=!`;-B_AoGLbAjV*BW zV=Rx*z5vZFd1{HC@+(u;^1;V6A~R@dmy+qtE6VSDHx=ND4HWi4KpLGuyW5$kzmYDm5?&^}q#R|^cfW#KvAfhIWW7jQ zbfa=We*$3-3F~C=ao`ZFd<&Sg(U4&}AGBTH+Y^0rILfkB0M*9)X%k(C$bm1C$Fasb zwcrkHC%jQCH!pwUDVSbuV}8aAuz?c&V9i00(nq*so*@BQ>X<+@e49h%E0`5>{X^=zQ~H(iU-FCO+F;0AUbEgDqkGV-c7ztt#^C6 z;v+#9&lsHAP7B8tZ%?5rAJn*NsrNJ;;I6ybz2kCUe_sg*)*$Gr(o5LW!>JN{S)jJx zp@g@wyk%9(xFuvuDc*f=dQgcr!OB+steP(LN-h5@P5njuNcT z;M2PE$I|Z&6Cs5-!8Y}FF*f6%`|)23UBX08ix+H$%7v7Kx0xM|t|bZ@7p9&gC9-1M z^G?EsR5Q8?V-T+pMI0^XtXYVHO0CmDt@D;@5F7KKdqf8g`LcmIzK<-gQcv&-`VZw^4s=wk3$=jF^!uqi46 z)SwE0SG+qySIl(dq#|wr#=)YOgoRtQ7V}HeBFetB$%B7pGeizCvfLZkbHhm`&BT33 z`{PRJ;05=Sfo?{9i{AqY&xbKlrCQ0Wg-goowU>vla}T$N~<6P z@=GkAI>5on)cJcYMNAf5H?ktR?V=ryRcV!_f@TDI&5naydqefA;seLbPRKk$#;&v2 zt_kB8cd3hlR=EeD{S?pPo-i4cl?a=8Sm}?Ix1CI5jPx_a2ccT>QxE zyk@dvWldFRieC?p6QcNflhEIZi@j~BJ1hGQJ!gZFmuRca1qs5h%wOPUE*w|h;|(2H z@rl4el5EMeWv^kH=0Us<2lmVp%VrqHxgrG`DA;p+T|Mwx&CeC&MUEJ~RFynGnzv5S zJSZ$}9&a4xOoURv`g(X;Cc77jGxEmMrR&$rdtlB@`#Od3jU|~3glN`Qz{*vM9zP3h zy(Q+bvkqUJ|4JPij6u2AP={hOnnIQ z+urtFkHmMcM9|o~?I9u;?u9@;1J=}xBX)3P8~p0ziHu(l z!EIT9mUl%vl7#<;HT)9FvTi+)RPy;;W+(!)=eCaNR7(f4eSTH&0}*f)17q3tPtVOG zgw4i8fJ$v(=$yIo77YQfP;|3)e%vLwE7Y^1=J#RC1eb?k7zcy~wVt z4Oi5L^^hSkwgaDF)$8QuZ_U2k;ncKwrIjK$W9D)hxmYUd)l z0D(O&uSKYtbhC*lU;gc~9Sj+S&jN@`;J)Im*m|ss9%0v&>Va7-HMWed+HR=ez;?iu z%Sdm>#qhO)q_P{~yYSYyiSa7?)X(`Q3FO)(j`MrfgcLpR{1kvULE|))zy}SV2V@pO z%!j+zSw^5|5HZ@HL!DJs8J=MMD>A7SN70LUe~ApDa-|8)yW28!h~Dy%PW2_?bd$3= zYE|hjg>Pisf<}}o=r8aV5o$K6Z8v;>>O#!M+_sbCqL=Ql1hcDVjfL=1#x4pUuRqcZ zHHO|l#oHoIL&81)**7ALL)q>?)|NE#UDLB2ut~;%P*~O`eq${hAA?@7*l2*NtnciE zMzspR?hLWUw#D7yRBqSn*ol1Lg>%+yDGfDc5?zSTSo}0++7h!Co*4a$qBl#+-HcTf z@Ur7|ehPC#+7gJj5c;ghp@^@P>X*npiVUn+UEY93?d8d}xbu$BA;?+u3U}Q?+=`TA zgBZc6Mt*QQZl%obsD4q1t2jM{&pE#{)Y{!f6A_ZziPX9hm#W! zMU;4G@PA3E|BrN#*ciAyHaxBV+a%mtQKA#*CtE;+*}^5 z@)_Z%2sU_Uq-Rs|G{o;U0Hfageh^opk_dd|U*aT>4t|q!(+u+f7K=9#3JRIfb&}36 zF-IChalaL$>~5I?O$1jb>_0jUTvJOKjx;rVY2K^(@t~3T@FjB-Z!DBpPV<2GZNBOg zKA)o79q|BCg+KRqvgYX$zU}as$5#cq8R2Hh=I<!RdINrj;{1)w$y2ph5GerF$X`a;8NcLKK zb!`#-RhQu0MQj3IlsD1_4~B0oH_1&hErxl}aFdes0g}2|yVgDp*>UH4f4f!yqk`dA zz9OkooXvZ8ot{<^r(kDgXkGK3c>Nl!nN5b@!851`)d3*&>|6jtp}LESUZFe|9xi_2 zuEVqECn!%l83=SAYkq$K^@<(b*GdhLt2t+O%lC8B9^O`*>;AHZ(62Q)c_M*#6m>C$ z(mi}bVs@i%5716`{MqCX@I8Vq>t%4E>f-CZ%VIOOu0dWS!jmL%|2`Xq^LZ1Qe!ZJ5 zNy}^q?WbATQ=#Ol@LIh1^XUqd=eYZYinzmMEk?Cpdm3=mZOn3JBrhGO4}&Qcf^O_K zsoOruBjZ{dDRrKGcMQ0r2`uqVopij*W(Uy0HT+fY1mmSOb3rNLf4YsAV`>9$i9WCQ z{g77vRUCBGs_#S&VmVC=bMPX8KAl;P;XVQoONAf({~4*^Lb0f1a83veV$hJ#4L5bj z{q5eW)@9%Y9O*B3nNfWrZ}6_dX{z3XOSYg?4kG8v)A1j=2=V&{m!gg(XkYFtuC2qh-r5_j$XT zP&46?1{s{eZW%{G`vmIsOO=pQr|9`CT!7)suEiHrHIp?PojZ=roAqm-7XM+5MQnJt ztx)!IaMmCvZ1)ZnG zfy2?DI%`f{Y@-r(z9*y{(@a+Kp0zgwh*l&z8EAG^@o;9xr#kIiR3TT4k|aQ~J7cu4 z=t+_mJ^R!87X+kM_meZZ8g`<>Kc+cg-Htp>%s9u1V0CS#uSLCOC}`oLN0r@$Kf#5Am?ucJBb ziBJddd)>vwQE6p+Bg!p!S06pnD=-{Lzt>}?eU(Wjr%>1VSo7BGoTm!3&Z#A8d6MU- znl08)Ib(lgi07nu2ltU6{6PWEsO*^zfs*GGCs}mKmM42`wiU9_)x3-4G5=#|FnxOx z??3W#*>`$qv9h_;ic2~^cHi}G>s$>N&4~Q_2J5;`@t~%q*=3r9CBD?8N~u-zUL#># z6A#*d{TL(lb^3$lcEUh0Xky8k|_QWc|BweI5!z)$VUW5eB+D5h(XhF$|WKs|3@Oq#4 ziY74ccMq4i_>T7r_+@S3%r*j+Xn{Pek%3WAq56glK~J1Z+x}V`T%(FQcSqYBNqEyN zdlFBf3omwCB=^?UPmFHT6d7u7880Y~@Yvh7j<#j`?Hnq*OPuJmaGDsLJRCAe-kB&I zTowb6H8nx?*iV0db$}ya-9M;IqS26i8UFPJUC&d*`W^wX|JXX~2uUTigR4EG6t&*o zzwBZII#W6&=HE8SERn*d>fd62=7V=mNbo$06D|C2WmwL%42vj8QP0~wXe0kGj@iEq z=BOhq&!_{f$L8nS z=f3NmJ(Z~s@-P+bKz`iKnJT@y6FoyLgEW;Iv8nK3ZD@{=0q8ZD9r%-Zam%rTPXPj zF+R5Q`(uonQ~k=PpSARhfV)i-2mOt~&<0o?desK5g|TGcLY?B2zbXyz!`FB?PB+$t zKS6>r>#^3Lr6#iIdTiaQXY+oabTNZV4z(9)a+c*a;SbV3+ciet7bK^>FPr)FfWzO1 zn*?Xn=Fg}$Avv2-yxtY;jC0ng+6>`Usb z?;4XS0rr$lTE5A{j;i8aVV+SFb)DY0X~6nAP&VPzP)vMnBVopG zPpL5iVD9;ere{t8JYXfTItu2AL=Km?R3X)t!S0XLX`}Ks}0j;mOt$JUob~ zy+SHp7S48P3jm|N4vUwcP92#1U<{XD1r^J@wfr_GD!ebK)@8AqN&#MM)KIfU9i<#waGH7u>QUP zCL5fsrhqJ0oQAija1;e8l}<~(C((tOJ<7{#==z@fu>H_M8JfQqa+6kHeD6^>5wa9O ziAoa$3q;k|RBBJxOnVplQAo6vt$Cpl_2SB_>=}y^$dlP* zn{-=unx#_vbvtj=vpybglzeszknJ4rs4}#y=ZUWt#Q5fNs+iaryblEd#6pnY$}&#E zLK#ooR3ry`5|65}hW?;%04IR**?@R`}T5UE@3~2G2WbU7u^0xO_NZ9 zPCbW~SRtcPj5LSY7!Stwn#?cJUc7&2E}VIpFwS+hHEKeO7Cy)xefMHjUfdZMlY1$2(C;_?#VG;>R61E;ZW4teRdUGH0nG{cW=88(qn zH{jREsMq#CZ0>7m_)Vk+7*#Txmkky~^t?4I# z>PpW2RK{Nm9Ram!3|A<+YoQYdmc@Rv z|MHZC4zC5a4+k|VGTS1|U0Bk(ughg8$*X)TQtIZP#R%T$c`a^15DtmY(9j6!dJZV1 zA&XiTZLFmYVgCcVpzxg1a*q2Z277P1fQL;<->-jb7c&y3-L>sN*gr~VMQwJ+YZ-4(* z6Z>k+VtjQGH#7p_w(4m^7-z-j_tftruE=j((NlPsdJd6NnL`+7Kg_#l#YKMriSMiU z5vnJ+MijTxzC!EBxHOY4U2xVAIR;_r%RANB213xDCD0q zn|K*QR=oFrGE;nfjYSf_o(h~kX%Hc*VhVFbGiL=p3J)uvv~;Zz#%9A1=o?-t>sCe& z--ZE=S3Zir=vKF83x(niB7*tDU>&vMoMG$3FmKL@{h+PuD8e53lR%nh*Qg39qQ;ei z$Y|wJZdOmtk(!LS`83u?K2_Vm=xCeTVb9aod!6O5lg05~!wKfPo=%}4$3Vz)KaThO ztPzF=0nY&s*|GY$T<)J$3-?6h)G8zK*#(h5jkVmfhKCfZ)m$jc{OX+%zH%|(z0#zn zy0`zw*S=8jnfKurKaUtawILrc_A+n;rrQ8yaYv*S5SKvXf|AcvmvEYqO6m-Q4WCUZovLSr9=wzhvu z=IHS#%n^MB+4|!5HFwOlu71WZqv{K*T&4cM6MrDy4A!(g%NSl5&%G_!$S9$Gjz~Kv z%k|$xxtyHC^ao|8hzF+2b8l%YP-S0dlociuDw#ds3&_1R;<{B}vWIc)i(LLN{)yWH zS0uhNgrun{Oj3f9m*FT^ zzwiohIEcL)?kfK>=2Q}Y;Te`-ITctRErGuy4bY1WK$iT?%W#)E)Z#zqdWGq224t!# zAUiXDevbghM<0OW6-r`3k5v4Zzz}B!o766;+1q()S}^MbFr7zK49*iEIuc_jk`aqp zrQ!3+o}sUuCZaa{F)1#*)L{+>*em9Xg#1>)JY#TVWb?ncYtr||S~b@Q3m+bKeJ9ND zXk9zlv|b{yAXs^I<<@g#E66-jjS`8WVBAq>R_eG*T~c@R{B%p|%|%VXY0Z*(NZ=x# zy)sw?o~OF*ENVqx#bV>8`Y-u*^cKGj>|Z`yD)N9EnU&9qG@nJ1>vjtR30N}G!)Des z^5aOe`UA8__1^T^#ZzIWMfRFfgRSs@>aP_akB?~QeXC1)R=8}wh;dXlJAly!9;x$T zyvmi&BS;V$Z)SWdVF73vyHlrU437Q)J50D5kjc*-Im}Obw1(XL9$xIvoX6n|ihwp% zll1Bx?_C~YvBht0&zXK{pc8`mMqRi`bf9W#dbzzoST5fAQ_mxDEeAgz#qSG4wRJfd zwY+@5DOGwVX{6i?{9q1?DkCf~6P`WKn8b8GT`v*Mgqk^@>c#Jj<5@V3=?5j_dW&Mf z;o%AAn$?{>kxTV;2{D*$SD8Nh9}!c6^y>RFmuh9pHH+mGXJ9(~=p_o^=vRst+V z)#B3;dirXhQ%85w?(X(U%}5G4jt|1J%S?YOM(94$D!rh2gvFA^6O!t&A+yr=I}Cw zZA+OVSu9Ke$86Y?%_`5~xUW=&vhj@P`I(7x-!L~I2xkkx{T5yQ5Y0MR8A(Q#JKZGR zAF~RL5w*48S&HCA$^ZFnkBpwOchrsc=SCHBH6GfRu7z>-WcZ%Q(YM*R*aZG&o}3iI z&7S)(ytG!rfNpsI48&zy+IgYd_~EdDvubec0h#09v<^760k?lsdFRU@ftp0(KU{vcb%5T)T%%!~LDFwr{zQ&u*Hz3Tob?(>W;bx&n7S{)2r z3yvkc04>V&r0S%VnW=zAMhcwxy}mgpEQ^A3`E$M;S~%eQmk7ISdm7%%4y-FVdDUe! zWrWZ4R|-@%iu~Oqm@|W{TG~F*_lfVSG(@}hJe&(B_^;S0qsx%)a#jnSfuPHb%G^nK z8T-%H9c|_=kuOz%w)gl8ohCu+e5fGB5lBPfJeEIxnHlTiMBi}r>8faV3t(mR>1MT# z+bDmt#_p9iyE|^f4clCY+-?5FQSvdOwa$cTqV+a&VbIraM)#t~)zZn4gzsDzwZ{|~ zycYgCK$Z`9L62g1k09TIJ$AF@;#_cL3hYZQl@gd)JeQeS7T@uR%e8IGhrCZy_TUN- zAr!>}KRtQv@FL&|P8<4S`OH>z39Sd%{A?Z)Ri@JF1nC0r*wrTj0y1Hyo zhhPOif#hwidOD?IjUWq~)co0ans*wWm>1}%OldeS{YV_C`8RCu5JYvFS0)yc5jv zSSUN3C^XHUml5jFhKqJK4FwCY5>Y7k{b3-#nZVFQq+}2dM<+zE85=5GkR_xCgOM_; zRZ^Ww@mO?0H(cu#*`eUd z=Pe>lM>^m&Q*A=Od*XRyNyJp^5iI>suduXhLd5>Y(~re4b@!qi;k~RpDYW|dd7?=h z0p@9^*u7YI>PqA)?S_r*&&RSum}WACch8lHSw@O1e)s5$uCD<5+K9^x+(%@Du}Vsj z(I*;EV{~gK`S>lAKp%~)-u_FE6L@{q&jZkP6sZ;tL3 zs&n)nwoY>>yWR#4U)Q&P^WZ~beL<8`e0$r&(5{G_)}ZGPg-~Sl@F()`7GXXLZR9Y4 zFDd*Byr_5X;g94dfoI)3+pPF0`XoU*u2b_JvEq9l;BFUK*VS~kYDoVBaHwg%LI7Fd zs_7i}m%R7#Vc{9jxDxo2pjRiq8JA(|8$*w&;{5q`@hB}6YWDM~lnzsm-OytzeOP~P zzmitg*Q)){gRn%WqFZt(LfJ11>PNP@J~<9l9b<@CI!eoQ#zP&wA(L_WBXZ-_qUP?z zn(nbX*7st=y2@kgV>T=Nw_R~y2i8=n`?Vb#*B*Aqjx4$Mu@)vZ@2`_9;r4+v&P{_cK`EW15X7)zF78b2^rcQ1tbmxfo$li0tSA79{#%E|9P z+%N2ku?QS+y2xNIWcCN?s(Dvue?~Z_jbYHh825uG zlbm$bz`Q`+Uawr8)4@~9yWk8XjAK&6OPja1M4Y2HCd_C7ewRK*L@(WBU?Qz zn!zi|xMFp~8P|_z<+V!pN_M>b4NH5&4fl77z5;hh+G$V9#~ZdBzBa%RNM6Po`++;? zeIilTpewNFE2KZoiZ<2ij0il3W)bW7O?BcE6f5A`MCA2Ih@Hw1=J1UYQx&}B5AW|( zlleyvUAg|8I7Zm~EuC@$XBaSR%N~gXsE4I%r!cnnWQ!rqt1K literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/PopUpAdvanced.png b/Packages/com.unity.render-pipelines.core/Documentation~/Images/Preferences/PopUpAdvanced.png new file mode 100644 index 0000000000000000000000000000000000000000..b26b2626580bddd3a6af396da299b7b70e86f724 GIT binary patch literal 10348 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 literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.core/Documentation~/advanced-properties.md b/Packages/com.unity.render-pipelines.core/Documentation~/advanced-properties.md new file mode 100644 index 00000000000..0534d9daf74 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Documentation~/advanced-properties.md @@ -0,0 +1,36 @@ +# Advanced Properties + +Unity Render Pipelines components expose standard properties by default that are suitable for most use-cases. +However, there are components and Volume Overrides that include **advanced properties** which you can use to fine-tune the behavior of the component. + +There is a global state per user that stores if Unity displays **advanced properties** or not. + +## Exposing advanced properties within the inspector + +Not every component or Volume Override includes advanced properties. +If one does, it has a contextual menu to the right of each property section header that includes additional properties. To expose advanced properties for that section, open the contextual menu and click **Advanced Properties**. + +For an example, see the **Water Surface** component in [High Definition Render Pipeline (HDRP)](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest). + +By default only standard properties are shown. + +![](Images/Preferences/HDRP_WaterSurface_General.png) + +When you select **Advanced Properties**: + +![](Images/Preferences/PopUpAdvanced.png) + +**Advanced Properties** become visible: + +![](Images/Preferences/HDRP_WaterSurface_General_Visible.png) + +For Volume Overrides, the already existing contextual menu has a **Advanced Properties** toggle as well. + +## Exposing advanced properties on preferences + +You can also access to this global preference by: + +1. Open the **Graphics** tab in the **Preferences** window (menu: **Edit > Preferences > Graphics**). +2. Under **Properties**. Set **Advanced Properties** to **All Visible**. + +![](Images/Preferences/AdvancedProperties_Settings.png) diff --git a/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesPreferences.cs b/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesPreferences.cs deleted file mode 100644 index 94bf4e924ef..00000000000 --- a/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesPreferences.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using UnityEngine; -using UnityEditorInternal; - -namespace UnityEditor.Rendering -{ - /// - /// Callback method that will be called when the Global Preferences for Additional Properties is changed - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] - public sealed class SetAdditionalPropertiesVisibilityAttribute : Attribute - { - } - - class AdditionalPropertiesPreferences : ICoreRenderPipelinePreferencesProvider - { - class Styles - { - public static readonly GUIContent additionalPropertiesLabel = EditorGUIUtility.TrTextContent("Visibility", "Toggle all additional properties to either visible or hidden."); - public static readonly GUIContent[] additionalPropertiesNames = { EditorGUIUtility.TrTextContent("All Visible"), EditorGUIUtility.TrTextContent("All Hidden") }; - public static readonly int[] additionalPropertiesValues = { 1, 0 }; - } - - static List s_VolumeComponentEditorTypes; - static TypeCache.MethodCollection s_AdditionalPropertiesVisibilityMethods; - static bool s_ShowAllAdditionalProperties = false; - - static AdditionalPropertiesPreferences() - { - s_ShowAllAdditionalProperties = EditorPrefs.GetBool(Keys.showAllAdditionalProperties); - } - - static void InitializeIfNeeded() - { - if (s_VolumeComponentEditorTypes == null) - { - s_AdditionalPropertiesVisibilityMethods = TypeCache.GetMethodsWithAttribute(); - - s_VolumeComponentEditorTypes = TypeCache.GetTypesDerivedFrom() - .Where( - t => !t.IsAbstract - ).ToList(); - } - } - - static bool showAllAdditionalProperties - { - get => s_ShowAllAdditionalProperties; - set - { - s_ShowAllAdditionalProperties = value; - EditorPrefs.SetBool(Keys.showAllAdditionalProperties, s_ShowAllAdditionalProperties); - - ShowAllAdditionalProperties(showAllAdditionalProperties); - } - } - static List s_SearchKeywords = new() { "Additional", "Properties" }; - public List keywords => s_SearchKeywords; - - public GUIContent header { get; } = EditorGUIUtility.TrTextContent("Additional Properties"); - - static class Keys - { - internal const string showAllAdditionalProperties = "General.ShowAllAdditionalProperties"; - } - - public void PreferenceGUI() - { - EditorGUI.BeginChangeCheck(); - int newValue = EditorGUILayout.IntPopup(Styles.additionalPropertiesLabel, showAllAdditionalProperties ? 1 : 0, Styles.additionalPropertiesNames, Styles.additionalPropertiesValues); - if (EditorGUI.EndChangeCheck()) - { - showAllAdditionalProperties = newValue == 1; - } - } - - static void ShowAllAdditionalProperties(bool value) - { - // The way we do this here is to gather all types of either VolumeComponentEditor or IAdditionalPropertiesBoolFlagsHandler (for regular components) - // then we instantiate those classes in order to be able to call the relevant function to update the "ShowAdditionalProperties" flags. - // The instance on which we call is not important because in the end it will only change a global editor preference. - InitializeIfNeeded(); - - // Volume components - foreach (var editorType in s_VolumeComponentEditorTypes) - { - var key = VolumeComponentEditor.GetAdditionalPropertiesPreferenceKey(editorType); - var showAdditionalProperties = new EditorPrefBool(key); - showAdditionalProperties.value = value; - } - - // Regular components - foreach (var method in s_AdditionalPropertiesVisibilityMethods) - { - method.Invoke(null, new object[1] { value }); - } - - // Force repaint in case some editors are already open. - InternalEditorUtility.RepaintAllViews(); - } - } -} diff --git a/Packages/com.unity.render-pipelines.core/Editor/CoreEditorDrawers.cs b/Packages/com.unity.render-pipelines.core/Editor/CoreEditorDrawers.cs index 0a958cd70f4..32535d23643 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/CoreEditorDrawers.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/CoreEditorDrawers.cs @@ -180,20 +180,12 @@ void IDrawer.Draw(TData data, Editor owner) if (m_Enabler != null && !m_Enabler(data, owner)) return; - if (m_Anim != null) - CoreEditorUtils.BeginAdditionalPropertiesHighlight(m_Anim); - - for (var i = 0; i < m_ActionDrawers.Length; i++) - m_ActionDrawers[i](data, owner); - - if (m_Anim != null) + if (AdvancedProperties.BeginGroup(m_Anim)) { - CoreEditorUtils.EndAdditionalPropertiesHighlight(); - - // While the highlight is being changed, force the Repaint of the editor - if (m_Anim.value > 0.0f) - owner?.Repaint(); + for (var i = 0; i < m_ActionDrawers.Length; i++) + m_ActionDrawers[i](data, owner); } + AdvancedProperties.EndGroup(); } bool IDrawer.Expand(int mask) => DefaultExpand(m_ActionDrawers, mask); @@ -888,6 +880,7 @@ public static IDrawer AdditionalPropertiesFoldoutGroup(GUIConten where TEnum : struct, IConvertible where TAPEnum : struct, IConvertible { + additionalContent ??= Group((s, o) => { }); return AdditionalPropertiesFoldoutGroup(foldoutTitle, foldoutMask, foldoutState, additionalPropertiesMask, additionalPropertiesState, normalContent.Draw, additionalContent.Draw, options, customMenuContextAction, otherDocumentation); } @@ -972,7 +965,10 @@ void SwitchEnabler(TData data, Editor owner) return FoldoutGroup(foldoutTitle, foldoutMask, foldoutState, options, customMenuContextAction, Enabler, SwitchEnabler, otherDocumentation, normalContent, - ConditionalWithAdditionalProperties((serialized, owner) => additionalPropertiesState[additionalPropertiesMask] && foldoutState[foldoutMask], additionalPropertiesState.GetAnimation(additionalPropertiesMask), additionalContent).Draw + ConditionalWithAdditionalProperties( + (serialized, owner) => additionalPropertiesState[additionalPropertiesMask] && foldoutState[foldoutMask], + AdvancedProperties.s_AnimFloat, + additionalContent).Draw ); } } diff --git a/Packages/com.unity.render-pipelines.core/Editor/CoreEditorUtils.cs b/Packages/com.unity.render-pipelines.core/Editor/CoreEditorUtils.cs index 2844c054146..0f9077c7d07 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/CoreEditorUtils.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/CoreEditorUtils.cs @@ -822,14 +822,14 @@ static Action CreateMenuContextAction(Action contextAction, Fu { if (contextAction == null && (hasMoreOptions != null || customMenuContextAction != null)) { - // If no contextual menu add one for the additional properties. + // If no contextual menu add one for the advanced properties. contextAction = pos => { var menu = new GenericMenu(); if (customMenuContextAction != null) customMenuContextAction(menu); if (hasMoreOptions != null) - AddAdditionalPropertiesContext(menu, hasMoreOptions, toggleMoreOptions); + menu.AddAdvancedPropertiesBoolMenuItem(hasMoreOptions, toggleMoreOptions); menu.DropDown(new Rect(pos, Vector2.zero)); }; } @@ -877,12 +877,6 @@ static void ShowHelpButton(Rect contextMenuRect, string documentationURL, GUICon Help.BrowseURL(documentationURL); } - static void AddAdditionalPropertiesContext(GenericMenu menu, Func hasMoreOptions, Action toggleMoreOptions) - { - menu.AddItem(EditorGUIUtility.TrTextContent("Show Additional Properties"), hasMoreOptions.Invoke(), () => toggleMoreOptions.Invoke()); - menu.AddItem(EditorGUIUtility.TrTextContent("Show All Additional Properties..."), false, () => CoreRenderPipelinePreferences.Open()); - } - /// /// Draw a Color Field but convert the color to gamma space before displaying it in the shader. /// Using SetColor on a material does the conversion, but setting the color as vector3 in a constant buffer doesn't @@ -1387,19 +1381,6 @@ internal static void TryToFixFilterMode(float pixelsPerPoint, Texture2D icon) #endregion - internal static void BeginAdditionalPropertiesHighlight(AnimFloat animation) - { - var oldColor = GUI.color; - GUI.color = Color.Lerp(CoreEditorStyles.backgroundColor * oldColor, CoreEditorStyles.backgroundHighlightColor, animation.value); - EditorGUILayout.BeginVertical(CoreEditorStyles.additionalPropertiesHighlightStyle); - GUI.color = oldColor; - } - - internal static void EndAdditionalPropertiesHighlight() - { - EditorGUILayout.EndVertical(); - } - internal static T CreateAssetAt(Scene scene, string targetName) where T : ScriptableObject { string path; diff --git a/Packages/com.unity.render-pipelines.core/Editor/CoreRenderPipelinePreferences.cs b/Packages/com.unity.render-pipelines.core/Editor/CoreRenderPipelinePreferences.cs index 832524c64b1..2178d1fd0af 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/CoreRenderPipelinePreferences.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/CoreRenderPipelinePreferences.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using UnityEngine.Rendering; namespace UnityEditor.Rendering { @@ -12,7 +13,7 @@ public static class CoreRenderPipelinePreferences /// /// Path to the Render Pipeline Preferences /// - public static readonly string corePreferencePath = "Preferences/Core Render Pipeline"; + public static readonly string corePreferencePath = "Preferences/Graphics"; private static readonly List s_Providers = new(); @@ -25,6 +26,14 @@ static void InitPreferenceProviders() continue; s_Providers.Add(Activator.CreateInstance(provider) as ICoreRenderPipelinePreferencesProvider); } + + s_Providers.Sort((x, y) => GetDisplayInfoOrder(x.GetType()).CompareTo(GetDisplayInfoOrder(y.GetType()))); + } + + static int GetDisplayInfoOrder(Type type) + { + var attribute = type.GetCustomAttribute(); + return attribute?.order ?? int.MaxValue; } [SettingsProvider] @@ -38,8 +47,11 @@ static SettingsProvider PreferenceGUI() { foreach (var providers in s_Providers) { - EditorGUILayout.LabelField(providers.header, EditorStyles.boldLabel); - providers.PreferenceGUI(); + if (providers.header != null) + { + EditorGUILayout.LabelField(providers.header, EditorStyles.boldLabel); + providers.PreferenceGUI(); + } } } } diff --git a/Packages/com.unity.render-pipelines.core/Editor/Deprecated.cs b/Packages/com.unity.render-pipelines.core/Editor/Deprecated.cs index 38402155432..e1bdc6b6989 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Deprecated.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Deprecated.cs @@ -5,6 +5,15 @@ namespace UnityEditor.Rendering { + /// + /// Callback method that will be called when the Global Preferences for Additional Properties is changed + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] + [Obsolete("This attribute is not handled anymore. Use Advanced Properties. #from(6000.0)", false)] + public sealed class SetAdditionalPropertiesVisibilityAttribute : Attribute + { + } + /// /// This attributes tells a class which type of /// it's an editor for. diff --git a/Packages/com.unity.render-pipelines.core/Editor/EditorPrefBoolFlags.cs b/Packages/com.unity.render-pipelines.core/Editor/EditorPrefBoolFlags.cs index b3d4133ad36..6ba5064e016 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/EditorPrefBoolFlags.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/EditorPrefBoolFlags.cs @@ -15,11 +15,17 @@ public T value /// The raw value public uint rawValue - { get => (uint)EditorPrefs.GetInt(m_Key); set => EditorPrefs.SetInt(m_Key, (int)value); } + { + get => (uint)EditorPrefs.GetInt(m_Key); + set => EditorPrefs.SetInt(m_Key, (int)value); + } /// Constructor /// Name of the Key in EditorPrefs to save the value - public EditorPrefBoolFlags(string key) => m_Key = key; + public EditorPrefBoolFlags(string key) + { + m_Key = key; + } /// Test if saved value is equal to the one given /// Given value diff --git a/Packages/com.unity.render-pipelines.core/Editor/ICoreRenderPipelinePreferencesProvider.cs b/Packages/com.unity.render-pipelines.core/Editor/ICoreRenderPipelinePreferencesProvider.cs index bdb8ce5f628..177609d7532 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/ICoreRenderPipelinePreferencesProvider.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/ICoreRenderPipelinePreferencesProvider.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using System.Reflection; using UnityEngine; +using UnityEngine.Rendering; namespace UnityEditor.Rendering { @@ -16,7 +18,15 @@ public interface ICoreRenderPipelinePreferencesProvider /// /// The header of the panel /// - GUIContent header { get; } + GUIContent header + { + get + { + var type = GetType(); + var displayTypeInfoAttribute = type.GetCustomAttribute(); + return EditorGUIUtility.TrTextContent(displayTypeInfoAttribute != null ? displayTypeInfoAttribute.name : type.Name); + } + } /// /// Renders the Preferences UI for this provider diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeAdjustmentVolumeEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeAdjustmentVolumeEditor.cs index 70682ec6b13..a75f6ff5925 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeAdjustmentVolumeEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeAdjustmentVolumeEditor.cs @@ -80,25 +80,6 @@ enum Expandable readonly static ExpandedState k_ExpandedState = new ExpandedState(Expandable.Volume | Expandable.Adjustments); readonly static AdditionalPropertiesState k_AdditionalPropertiesState = new AdditionalPropertiesState(0); - public static void RegisterEditor(ProbeAdjustmentVolumeEditor editor) - { - k_AdditionalPropertiesState.RegisterEditor(editor); - } - - public static void UnregisterEditor(ProbeAdjustmentVolumeEditor editor) - { - k_AdditionalPropertiesState.UnregisterEditor(editor); - } - - [SetAdditionalPropertiesVisibility] - public static void SetAdditionalPropertiesVisibility(bool value) - { - if (value) - k_AdditionalPropertiesState.ShowAll(); - else - k_AdditionalPropertiesState.HideAll(); - } - public static void DrawVolumeContent(SerializedProbeAdjustmentVolume serialized, Editor owner) { EditorGUILayout.PropertyField(serialized.shape); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs b/Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs new file mode 100644 index 00000000000..0bc404e8930 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using RuntimeSRPPreferences = UnityEngine.Rendering.CoreRenderPipelinePreferences; + +namespace UnityEditor.Rendering +{ + /// + /// Preferences for Decals + /// + public class DecalPreferences : ICoreRenderPipelinePreferencesProvider + { + static readonly Color k_DecalGizmoColorBase = new Color(1, 1, 1, 8f / 255); + static Func GetColorPrefDecalGizmoColor; + + /// + /// Obtains the color of the decal gizmo + /// + public static Color decalGizmoColor => GetColorPrefDecalGizmoColor(); + + static DecalPreferences() + { + GetColorPrefDecalGizmoColor = RuntimeSRPPreferences.RegisterPreferenceColor("Scene/Decal", k_DecalGizmoColorBase); + } + + static List s_SearchKeywords = new() { "Decals" }; + + /// + /// The list of keywords for user search + /// + public List keywords => s_SearchKeywords; + + /// + /// The header of the panel + /// + public GUIContent header => null; // For now this is only a data preference without UI + + /// + /// Renders the Preferences UI for this provider + /// + public void PreferenceGUI() + { + // For now this is only a data preference without UI + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs.meta new file mode 100644 index 00000000000..4f7b832675d --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Material/DecalPreferences.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f6b878d2c4b3d974db270bab74cd8f18 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Editor/Properties.meta b/Packages/com.unity.render-pipelines.core/Editor/Properties.meta new file mode 100644 index 00000000000..ceef5af30fe --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80eb240eb8f49794ea98245f43a29de6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesState.cs b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdditionalPropertiesState.cs similarity index 83% rename from Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesState.cs rename to Packages/com.unity.render-pipelines.core/Editor/Properties/AdditionalPropertiesState.cs index 8e3bdfb7094..ffe60292840 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesState.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdditionalPropertiesState.cs @@ -9,16 +9,7 @@ namespace UnityEditor.Rendering public abstract class AdditionalPropertiesStateBase where TState : struct, IConvertible { - HashSet m_Editors = new HashSet(); - Dictionary m_AnimFloats = new Dictionary(); - - void RepaintAll() - { - foreach (var editor in m_Editors) - { - editor.Repaint(); - } - } + HashSet m_Editors = new (); /// Get or set the state given the mask. /// The filtering mask @@ -28,6 +19,7 @@ public bool this[TState mask] get => GetAdditionalPropertiesState(mask); set => SetAdditionalPropertiesState(mask, value); } + /// Accessor to the expended state of this specific mask. /// The filtering mask /// True: All flagged area are expended @@ -39,9 +31,6 @@ public bool this[TState mask] public void SetAdditionalPropertiesState(TState mask, bool value) { SetAdditionalPropertiesStateValue(mask, value); - - if (value) - ResetAnimation(mask); } /// Setter to the expended state without resetting animation. @@ -55,30 +44,13 @@ public void SetAdditionalPropertiesState(TState mask, bool value) /// Utility to set all states to false public abstract void HideAll(); - internal AnimFloat GetAnimation(TState mask) - { - AnimFloat anim = null; - if (!m_AnimFloats.TryGetValue(mask, out anim)) - { - anim = new AnimFloat(0, RepaintAll); - anim.speed = CoreEditorConstants.additionalPropertiesHightLightSpeed; - m_AnimFloats.Add(mask, anim); - } - return anim; - } - /// /// Resets the animation associated with the given mask to a default state with the animated value set to 1.0 and the target value set to 0.0. /// /// The state mask used to retrieve the associated animation. protected internal void ResetAnimation(TState mask) { - AnimFloat anim = GetAnimation(mask); - - anim.value = 1.0f; - anim.target = 0.0f; } - /// /// Register an editor for this set of additional properties. /// @@ -118,36 +90,31 @@ public AdditionalPropertiesState(TState defaultValue, string prefix = "CoreRP", { string key = $"{prefix}:{typeof(TTarget).Name}:{typeof(TState).Name}:{stateId}"; m_State = new EditorPrefBoolFlags(key); - - //register key if not already there - if (!EditorPrefs.HasKey(key)) - { - EditorPrefs.SetInt(key, (int)(object)defaultValue); - } + AdvancedProperties.UpdateShowAdvancedProperties(key, m_State.rawValue != 0u); } /// - public override bool GetAdditionalPropertiesState(TState mask) + public override bool GetAdditionalPropertiesState(TState _) { - return m_State.HasFlag(mask); + return AdvancedProperties.enabled; } /// - protected override void SetAdditionalPropertiesStateValue(TState mask, bool value) + protected override void SetAdditionalPropertiesStateValue(TState _, bool value) { - m_State.SetFlag(mask, value); + AdvancedProperties.enabled = value; } /// public override void ShowAll() { - m_State.rawValue = uint.MaxValue; + AdvancedProperties.enabled = true; } /// public override void HideAll() { - m_State.rawValue = 0u; + AdvancedProperties.enabled = false; } } diff --git a/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesState.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdditionalPropertiesState.cs.meta similarity index 100% rename from Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesState.cs.meta rename to Packages/com.unity.render-pipelines.core/Editor/Properties/AdditionalPropertiesState.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs new file mode 100644 index 00000000000..c35644cf7ac --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs @@ -0,0 +1,138 @@ +using System; +using UnityEditor.AnimatedValues; +using UnityEngine; + +namespace UnityEditor.Rendering +{ + /// + /// Global accessor to advanced properties + /// + public static class AdvancedProperties + { + static class Keys + { + // TODO Deprecate this key in U7: Advanced properties were formerly called additional properties + internal const string showAllAdditionalProperties = "General.ShowAllAdditionalProperties"; + internal const string advancedPropertiesMigrated = "General.LocalAdditionalPropertiesMigratedToGlobal"; + //END TODO + + internal const string showAdvancedProperties = "General.ShowAdvancedProperties"; + } + + // TODO Deprecate this in U7: Advanced properties were formerly called additional properties + static AdvancedProperties() + { + // Migrate from the previous global state + UpdateShowAdvancedProperties(Keys.showAllAdditionalProperties, + EditorPrefs.HasKey(Keys.showAllAdditionalProperties) && + EditorPrefs.GetBool(Keys.showAllAdditionalProperties)); + } + + internal static void UpdateShowAdvancedProperties(string key, bool previousState) + { + if (previousState) + { + if (!EditorPrefs.HasKey(Keys.advancedPropertiesMigrated) || !EditorPrefs.GetBool(Keys.advancedPropertiesMigrated)) + { + // Before we were storing a global state and a per editor state. + // So if the user had at least 1 editor with show additional, we need to show advanced properties everywhere. + enabled = true; + EditorPrefs.SetBool(Keys.advancedPropertiesMigrated, true); + } + } + + if (EditorPrefs.HasKey(key)) + EditorPrefs.DeleteKey(key); + } + // END TODO + + /// + /// Global event when the advanced preferences have changed + /// + public static event Action advancedPreferenceChanged; + + private static bool? s_ShowAdvanced; + + /// + /// If the show advanced properties is enabled + /// + public static bool enabled + { + get + { + s_ShowAdvanced ??= EditorPrefs.GetBool(Keys.showAdvancedProperties, false); + return s_ShowAdvanced.Value; + } + set + { + if (s_ShowAdvanced != value) + { + s_ShowAdvanced = value; + EditorPrefs.SetBool(Keys.showAdvancedProperties, value); + advancedPreferenceChanged?.Invoke(value); + } + } + } + + /// + /// Adds an entry to toggle Advanced Properties + /// + /// The menu where to add the Advanced Properties entry. + /// If the option is checked + /// The toggle action + public static void AddAdvancedPropertiesBoolMenuItem(this GenericMenu menu, Func hasMoreOptions, Action toggleMoreOptions) + { + menu.AddItem(EditorGUIUtility.TrTextContent("Advanced Properties"), hasMoreOptions.Invoke(), () => toggleMoreOptions.Invoke()); + } + + /// + /// Adds an entry to toggle Advanced Properties + /// + /// The menu where to add the Advanced Properties entry. + public static void AddAdvancedPropertiesBoolMenuItem(this GenericMenu menu) + { + AddAdvancedPropertiesBoolMenuItem(menu, + () => AdvancedProperties.enabled, + () => AdvancedProperties.enabled = !AdvancedProperties.enabled); + } + + internal static AnimFloat s_AnimFloat = new(0) + { + speed = 0.2f + }; + + internal static void ResetHighlight() + { + s_AnimFloat.value = 1.0f; + s_AnimFloat.target = 0.0f; + } + + internal static bool IsHighlightActive() => s_AnimFloat.isAnimating; + + /// + /// Starts the Advanced Properties highlight + /// + /// The animation of the highlight. If null, the global animation value is used. + /// Tru, if the advanced properties is enabled + public static bool BeginGroup(AnimFloat animation = null) + { + var oldColor = GUI.color; + + animation ??= s_AnimFloat; + + GUI.color = Color.Lerp(CoreEditorStyles.backgroundColor * oldColor, CoreEditorStyles.backgroundHighlightColor, animation.value); + EditorGUILayout.BeginVertical(CoreEditorStyles.additionalPropertiesHighlightStyle); + GUI.color = oldColor; + + return AdvancedProperties.enabled; + } + + /// + /// Ends the scope of highlight of advanced properties + /// + public static void EndGroup() + { + EditorGUILayout.EndVertical(); + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs.meta new file mode 100644 index 00000000000..d245729603e --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedProperties.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7cb91275e17b45ab83910c63bb9a3a99 +timeCreated: 1711378153 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs new file mode 100644 index 00000000000..78955e5bda4 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs @@ -0,0 +1,30 @@ +using UnityEditorInternal; + +namespace UnityEditor.Rendering +{ + class AdvancedPropertiesObserver + { + [InitializeOnLoadMethod] + static void SubscribeToAdvancedPropertiesChanges() + { + AdvancedProperties.advancedPreferenceChanged += OnShowAdvancedPropertiesChanged; + } + + static void OnShowAdvancedPropertiesChanged(bool newValue) + { + if (newValue) + { + AdvancedProperties.ResetHighlight(); + EditorApplication.update += RepaintUntilAnimFinish; + } + } + + static void RepaintUntilAnimFinish() + { + if (AdvancedProperties.IsHighlightActive()) + InternalEditorUtility.RepaintAllViews(); + else + EditorApplication.update -= RepaintUntilAnimFinish; + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs.meta new file mode 100644 index 00000000000..890b273ac96 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties/AdvancedPropertiesObserver.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ee336999a409439e86492ecebf683718 +timeCreated: 1711378086 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Editor/Properties/PropertiesPreferencesProvider.cs b/Packages/com.unity.render-pipelines.core/Editor/Properties/PropertiesPreferencesProvider.cs new file mode 100644 index 00000000000..8190d23d055 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Properties/PropertiesPreferencesProvider.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +namespace UnityEditor.Rendering +{ + [DisplayInfo(name = "Properties", order = 100)] + class PropertiesPreferencesProvider : ICoreRenderPipelinePreferencesProvider + { + class Styles + { + public static readonly GUIContent additionalPropertiesLabel = EditorGUIUtility.TrTextContent("Advanced Properties", "Tells Unity to show or hide Advanced Properties."); + public static readonly GUIContent[] additionalPropertiesNames = { EditorGUIUtility.TrTextContent("All Visible"), EditorGUIUtility.TrTextContent("All Hidden") }; + public static readonly int[] additionalPropertiesValues = { 1, 0 }; + } + + static List s_SearchKeywords = new() { "Additional", "Advanced", "Properties" }; + public List keywords => s_SearchKeywords; + + public void PreferenceGUI() + { + AdvancedProperties.enabled = EditorGUILayout.IntPopup(Styles.additionalPropertiesLabel, + AdvancedProperties.enabled ? 1 : 0, Styles.additionalPropertiesNames, + Styles.additionalPropertiesValues) == 1; + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesPreferences.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Properties/PropertiesPreferencesProvider.cs.meta similarity index 100% rename from Packages/com.unity.render-pipelines.core/Editor/AdditionalPropertiesPreferences.cs.meta rename to Packages/com.unity.render-pipelines.core/Editor/Properties/PropertiesPreferencesProvider.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Editor/Settings/DefaultVolumeProfileEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Settings/DefaultVolumeProfileEditor.cs index f744a596cf5..0ac19fc3367 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Settings/DefaultVolumeProfileEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Settings/DefaultVolumeProfileEditor.cs @@ -233,11 +233,7 @@ void OnVolumeComponentContextClick(Vector2 position, VolumeComponentEditor targe menu.AddSeparator(string.Empty); if (targetEditor.hasAdditionalProperties) - menu.AddItem(VolumeProfileUtils.Styles.showAdditionalProperties, targetEditor.showAdditionalProperties, () => targetEditor.showAdditionalProperties ^= true); - else - menu.AddDisabledItem(VolumeProfileUtils.Styles.showAdditionalProperties); - - menu.AddItem(VolumeProfileUtils.Styles.showAllAdditionalProperties, false, () => CoreRenderPipelinePreferences.Open()); + menu.AddAdvancedPropertiesBoolMenuItem(() => targetEditor.showAdditionalProperties, () => targetEditor.showAdditionalProperties ^= true); menu.AddSeparator(string.Empty); menu.AddItem(VolumeProfileUtils.Styles.openInRenderingDebugger, false, DebugDisplaySettingsVolume.OpenInRenderingDebugger); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentEditor.cs index b82ecf2023c..bb64826d8aa 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentEditor.cs @@ -117,8 +117,6 @@ internal Vector2 overrideToggleSize #region Additional Properties - AnimFloat m_AdditionalPropertiesAnimation; - EditorPrefBool m_ShowAdditionalProperties; List m_VolumeNotAdditionalParameters = new List(); /// @@ -131,17 +129,8 @@ internal Vector2 overrideToggleSize /// public bool showAdditionalProperties { - get => m_ShowAdditionalProperties.value; - set - { - if (value && !m_ShowAdditionalProperties.value) - { - m_AdditionalPropertiesAnimation.value = 1.0f; - m_AdditionalPropertiesAnimation.target = 0.0f; - } - - SetAdditionalPropertiesPreference(value); - } + get => AdvancedProperties.enabled; + set => AdvancedProperties.enabled = value; } /// @@ -151,15 +140,11 @@ public bool showAdditionalProperties /// True if the additional content should be drawn. protected bool BeginAdditionalPropertiesScope() { - if (hasAdditionalProperties && showAdditionalProperties) - { - CoreEditorUtils.BeginAdditionalPropertiesHighlight(m_AdditionalPropertiesAnimation); - return true; - } - else - { + if (!showAdditionalProperties || !hasAdditionalProperties) return false; - } + + AdvancedProperties.BeginGroup(); + return true; } /// @@ -168,9 +153,7 @@ protected bool BeginAdditionalPropertiesScope() protected void EndAdditionalPropertiesScope() { if (hasAdditionalProperties && showAdditionalProperties) - { - CoreEditorUtils.EndAdditionalPropertiesHighlight(); - } + AdvancedProperties.EndGroup(); } #endregion @@ -267,12 +250,7 @@ internal static string GetAdditionalPropertiesPreferenceKey(Type type) internal void InitAdditionalPropertiesPreference() { string key = GetAdditionalPropertiesPreferenceKey(GetType()); - m_ShowAdditionalProperties = new EditorPrefBool(key); - } - - internal void SetAdditionalPropertiesPreference(bool value) - { - m_ShowAdditionalProperties.value = value; + AdvancedProperties.UpdateShowAdvancedProperties(key, EditorPrefs.HasKey(key) && EditorPrefs.GetBool(key)); } internal void Init() @@ -291,11 +269,6 @@ internal void Init() InitAdditionalPropertiesPreference(); - m_AdditionalPropertiesAnimation = new AnimFloat(0, Repaint) - { - speed = CoreEditorConstants.additionalPropertiesHightLightSpeed - }; - InitParameters(); OnEnable(); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs index 3dc8dd0875c..47734b62533 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs @@ -448,12 +448,8 @@ void OnContextClick(Vector2 position, VolumeComponentEditor targetEditor, int id menu.AddSeparator(string.Empty); if (targetEditor.hasAdditionalProperties) - menu.AddItem(EditorGUIUtility.TrTextContent("Show Additional Properties"), - targetEditor.showAdditionalProperties, () => targetEditor.showAdditionalProperties ^= true); - else - menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Show Additional Properties")); - menu.AddItem(EditorGUIUtility.TrTextContent("Show All Additional Properties..."), false, - () => CoreRenderPipelinePreferences.Open()); + menu.AddAdvancedPropertiesBoolMenuItem(() => targetEditor.showAdditionalProperties, + () => targetEditor.showAdditionalProperties ^= true); menu.AddSeparator(string.Empty); targetEditor.AddDefaultProfileContextMenuEntries(menu, VolumeManager.instance.globalDefaultProfile, diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileUtils.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileUtils.cs index 1cb1b8b4361..80eadedc7cb 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileUtils.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileUtils.cs @@ -19,8 +19,6 @@ internal static class Styles public static readonly GUIContent expandAll = EditorGUIUtility.TrTextContent("Expand All"); public static readonly GUIContent reset = EditorGUIUtility.TrTextContent("Reset"); public static readonly GUIContent resetAll = EditorGUIUtility.TrTextContent("Reset All"); - public static readonly GUIContent showAdditionalProperties = EditorGUIUtility.TrTextContent("Show Additional Properties"); - public static readonly GUIContent showAllAdditionalProperties = EditorGUIUtility.TrTextContent("Show All Additional Properties..."); public static readonly GUIContent openInRenderingDebugger = EditorGUIUtility.TrTextContent("Open In Rendering Debugger"); public static readonly GUIContent copySettings = EditorGUIUtility.TrTextContent("Copy Settings"); public static readonly GUIContent copyAllSettings = EditorGUIUtility.TrTextContent("Copy All Settings"); @@ -313,8 +311,7 @@ public static void AddVolumeProfileContextMenuItems( menu.AddSeparator(string.Empty); - menu.AddItem(Styles.showAllAdditionalProperties, false, - CoreRenderPipelinePreferences.Open); + menu.AddAdvancedPropertiesBoolMenuItem(); menu.AddSeparator(string.Empty); @@ -400,8 +397,7 @@ public static void OnVolumeProfileContextClick( menu.AddSeparator(string.Empty); - menu.AddItem(Styles.showAllAdditionalProperties, false, - CoreRenderPipelinePreferences.Open); + menu.AddAdvancedPropertiesBoolMenuItem(); menu.AddSeparator(string.Empty); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumesPreferences.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumesPreferences.cs index 9168883ecb3..38aa8717383 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumesPreferences.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumesPreferences.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Rendering; using RuntimeSRPPreferences = UnityEngine.Rendering.CoreRenderPipelinePreferences; namespace UnityEditor.Rendering @@ -8,6 +9,7 @@ namespace UnityEditor.Rendering /// /// Preferences for Volumes /// + [DisplayInfo(name = "Volumes", order = 50)] public class VolumesPreferences : ICoreRenderPipelinePreferencesProvider { static class Keys @@ -80,11 +82,6 @@ public static VolumeGizmoVisibility volumeGizmosVisibilityOption /// public List keywords => s_SearchKeywords; - /// - /// The header of the panel - /// - public GUIContent header { get; } = EditorGUIUtility.TrTextContent("Volumes"); - /// /// Renders the Preferences UI for this provider /// diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs b/Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs new file mode 100644 index 00000000000..67c9b36d8d4 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; + +namespace UnityEngine.Rendering +{ + /// + /// Represents an observable value of type T. Subscribers can be notified when the value changes. + /// + /// The type of the value. + public struct Observable + { + /// + /// Event that is triggered when the value changes. + /// + public event Action onValueChanged; + + private T m_Value; + + /// + /// The current value. + /// + public T value + { + get => m_Value; + set + { + // Only invoke the event if the new value is different from the current value + if (!EqualityComparer.Default.Equals(value, m_Value)) + { + m_Value = value; + + // Notify subscribers when the value changes + onValueChanged?.Invoke(value); + } + } + } + + /// + /// Constructor with value + /// + /// The new value to be assigned. + public Observable(T newValue) + { + m_Value = newValue; + onValueChanged = null; + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs.meta b/Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs.meta new file mode 100644 index 00000000000..5596972c6a2 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/Common/Observable.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c809a62d5133434283a678284bde6334 +timeCreated: 1712237945 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Features.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Features.md index 9f0f28ce110..be255b8d892 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Features.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Features.md @@ -351,7 +351,7 @@ To apply a tint to the shadow or the penumbra of the shadow: 1. Open the Light's Inspector window. 2. Go to the Shadows section. 3. Open the **More** (⋮) menu. -4. Select **Show Additional Properties**. +4. Select *Advanced Properties**. ### Ray tracing diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/MatCap_Settings.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/MatCap_Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..39ccecec279d579c3e7ae89d897c4ae2916caf8e GIT binary patch literal 7295 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 A@Bjb+ literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Lighting-Mode-Shadowmask.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Lighting-Mode-Shadowmask.md index 4efc1f4f37d..b992df5d2c5 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Lighting-Mode-Shadowmask.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Lighting-Mode-Shadowmask.md @@ -55,7 +55,7 @@ For information on the behavior of each Shadowmask Mode, see the following table | Shadowmask Mode | Description | | ------------------- | ------------------------------------------------------------ | -| **Distance Shadowmask** | Makes the Light cast real-time shadows for all GameObjects when the distance between the Camera and the Light is less than the Fade Distance. If you can not see this property, enable [additional properties](expose-all-additional-properties.md) for the Shadows section. When the distance between the Light and the Camera is greater than the Fade Distance, HDRP stops calculating real-time shadows for the Light. Instead, it uses shadowmasks for static GameObjects, and non-static GameObjects don't cast shadows. Directional Lights don't use Fade Distance, instead they use the current [Max Shadow Distance](Override-Shadows.md). | +| **Distance Shadowmask** | Makes the Light cast real-time shadows for all GameObjects when the distance between the Camera and the Light is less than the Fade Distance. If you can not see this property, enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for the Shadows section. When the distance between the Light and the Camera is greater than the Fade Distance, HDRP stops calculating real-time shadows for the Light. Instead, it uses shadowmasks for static GameObjects, and non-static GameObjects don't cast shadows. Directional Lights don't use Fade Distance, instead they use the current [Max Shadow Distance](Override-Shadows.md). | | **Shadowmask** | Makes the Light cast real-time shadows for non-static GameObjects only. It then combines these shadows with shadowmasks for static GameObjects when the distance between the Camera and the Light is less than the Fade Distance. When the distance between the Light and the Camera is greater than the Fade Distance, HDRP stops calculating real-time shadows for the Light. It uses shadowmasks for static GameObjects and non-static GameObjects don't cast shadows. | diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Planar-Reflection-Probe.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Planar-Reflection-Probe.md index 2321d367d1a..2e644aa0907 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Planar-Reflection-Probe.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Planar-Reflection-Probe.md @@ -59,8 +59,8 @@ The following properties control the method that the Planar Reflection Probe use | **Custom Frame Settings** | Allows you to define custom [Frame Settings](Frame-Settings.md) for this Probe. Disable this property to use the **Default Frame Settings** in your Unity Project’s [HDRP Asset](HDRP-Asset.md). | | **Resolution** | Set the resolution of this Planar Reflection Probe. Use the drop-down to select which quality mode to derive the resolution from. If you select Custom, set the resolution, measured in pixels, in the input field. A higher resolution increases the fidelity of planar reflection at the cost of GPU performance and memory usage, so if you experience any performance issues, try using a lower value. The resolution can be set to 0 to prevent the probe from being rendered for certain quality levels. | | **Rough Reflections** | Disable the checkbox to tell HDRP to use this Planar Reflection Probe as a mirror. If you do this, the receiving surface must be perfectly smooth or the reflection result is not accurate. If you want perfect reflection, disabling this option can be useful because it means HDRP does not need to process rough refraction and thus decreases the resource intensity of the effect.| -| **Mirror Position** | Offsets the position of the mirror from the Transform Position.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Range Compression Factor** | The factor which HDRP divides the result of the probe's rendering by. This is useful to deal with very bright or dark objects in the reflections that would otherwise be saturated.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | +| **Mirror Position** | Offsets the position of the mirror from the Transform Position.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Range Compression Factor** | The factor which HDRP divides the result of the probe's rendering by. This is useful to deal with very bright or dark objects in the reflections that would otherwise be saturated.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | ### Render Settings @@ -90,4 +90,4 @@ You can use Scene view gizmos to visually customize specific properties. ## Best practices If you use a Planar Reflection Probe as a mirror (i.e its influence volume overlap a GameObject with a Material that has its smoothness and metallic properties set to 1) it is best practice to disable the **Rough Refraction** property to decrease the resource intensity. -If a receiving surface isn't a perfect mirror and the **Rough Reflection** option is disabled, the surface still renders smooth, but the result is physically incorrect. \ No newline at end of file +If a receiving surface isn't a perfect mirror and the **Rough Reflection** option is disabled, the surface still renders smooth, but the result is physically incorrect. diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Bloom.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Bloom.md index 7f63b598071..883fbf51554 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Bloom.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Bloom.md @@ -13,7 +13,7 @@ The Bloom effect also has a **Lens Dirt** feature, which you can use to apply a 1. In the Scene or Hierarchy view, select a GameObject that contains a Volume component to view it in the Inspector. 2. In the Inspector, go to **Add Override** > **Post-processing** and select **Bloom**. HDRP now applies **Bloom** to any Camera this Volume affects. -Bloom includes [additional properties](expose-all-additional-properties.md) that you must manually expose. +Bloom includes [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) that you must manually expose. [!include[](snippets/volume-override-api.md)] @@ -39,10 +39,10 @@ Bloom includes [additional properties](expose-all-additional-properties.md) that | **Property** | **Description** | | -------------------------- | ------------------------------------------------------------ | -| **Resolution** | Use the drop-down to set the resolution at which HDRP processes the Bloom effect. If you target consoles that use a very high resolution (for example, 4k), select **Quarter,** because it's less resource-intensive.
• **Quarter**: Uses quarter the screen resolution.
• **Half**: Uses half the screen resolution.
This property only appears when you enable [additional properties](expose-all-additional-properties.md). | +| **Resolution** | Use the drop-down to set the resolution at which HDRP processes the Bloom effect. If you target consoles that use a very high resolution (for example, 4k), select **Quarter,** because it's less resource-intensive.
• **Quarter**: Uses quarter the screen resolution.
• **Half**: Uses half the screen resolution.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html). | | **High Quality Prefiltering** | Enable the checkbox to make HDRP use 13 samples instead of 4 during the prefiltering pass. This increases the resource intensity of the Bloom effect, but results in less flickering by small and bright objects like the sun.
This property only appears when you enable [additional properties](expose-all-additional-properties.md). | -| **High Quality Filtering** | Enable the checkbox to make HDRP use bicubic filtering instead of bilinear filtering. This increases the resource intensity of the Bloom effect, but results in smoother visuals.
This property only appears when you enable [additional properties](expose-all-additional-properties.md). | -| **Anamorphic** | Enable the checkbox to make the bloom effect take the **Anamorphism** property of the Camera into account. This stretches the bloom horizontally or vertically like it would on anamorphic sensors.
This property only appears when you enable [additional properties](expose-all-additional-properties.md). | +| **High Quality Filtering** | Enable the checkbox to make HDRP use bicubic filtering instead of bilinear filtering. This increases the resource intensity of the Bloom effect, but results in smoother visuals.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html). | +| **Anamorphic** | Enable the checkbox to make the bloom effect take the **Anamorphism** property of the Camera into account. This stretches the bloom horizontally or vertically like it would on anamorphic sensors.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html). | ## Details diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Depth-of-Field.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Depth-of-Field.md index 05a24ae6127..de6ba424ce8 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Depth-of-Field.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Depth-of-Field.md @@ -9,7 +9,7 @@ The Depth Of Field component applies a depth of field effect, which simulates th 1. In the Scene or Hierarchy view, select a GameObject that contains a Volume component to view it in the Inspector. 2. In the Inspector, go to **Add Override** > **Post-processing** and select **Depth Of Field**. HDRP now applies **Depth Of Field** to any Camera this Volume affects. -Depth Of Field includes [additional properties](expose-all-additional-properties.md) that you must manually expose. +Depth Of Field includes [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html). that you must manually expose. [!include[](snippets/volume-override-api.md)] diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Motion-Blur.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Motion-Blur.md index fc488e5b296..104e421c2ed 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Motion-Blur.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Post-Processing-Motion-Blur.md @@ -11,7 +11,7 @@ The Motion Blur effect uses velocities from HDRP's velocity buffer. This means t 1. In the Scene or Hierarchy view, select a GameObject that contains a Volume component to view it in the Inspector. 2. In the Inspector, go to **Add Override** > **Post-processing** and select **Motion Blur**. HDRP now applies **Motion Blur** to any Camera this Volume affects. -Motion Blur includes [additional properties](expose-all-additional-properties.md) that you can manually expose. +Motion Blur includes [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) that you can manually expose. [!include[](snippets/volume-override-api.md)] diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Reflection-Probe.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Reflection-Probe.md index 54d5d8a1dee..b5bda4e0cb7 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Reflection-Probe.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Reflection-Probe.md @@ -66,7 +66,7 @@ The following properties control the method that the Reflection Probe uses to ca | **Probe Layer Mask** | Acts as a culling mask for environment lights (light from Planar Reflection Probes and Reflection Probes). This Reflection Probe ignores all Reflection Probes that are on Layers not included in this Layer mask, so use this property to ignore certain Reflection Probes when rendering this one. | | **Custom Frame Settings** | Allows you to define custom [Frame Settings](Frame-Settings.md) for this Probe. Disable this property to use the **Default Frame Settings** in your Unity Project’s [HDRP Asset](HDRP-Asset.md). | | **Resolution** | Select a quality mode to determine the resolution of this Reflection Probe. If you select Custom, you must specify a resolution in the dropdown menu. Higher resolutions increase the fidelity of cube reflections but can reduce GPU performance and increase memory consumption. The resolution can be set to 0 to prevent the probe from being rendered for certain quality levels. | -| **Range Compression Factor** | The factor which HDRP divides the result of the probe's rendering by. This is useful to deal with very bright or dark objects in the reflections that would otherwise be saturated.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | +| **Range Compression Factor** | The factor which HDRP divides the result of the probe's rendering by. This is useful to deal with very bright or dark objects in the reflections that would otherwise be saturated.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | ### Render Settings diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/debug-materials-and-shaders-matcap.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/debug-materials-and-shaders-matcap.md index c00478a9c14..aa3f60b3968 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/debug-materials-and-shaders-matcap.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/debug-materials-and-shaders-matcap.md @@ -14,10 +14,15 @@ MatCap mode preserves the normal maps and you can use the original Material albe ## Properties -| **Property** | **Description** | -| ----------------------------- | ------------------------------------------------------------ | -| **Mix Albedo in MatCap Mode** | Enable to make HDRP mix the albedo of the Material with its material capture. | -| **MatCap Intensity Scale** | Set the intensity of the material capture. This increases the brightness of the Scene. This is useful if the albedo darkens the Scene considerably. | +1. Open the **Graphics** tab in the **Preferences** window (menu: **Edit > Preferences > Graphics**). +2. Under **High Definition Render Pipeline** and **MatCap Mode**: + +![](Images/MatCap_Settings.png) + +| **Property** | **Description** | +| ------------------------- | ------------------------------------------------------------ | +| **Mix Albedo** | Enable to make HDRP mix the albedo of the Material with its material capture. | +| **Intensity Scale** | Set the intensity of the material capture. This increases the brightness of the Scene. This is useful if the albedo darkens the Scene considerably. | ## Default material captures diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/expose-all-additional-properties.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/expose-all-additional-properties.md deleted file mode 100644 index cba36fb4dca..00000000000 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/expose-all-additional-properties.md +++ /dev/null @@ -1,29 +0,0 @@ -# Expose all additional properties - -The High Definition Render Pipeline (HDRP) components expose standard properties by default that are suitable for most use-cases. However, some HDRP components and [Volume Overrides](volume-component.md) include **additional properties** which you can use to fine-tune the behavior of the component. - -## Exposing additional properties - -Not every component or Volume Override includes additional properties. If one does, it has a contextual menu to the right of each property section header that includes additional properties. To expose additional properties for that section, open the contextual menu and click **Show Additional Properties**. For example, the [Light component’s](Light-Component.md) **General** section includes additional properties: - -![](Images/MoreOptions1.png) - -When you select **Show Additional Properties**, Unity exposes additional properties for the **General** section. In this example, the **Light Layer** property appears: - -![](Images/MoreOptions2.png) - -For Volume Overrides, the already existing contextual menu has a **Show Additional Properties** toggle as well. - -Note that you can also open the contextual menu by right-clicking on the property section header. - -## Exposing all additional properties - -If you want to toggle additional properties for all components and Volume Overrides, you can do so through the **Preference** window under **Core Render Pipeline**. To do this: - -1. Open the **Core Render Pipeline** tab in the **Preferences** window (menu: **Edit > Preferences > Core Render Pipeline**). -2. Set **Additional Properties** to **All Visible**. - -![](Images/MoreOptions3.png) - -When toggling additional properties through this menu, the state of all components changes once. After that, you can still choose to show or hide additional properties for each component individually. -A shortcut to this preference menu is also available from the component and Volume Override's contextual menu with **Show All Additional Properties...**. diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/hdri-sky-volume-override-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/hdri-sky-volume-override-reference.md index 794cd659720..0f20a632f1f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/hdri-sky-volume-override-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/hdri-sky-volume-override-reference.md @@ -100,7 +100,7 @@ Refer to [Create an HDRI sky](create-an-HDRI-sky.md) for more information. ![](Images/Override-HDRISky2.png) -These properties only appear if you enable [more options](expose-all-additional-properties.md) and then enable **Backplate**. +These properties only appear if you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) and then enable **Backplate**. diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/reference-light-component.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/reference-light-component.md index 10a11d0d08b..eb941d397ac 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/reference-light-component.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/reference-light-component.md @@ -1,6 +1,6 @@ ## Light component reference -The properties available for Lights are in separate sections. Each section contains some properties that all Lights share, and also properties that customize the behavior of the specific type of Light. These sections also contain [additional properties](expose-all-additional-properties.md) that you can expose if you want to fine-tune your light's behavior. The sections are: +The properties available for Lights are in separate sections. Each section contains some properties that all Lights share, and also properties that customize the behavior of the specific type of Light. These sections also contain [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) that you can expose if you want to fine-tune your light's behavior. The sections are: - [General](#General) - [Shape](#Shape) @@ -23,7 +23,7 @@ To make the Light work with the **Animation window**, when you click on the **Ad | ------------------------ | ------------------------------------------------------------ | | **Type** | Defines the Light’s type. Lights of different Types behave differently, so when you change the **Type**, the properties change in the Inspector. Possible types are:
• Directional
• Point
• Spot
• Area | | **Mode** | Specify the [Light Mode](https://docs.unity3d.com/Manual/LightModes.html) that HDRP uses to determine how to bake a Light, if at all. Possible modes are:
• [Realtime](https://docs.unity3d.com/Manual/LightMode-Realtime.html): Unity performs the lighting calculations for Realtime Lights at runtime, once per frame.
• [Mixed](https://docs.unity3d.com/Manual/LightMode-Mixed.html): Mixed Lights combine elements of both realtime and baked lighting.
• [Baked](https://docs.unity3d.com/Manual/LightMode-Baked.html): Unity performs lighting calculations for Baked Lights in the Unity Editor, and saves the results to disk as lighting data. Note that soft falloff/range attenuation isn't supported for Baked Area Lights. | -| **Rendering Layer Mask** | Defines which Rendering Layers this Light affects. The affected Light only lights up Mesh Renderers or Terrain with a matching **Rendering Layer Mask**. To use this property:
• Set up [light layers](Rendering-Layers.md) in your project.
• Enable [additional properties](expose-all-additional-properties.md) for this section. | +| **Rendering Layer Mask** | Defines which Rendering Layers this Light affects. The affected Light only lights up Mesh Renderers or Terrain with a matching **Rendering Layer Mask**. To use this property:
• Set up [light layers](Rendering-Layers.md) in your project.
• Enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | #### Light Types guide @@ -106,7 +106,7 @@ These settings define the behavior of the light when you use it as a celestial b ### Emission -These settings define the emissive behavior of your Light. You can set the Light’s color, strength, and maximum range. If you don't see these properties in the Light Inspector, make sure you enable [additional properties](expose-all-additional-properties.md). Most Lights share **Emission** properties. Below are the list of properties that more than one Light **Type** share, followed by unique properties only available for a single Light **Type**. +These settings define the emissive behavior of your Light. You can set the Light’s color, strength, and maximum range. If you don't see these properties in the Light Inspector, make sure you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html). Most Lights share **Emission** properties. Below are the list of properties that more than one Light **Type** share, followed by unique properties only available for a single Light **Type**. #### Shared Properties @@ -122,13 +122,13 @@ These settings define the emissive behavior of your Light. You can set the Light | **Cookie** | An RGB Texture that the Light projects. For example, to create silhouettes or patterned illumination for the Light. Texture shapes should be 2D for Spot and Directional Lights and Cube for Point Lights. Always import **Cookie** textures as the default texture type. This property is available for **Spot**, **Area** (Rectangular only), **Directional**, and **Point** Lights.
Pyramid and Box lights will use an implicit 4x4 white cookie if none is specified. | | **IES Profile** | An IES File that describes the light profile. HDRP uses a linear average of a cookie and an IES profile in your scene. If you use an IES profile and a cookie at the same time during light baking, the Light in your scene only uses the cookie. You can't assign an IES file with code. Instead, use the **Cookie** property with the Textures that IES generates. | | **IES cutoff angle (%)** | Cut off of the IES Profile, as a percentage of the Outer angle. During a baking of a lightmap this parameter isn't used. | -| **Affect Diffuse** | Enable the checkbox to apply [diffuse]() lighting to this Light.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. It's only available in Realtime or Mixed light **Mode**. | -| **Affect Specular** | Enable the checkbox to apply [specular](https://docs.unity3d.com/Manual/shader-NormalSpecular.html) lighting to this Light.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. It's only available in Realtime or Mixed light **Mode**. | -| **Range Attenuation** | Enable the checkbox to make this Light shine uniformly across its range. This stops light from fading around the edges. This setting is useful when the range limit isn't visible on screen, and you don't want the edges of your light to fade out. This property is available for all **Light Types** except **Directional**.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. It's only available in Realtime or Mixed light **Mode** for **Type** Area. | +| **Affect Diffuse** | Enable the checkbox to apply [diffuse]() lighting to this Light.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. It's only available in Realtime or Mixed light **Mode**. | +| **Affect Specular** | Enable the checkbox to apply [specular](https://docs.unity3d.com/Manual/shader-NormalSpecular.html) lighting to this Light.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html)for this section. It's only available in Realtime or Mixed light **Mode**. | +| **Range Attenuation** | Enable the checkbox to make this Light shine uniformly across its range. This stops light from fading around the edges. This setting is useful when the range limit isn't visible on screen, and you don't want the edges of your light to fade out. This property is available for all **Light Types** except **Directional**.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. It's only available in Realtime or Mixed light **Mode** for **Type** Area. | | **Fade Distance** | The distance between the Light source and the Camera at which the Light begins to fade out. Measured in meters. This property is available for all **Light Types** except **Directional**.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. It's only available in Realtime or Mixed light **Mode**. | -| **Intensity Multiplier** | A multiplier that gets applied to the intensity of the Light. Doesn't affect the intensity value, but only gets applied during the evaluation of the lighting. You can also modify this property via [Timeline](https://docs.unity3d.com/Manual/TimelineSection.html), Scripting or [animation](https://docs.unity3d.com/Manual/animeditor-AnimatingAGameObject.html). The parameter lets you fade the Light in and out without having to store its original intensity.
This property does not affect the [Physically Based Sky](physically-based-sky-volume-override-reference.html) rendering for the main directionnal light.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. It's only available in Realtime or Mixed light **Mode**. | -| **Display Emissive Mesh** | Enable the checkbox to make Unity automatically generate a Mesh with an emissive Material using the size, color, and intensity of this Light. Unity automatically adds the Mesh and Material to the GameObject the Light component is attached to. This property is available for **Rectangle** and **Tube** Lights.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. (In case of an IES profile and a cookie used at the same time, only the cookie will be displayed). | -| **Include For Ray Tracing** | Enable the checkbox to make this Light active when you enable the **Ray Tracing** [Frame Setting](Frame-Settings.md) on the Camera. This applies to rasterization and [ray tracing](Ray-Tracing-Getting-Started.md) passes.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. It's only available in Realtime or Mixed light **Mode**. | +| **Intensity Multiplier** | A multiplier that gets applied to the intensity of the Light. Doesn't affect the intensity value, but only gets applied during the evaluation of the lighting. You can also modify this property via [Timeline](https://docs.unity3d.com/Manual/TimelineSection.html), Scripting or [animation](https://docs.unity3d.com/Manual/animeditor-AnimatingAGameObject.html). The parameter lets you fade the Light in and out without having to store its original intensity.
This property does not affect the [Physically Based Sky](physically-based-sky-volume-override-reference.html) rendering for the main directionnal light.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. It's only available in Realtime or Mixed light **Mode**. | +| **Display Emissive Mesh** | Enable the checkbox to make Unity automatically generate a Mesh with an emissive Material using the size, color, and intensity of this Light. Unity automatically adds the Mesh and Material to the GameObject the Light component is attached to. This property is available for **Rectangle** and **Tube** Lights.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. (In case of an IES profile and a cookie used at the same time, only the cookie will be displayed). | +| **Include For Ray Tracing** | Enable the checkbox to make this Light active when you enable the **Ray Tracing** [Frame Setting](Frame-Settings.md) on the Camera. This applies to rasterization and [ray tracing](Ray-Tracing-Getting-Started.md) passes.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. It's only available in Realtime or Mixed light **Mode**. | | **Include For Path Tracing** | Enable the checkbox to make this Light active when [Path Tracing](Ray-Tracing-Path-Tracing.md) is enabled. | #### Spot Light @@ -183,21 +183,21 @@ This section is only available in Realtime or Mixed light **Mode**. | **Resolution** | Set the resolution of this Light’s shadow maps. Use the drop-down to select which quality mode to derive the resolution from. If you don't enable **Use Quality Settings**, or you select **Custom**, set the resolution, measured in pixels, in the input field.
A higher resolution increases the fidelity of shadows at the cost of GPU performance and memory usage, so if you experience any performance issues, try using a lower value. Shadows can be turned off by setting the resolution to 0. | | **Near Plane** | The distance, in meters, from the Light that GameObjects begin to cast shadows. | | **Shadowmask Mode** | Defines how the shadowmask behaves for this Light. For detailed information on each **Shadowmask Mode**, see the documentation on [Shadowmasks](Lighting-Mode-Shadowmask.md). This property is only visible if you tet the **Mode**, under [General](#general), to **Mixed**. | -| **Slope-Scale Depth Bias** | Use the slider to set the bias that HDRP adds to the distance in this Light's shadow map to avoid self intersection. This bias is proportional to the slope of the polygons represented in the shadow map.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Normal Bias** | Controls the amount of normal [bias](https://docs.unity3d.com/Manual/ShadowOverview.html#LightBias) this Light applies along the [normal](https://docs.unity3d.com/Manual/AnatomyofaMesh.html) of the illuminated surface.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Custom Spot Angle** | Enable the checkbox to use a custom angle to render shadow maps with.
This property only appears if you select **Spot** from the **Type** drop-down and enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Shadow Angle** | Use the slider to set a custom angle to use for shadow map rendering.
This property only appears if you enable **Custom Spot Angle** and enable [additional properties](expose-all-additional-properties.md) for this section. | +| **Slope-Scale Depth Bias** | Use the slider to set the bias that HDRP adds to the distance in this Light's shadow map to avoid self intersection. This bias is proportional to the slope of the polygons represented in the shadow map.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Normal Bias** | Controls the amount of normal [bias](https://docs.unity3d.com/Manual/ShadowOverview.html#LightBias) this Light applies along the [normal](https://docs.unity3d.com/Manual/AnatomyofaMesh.html) of the illuminated surface.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Custom Spot Angle** | Enable the checkbox to use a custom angle to render shadow maps with.
This property only appears if you select **Spot** from the **Type** drop-down and enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Shadow Angle** | Use the slider to set a custom angle to use for shadow map rendering.
This property only appears if you enable **Custom Spot Angle** and enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | | **Shadow Cone** | Use the slider to set the aperture of the shadow cone this area Light uses for shadowing. This property only appears if you select **Rectangle** from the **Type** drop-down. | -| **EVSM Exponent** | Use the slider to set the exponent this area Light uses for depth warping. [EVSM](Glossary.md#ExponentialVarianceShadowMap) modifies its shadow distribution representation by this exponent. Increase this value to reduce light leaking and change the appearance of the shadow. This property only appears if you select **Rectangle** from the **Type** drop-down and enable [additional properties](expose-all-additional-properties.md) for this section. | +| **EVSM Exponent** | Use the slider to set the exponent this area Light uses for depth warping. [EVSM](Glossary.md#ExponentialVarianceShadowMap) modifies its shadow distribution representation by this exponent. Increase this value to reduce light leaking and change the appearance of the shadow. This property only appears if you select **Rectangle** from the **Type** drop-down and enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | | **Light Leak Bias** | Use this slider to set the bias that HDRP uses to prevent light leaking through Scene geometry. Increasing this value prevents light leaks, but removes some of the shadow softness. This property only appears if you select **Rectangle** from the **Type** drop-down and enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Variance Bias** | Use the slider to fix numerical accuracy issues in the [EVSM](Glossary.md#ExponentialVarianceShadowMap). This property only appears if you select **Rectangle** from the **Type** drop-down and enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Blur Passes** | Use the slider to set the number of blur passes HDRP performs on this shadow map. Increasing this value softens shadows, but impacts performance. This property only appears if you select **Rectangle** from the **Type** drop-down and enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Dimmer** | Dims the shadows this Light casts so they become more faded and transparent.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Tint** | Specifies whether HDRP should tint the shadows this Light casts. This option affects dynamic shadows, [Contact Shadows](Override-Contact-Shadows.md), and [ShadowMask](Lighting-Mode-Shadowmask.md). It doesn't affect baked shadows. You can use this behavior to change the color and transparency of shadows.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Penumbra Tint** | Specifies whether the tint should only affect the shadow's penumbra. If you enable this property, HDRP only applies the color tint to the shadow's penumbra. If you disable this property, HDRP applies the color tint to the entire shadow including the penumbra. To change the color HDRP tints the shadow to, see the above **Tint** property.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | +| **Variance Bias** | Use the slider to fix numerical accuracy issues in the [EVSM](Glossary.md#ExponentialVarianceShadowMap). This property only appears if you select **Rectangle** from the **Type** drop-down and enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Blur Passes** | Use the slider to set the number of blur passes HDRP performs on this shadow map. Increasing this value softens shadows, but impacts performance. This property only appears if you select **Rectangle** from the **Type** drop-down and enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Dimmer** | Dims the shadows this Light casts so they become more faded and transparent.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Tint** | Specifies whether HDRP should tint the shadows this Light casts. This option affects dynamic shadows, [Contact Shadows](Override-Contact-Shadows.md), and [ShadowMask](Lighting-Mode-Shadowmask.md). It doesn't affect baked shadows. You can use this behavior to change the color and transparency of shadows.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. | +| **Penumbra Tint** | Specifies whether the tint should only affect the shadow's penumbra. If you enable this property, HDRP only applies the color tint to the shadow's penumbra. If you disable this property, HDRP applies the color tint to the entire shadow including the penumbra. To change the color HDRP tints the shadow to, see the above **Tint** property.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html)for this section. | | **Fade Distance** | The distance, in meters, between the Camera and the Light at which shadows fade out. This property is available for **Spot** and **Point** Lights.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. | -| **Custom Shadow Layers** | Enable the checkbox to use a different [Rendering Layer Mask](Rendering-Layers.md) for shadows than the one used for lighting. If you enable this feature, then HDRP uses the **Shadow Layers** drop-down in this section for shadowing. If you disable it, then HDRP uses the **Rendering Layer Mask** drop-down in the **General** section for shadowing.
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. To access this property, enable **Light Layers** in your [HDRP Asset](HDRP-Asset.md). | -| **Shadow Layers** | Use the drop-down to set the [Rendering Layer Mask](Rendering-Layers.md) HDRP uses for shadowing. This Light therefore only casts shadows for GameObjects that use a matching Rendering Layer. For more information about using Rendering Layers for shadowing, see [Shadow Light Layers](Rendering-Layers.md#ShadowLightLayers).
This property only appears when you enable [additional properties](expose-all-additional-properties.md) for this section. To access this property, enable the **Custom Shadow Layers** checkbox. | +| **Custom Shadow Layers** | Enable the checkbox to use a different [Rendering Layer Mask](Rendering-Layers.md) for shadows than the one used for lighting. If you enable this feature, then HDRP uses the **Shadow Layers** drop-down in this section for shadowing. If you disable it, then HDRP uses the **Rendering Layer Mask** drop-down in the **General** section for shadowing.
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. To access this property, enable **Light Layers** in your [HDRP Asset](HDRP-Asset.md). | +| **Shadow Layers** | Use the drop-down to set the [Rendering Layer Mask](Rendering-Layers.md) HDRP uses for shadowing. This Light therefore only casts shadows for GameObjects that use a matching Rendering Layer. For more information about using Rendering Layers for shadowing, see [Shadow Light Layers](Rendering-Layers.md#ShadowLightLayers).
This property only appears when you enable [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) for this section. To access this property, enable the **Custom Shadow Layers** checkbox. | ##### Contact Shadows diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs new file mode 100644 index 00000000000..7bd28c8f4e6 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; + +namespace UnityEditor.Rendering.HighDefinition.Core +{ + /// + /// Editor Preferences for HDRP + /// + [DisplayInfo(name = "High Definition Render Pipeline", order = 200)] + public class HDRenderPipelinePreferencesProvider : ICoreRenderPipelinePreferencesProvider + { + class Styles + { + public static readonly GUIContent matcapLabel = EditorGUIUtility.TrTextContent("MatCap Mode Default Values"); + public static readonly GUIContent matcapViewMixAlbedoLabel = EditorGUIUtility.TrTextContent("Mix Albedo", "Enable to make HDRP mix the albedo of the Material with its material capture."); + public static readonly GUIContent matcapViewScaleLabel = EditorGUIUtility.TrTextContent("Intensity scale", "Set the intensity of the material capture. This increases the brightness of the Scene. This is useful if the albedo darkens the Scene considerably."); + } + + static List s_SearchKeywords = new() { "MatCap Mode", "Intensity scale", "Mix Albedo" }; + + /// + /// Keyworks for the preferences + /// + public List keywords => s_SearchKeywords; + + /// + /// UI for the preferences. + /// + public void PreferenceGUI() + { + EditorGUILayout.LabelField(Styles.matcapLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel++; + var matCapMode = HDRenderPipelinePreferences.matCapMode; + matCapMode.mixAlbedo.value = EditorGUILayout.Toggle(Styles.matcapViewMixAlbedoLabel, matCapMode.mixAlbedo.value); + if (matCapMode.mixAlbedo.value) + matCapMode.viewScale.value = EditorGUILayout.FloatField(Styles.matcapViewScaleLabel, matCapMode.viewScale.value); + EditorGUI.indentLevel--; + } + } +} diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs.meta b/Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs.meta new file mode 100644 index 00000000000..12557ca5682 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Core/HDRenderPipelinePreferencesProvider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e2f32393e04740bab03f54007a3e4368 +timeCreated: 1711446846 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.ContextualMenu.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.ContextualMenu.cs index 729f5deae4d..ad2db7cb421 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.ContextualMenu.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.ContextualMenu.cs @@ -32,7 +32,7 @@ static void ResetLight(MenuCommand menuCommand) light.cookie = null; } - [MenuItem("CONTEXT/Light/Show All Additional Properties...", false, 100)] + [MenuItem("CONTEXT/Light/Open Preferences > Graphics...", false, 100)] static void ShowAllAdditionalProperties(MenuCommand menuCommand) { CoreRenderPipelinePreferences.Open(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs index f8b6c76f32e..3dbe7df0822 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs @@ -130,15 +130,6 @@ internal static void UnregisterEditor(HDLightEditor editor) k_AdditionalPropertiesState.UnregisterEditor(editor); } - [SetAdditionalPropertiesVisibility] - internal static void SetAdditionalPropertiesVisibility(bool value) - { - if (value) - k_AdditionalPropertiesState.ShowAll(); - else - k_AdditionalPropertiesState.HideAll(); - } - static Func GetLightingSettingsOrDefaultsFallback; static HDLightUI() diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDProbeUI.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDProbeUI.cs index cc3959a6c77..9cc022bb7c6 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDProbeUI.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDProbeUI.cs @@ -33,14 +33,5 @@ internal static void UnregisterEditor(HDProbeEditor Graphics...", false, 100)] + [MenuItem("CONTEXT/PlanarReflectionProbe/Open Preferences > Graphics...", false, 700)] static void ShowAllAdditionalProperties(MenuCommand menuCommand) { CoreRenderPipelinePreferences.Open(); } - [MenuItem("CONTEXT/PlanarReflectionProbe/Show All Additional Properties...", false, 700)] - static void ShowAllAdditionalPropertiesPlanar(MenuCommand menuCommand) - { - CoreRenderPipelinePreferences.Open(); - } - #endregion protected override void OnEnable() diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs index 7855533c2f4..3ee2c8f6090 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs @@ -29,7 +29,7 @@ static Color fullColor static Color s_LastColor; static void UpdateColorsInHandlesIfRequired() { - Color c = HDRenderPipelinePreferences.decalGizmoColor; + Color c = DecalPreferences.decalGizmoColor; if (c != s_LastColor) { if (s_BoxHandle != null && !s_BoxHandle.Equals(null)) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraUI.Rendering.Drawers.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraUI.Rendering.Drawers.cs index 0e5f483aebd..f81d4b7dcd0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraUI.Rendering.Drawers.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Camera/HDCameraUI.Rendering.Drawers.cs @@ -92,15 +92,6 @@ internal static void UnregisterEditor(HDCameraEditor editor) k_AdditionalPropertiesState.UnregisterEditor(editor); } - [SetAdditionalPropertiesVisibility] - internal static void SetAdditionalPropertiesVisibility(bool value) - { - if (value) - k_AdditionalPropertiesState.ShowAll(); - else - k_AdditionalPropertiesState.HideAll(); - } - static void Draw_Rendering_Advanced(SerializedHDCamera p, Editor owner) { } @@ -207,7 +198,7 @@ static void Drawer_Draw_FSR2_Section(SerializedHDCamera p, Editor owner) p.fidelityFX2SuperResolutionQuality.intValue = (int)(object)v; } EditorGUI.indentLevel--; - } + } EditorGUILayout.PropertyField(p.fidelityFX2SuperResolutionUseCustomAttributes, Styles.FSR2UseCustomAttributes); if (p.fidelityFX2SuperResolutionUseCustomAttributes.boolValue) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Appearance.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Appearance.cs index ff20450592a..03e3c39bbda 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Appearance.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Appearance.cs @@ -118,7 +118,7 @@ internal static string GetWaterResourcesPath(MonoBehaviour component) CoreUtils.EnsureFolderTreeInAssetFilePath(folderName); return folderName; } - + internal static Material CreateNewWaterMaterialAndShader(MonoBehaviour component) { string directory = GetWaterResourcesPath(component); @@ -277,8 +277,8 @@ static internal void WaterSurfaceAppearanceSection(WaterSurfaceEditor serialized EditorGUILayout.PropertyField(serialized.m_CausticsVirtualPlaneDistance, k_CausticsVirtualPlaneDistance); EditorGUILayout.PropertyField(serialized.m_CausticsTilingFactor, k_CausticsTilingFactor); - - if (WaterSurfaceUI.ShowAdditionalProperties()) + + if (AdvancedProperties.BeginGroup()) { EditorGUILayout.PropertyField(serialized.m_CausticsIntensity, k_CausticsInstensity); EditorGUILayout.PropertyField(serialized.m_CausticsPlaneBlendDistance); @@ -290,6 +290,7 @@ static internal void WaterSurfaceAppearanceSection(WaterSurfaceEditor serialized EditorGUILayout.PropertyField(serialized.m_CausticsDirectionalShadowDimmer, k_CausticsDirectionalShadowDimmer); } } + AdvancedProperties.EndGroup(); // Display an info box if the wind speed is null for the target band if (!WaterBandHasAgitation(serialized, owner, HDRenderPipeline.SanitizeCausticsBand(serialized.m_CausticsBand.intValue, bandCount))) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Simulation.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Simulation.cs index 5aa7ce11d0f..8b5452a09a0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Simulation.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.Simulation.cs @@ -223,7 +223,7 @@ static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor seri } // The fade parameters are only to be displayed when the additional parameters are - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { // Fade of the ripples using (new BoldLabelScope()) @@ -239,6 +239,7 @@ static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor seri } } } + AdvancedProperties.EndGroup(); } // Second band foldout @@ -256,7 +257,7 @@ static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor seri } // The fade parameters are only to be displayed when the additional parameters are - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { // Fade of the ripples using (new BoldLabelScope()) @@ -271,6 +272,7 @@ static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor seri } } } + AdvancedProperties.EndGroup(); } using (new DisabledScope(true)) @@ -292,7 +294,7 @@ static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor seri // Current & Orientation WaterSurfaceRipplesOrientationCurrentInherit(serialized, owner, WaterPropertyParameterDrawer.swellModeNames); - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { // Fade of the ripples using (new BoldLabelScope()) @@ -307,6 +309,7 @@ static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor seri } } } + AdvancedProperties.EndGroup(); } } } @@ -342,7 +345,7 @@ static internal void WaterSurfaceSimulationSection_River(WaterSurfaceEditor seri } // The fade parameters are only to be displayed when the additional parameters are - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { // Fade of the agitation using (new BoldLabelScope()) @@ -357,6 +360,7 @@ static internal void WaterSurfaceSimulationSection_River(WaterSurfaceEditor seri } } } + AdvancedProperties.EndGroup(); } // Ripples Section @@ -372,7 +376,7 @@ static internal void WaterSurfaceSimulationSection_River(WaterSurfaceEditor seri // Orientation & Current WaterSurfaceRipplesOrientationCurrentInherit(serialized, owner, WaterPropertyParameterDrawer.agitationModeNames); - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { // Fade of the ripples using (new BoldLabelScope()) @@ -387,6 +391,7 @@ static internal void WaterSurfaceSimulationSection_River(WaterSurfaceEditor seri } } } + AdvancedProperties.EndGroup(); } } } @@ -406,7 +411,7 @@ static internal void WaterSurfaceSimulationSection_Pool(WaterSurfaceEditor seria // Current WaterSurfaceRipplesOrientationCurrent(serialized, owner); - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { // Fade of the ripples using (new BoldLabelScope()) @@ -421,6 +426,7 @@ static internal void WaterSurfaceSimulationSection_Pool(WaterSurfaceEditor seria } } } + AdvancedProperties.EndGroup(); } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.cs index d5409dcb0b6..22efe23f1d8 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Water/WaterSurface/WaterSurfaceEditor.cs @@ -208,11 +208,12 @@ static internal void WaterSurfaceGeneralSection(WaterSurfaceEditor serialized, E using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.PropertyField(serialized.m_MaxTessellationFactor); - if (WaterSurfaceUI.ShowAdditionalProperties()) + if (AdvancedProperties.BeginGroup()) { EditorGUILayout.PropertyField(serialized.m_TessellationFactorFadeStart); EditorGUILayout.PropertyField(serialized.m_TessellationFactorFadeRange); } + AdvancedProperties.EndGroup(); } } } @@ -325,12 +326,12 @@ class WaterSurfaceUI { public static readonly CED.IDrawer Inspector; - public static readonly string generalHeader = "General"; - public static readonly string simulationHeader = "Simulation"; - public static readonly string deformationHeader = "Deformation"; - public static readonly string appearanceHeader = "Appearance"; - public static readonly string foamHeader = "Foam"; - public static readonly string miscellaneousHeader = "Miscellaneous"; + public static readonly GUIContent generalHeader = EditorGUIUtility.TrTextContent("General"); + public static readonly GUIContent simulationHeader = EditorGUIUtility.TrTextContent("Simulation"); + public static readonly GUIContent deformationHeader = EditorGUIUtility.TrTextContent("Deformation"); + public static readonly GUIContent appearanceHeader = EditorGUIUtility.TrTextContent("Appearance"); + public static readonly GUIContent foamHeader = EditorGUIUtility.TrTextContent("Foam"); + public static readonly GUIContent miscellaneousHeader = EditorGUIUtility.TrTextContent("Miscellaneous"); enum Expandable { @@ -344,37 +345,15 @@ enum Expandable internal enum AdditionalProperties { - Global = 1 << 0, + General = 1 << 0, + Simulation = 1 << 1, + Appearance = 1 << 3, } readonly static ExpandedState k_ExpandedState = new ExpandedState(0, "HDRP"); readonly internal static AdditionalPropertiesState k_AdditionalPropertiesState = new AdditionalPropertiesState(0, "HDRP"); - internal static void RegisterEditor(HDLightEditor editor) - { - k_AdditionalPropertiesState.RegisterEditor(editor); - } - - internal static void UnregisterEditor(HDLightEditor editor) - { - k_AdditionalPropertiesState.UnregisterEditor(editor); - } - - [SetAdditionalPropertiesVisibility] - internal static void SetAdditionalPropertiesVisibility(bool value) - { - if (value) - k_AdditionalPropertiesState.ShowAll(); - else - k_AdditionalPropertiesState.HideAll(); - } - - internal static bool ShowAdditionalProperties() - { - return k_AdditionalPropertiesState[WaterSurfaceUI.AdditionalProperties.Global]; - } - - [MenuItem("CONTEXT/WaterSurface/Show All Additional Properties...", false, 100)] + [MenuItem("CONTEXT/WaterSurface/Open Preferences > Graphics...", false, 100)] static void ShowAllAdditionalProperties(MenuCommand menuCommand) { CoreRenderPipelinePreferences.Open(); @@ -407,14 +386,21 @@ static void ResetWaterSurface(MenuCommand menuCommand) static WaterSurfaceUI() { + var emptyDrawer = + CED.Group( + (s, e) => { }); + Inspector = CED.Group( - CED.FoldoutGroup(generalHeader, Expandable.General, k_ExpandedState, WaterSurfaceEditor.WaterSurfaceGeneralSection), - CED.FoldoutGroup(simulationHeader, Expandable.Simulation, k_ExpandedState, WaterSurfaceEditor.WaterSurfaceSimulationSection), + CED.AdditionalPropertiesFoldoutGroup(generalHeader, Expandable.General, k_ExpandedState, + AdditionalProperties.General, k_AdditionalPropertiesState, CED.Group(WaterSurfaceEditor.WaterSurfaceGeneralSection), emptyDrawer), + CED.AdditionalPropertiesFoldoutGroup(simulationHeader, Expandable.Simulation, k_ExpandedState, + AdditionalProperties.Simulation, k_AdditionalPropertiesState, CED.Group(WaterSurfaceEditor.WaterSurfaceSimulationSection), emptyDrawer), CED.FoldoutGroup(deformationHeader, Expandable.Deformation, k_ExpandedState, WaterSurfaceEditor.WaterSurfaceDeformationSection), - CED.FoldoutGroup(appearanceHeader, Expandable.Appearance, k_ExpandedState, WaterSurfaceEditor.WaterSurfaceAppearanceSection), + CED.AdditionalPropertiesFoldoutGroup(appearanceHeader, Expandable.Appearance, k_ExpandedState, + AdditionalProperties.Appearance, k_AdditionalPropertiesState, CED.Group(WaterSurfaceEditor.WaterSurfaceAppearanceSection), emptyDrawer), CED.FoldoutGroup(foamHeader, Expandable.Foam, k_ExpandedState, WaterSurfaceEditor.WaterSurfaceFoamSection), CED.FoldoutGroup(miscellaneousHeader, Expandable.Miscellaneous, k_ExpandedState, WaterSurfaceEditor.WaterSurfaceMiscellaneousSection) - ); + ); } } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs index c3863ce4d1b..678e495c101 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.cs @@ -1204,6 +1204,11 @@ static class LightingStrings public static readonly NameAndTooltip AreaLights = new() { name = "Area Lights", tooltip = "Temporarily enables or disables Area Lights in your Scene." }; public static readonly NameAndTooltip ReflectionProbes = new() { name = "Reflection Probes", tooltip = "Temporarily enables or disables Reflection Probes in your Scene." }; + // Lighting - Mat Cap + public static readonly NameAndTooltip MatCapHeader = new() { name = "Mat Cap Mode", tooltip = "Settings for Scene View MatCap" }; + public static readonly NameAndTooltip MatCapViewMixAlbedoLabel = new() { name = "Mix Albedo", tooltip = "Enable to make HDRP mix the albedo of the Material with its material capture." }; + public static readonly NameAndTooltip MatCapIntensityScaleLabel = new() { name = "Intensity scale", tooltip = "Set the intensity of the material capture. This increases the brightness of the Scene. This is useful if the albedo darkens the Scene considerably." }; + public static readonly NameAndTooltip Exposure = new() { name = "Exposure", tooltip = "Allows the selection of an Exposure debug mode to use." }; public static readonly NameAndTooltip HDROutput = new() { name = "HDR", tooltip = "Allows the selection of an HDR debug mode to use." }; public static readonly NameAndTooltip HDROutputDebugMode = new() { name = "DebugMode", tooltip = "Use the drop-down to select a debug mode for HDR Output." }; @@ -1434,6 +1439,29 @@ void RegisterLightingDebug() lighting.children.Add(hdrFoldout); lighting.children.Add(new DebugUI.EnumField { nameAndTooltip = LightingStrings.LightingDebugMode, getter = () => (int)data.lightingDebugSettings.debugLightingMode, setter = value => SetDebugLightingMode((DebugLightingMode)value), autoEnum = typeof(DebugLightingMode), getIndex = () => data.lightingDebugModeEnumIndex, setIndex = value => { data.ResetExclusiveEnumIndices(); data.lightingDebugModeEnumIndex = value; } }); + + lighting.children.Add(new DebugUI.Container() + { + children = + { + new DebugUI.BoolField + { + nameAndTooltip = LightingStrings.MatCapViewMixAlbedoLabel, + getter = () => data.lightingDebugSettings.matCapMixAlbedo, + setter = value => data.lightingDebugSettings.matCapMixAlbedo = value + }, + new DebugUI.FloatField + { + nameAndTooltip = LightingStrings.MatCapIntensityScaleLabel, + getter = () => data.lightingDebugSettings.matCapMixScale, + setter = value => data.lightingDebugSettings.matCapMixScale = value, + isHiddenCallback = () => !data.lightingDebugSettings.matCapMixAlbedo + }, + }, + isHiddenCallback = () => data.lightingDebugSettings.debugLightingMode != DebugLightingMode.MatcapView + }); + + lighting.children.Add(new DebugUI.BitField { nameAndTooltip = LightingStrings.LightHierarchyDebugMode, getter = () => data.lightingDebugSettings.debugLightFilterMode, setter = value => SetDebugLightFilterMode((DebugLightFilterMode)value), enumType = typeof(DebugLightFilterMode)}); list.Add(lighting); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/LightingDebug.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/LightingDebug.cs index dd13429c2fb..f046f431d6d 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/LightingDebug.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/LightingDebug.cs @@ -359,6 +359,22 @@ public bool IsDebugDisplayEnabled() /// Light category for cluster debug view. public ClusterLightCategoryDebug clusterLightCategory = ClusterLightCategoryDebug.All; + + /// Enable to make HDRP mix the albedo of the Material with its material capture. + public bool matCapMixAlbedo = false ; + + /// Set the intensity of the material capture. This increases the brightness of the Scene. This is useful if the albedo darkens the Scene considerably. + public float matCapMixScale = 1.0f; + +#if UNITY_EDITOR + public LightingDebugSettings() + { + var matCapMode = HDRenderPipelinePreferences.matCapMode; + matCapMixAlbedo = matCapMode.mixAlbedo.value; + matCapMixScale = matCapMode.viewScale.value; + } +#endif + // Internal APIs internal bool IsDebugDisplayRemovePostprocess() { diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs index 8d908a578d2..1d96e661ff0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Debug.cs @@ -145,7 +145,9 @@ unsafe void ApplyDebugDisplaySettings(HDCamera hdCamera, CommandBuffer cmd, bool // However debug mode like colorPickerModes and false color don't need DEBUG_DISPLAY and must work with the lighting. // So we will enabled DEBUG_DISPLAY independently - bool debugDisplayEnabledOrSceneLightingDisabled = m_CurrentDebugDisplaySettings.IsDebugDisplayEnabled() || CoreUtils.IsSceneLightingDisabled(hdCamera.camera); + bool isSceneLightingDisabled = CoreUtils.IsSceneLightingDisabled(hdCamera.camera); + bool debugDisplayEnabledOrSceneLightingDisabled = m_CurrentDebugDisplaySettings.IsDebugDisplayEnabled() || isSceneLightingDisabled; + // Enable globally the keyword DEBUG_DISPLAY on shader that support it with multi-compile CoreUtils.SetKeyword(cmd, "DEBUG_DISPLAY", debugDisplayEnabledOrSceneLightingDisabled); @@ -173,12 +175,6 @@ unsafe void ApplyDebugDisplaySettings(HDCamera hdCamera, CommandBuffer cmd, bool var debugEmissiveColor = new Vector4(lightingDebugSettings.overrideEmissiveColor ? 1.0f : 0.0f, lightingDebugSettings.overrideEmissiveColorValue.r, lightingDebugSettings.overrideEmissiveColorValue.g, lightingDebugSettings.overrideEmissiveColorValue.b); var debugTrueMetalColor = new Vector4(materialDebugSettings.materialValidateTrueMetal ? 1.0f : 0.0f, materialDebugSettings.materialValidateTrueMetalColor.r, materialDebugSettings.materialValidateTrueMetalColor.g, materialDebugSettings.materialValidateTrueMetalColor.b); - DebugLightingMode debugLightingMode = m_CurrentDebugDisplaySettings.GetDebugLightingMode(); - if (CoreUtils.IsSceneLightingDisabled(hdCamera.camera)) - { - debugLightingMode = DebugLightingMode.MatcapView; - } - ref var cb = ref m_ShaderVariablesDebugDisplayCB; var debugMaterialIndices = m_CurrentDebugDisplaySettings.GetDebugMaterialIndexes(); @@ -202,6 +198,31 @@ unsafe void ApplyDebugDisplaySettings(HDCamera hdCamera, CommandBuffer cmd, bool } } + DebugLightingMode debugLightingMode = m_CurrentDebugDisplaySettings.GetDebugLightingMode(); + + // Mat Cap Mode Logic + { + bool matCapMixAlbedo = false; + float matCapMixScale = 1.0f; + + if (debugLightingMode == DebugLightingMode.MatcapView) + { + matCapMixAlbedo = m_CurrentDebugDisplaySettings.data.lightingDebugSettings.matCapMixAlbedo; + matCapMixScale = m_CurrentDebugDisplaySettings.data.lightingDebugSettings.matCapMixScale; + } +#if UNITY_EDITOR + else if (isSceneLightingDisabled) + { + // Forcing the MatCap Mode when scene view lighting is disabled. Also use the default values + debugLightingMode = DebugLightingMode.MatcapView; + matCapMixAlbedo = HDRenderPipelinePreferences.matCapMode.mixAlbedo.value; + matCapMixScale = HDRenderPipelinePreferences.matCapMode.viewScale.value; + } +#endif + cb._MatcapMixAlbedo = matCapMixAlbedo ? 1 : 0; + cb._MatcapViewScale = matCapMixScale; + } + cb._DebugLightingMode = (int)debugLightingMode; cb._DebugLightLayersMask = (int)m_CurrentDebugDisplaySettings.GetDebugLightLayersMask(); cb._DebugShadowMapMode = (int)m_CurrentDebugDisplaySettings.GetDebugShadowMapMode(); @@ -215,13 +236,6 @@ unsafe void ApplyDebugDisplaySettings(HDCamera hdCamera, CommandBuffer cmd, bool cb._ColorPickerMode = (int)m_CurrentDebugDisplaySettings.GetDebugColorPickerMode(); cb._DebugFullScreenMode = (int)m_CurrentDebugDisplaySettings.data.fullScreenDebugMode; -#if UNITY_EDITOR - cb._MatcapMixAlbedo = HDRenderPipelinePreferences.matcapViewMixAlbedo ? 1 : 0; - cb._MatcapViewScale = HDRenderPipelinePreferences.matcapViewScale; -#else - cb._MatcapMixAlbedo = 0; - cb._MatcapViewScale = 1.0f; -#endif cb._DebugViewportSize = hdCamera.screenSize; cb._DebugLightingAlbedo = debugAlbedo; cb._DebugLightingSmoothness = debugSmoothness; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/HDRenderPipelinePreferences.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/HDRenderPipelinePreferences.cs index 8991ed25bb4..40c8e11ba09 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/HDRenderPipelinePreferences.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/HDRenderPipelinePreferences.cs @@ -1,90 +1,36 @@ using System; +using UnityEditor; namespace UnityEngine.Rendering.HighDefinition { // This file can't be in the editor assembly as we need to access it in runtime-editor-specific - // places like OnGizmo etc and we don't want to add the editor assembly as a dependency of the - // runtime one #if UNITY_EDITOR - using UnityEditor; - using AntialiasingMode = HDAdditionalCameraData.AntialiasingMode; - - [InitializeOnLoad] static class HDRenderPipelinePreferences { - static bool m_Loaded = false; - - static bool s_MatcapMixAlbedo; - public static bool matcapViewMixAlbedo + public class MatCapModeEditorPreferences { - get => s_MatcapMixAlbedo; - set + static class Keys { - if (s_MatcapMixAlbedo == value) return; - s_MatcapMixAlbedo = value; - EditorPrefs.SetBool(Keys.matcapViewMixAlbedo, s_MatcapMixAlbedo); + internal const string matcapViewMixAlbedo = "HDRP.SceneView.MatcapMixAlbedo"; + internal const string matcapViewScale = "HDRP.SceneView.MatcapViewScale"; } - } - static float s_MatcapScale; - public static float matcapViewScale - { - get => s_MatcapScale; - set - { - if (s_MatcapScale == value) return; - s_MatcapScale = value; - EditorPrefs.SetFloat(Keys.matcapViewScale, s_MatcapScale); - } - } - - #region Decal Gizmo Color - - static readonly Color k_DecalGizmoColorBase = new Color(1, 1, 1, 8f / 255); - static Func GetColorPrefDecalGizmoColor; - public static Color decalGizmoColor => GetColorPrefDecalGizmoColor(); + public Observable mixAlbedo = new(true); + public Observable viewScale = new(1.0f); - #endregion - - static class Keys - { - internal const string sceneViewAntialiasing = "HDRP.SceneView.Antialiasing"; - internal const string sceneViewStopNaNs = "HDRP.SceneView.StopNaNs"; - internal const string matcapViewMixAlbedo = "HDRP.SceneView.MatcapMixAlbedo"; - internal const string matcapViewScale = "HDRP.SceneView.MatcapViewScale"; - } - - [SettingsProvider] - static SettingsProvider PreferenceGUI() - { - return new SettingsProvider("Preferences/HD Render Pipeline", SettingsScope.User) + public MatCapModeEditorPreferences() { - guiHandler = searchContext => - { - if (!m_Loaded) - Load(); - - matcapViewMixAlbedo = EditorGUILayout.Toggle("Mix Albedo in the Matcap", matcapViewMixAlbedo); - if (matcapViewMixAlbedo) - matcapViewScale = EditorGUILayout.FloatField("Matcap intensity scale", matcapViewScale); - } - }; - } + mixAlbedo.value = EditorPrefs.GetBool(Keys.matcapViewMixAlbedo, true); + mixAlbedo.onValueChanged += value => EditorPrefs.SetBool(Keys.matcapViewMixAlbedo, value); - static HDRenderPipelinePreferences() - { - Load(); + viewScale.value = EditorPrefs.GetFloat(Keys.matcapViewScale, 1.0f); + viewScale.onValueChanged += value => EditorPrefs.SetFloat(Keys.matcapViewScale, value); + } } - static void Load() - { - s_MatcapMixAlbedo = EditorPrefs.GetBool(Keys.matcapViewMixAlbedo, true); - s_MatcapScale = EditorPrefs.GetFloat(Keys.matcapViewScale, 1.0f); - GetColorPrefDecalGizmoColor = CoreRenderPipelinePreferences.RegisterPreferenceColor("Scene/Decal", k_DecalGizmoColorBase); - - m_Loaded = true; - } + private static Lazy s_MatCapModeEditorPreferences = new(() => new MatCapModeEditorPreferences()); + public static MatCapModeEditorPreferences matCapMode => s_MatCapModeEditorPreferences.Value; } #endif } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs index db106443aac..09b57f54482 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs @@ -28,7 +28,7 @@ static Color fullColor static Color s_LastColor; static void UpdateColorsInHandlesIfRequired() { - Color c = new Color(1f, 1f, 1f, 0.2f); + Color c = DecalPreferences.decalGizmoColor; if (c != s_LastColor) { if (s_BoxHandle != null && !s_BoxHandle.Equals(null)) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/FullScreenPassRendererFeatureEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/FullScreenPassRendererFeatureEditor.cs index bfe222c3782..d8fccb87677 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/FullScreenPassRendererFeatureEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/FullScreenPassRendererFeatureEditor.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using UnityEditor; +using UnityEditor.Rendering; using UnityEngine; /// @@ -49,8 +50,11 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(m_BindDepthStencilAttachmentProperty, k_BindDepthStencilAttachmentGuiContent); EditorGUILayout.PropertyField(m_PassMaterialProperty, k_PassMaterialGuiContent); - if (currentFeature.showAdditionalProperties) + if (AdvancedProperties.BeginGroup()) + { DrawMaterialPassProperty(currentFeature); + } + AdvancedProperties.EndGroup(); serializedObject.ApplyModifiedProperties(); } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs index a4eff549f37..784f10b9dd4 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs @@ -222,7 +222,7 @@ private void OnContextClick(Object rendererFeatureObject, Vector2 position, int menu.AddItem(EditorGUIUtility.TrTextContent("Move Down"), false, () => MoveComponent(id, 1)); if(rendererFeatureObject?.GetType() == typeof(FullScreenPassRendererFeature)) - AddShowAdditionalPropertiesMenuItem(rendererFeatureObject as FullScreenPassRendererFeature, ref menu, id); + menu.AddAdvancedPropertiesBoolMenuItem(); menu.AddSeparator(string.Empty); menu.AddItem(EditorGUIUtility.TrTextContent("Remove"), false, () => RemoveComponent(id)); @@ -230,10 +230,6 @@ private void OnContextClick(Object rendererFeatureObject, Vector2 position, int menu.DropDown(new Rect(position, Vector2.zero)); } - private void AddShowAdditionalPropertiesMenuItem(FullScreenPassRendererFeature fullScreenFeature, ref GenericMenu menu, int id) - { - menu.AddItem(EditorGUIUtility.TrTextContent("Show Additional Properties"), fullScreenFeature.showAdditionalProperties, () => fullScreenFeature.showAdditionalProperties = !fullScreenFeature.showAdditionalProperties); - } internal void AddComponent(Type type) { diff --git a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs index 04b8a95f02b..e2943ef6d1b 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs @@ -41,15 +41,6 @@ internal static void UnregisterEditor(UniversalRenderPipelineAssetEditor editor) k_AdditionalPropertiesState.UnregisterEditor(editor); } - [SetAdditionalPropertiesVisibility] - internal static void SetAdditionalPropertiesVisibility(bool value) - { - if (value) - k_AdditionalPropertiesState.ShowAll(); - else - k_AdditionalPropertiesState.HideAll(); - } - static bool ValidateRendererGraphicsAPIsForLightLayers(UniversalRenderPipelineAsset pipelineAsset, out string unsupportedGraphicsApisMessage) { unsupportedGraphicsApisMessage = null; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs index 389f3876c06..dc4ee1640e4 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs @@ -55,8 +55,6 @@ public enum InjectionPoint /// public Material passMaterial; - internal bool showAdditionalProperties = false; - /// /// The shader pass index that should be used when rendering the assigned material. /// diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/Images/sdf-bake-tool-additional-properties.png b/Packages/com.unity.visualeffectgraph/Documentation~/Images/sdf-bake-tool-additional-properties.png index 846389c360d738070e7e1cfeff889c76c9933f16..a7bb0ef2a4084544d92077f832e40aa4af8286da 100644 GIT binary patch literal 39778 zcmZ^LXIPWlwsjIB1Suh+Lg)|$6fiXDHDEvi5p^pHQl$w92q?V<2ogX9DbkCATYB$= zA|Smez4zXG%lG0w=iKvr&%HkcQ(m&(wdR_0j4{Vb;Dh@rG#8mJf zHW@ELpwIhvl@%X5>8(~h{qV9WeoWftq8}9V>)tixwOd4RBoRa=!qGK=1Wi}%kNtL9 zuiEdOrfD>)6gSuYm^6Q@>=zRJovp1_bVc@yiaC5Jo2*Oe{CnrVtM%L0lrb~O9+S*P!|49R|8JrS#?{iKj)krIJw zf^i(|%Vpa0c#@9rEd?N*hc!@pkiR$!hN?$ z($gG{G?xcPO~4@-1)WrXK^bS-$6bl-pKtT&n03TSz8)=ie0Ejf`3yFg=~H`v;J9{` zi(?9PTb!hbmg$f8S6=TdbW6?}J@A;U^XslO(k?L7FdF8p_ooT!vk0N2=RP=M_c$;V ztzmSSzQ~E=WpF~DuDz?-rh9#fFFdpm!8lf<34G=lbsO7Cwr<%}_1Tdnyw&`IB?_A; z=YCT0ZfoXe_euJv$R*0ck;Coz(NK>a6udR6Gh5<+mfzsMH)ystQf8l^Q}Vh@C6uk~i&~WFu&m=!M2%M_HH(asV5|+lb}rHV za5idCxIah#-TwMGddal+jIY4#}^Ls*%!dRcnEYHVB6FbZ;f)~6PR zoX>3F-EeMaBWFKVW^ZPDf8{@)9vuP<(lywC`{jH`eBe71Rnpn%XnLZ@l5mW=XiY)1 zxJ^R;?bD;(pt*OV0^Rh?Vph#;mL0dH+WLf^tJnzdD1t}lnzV{w&&Wj@PfJY4O6e1@4jf;IuhIA^O@^q@* z%9zDp>lUjMs@;#vUH8|@{`&spdJkf|O+rvj$Zo1ZnQepktnAH~SSiO>Vj5TlV9ylQ zqPrCMbLcEkw$6=S83*vmSa1W+5r-(`gN-SNH8dmOtw9>o>4${bL|NBjPfyK6IoVh& zYcHa5-W2_rK{0 zM*&SS)&5w}Ry%cCFz9sN&6Xgc59AHK6q)0nb}VvkPGZ5<$psRoETn-INRzLNl0Ws& zpQ*QY`QZYAY!&wNAtY(@uB1wnOg-$e>!4n)tm;16` zEcfeJLcL<3B9IZ{%=D7n*@3a=!__%hFmbHP^;C)h!4qS0q*SFTci3RlG^9x{0zs*S z>^R1(mO5>wtdo89k-3#i&vU<&0?y{tyY+)XzciRx{741~1`^Y6DEY+GnxjwYUrdt( zupH!un91WFSTJbaVXU($gmt@o64hJ$V7x$T`TW3)@u>dBiWtSOY1&qNIVK* zl|J!nenW^xBxz84$x4)J-KdwFo+{JI3YBnw?S^H42?a9#WBOGKXm%%(StQ#f5lH3nPh%*Px9VeXYFA}y41xnLYwW`Y$|HpF)2KH{iy|7U>>W8hVV ziU(I&eN>C^u(}LHtQ%kRf-s~P*eWNq+fl&fFcTgrFC9a%yaSCSl^J)af!yp z?H=;2&Kovs`BFE;ujfy0-2)9x4^>| zQ`TJuwsr}oZws7v#nCPK70_}Dp}bs6Rzc#cPxakr(IfQ%@MDkXYz!Q5*e&ya;+C8| z=?gcg2b&Zf>Sxozy5yJsoAQUb8Ud7A6&d=W@SO~qFU(O?<-iwZ9=)N1RhDzX?Mtn@ zi)v)>S-Dcntc@q0jH~bYa$2B1+zNV1RSa{EJfgh!y{b5!l<5lW0p+Q8g zenGyxy(MWgS|Ha^S*|JS!!2^tcdJ9Q+cd*$^R__p8g%iZoUj>!rM33hEc0PO@!F3b zg}3LJUc!RjA09qXzI8ujBgqX5dfEt+Yqh4NnSvw>L?TEq_xl_o;1OanV#3GBA%V(Q zR9TWIp({mnW>5^Xg#-^XOmIzl6a8B2iPWLBKN{@95CCe>vKE}C&8x%!Dd+OZVb`GV zi2e)dRloF4aNzDSzQA>+N65V5jmu+;X~s}YSjP%@-5ncZog|XQ*9FCKAa)IQF+Et0 z7m?lOu@$2h3N7_`lyrHsvH5ugH$REWssB^hdrRwB14bV1tAq_`tMNq0flX(#js-?GRf zg8bQL=xGV%pSt!pCDu%Xx_Eb9iE~{3^0b)}X=x~Cr8u)POG${Gia{6>jciEuJ54cj zDtW}7*U52hR{(Ap!pR}SNN=>;CB+CfrQt7Tb$_`Fv&WtoLm8EekPzmD!u*}6u(!$% zW=!BcluQRO0b1Od#+NOj17Qf!x3;&{d&l;+LE#XiE+F^32Hi5+`d3oHOPkJl&uYiGH4qdyVPMK1W~zDe z?9ZEF9N2DJ7zX3kEqRspWwIhQL|DY@t-?yUitN}S-f8T3flQPWoG?g`}}T@bFHOhlQM3Jbhjw4ZwkG3 z9yeOc=B4RcT42f(Df0$za-*{+jcHn^anIu-HTu&$=iWQeZ~IMDc;^ayb*i)G%#hU5 zy;h3RO&T4EXo}E&*4KV*0$P@Fx86!ShEc+?Ww6b+_8qv7T>jaWIYaUVDu&mL#(3|f z%3$6?@_&+rf?6<0Fgjqs@+S~L@vRk6Zz_Ac1twi%9bKD5@`H0}dWjg{E|xYX?Feth z#}HGWeK{@2q!)YM%C8^`TGI=3x#m25h@*%v@wxn8z2ye26kWR>%GTy7+KL=d@z2Ln z3NpISmp%yTeizw|i|my0P2=z75oI~*=>Y`?fE6^8$-4a`DR7tVPP$^vmD>VlH@DMR zREooC^_8gJWDDKMMD5&AlQw*&PPQw=7x|?9vI$gqp7We0q%fHWBNq7EU=3S0Ki%u5 zH-#EGr<{f%c(DSiM(cK zlcXz{LIe`5RlLD|QoUcbUdEv3qzL1bk)d}IYe+y^90+WdjJc>eZ~zYjX5)A?%Wr&ptvfZqQ%uy1To8OR&F!%t>-qSa)cG3SjO~K$tPJ+< zF8yvLQJ5mZ-QNV4c<4ElcMTg`0at=b{Li49cjJmJCHlpPk|kq|KCk%3zR4)(M4a8%Tug4zu@QfmsC& zvsmeE%f8YZkG?9m7LuPmYdAUFPIYFzK=OAv+?wr{(UQ7|^p4VBoYPx8D|ao^De-?s zhWabS(=g#aU&L6LI)EHE*L%TD!N;_{MwOe5%z?YzsVWsn5mP6j%U{WkP1Ck7c84`V z6&tG?x1LkMzi}%0D{l{7B<;zc<}BSgM$qpGS`Uf7JKQqa-|g3T)#es>a`m1G^y)3$ zg{%D9bnVOLQbxneeOZ?MVkZCG^hS>w+F8U)Y_jS_1Y)4fKE2}Y>gVB#cRA7y3m;q$ zHj;JnU*0XWYTlTvA1$+=ugu6R92$CF0x*c0lgR+~^4@gKicfq`O}Ev+#~ZUz`bP{8 z_-m>pT=z0##clLNHD{Q-qnH=<9<4v%>9AW5{yZfYC)~NaAd)dgSGlxZw}qqCt#bJt z+bbBqymqv^oNY5+9k>(nvMWh(4Zw+VdNGcA32~%zB$~cHkXKI?>maMJGFIu_ySv=q znPdD=o^)dWZn5XOr?J0@5YtL*?OBdqm6R4YJ3#I1f*8;tb46Dhj*6{^Pvks~7Sqo> znurZ8UlsB8aaQr$V(->QR-`&vhgM-^^<*0@pZH#%voW`Bu^u0`Vw>@`bL>$Lu&VM} zUkYG0gDrWVq^AahNO=*itMa6I(#qM|`dNpp$H_oVqLImPECA@{tYXccWm>_=Xiw6I zukby2+3S?fDq%}R+mp_Dq5b~aXzN_br#)eaF`C5Q?SPK~;RBhBH%o72x0a$)oHg7g zT^zsJO)nWa$KS2?2-B<4f7X(*?x-?KW#Y_##~z1Gvh2@3lRVuUwwcFK+zBRTXr)$e z@X+@5(6Lo+SjV@tF$(4jy+&9X7UE0Zdyp?%odP8NHNZ^=cZ+-2uu1Ec@nc@06^EYKZDVebQA(pP@2Xtq?$TJC zV3snfE27$7BY3&zG-Ei1_tDLk-GRW!OHAPEswv4Ag$M)DLtb6vp zJxX_DGxb^h*hF>;aN@Ov?$oiQjVM+Wng$XS_MGi2yXT4BTX`=r3ko};IUoFC4+78- zMz@AjZ@G&X)T-vpYDI0_=((Z9ys``|M!_(h1^^FJNsnmt-j0sBNlQyl_>nAgjw|z| zHC2K^O>ve@b>=--FUv5?&}D!7ATRFIqJF*Yd5Yeq+f7CE7fptSE1e5!Ok>Jgc#09t zFzsymJ|X|;_IG2>JUZmzL8`@$#r1oojb$ZmurB#*wQP2SqmCsnBzWqGKX^k*U7*z} zd|I)hFm#~kO)`Q}$Ovb{UQj0`@>F-2MFkh=Ct?S;4Sp2q`g=%tpfTU1HGdfprp5)E59|KWP2Bb_mPl;l9eOJ%{>!+g zti<`gwl<xfsMHb&qx#PC+*1iyP_8y-EIu0!9+1!{J5=aLoEjY&{R4|Bp z$MdX{v{-M>9~?uOZ83Hu)1DPk_tM|HmLmaKNsq+myJYryMj~Hgx==gLa(<|N@^z+S z)($zr2gKs67h}wZ(v=m>$D5&^D`!ol1NJj?C+pGfcm30r)17qrT?@vW2?&`2^8ho> zeYCZf|1q)nr+a0^_g1028RfPqwZ+Uj|T9<4cgN@_V>_B_oQ73q`-ziwkrS2qQeoHH<9 z6=p`^^uZ9sc=$4&LJIvV?t%}sVgy#sC=Tbb#TwH{*E5av+3PE_YZPQE2R2X`eI0ZsrtFu7gstQ&DBVP*0>U{h z0P7`;SL$Hz7x0hh7NO?HdTlp38_ggmf2w)TG>28QX7lMKxzYQU&dlCpE_U}ta_QxA z%OE17F%5r@@)?)#*Q42?Ps2e-tsT)K* zRf(P9^cRARpzyXLlvWhr`l zAueLWK3y+sz8Sk;T~&JCWv_2Hn%5@n({;rlMs$mpzRx>E6r#It6>b?|DI_pZwojU5 zKdXiF+tEC_YN%dDI?^Y7uQ}r_@i=waA157q?(bh*=hQ14v1Bx$hM0<2F_iXsZiOcv zSc|wMj*0EFb1L=Gu3t$&%xvl!VZG+5*13;NMIbX;y?|Ry`U)sWViDKH`gYAlFDo*0`@TFxNWqiq|Jn})YG;v z)M|T}9<=Nz#rw`h?``2|0P>l{eX)@YEm+Psbd)t(l$FN%xnA+A!SRdoHv6C~w?h43 z=Vt&y@}Je4e)V}s!-{XDrqLz6-kRJ!bWg~t=9@;SJomTiJHyTP>dNVtn7nN~kB8SZ zNjsXSnxfm4ro`@MK-StIXL~|m+}N7=p)Li#i=|egW5-YSF@kl-^%g1*5YjR*i_R^& zMSvzUz%gvmmD;cyxog7IGmrG6TgR`AfD%80* z<#I6nj6(3L55aa=#Cxl{zvsBFQrupvx1bt{FfLgRR?J$~N^HDv)G;BnHXF6vD&`@| z!UXQ%@quqLGl7+__mdA7tZw+sdi2M0dId2VQcr{tez_#2fZ zXIZf>r9*Ajtd#HZ_xD@yK1$NRu*9R}%QR#@WSZYjZkVuC@w@$J>v+@4V?*}(T^Z}N zkUU=a&`T)eH>wK~8yr)LezuCrf;XFeg>e+pyF;z8jR_i+LnRc5kjp_%Cr!XNnnInL zd)V22k;5Mh%bN-@{#Cd^rXKqHj@8!0?BsiG!$fVBYhU)`8DNetp%=piA-hx6^QFk_ zW7l%ph5XwiywhIECx$7y!)_Aj)N z*k%Dy{O%k9^p#Apb@zQK7N%2Ex;LPYw0wVfggY>q_U$gzQcVzTGLGsx_;sZk~w;Vk; zxM%7%<0);cbC?Zk(7EAt>6%|r(Upnbta$8#POXRE2ev+VN!Z`?i%Q{TKdt3sqjEwe z9WQ1w40RsOZk*sd(lxLkLxK~`?>5|8ZvZC1hOO*!-Cdg9X7ru~E1hH`y}MKk8(|w$ zrZXWXJ` zIO0#I{QT&Wa|$g)=n88W?lLkpC?%MLskOmQ47zyHXH^IZrynGTg_F-ubxCWUljT(> z?lmJh9x+lDCHj{7lyVl1Vw zl8@2I-J?Q+J2(#+cLhh+jIooFdyHutj6)^#t0qwMrn)*W*XVAOH9G<=xu3rHl-^ew zg4}GWhoIWqQ~X|iM~SzhKuM?{AUX5VZAUgrPq33V*-vGS8$X#OOivO(ov=2rH61t3 zoI8GfptQ40&KrP6YL?@~5Bb)ZKK|f$6m@aMrMH}me+*fmQAF7m0%+fN)^7bXBFV;z z9!L)crXaGeOY|TidQe#kxzOiJNeNiR5yFHReV8CUr6OyGpePS+8|f{x2#|Dbmuu+! ztP^aKA$jUgnDSBdqjaLnm>AQ>T;^HjOEW&@^d4>$F^GB6=ioZQUqXp30kp9)5#O*9`(-nvfzej;Vdy?H z=Yx^$C*+LOsVwWX!(yuj2F`4DokEv7W$#IkRCpejcrLH&XIl_J!xN(_t~;Mxo7xnG zu*9WJRxeqlIveN$ypi1aVI~3)a|DFIbRysns8@_-ny^uK&el@g?i7NkXGD-laM&Q|$nIHi& z^czGxjYVO+7}(%cExiD}a{-KV!nhd-(_Pv5-O{bn!s$SFC9)&qru((fa@;FzwmRP^ z8cbV{GQ9zBn=$2pMS1c8>Qe%j(*j~+s|~U+gbQSEzUi}9Yqx8A{YlW8^kY1IEEk^6T8HF zVnrZ@#=d0HNaauNC=d?T&9*B1@Rd85Kw)%If}8O&PRfYN{sFKCYl=9yX`D#|Z4-`y zdA=QYX}&j`Dw_<)Xp+g=E!UtdyRl;WfU=f~zsVFr0AMk3*XzK2YbFprS^Ho}98yUk zcmuYjPde(a&H-8>w7V*E6vrb0A@W?a&3;u!%8+=A2X~&X*z$M2DF7HH{T^SZd5k=m=9cYSV^zOR^#Ku)of>Tq&7lyv8 zY?pC|GaeDc91{g5^`cAHJU$jO8jfh^B&2cJ+(T#UV_lfrXRa528t&hyAGadCS^7;+ zL-R^v%z4|``Why4tCJDm(_@P28r%VNN-8M!KHXKZC9|5#*KURby~8$z5^+~2rH!rc zIb}cPoqlAwlm6O2YW18f-dkH6TkSJ|dVPQ^r)32!E{fvrJm2}!n)jMLoC)u#{3<%q z|A8v7?2PNcC97L3q$0lC3~Qu6k{j{tt51|LiG}g$zS-dZX|gBAgSx0ynBqk{!C&iAd2z=@lU z3NyGKJ7nzK_FQm)uC?Bwu?MN!92NDotC*_D7uo1AEam%`*tP=e(vYxeYYXRD7Mn;y z+lOatU0J&BBBJ$#9q1GlA-%e6Aa|%N~;R#;mDSs2ZGH#V_Fz%wDfS16_3}ep?g6(sO64o`0AWsV6 z|B|->jr{LR)eMJ0H3wAtfFc`6i@_@3Td?N_1RPz~|NVeV6atVv()vfEVL(x5{nMPl z6vBYtf0O;+57uTqk8Ma<$9*N$v(?9=>*e!_o?|54fqD(Z1dpG)r{sl-VZGVerDrz*v_QunG}Za;o+|yRMbZzcKm+ zw5KEBvlh^V(xK0{velxnuU?IYn@fg8@f2l$RSW*^e(5LuUx5TKUcU0Tt4rmM%U9hu zft%%pw{*aqz{5XGmOfe(O}c#lW{(Us*80*6!{_@13GMYDfR3eHL=?h2no>2|>+Kz^ z!eexnFytk_e)WieZmA#-yjiE*!9p~L1u6L^ZCyl~t+lf$*RXyBkZ?x<-4bxq%r+2+ z73GNG1#%!;&3^=N)|%2iNgMS)r8+>FL&(VypLp4WgGLehD* zrPOYEWVGVliyDv9ltXfg89+3BJ=YfF!AfQeNZsNlEfI0~DUNBu#I9te(H}t!qwTTc zqgAf^C!6y}RINln#~$tUJhK<~JUfY#0Rm`MZ4l}0GfpOoKjcpSe5t}Q29Kv{O>1Fz zQKQEZ>y(4;z1Fh*D_#9T_1CZ5!)xI~UuXFZ5BcvDT8rw`7_xsPN5wFV%WK`WMQ;}* zqboOj#L04MfDXoXyZES%P1WoTb10jf+rn4P#DwPIe3PIGm)%!&FlwZ5+E}33h|dM8 z5kP=+XG;03rHB2U#j;G#t=^o?Y(LkwnOgfRowbK<6|l+dS`ZcjW&w-HvKe1Sf5p3X zWwz57h2~mDm*qtvC@eu0=8BE6j$h5QIr(C}2Yy7y1UtHWY+)~G*~dSwxzrIW-g$0b z3PUrgGJ{QZ0RepS#Vep0PM91Tq=ODEGznw zADXD^9$@~?%GxD=d_Gb4l%65IO=}RUfxqy?b`AKCcVWBqm+4xZmxslcTTN*c+$CEW zqBjkSLAC4qH8IuKTd=(s_a9-Cj?BXm3Zkea>&J;f#jiXf!s^yfxE|~2LJ3YY%gac2&_jY!2 zcHUW!G<dvh z+qR(5E*Qwj1uzGm_fh1=0EgM=U?tEKJV5MWP%|?EdX*9t9qOReRZf^CPSRabCZ9%5 zyOH`qfbitoLq?x!1G=Gl7{5+&8#|RHJ1wi!OuaUsh)2%m!K2f1D^;1mrr{okt@=mL zP$8V;@0UYjShntp6#OVZ@3Thu=Ziol{9e&r3TM3&ivQ*CjD4tAu%PRK__Q#v|0hsJ zRN(i0@FAP~yz}4JdwXXex{F^jRIhDz&s^0WG(W|h^5@Fu8S~%t5n~2JH&oc&XN;$< zak8QiMo`P^;o|lz?L01(57Q3F)gRZipMQ=<80>Kb2fmxyTqN723uuGUwUG7s7x~&+ z!BNC&L-V@5n4$qd_9rM%0sgP1-Q}E`J%+DeV(ebVZ2uI8Mv#d>;%xZ-t_>B)+q&Qq z>`vVsZR|j=CdM|B|JhW@Z6J~oo6JSH#@_Z3K;yi0*$p0AA#Z!JUga}>Sc9QLi)xx7 zuF%}84f1u5u}Mxq-&csV)2n$(F&Eib^yBud=uou!Xo-)+ux&Ey2k;j8KP3?u zU#3V)XR`omGZT=Y58N9>Ob#-_9Yi3pV%A&iojq(d)1CNi$_>EKVzB28e|<<7T`Y*e z%Wna@!5tfPXuwz-%&Ri9orfN-SAO8XPLV;+1eR0%!X9B<7-J2Xz4#mb5f;S^OyI2r zDo2Y%_@_brHeZ6mCa_B-LRr*8So@pdo(D=b>ItE#)VWCTS-Qf2KM>PCOie{2XRAAl~p6!633PJi}`7eKm9L9+q1YStTw<=?;$UcPf1-Z>ijNe$RAkpS>e zcH}^Dw9uZn+;NnY09cU!V>S3=T!3|R{cjJH|Jpp+?yN9NbnlbhZWBpSpFFWmFq+Si z?YjNo%wgts(zZU6R4?pg67C5s^SLF#aUh^Er*iAw&a{{oo2^HJ>zbrzwb6W@zyebS zwbT+**CCqq^S{Ram#>FQ;hPB=yMModMQZBL8~%l$NNeM#(()49^PXq(XOb;m?*W8$ zlicGc*IwPFS;~37w`{{c+1@QFRXN~zQV;N=vLmsotsp$+SIM}?@GjtAs3M&muld5| zHk5-wNWeAMnQt{HEDktT+M%;Kb0@Q?2Aj6MlJ}XEuQFb)!|0`PTd<&fSwv}B} z)uHFiLO=G8Rg^wnO%BoQtOwwu`%;}q)${=1p7^(3kcpUew8>HQG_){Fk-jMXE0mG| zC+m4n{=9pbFx?bdac(ib6LfVp!kX&))10@V?DBi7{e6AqK&>tZ(8m#NV+%v;`zw5I zv3WAxha7v7>v*u*Fwoqs0Bob4F##q@JzQQ&Aq4tf<99F>7F>o*_kC_g0h#Ma#)=2D$Zv)-So%Fs9#+f5W4hK!_A~I8zHa zj}^sO0tjuTrc?;{sim}DAMGrjdCPg699Rtj_RZ7!!9M4~aMNY-R1&_{miZUpZ+LF> z*cRv#y{`4S@ES0HXY1E^3_2`nMhn(b1pwye3d4H;!yTZ7Y8njkDexqn$yEWxr8*ce z7?%URF`l7h8s){0*VXbDQ;Y`z$AssmJwljoXJb;yGr`y-_yKeyU*7Yqa=6eU+;ust zWCZA>RE5nvhv}RCxl2Q!@~;8U4elB@g_OyX!Ay1I{nB$d%S0mhO;=xyg!Gzi%d%n6@(kt1O8gLXK9s9lmiWj|z(g zy2G<+#u6}kBP3_1Dm+zLW@Ate?z$y+w16tH9u|AIxAIK>BQ*f1HjEOsGPk2dmkf+< z>6T9Pz8MY{aq5P;=sZv9wOOKlj^OjnfHb>8Ajyr06hDz0dK}&p@2^D zLCkd>hIlnjMDqj~RfZQMr!VbP@=buhAp3MD*^S-3lP^b1n9DT z@nV~88B$y!i5y1pVS7N4JY;YN>Sa~ZTyjYBxe<8Wd_az)8F9MkKvq!O3MQ+Qa>oc> z!qiD&4FG`X5tFD??y&gqEjK4CQ$y<{fP$-O`UbOOn2uC+DhZjDyfkf~k#fgYDvU?n z%_rQ~E`!@0w>p%ENFclBX2Y=b!+7sRng zQyi4X!M@4nzeV@lE7w5M8rmj`Gtl*?Wd&@FR;EBMB#_fHbQJaVbQ_okMTbq5*a^_2 zzE@lYyw_qH4s7j#3U#}JGk66yY@V>izXm3T|D~(?;eUeSCDe)>gdbOlMs)!|YB84< zB0~TETy+# z<3qWIzKM$OUrO_xpr(Y#PEgX^k*B{NF9i;XBPTPLZ)$^6Ey$kR- zchTS^Jr5Vag-DLe!blI!2EbiBdyFsBn}U!L@*|=o0$} zuA$YaAYkNlF_QuKHthj%8o;4OHVM*Ia%*cp%=rEtkh(K75${3SaF6Ry-&YoHZtoR~ zfYD#RNnU0mY65u=Dq~=_K*()Bq z1rWuA=m@{ULno8ujJ!Pr{j7}gJ|L3dg{>4BZn^6Ec;;DVGIemll}a2yDId6$vK{>3 z?Fj#3JzhN;Ih67W97eL~lctxmMMpChX)Q{g%E*Dv|UWp80Z zQ?c~a*l4s=lpB{I&N8{H1oJ0)53{`i1KYu|EH<<9Jb+vJVWRIRhX~6(UxLytB3ScA zKakTTO9js^Ghr9PXO}Hl%4{;|KL!UGzxbtBtbO4O!EaRV2My z3cgbZyLL2o`EvyIql+cKwRzIlQ$AaK0_rl$-5`+G*bKe5wPL@5N%vU4SBK{!uMLV0 zW`}vhk7iAvk1XkSK_@)o8c}}ZeoBrQGl0CQcX~McNR)Ep=uPnO_g2wJ%^d-&^gPeJ zQ;RkctxkTWsK-^A6Yzb$k*mj#ZSGm=53wa&yGa9}h1(9RL%#tEB5>4mY4*Z=;Pw^i z(DM(T?Lz$X!N*ANOh$Mgvr2O~M*M{w-O4wFBOEf6KD>u{GknhgB11RDT^SCMu}Y6Q zrK}5nv-QwjedVdSax~56@?@r;)AI?vvqtgi$?C&)n{pfXWgXg4QvA9b58%z!b+awZgE(rhc7h&3rfRUO}}k(MMf) zhOQ^+Y(ZHzmxmUm2<1Gj*Efx1Z!fJaUuy|Ceqi9K4d45=(Nt&192s>h_9iOf;=i$A zODn9pB!wi0sgeXYT!sz-zZRdHDbjC(yc6Oy+$hD zb+XF24KT+7F2*tdtQ^X;b(~9Bcm(RrQXo0qaU80_>x=bBX*YWbU~j$F;-7Yh2mm?v zcy!H4&$&Do#v_&J#`R%5-va=P;_Z=*r-wjY7yoalNKCmCl;3GS4QL5#z_s05{y+}+ zLpT5;HsNP&QJHbB7no7-2Lsj$G$0$AHF{||K}D?3%O{{0J=<&|W9cR^CTW;*swN5= z`gq=Lz)3qcr^aKjpk85@odv5Qz*jZ`9Hq=(USS{pI&LUAWQOI`h5vY8+j?Fj2OW>v zHa`oSyl0kjFn`N#5hT{5ExYF{XG<-4Bl1i%*M9y!X==XGeni4751H`c0krM&?N+KL zz%g111gkDr5;d?$=U8z}b@(XHxaq{5DKZe)Z27znG`J1wN>7qU0h!o;;QA;5L`QCa za$r{@qY`{tuIUGY}NzNn9y;~sv?)vom=Sged%5nCTO{0 zEa>_Rm8yV)aixIhXjW2X(i&;ShT0Gi0{S&rP;v)#699ePYJ|jbdmow>&4r^CE38Kuh+nFz-I^mJA0l(TzTUUVh|YE^$THGctP zf4o~62=n^(0&sF15?Vy+I+{GMq7%g+ZBXsu2xD2RQ0ooFTacKT3w%`gLk!ky9SM4b zNwf%X8#25(*g{{YT=T6-Y8VqCaxYY&5~jMqYrZ(+n|`lQ#EEVmL&Ov@e*IBm_+rWyMXDd z%I6$~1WRvAy!|DA?^$3*^Ud!=A?$-C4WMO!wO)KdCPT*PKv`4rUxNf7X0&sUx-$Km z@#YQ@Pn)_1dpT9TnrbA5pHMmgPWBK!0xxlLIefffJaj!&%T=!BI($+?;%*++YxUAr zeUMN0e(rb!kAB&kAM<(R_=gQQ8aemq11c*S+u`z7COT;d;RrFvo|e^teM;L0136wB z3&sn_PbMwA?A3UY$;OPS<>gYI2}UL~z@!3|2OxF)*YFHl{PO>uffNMEQr8<6P_MG6 z;rdgqhXbD&B#nl)0#ENa6?8P^0p{F1c02S-sMlNmwS>18<8|+0B3!xwGSF*zq(cG- zb=3E+#gJ(wT~mmuu)e7gH*Fx-HX_KSIo$S2kiM4J^MDUSj?!j<4`G`hgq&Wh|31&;2pN4rm?T2!;E+I(kHJlNh&#$C{6!s5GYF(gk#V4i_Qd6*6MxV})( zDc35Ou2eVJC;GqP{olXj?tbkz(T!4%Kb{VM{{S_zp zC6{{6$0N)p?^~s^HhlP{tQa2%|BL{u@$6KUqxj??_vULTi*8%UE~;TDNk77b{EO_F zq0SegTtE}};5JXs#rBIc^kCfgyU+;sAB^Da3&$SmjOSDexUU5FNfDuIPsYx59ASvi zf(o0WO^Uo~Jqn)(61;e zYD|75-H(5DFRyC-#DYH8Sv127aW;P(pEE6up$Tz9y*(8U3OLXCewVKP@R$Zl_!tHS%`q54d69T z2b`^_3csDhty%-cOLNvyqpICnLLuw)i4nF zoBv`O|E4&9-eF#VU=)8H#}nBfM$IB2xc)Xvvk@r0DYHWm(n~`CV7_jNxZ%Nka_rIr z;H5>=j<`i^2usW(mCFI~C4#}z8qbrbndrfBp+GOF4CqnL%mj8^PlOTTNti{>e`Gi! zpj{QrOKbeY=KgMi!8RRwxlvu;pQ1|uQKsb0>^;(l;7@n!m7IZdBd>u|_}wQ)Na2_G z^V9e1N>Vn!_b8mHxtxDdfKGvF@VVM|zpSqZsNFSis;m4PDTy^|k^Gx;I8tNdUMz5{ zCmef#LcILL>x*HjM5Ae`QQ934+A|xGtu+)Y=U(o5yjntUqC6j_34L=`W>(fDV7<_l ze8wWSKXNXs%~X&B_$S=mpIOFizB7?s;D4a47~rmK;d_#43$Wci_?m+p+^|PUu}Li< zU<)`?lb>2qxpBO^93>F0$1dY!dtbU8=?#3}!^?g^2VHI5vI!RmJ}SIBY{)bqbqenf z2JqHV)W;$fc0m^WUww=7z|n(~{34{0yJpHl?Mzsm>xhqip#n21uNM|NPg{Q3-gINP0nzpK+qX~u z!ybOZ00~dX*q?zosm9zG%D(<2>-p@3E#UmaNl?54)*)JP0_}+Cof%eTuM2e)p^Ts$ z783H3;O~QR6f2)xHsm$<@g)b~d zF-S1|nIC~j!R|KUCt(Pl(Mr_fWZP&*f~lbfECUICOI=SG-x^qdh9!!ah2#W;P0lK1 z{6E^>Ixfoeeg7s#7^G%INy$;bH3k@@8yr+XKwSlcl#*0JI%FtmK{^B!bVa2ER5}C! zX=y2?Q@VN1o88anyU+9bKL7oG|FAE1XNQUVzOM5+&f|EW;U6q>76PwLYp3L`d|mnm z(N~WgWA7lIAL`NZ)J;dNZ*im>@>5rT`9Ok?o`&WES-!{})ezJzcK-x6tt1|rlw|!c7sURu-maJP zi@4F$IB!9YtJoZuDRK~vv#)bO|MZa*m=bMs0hRJ2OYtMDPwuviKhi4rXz6WV?;T7} zbw1#~_2UOD&(XlhK8#-9FX8FOJ>jJ#w?QxS3Vc{tTOc&IbXD*RngoWLE<#=t8awww zbx;{sF)3S>vb0G|v%n{vGDu||DatviCkn=6sRS|WE^m*_g%?@5Qkv3DpM=<(gn1nr z!mN2gBV4WgP+e|ZB-(V^y7$xModhNyr2Q^$&)gXN&)H;=Zuq0F`oFZwTP7$>J*ivh zvN9`1=xOuhSw{UvRp)CdtQs|9MnfSA5>>u-pEw(kIf#Cm;$Eqdwj!PB{~5uksnWGQ-3uKu$|l>h|_S^)3Um zz;5%~(8Md+;a2xJ2y0mJI-Idnox?cR z?*2*l-+Sl}oVUSPTEZ29OzETfGEKttAr6Go22-T^2%C&GR#bxl7pDG2e+YR#Z2?Wl ztdM;LTE20Ul>bZ|vpl86wbd{w@AXZ+H7iG>@YuV6R{YkbR7vJQ&&CV}JeQtCR{&<~ zisX`ouV};V-7HS&D~9a(S6&=TICe3Z?A*P?kxF-?;VO5~S&dN=6U>D->HcZcv?#kV zya;;sKmD0E(4`r>cncM{l*x)~y^7pka~=mm$&v_#vf1{=ueOP3m({)C)c;YX*0T<(%FTYV!Ii8t!NGrT1Fu6 z`pC9)^~TD}lMS^0OC1J93Z@D@V|wA5TkwR;Tzq|zBYrKB#Kp5#wHkxNY4!e+_xec8 zgCsQUvG^kbsd*^@Zr4moT}SGu;AIv7X7=KKU?7azxu;jQTUIGf!>0e67oq|J)4${ z4)oFToG!@6;GdU@Mb{LCRtZ#}zUp|y0tD%H4$Bvny5>VHa zva>GSD7|Ekxo+sHyqkS-O-YKsX{p;Ha4hUQ%^_!xWTNj=&M6HN!&qVJH#L&ZP=aAKv!=$RzdA}~#zLl>ymvWPkg2?^?+IczK=a;G=>@OW2!}g&1Uu)tv+$kg zS7d|Q?D17^J+%aq90gBws(Vu_4UisP^$xIp(XX~DK2%6Mrv~+4q||NO@Wm5tu7~eP zlPA@M30eN<6`NS1rn{L&rT9YZr$q%)@?Crk7*rguxb+qg*&DmQub&pan)+IUW-%w! z!R_^4AuMcZmvkw$^u@AdwQsdgNL>NHIPO1BHfDu-I&-Fuc-6k~gvzHN3*v8$6Wc4! z$@iSEum`VRS&uBxD#+T7KBwPQ80BJNJgjl`j}w9Wxoue7w{#tNGNsWzOZ|H&72V1U z8_E-tGm3$};S^J$313-CLP#SCx1m_CwHNNk zad9OJOLWc`-cHHUobtH*mZi^W&?C3Rq4zqQw$a1)LzxcJ;hY2xGAKi{hr8v9F`HxI zM$gYU8d*body*AYO!%19-h?QCkqKm}p92szwO;~Y(+py^iWXr7b^i`HlP%>=qM+`g3n$_FTX?w@x!WnBwq zK&eUJ3E=je1m@P*vJuf+uH#0J_?q=p`^z%D;?yp)!rG?5m%(eG%KrP0fNyM3|M@j4 zUX51~V@R4AAYP4la6Ppl4h1m5wVc&2lSxd0WhTdn;Zf@P}w|i9JCq|y~ng_ z2m}L1tLuZN6gqWuHGQYM(4_PvslZjcc)9#5`(5w#7edK~XcuKEGjoJ=6*e><;=X+nDlG?D=s{eX74Cg6GebBT25-^R4@paBRN0EYcRVh~FB(8SM9kWDL zF+S-%hg*+hT!Nm6q10s5H?#poeHNotfa@CX19OxRP297bmL{Xc?mp)K?-LvFakhoL z5(w3HkgK_{5rAPrrpC_zl zTemqO5_U*)K@VZzl%eBKgIsEe&d39;Ln2!S4%CKX3V%TaYE zhjaRO8@_5tj+vj)S82Ob;La&giq16aZSOeit0_)GETqHnAF*@3$VwIcw|fV!{J>=( znvGSwlFgVt6ELPLZpfuHAnVe^zBnT{wSyrJVn?Gj_i@5CQn+2x6y~zZXG6J+P1d7J z!u(CB#az70N^f5+YeYaBZ@5S&O|=(d*qLj4_umUOwON$H3y=XMjP(l*;`0F^9Hx=! z*`f3lT4DYTW33wpj=Eq|1doBND!-eh7n}`;j=cJ3K>>4%ilf#s*j zc9t6FhjtRZex|sL$EW{macV(#7AGXcE!v3E92rwmfh)$O783oFe!Bn?ymd7C<(2HS z@Zvd@CE0z{GY9EFE*k%i$VFc!U|ox(U00>3FLe)|VYQIxZOr z0b9`DZNN(?IptU1DQ~_u+spKgsdl+^!2|!t2CZVU&TZJer2HQOPD*nl@quISiom3}AS6;9Xg1 zgieZ6s{2yV0hBK9UXZ3V9LAg^={Y69ID*f2Teq?0K|C4A>P|(+It=EGj1tG&4L!NW zKj8m$@1H8!-Ci%!=`{XhlDp2oEJga!x%<&7hJW8+r!;Y`JWJRKInK1XLmutun(6ar za9`$Z%S2Ywf2dRVr+La6^5i*IyApex{wOcAX}0pmob+~!_jx3`QOE5yi}<2HoS|F> z&yVd#Y#j735+&_3Z4J7zb?1Qw;F-JvBoNmJErIflQ=dYrjQQeH43f(cQo;CR$G*xt zIqIq%i0fz~*P1v9XYK`mdXDjq_M;*cR%YPN@r?I~gHx;K?HmIiTaGk&+d&zmd1J-N zz-*#pIy666IS|3ww}5|CH0=cUjAP{3rVZ zh)eFXXH-;;2o&xRZ`uI2S1A>AsEQMX43!!~E1=;p0Ir=g`8~En}ix_)RfD96Rd}IOZzVj&5}lTw&V9q%VUow!7M0ishl>_SlO`-Kk-; zVdCn9qo>Ffirf%|BKI1XvPG^k>gVS&rrfVptRET)EMp^&0j*-9QWPUs0PgG5Fgw+x z{#i1+E9XSXiVZVReRV4Bg3xr;9@MV0LB^|pA9e^a;= z>MacDnIel0e)+>*V-3f|;fhY>VkcKf!YyHEvcU-3e-}tEUW*tdj$gX6=2IbLjZIgC zm<)LpSC-*!*V}-OEs}>oYwtyWz%Jr;H)~{ELenHxO+-A2&w0P8eB3V<7fX!DPga`I zXbcLE+I3RK9eHtD^r8dBK;v3yMTHOL572FP7^g5s;cUPaF<2=F_g3#JLOI>Pis5F+ zPZ6VVm-g1p(WPXXhNfjp-n;+A_)%;mozIz{&P^uh4 z#!cJrism40^h@FPNNC;Tp5`dbpo0YGz9uW9yvMy6_hHL48Qzyd6uE^L{<#Sc_RnEG zo8R(B2{=0dSfWUaqGqTK-7Bbkzh%6yP4 zD=@WE9|-d`iwLXUU}+1HXkKUhjG6qk979b}#AU}+2+yWBU=b^<;3 zUgiv?JY$2C6|;{?Vx@t9)mDYncB9mnz_}c&x%>sviCR;fis!#~aKvnp;S7$j9|)G| z*p9HE+CM8R0$@V&C)zg<8I;zIxEbt|*BSKTBor3L|4}kw304XIzxa!wCT_9jdzZt5 zyPrg_UYkkTSdogIx(e>37mY=Xj`0SGoAd(w2x+c! z2pK38xF^ID%(h&?Xy5b|%HtgLq*XY{`K}f_Pl35L1K@ zISqU>^{Q_|DgcZ51I&p_N}it>3{aT8H#gosq@-qWK+1CPK0cJ+{HnQQUj7X64fKC< zeA8d%@!9r007KXa5y*_Vzfk z(IFI3Gxk@?t~v~05uI3uw&sMHu+#j&)J&!sVe%(D&OH$v2CJ(VQ^Bo(m?7U+m*oz@ zw)F@+j}D;p*3U1D)&_g*za|)ep)3C;X+OT-ux|9ekj(YydAd#>6qri3!h`I zNSmUNZFSq!rE3phPVW6NaxP2v$~79E*2&o?Npc^*xfba`-;xZU$#hnBh<7S|eeov; z*O=%Hnu>&KUzrH zhE3}S^!VK+RisUn5T_slG%~}N?JTK1TA#nGzYbT!V5=6Dc9R<ZVe#Hh2%*Q&t1^ zJb-ECIbIdgim+hTVXM-gU@715WBJjkTWpsmuV)o3_Y_H$lzVjTPru)5Ky0MJ_6^35 zCAh3o-TN+NN2&H4wfMEnLQs&Zd%7ku7>5cgwdTH7xdnZ9_tf|YBNF+VNz`G~t8$ya zqM#;*tNcfFGPd565raEAc_!)PSOcu^N9--J0m)YK#UQJ5qWbFh1F5Y2M8JV z9d;{l0q|mOm6zPz%uyT6WNkJ>w7&=x(HzoF+0Zt4$}(gXwFI8%bq__%wG>@ClCwS0 zdk3jaur212O389|!)p+B*=~F#yE#kEml7YGBmax=G@MP+dGWdUiD*M^$#ZDiLJOkz z&+4__!3EECXG%nls@X51iJ%tnla&3Bv>ln`@cs54b&6BIO09jQL^BlX~65=5tY(IA1Ef z=<*u7^`&68UhY@iAzZhp=y%#sg{vE8MXA>CX|;hUzHvBBERDwCN7XGONLZZU#?%I0 zDPxHfvrfP(OB}|{1Wv+jwdu~(VTx)7c5Vkver_Qoc1>C97rwuVeQ(CcQ60&=8@L4U z2aiJ08sU6;R@>Ipalf?$(-&K0Sd&h4$4 z_a10$T`C)eiVHgbNE}x~Rymd@d9B^?Aa%0Vgzljux6?MDi?cT17Cto?-#VvK*M1-98GHdm9?thE{G9A4QZ)Ea z49p5P!D}q%?icA;Bb6>?jel?+)lCY@o1>!}zH_aq<{O%Sl`^x@ z^Y*1ek4Vnp!aXC3jYik(BrH35KYEnQr|A({zUenGz4FIk`)W3_Ldp1!KDd0l<_&?i z?JCaum8lbjaA>`%`t3IOIuzOsSDq&LfVMYLwwJ}yF#<%NKf3&n#Jo1#~(&xfmjf*$q46eSYxuS?x(TF&ZnaLM#SIe&K-zM1N zF6LG9@I@|Sk@YVrI^A45&f8|6YrYyYV|stFFtMwYqsP+pLy~T@nI6Xcyy3raNKjdR zig7nT(!tlE;c7s**Id?xuhknljBD3YSDrc2t}43c+u-(^LNI*yxOwu=(o#}19j;@l zHm>uFQvZA-z=4jz~TMH|RD)uM%# zE6gR+q4zFIF@@wYM=cJ{^TV&tQ|u7%#KFz)+;UE1{U{}uGqe1m2jXg*H~iy!fpn7tJ0YT4!7ms7w_gJDer`^rJ_3|k zw%d5T8IsQBJ;|x5QfwIf;U%EA zR&ehvQuC^Cz*{x>x(@ixB$k8!q(ndj#$;0z(!vz8>KTRu<4>>Zq4t~5mxM$|wBYF! zE+gVF%tNpTt+3@1ixRp`^5E4vJo*2HPl|;XIB>QJpSk;~Gg->~BS$ZON6JKuN;!8#U5Pb6X@#v?jjA{H_mzUfvgQlM;}We4)VrL*Mk;*xnl;I;?gu}=Y|iB^ zB%M(+OZ??GQ|Qsa_iB^FCehv-E8($KFvM7Bxhfspif$c3(l!5a{~$=&uw||T^>QB!mHGXEO4ldW>lNEoCXyh&Qw%j;F%*@~l~0Px-8b_l;1e3W zqa|*|gdAzl!HE{irg0<$(sFRb2ZG`+hsJcZ!Du3j3k8pZaLDh6bzw4OY_8xsGe0#>)B@iPrhyaTHrdbr^f&gU`UA zY*GNZhE+EIR>B_Q$k6wRuGm!2eAJs5NZ>$AgZgosAvY`z;3T7V)19y7!m-XM4_Al5 zkP1Nh-vOCira<%aFG63)a8VxG5w(Iekq?RFqkn0n%Kdl?>L>o17q|sIFR7%f7yyTi7D0TgfuWB({pmLeP~s1rYy zEpCQFqD$+H)qc5oGO$v+CTq-cki$1d5(MMc0sprAcc^W#Ex@woZx3z7D6e}>NDqB& zH{_-zu!o_|3U(oouB&KCB&&3X<1#mwu_O8sO=ty}B=h-wT3LvV9V2H=QLMYLhs$P+ zj=N%hS+TT*_J~!63uYasB8e2f9czsJ499_O&vOtMrRS9D%mU%-d&@1bdEjV0YIs`Z zw>&o%4Y?1S5RULl;6s4D+*} zm%7U9gL9zZN34PlZmT-n1e*a7;gzaZ9%47P%i)P*jjJW#C%0n0hy}hcTI2>2Uuq5; zbZmD*if_x)D1L$(TGLEr$dnbcu;MG$BW|<^qX}l0v+1k+>#HRq7@EXL9wKqPhVs_Q zx`#s0y9WDbt_STBclsaE&NB8J#m^C<4%|cOxc|P8re5m50^LHymsO}fEg(*8de4Dz^gj=;A&-YuNCGP9kz+Kv4#{H-on*Q-K{YXVLZtb=554}+C?@P4G z*#W{U2C(IO)!>P~&Tfrn0&K^!@X;g2ceVp#h4_~?#<)$%Fk3emv6@m8(nnhZJv|4b ztlMs|HW+&lTLZW+W{sFB#5+Du+BJ%(e2_Dj>2<3!?3Bk(i9U7eemdoB^Vr=y$F7WH@~;Wo@W}{*p>LC?SWAy##N5lbchQka{&t@he^ljl(O;Hg3Jxa#>$rbZ z1OGR0J-sT2`-bz_vzzJM%TA&u=i#N8pBKheFs^{$-{a+e=HRtOvnB6dYdk1xEO2&n zedqU?(qYcg!}7h=_lUTs6!_3re?Ew2NVlP8>+jgRV6$5SUM&{CT#fqX|)Ekl8A)z?XC@I~$XHsR@lp_bP`TqZ8D=J8!b(+c8849^0Mo|^c%0P8Xo)&)xc&xYm^WfL`)xu+YBu3V;w-n z-IIQtLnk!3+L5}~S>6(Y5U-;x84gO7E8-MzDtd@CHxRZ5ZWL+~^=MVnvVyV8-p;0+ z%_&hV;Jv)$jgtdLpgzgp%wERF!Vb28R8sRpYMKZIKPs6v;&n>vb z>X)`3ty|*!zzKz|R!r@E5B|iHea1(9ZaeF*vPD)b`clA#MFEH2?XY`!xaNJ7G-Mf#9A{_Z=; zgDo6cC-@zZ&DqysYsF$e?<8HIw$*7sV$Wv4zw`T-g_<476XXYd@z~GFdA>wz=LCEsrE# zz4`@^!3@*6Nc>_`CXAy$;~UhJ+W{qGenfArKl*YWlEjf(nN`WV*zB-kyv|)-Dc@G~ zqUSaUEIZy&FMHkEx>dLXI)_+rNs6aZKa{a%ic*iG;pMP;ngP?M+=&(m+hy>nw@XwMN5SLN~uOYLt zu2Y*J;%V9|S@(^c)cFEOUo1?n(mh9wt9Z2wD3+Z-Pxd9@Gl4r0$Z>t3Sd5*5%fe7w ztePz81lJOJ2fjuH#&9;AY}0W;(TjmQ@Z&mr8a7VK@h`8U-$#l>OuS8vCPt2alXQ@cSxyn+R?;{d>O(M1 z)nza{6nB0c8Y4}YnV$Bw+aCHK#6n~%I(jUGtlUZ2S;KWDMcV--gd37+6*SIW_r7Ex zn!@-X{v^-N7wEZM{ax{s++v8g#+(tSu>Att4oCK=_+!NNUQMp{oeruR`5`Ry6pvG* z`NLP4b-J-z>3sH=R(2c*VYp7;Daj{Zk$h(|sIildS(M9k@3|ptegHuDMfCoH%?UKE!KX_fw=hoDB~uY9pJ(bi zkLhI=JIb_DpjwQnO4KFU-AmbLQ3#~Z;4w_bOt*y#(eqv@7Z%L!_iW|LSOGu5fI#_? z8cMO!@aQc4Cb~tIYl>3bkK&7|xh6-Xi2hT0?Mj9%f?7IZttW`?7jcZn&*l>`d@S?V zOtIMO6%U;k4r`x#5vrh}5z4YnN)(Bxm9AQ1jTkL8orxo-%J4Q(vqh%bT&F%MPElJm z>A#y0fq1hLU}oFZ0|Sdz;or7_2mf%kVsNc$NFj+ZHV`@2aPh%{8ospC!W8!G|CkJ3 zK}4mA4#R)_{=rHJKj5MNJ7ELaRuBLBx43XQ?B7q{Q&$BzjVE3{u?hd!{U9asHTKKH zFW*m2@3eh4`BZ%F?!(s*!xp@Gd}{9H_O%wsk}#>Yq`h5D^j(YEPI?{ujP`3s){TzA zxuCAUXB}Q=-P&x8hy7%wZ2m7XworSwE05dSg&#Om9ox?|hZCq!ieUw7C%i z5Tg2X#as%0b}XF`#O9+{>iQ9E;-3z-{14)PTBF?2S5k7~OI)Vr{2EtH2#$)b#t9?K z*~t#OI$KOPZ%0kDWNbmgo2D^H?#r6=cTXLb^wn#QhmU8d)c;v*tC*b7*C(?rcv&Nh z)d!ZAPmrnHj6I{YIZ_>91BueMyl*~1&MT9Vx1kvTiiT%_x?8@>vMIC^jPbKRbGH43 zXA{F)_u;IuBX<@AmaJrn2USQg{p_s*!Q1a%W`peu^neoy0wi+|Xo5M!;`PIn^s>V+ z$rt+224qN=6cGjFUlhT1Dl7vynK}El2g*rg#DZcJufMU&JSu!b7tx9%e&Gf2$)-TL>rgX#P%jk?oKQC$GwkVW+$)nUW}hrvc2|JR2>k z@(Unw{Tg(gIg2y}_ftkaOicO`|2j{h*U8^#dci5JBx&w@ae^yT#LR^?Jv(7JUkxd$E4Xc9+6&+Cqw9)!=I0s;|^Ywz84FirLkNI3d>+bNPg@IQkBa zMLvYQlA>XDqPYvnMKBzf7)CZ>zw=7*S{y3kUWkYRP@ZXI+GIDIU%AV2re=m*dJ+pP z^qpqYUH}D?v+d0@*{l3oCK#QOW%LaFdx%>?f2(P2 zk}!kVR;bs&f3jEkEu?C$zo^vZIcFHHN9OU(&XKe-ppT>yQ#YlpdUBHFz_Li4A7wF; z>MxS}Ny&iz6sEFbBbXXaclB{2Ju=SP$tw!I}l-&Nv6UUH%@6~ZaevQhBj%9?3Kq1=7 zCiDDcPw1_{C(} zqEEa*be-wd)LQkb`>K7TO1SbysgGuOx3;;~X6q>;89G35kQ&7E- z#Cb=KkbeuQg{wWEo5Nlmop^Ygys!nf76+(s(vyN@PeTt>U1XuMTi;7IG3M*N9k;hg zMO3i%Vjx7JdNSWH<`b5ym47>SL%)7*dE)C8VD0VUBE>DBiCBA zm8a?2Zb4zkDw9XZuZe;V!6qgOxx4az3M@Q8H~Wg8Qq;qUya@Me3;^kqoRVroD^@5} zf~aJMX1xCfYd}g3;KuE<(#ypuspHD96L1KmjAD^Zm#JyGgzhh5^T!wwG+ux{=l%Ll zAB>ZEzF+2TGA(@V={&X8goO~i9je3hN1hSQQE?{Y$<=BD?Qtfi{=HrOiA$g(1a@gX z#8sF}rF$XMLq$Dx1ByN6yiMW*x)B|58S@*$9wZLG@`B^dhc+AksiV8XA zg(-5=24BXBQqZOUR#V)081eG=H}(bL+qSj`J8yApIRfZ}@mQ7nSr1K_huoJn_Nysd z=ZP?!SZAX431-6Zf<#DY+45;c_kzZ{g22HTm^5(SD8aRJ!iyGIynS9Z!3r0T_(;1O_K5`!mWsSSkb=94%rOIO5I< zDOWWeGQ4gjz8kEn6j)eErgUqEV`TU-W=z2x<^2eg_J(vs*c>5(Za&h0<^Lb&%l{hg zJI}ckN@nVT`CR}miVR;N%(@KRuoF}ar_W<^E5aq&svsg_BpnV5j$ zEPAeJnGdigGEKjUpRCc4%W*2ogN`mcU@Xqhp!_1E*OQ|grrr)) zY@QeCN!kyr&}R>K_+hLAw7sYVG1n{dOes_(pNdiJDA60fac_J$-FZs>BJ+5W_(A=Y zZ1i`L;|e1nJO9-}IYxw4_JB{uS9&fUoX&eF^p$ z;BTM=%EjM25+5;_=Tq#0w*Sz}{`>gJ+0+iE+J6N}B^_%1NxJ@RQT<+l*R9dhNtYS< zPt^23Sy)huIzOt%B6$sc_D0BIyjoVh84He5hp#U)*Dj^sdGMkr7FaEs_wQ<)k)@t4 z%G7izJl$6TMGaF@Fho;N+&ZVB)_h@adG|#j|HYP4|9(JCkRL`2+|+x=_7VFFjB*-? z;8lJ&{W4zIn3%o?E`cAAs!KOX^xcA9%#(2q#QCk0TZMqq5Gy!rOD*`ih9}K+?*fFZ zVe9X;JfY4Q6hyXn>I?Yb?AtF)L_tb01+usaQK0{eXiCYd0Bay}fjv&r-gHeeg8%Pa z@OJ~$sL5?LSGR8;ZoX2N3SV{QjeAYoP$OviIo-VE!OW)<%0vcHeWy1>oeyk z^mtOY{()2QK`07voaIO2jb7gRCC+W3T(W(!vS2=hBFyj#2N=^It4MclPiBN8;zarw z?E}#0i=aEvp_1k37kWqI@`3rxYP^fY39K&Xz0ZVG-M+2Wrz>4cG3);g?`B?WZbm5 zi}FE+@WmzD_aD~|KMVThqTM$TXy-N?VE){YpQjvcJFipp>&`Fy?bxY}de+>!FSS^COWdkFhdqog~K9Pca5hlZ#cK8IySQBU? z#gJ^k>KyJ5C7h6HQ=HX)+$o-L(FTzW!__oEH^`;R5ThrRE!CfxOG5u@1@HMT6b9%O z!;t8$Wz1kRLShS$>Qjh|&ft6=j??N?#5Oah6CnK3s3Ut$Tf1wy8 z-u-AAuR+Yml* z72LdbyZ^5e2YHcIzQT+uU8&>c`kPzLd%beqOiBHj9#^<+hmU{h3wh>uPv`24QddIO zkI;&LV7(rK)OcHxT!sXgl^aeaicxrz6|l%v?Sbky4>sp{Fg3p`+@mOnNCD06BfQfM z>pP#F&KjaHVL+bv4Y}RmA3)y-CBq->OF!OU_ev{9&U5Lj0ODhoW9(2&EcmttppxNp z`eny|n6>TELH|;p1KeFp89wN0osU2e;bDz?MiJz_^dbUXGhpupCFxM2$Gm=`$r%!o z9E5=npGmrR+{9Rv;OoEs9%~?ZwmA5k8a_+)nX$1n=4|+3!V{Q4*XVAnz=hj_lDe6l zT)hr~sbrGdN4B7aj8qb{nY^}s*Ku#VB57a`V}5TL)K@4y&f>I`B;=9C<>QE%zu|8F zDhiwJN$5K;nZ3*V{hf~@xA;T9*PC6B3#S4A$vEQv{wc#YClI=1c)N+&05#bU zRz9Z3oYfI6Xdcn*IOJpzpgI_JvgbmK~Q!%m6$k|tvlr4tl?1dprmOoZsl zrqGOJ8y@6Q0Zu1l8-L8^+=+SwTmUW>ibyL98s31`KR#ezu~@HqT=w66(fEtWE3(9{ zKhm>i=2+YXbhpL(?=aBV^E%&1Zm{;SGqF3ZHAG>#?#@;Psv{plL;z3BZ{u{gr>R55N6{nw7vvDjufpT-9ufbG>r(~ zkyvLQJa(Fe538jMSydnX4I?Lf49fw*Ws-fEP2plIoS)M-g&}FF3VC;`$fJ7&8Tu_x z>_|7%z1h+*#*&yjG`asNf&&ABNsSimF4+NmIfk;293-BlOzL0m=`y+Vdqm!Ed33kF z$o3dXo;dR0eb!#w7q9cLK02EFViza!jKeH0g^=;d-(`T&ro`^UP(P2xw7~2 zo9Up3%~#?2n=vby)&k8Y(qQ*t%SLd|W;Ou6kz2aABDWUI4cejn!dLTFIR6enJKjAh z=Nmdg(+%xNd?L(Y1wC1#)CgQv&_*g1iT*<;8Z%BxGf0lbj!i<2tghN+ctW|_xD>3e zre14*{ulR=(m}VgxO1fgLgwb22bY)`O6BuNtu5Ej>w=osPo!aaj!@C7n|mtayf2!5 z65F*;tWYg=pH&NFnAu4ZWbkF&Z#TiZ7ep{Nb_WN-0|< zqB;y_TybZgbGzTW$hqf5=I`q?YkaSed+&(fSiG>In0GI=DW!zqVfsJllYAW{$Oy_W zKCEy*;icI4E&%IV2CQHoDwc77UtX|j4}U&4zs{Qb58dgNUc2Fq+VP+Uk{f`Z^ZrWvKdD4XZ2Vw;e-IK*kofJX*#%QvHIE~Me z|FUtp7Upk^oJp(p0Y>hiEe#aqd@}doAUIAZ?l-P>a*%85@}O9colsGT7D!4B6C#I% z_)-?`0494-lVaG(J)HxzoXgV20v>KO9|Vv{7{n|5ia`mNV^n*1KZA~h!g8gq-}FT! zzTYdLuOYRpRa(M@ePv;!5|t_aSJnHEy9mf-7}XWXFKtwT8Hp){T!yy2g<2LzdWBfT zUoqUWLOEA1>-z@Kv5oHczrl=7k<7?i9v85+62PGgK{$XF*Fqanu5{QBQ<3j&_BaK5 zfWbhhXgz2xo;5A_!^w;4$m6qu|D6-IY;wCgbN^Fkai4(UrqT0nUtHhXWJn@o2A&Tg zFvNm8s@Pd$QF#ru#^B2e#OF;gE>eXdMjVK;D!odi)rL?d56f`R*yXaD5EOmsHzQ3y z6~(Xd5Jr49o*GK&DU^y*@-VmDZ!p~d!w=4cJ_@T&%?j5|`qR7?zs8o{oV< zZrjPoh3}FshmR9BoAZ<_hbhGo{^!>su&u9RRH}RZG-oHg+aFFJdc)x+N0(N(goW>UFA?z{O3nUxrPa zMT;<(m95CEB}L^&VO43PSEAJ$timhsEf@Uxm@~4OUgcmA@!>M`@i ztyn>p8U4T9FAiFtSbkb}LeuNQ8}qkp5m-S&6Z%DmD&$LR#raab_M6mf0Uev-pbPev zPq-(ie1&p$VB~Evtgddta0*_Vt>?|BhZb)`SRwBjor$WvPYUcf+k!?vRrU-wv`gQK zAExKp}`t|rI@9xBRRP!f+uw#3r9q3@$2CpIlW*?0KIf&b@Ft7 z!J5i8mZVvcDmAK?())W_cO{~Pr`CZSh@w!Y^f@5EvF6RN^3HuJXpAjnY3Xv3#7S2$vuzk83?47{w=c^nK`9(+LCCJQI#3^$tB-mZF^4&D+uuu zc4zS1A`~Y6fKXAVnku=6T`%Er(d`EkbAba#w4~E)95M(39~=iRWfVDHu7=>~qPzUC zDE0(iNiU^j$633MST}pJL2aNgTry2&CXQ^2{RyhN2Gy@ntRqE{5(}1Z%yAN*4(n08 z^$cTw#`_TOJTKyhIYLaJ%Mhx$em9iK~tuM`uI=wW`a-5-{jgv#UE}W z#*D5De5PMo;*8RP>(ymvBX{P<=c0YngT|hZh;OV6z7?Z43o{<>*rzFi_NpF2x|YIn zGTl4YMPl?zaI8D%)K1QuZL#hTN=#wYmmeoPy}^ml*uUO#n4$z5^_fnwlIbmh@VdR? z%OV}8%M%_eUgg{S1klzd^ij`vLmf$UczY(XgURol0~{fl0WH*tiZJNtA(ZU%9`oHo z&0Hg4f;JHJxaL!#i$rxYV7oW3RXpx*5b`rdQ_`q@|~S}*I4a_C5>TH1KjgLtUE&Z zyXQ_`Rx?2*Y!jbH%dW!eK5 znvm}bl-~{hxcemouc{lL%5Ypj5eIwUz0LQ~dlk~7dn=(8og=H4&Hu$G_6&4QZ6L0j z?MKxr&_uI+pXj}NAp$dqQDS#tr6JCn2hRzOs%{4c*nLim$Q5lXgEfg^o__xO;-1XeXxPu0%u@NGI8xACs9wrzf(46RE{Z#EUN!j#ho_Ob_m*$^x6;z4ayX^L+xaDI$amx6}2JjHkJ zYvm=sXoZh}zsITiqFb)@`RLO!Qrtr~mix{3;zU=)MY~UD#&}X^ms1IYRnAvM~t4c3?dJ8_s z?WXBm4U!0e+39k&pScl^+X-C+FJ`(-siwObhW0DSu_7%jUBc%{N^njv<01IW8uxI+ ztz}|LK8bI+Ky~sW3{XvhebrD$O)f2oIq&r<@d3j(&ocv~Vtme($5*6}OKSc))}vR< zWhMPPStZx{<#yDBn{TEy>I?6J*!0&&>PxFP3*x-Cvb>&TvQVxsrS5!9Ew)8Q!M5zp zwhVwFS#}*P5vGw?L1CEUr6PqFBzAO|oT{dcw6NBj4+;A{I`;C4T!vX^onTKem#_xc z_+z=n^b@i>^%5j8Axxo%UUQ&JpNc!-FIKn6M6_Zj?ufH)K4?CeF|g&um;gLEYA)Pjt!1`0_Ct! zS<>xYPZKX+f*IMEd9byPmy!^DL3QcZHJ=GGfA0x~?RqhYq{3fXm*Q0knO%0L3nkk% z*`^ceAp||7lk3SAY>{hdS2bm^fGI1^Aj3tU(mSp;%-&t=5hdI6M1_gi!HyVkrY3GIduphR2?A=`1?sj1spn zWpx%N^fCKWum+M%Crplyg`soi{O}zZ6^d;`Yd&Jt#xV3ZjOx@9mI{J5hhJXd^7y3_ z+5BMmkS6d2NNEgzuPN}!r?3RxLfLN2g;f$LB3pK=Wo_0O?G}u>J}z9GkQ2vMls-`` z+Lm#@0ejrE2*wb%XfY|kUzH+DCtA4*~{evH7n)v+lF^ zpLP9anjz6EGLR4P$au-8TDP*hqCrc4gV!Ex^N9cyeg9N%m3Q^GE-R$_l;MVW#xOEq-1|^HRk>VpV83(=MH zETRr{kIq4<&O}T$d3H6YF3E9rvKW32|0Ga z&WV9ezR029JW#*yf%&e}5zyA9ThnhmZ#)Ncx?BwlIAbnVq7GQlMOB;h4sbenM!v6X z1Q^tJQ19toTug3-DK9Appu!8(qqyTPI|#d)_bysnYHz1yf1q?@GZnU39}O|)W~Y=V>{QX>H;V81E}|+|3H8b(dT@cZKFQ&%N$!ik`LNEqH+@Qj{q-3e#wC742 z50MS6X|B0(%6RZ>Zi&$(q@@5vQohg8h!>CuLy#xphPm#%MnX*9G{ajo)sL6h$@lCh zAj&AON9#99qq*rrwW){GUr=xOS9+ zenS+)MajOE3mV&X1fv=>w!f3W}AUnqQ-PFo5kJ^<>lEm@)M&^)zx5pPKxn-%*T&t#oV%pFP;31$J+fFxl`U!&(cnHc7&+> z1|xi2V_#pN${+~(17NmiA{u}J5=n8+1K?t*8$AIzpg$N_@n!!{N9W>}J_K>Y`R<$?>1LnM4n5uC2}(pmXw|QX3Zt5)+pZdJ|9&7HvY965YVT1P z&k;5ek%4Mrmka6pER%>%j$DCp z!}+`C3R~1u zzx_?-sx5N_21_GP0IHgqoQ|c-fq!n+z4D*T57RRzP}O(9BRlE*ukm!7^mUGOvaXT# z+3`2l=ZL^nY8<)+r3p9ew$23>R@}h8oB~2AsZhkf#H3JvuJ)s#q9OkXKVNrpabumB zL9n=CD{_nK_EbB&u}ZkzfmV%OErTo&3o5VcbC=~{tJmd?1N%71bhYYAvt zyFoVJrq%68nnT}$M1@R8$g*v1xj_~A(ehR05JJYnlG%M}HO%(HtfxXAqtE%;g)qg6 zO1gYN`rX(GE{JWsta1B*0~&$d?s9L}3Gms`1umMfKg&3Se9Q!DfAZg<#!SWa(<`9X zT>p4Jx1JW3YgA$D%ap^-nVKZ+Llf(R;b{scMQ6qcmH!*NVc0JSsiXpU;Kurb8QjuP%lWf(i{pKyS=Nm__fE1cNehxO{_JgD6-GYKsUSk9o}rj zm)|c)7g4F&Fqh-^j*-U(=Wp-MP0l)V)b7boErXE^yR*H}tbd=)bQ#db=$f4rGcJx% z9k9n37UV78JNg~ZdwI)+7kzOFEF`OuCNUl1RRs~IeqVnc24<>VgF$@IzR>Cyf=LWS zIB!=0{WfRoo`<|S;h4{Z%@H@w7htp7jaaCpV)#)eBFtF@qbpi|O(hBevkLSK43eB8 zm*s_c!r!Wqzxv3zW}%kh+BqE}&$m#!c9N_<+@(Ro??YI^so1f<&_l4s-SI!m+OqgN z9IoJQtDyuXs!3{+-`dZUz^$_^?txB%i;WgZ@|6erm4lc0e$Vx9z}H~aU6vE2)~5weIh_bj2tSMF#&-E{W9R^?;&(`=d(W$XLtXv=LVI^f%t>iQ$JOmHXVan^d9u2fB!P0H(DDFQ{$xh=o5ZRb-~0Zm z@X5l+FZ-}!C5JOUUib{#3RbW}H#*3+$=xNW(I~|;1=9ryCLCRl&l949HV%i4XIDcW zY*^6o4W=nq*4JQTVyhsb6OM3$+@{HM6ZqIapPCe+=#!3Abic#P(RHJV4d5xF#}SjA zHfS#v`4XdQ$0Rx`d6?wSM&7b~r>&1lo-Sd%O9D*KAayf`5jLw!b;L8o6Umqv0 z3F(GEUf${_TH?RG`^9y$W^;}!{v_XGUX0~NmUN7 zCXyauV0(R79caS7+{8zdoW}RtGYF8KEEix~P4tzB#_LDyZvag?RMb4ON{ryfcqAn@ QyP@FN866u{8!0&Te-$zq0RR91 literal 16559 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 diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/sdf-bake-tool-window.md b/Packages/com.unity.visualeffectgraph/Documentation~/sdf-bake-tool-window.md index d991c511274..c32b41b47ac 100644 --- a/Packages/com.unity.visualeffectgraph/Documentation~/sdf-bake-tool-window.md +++ b/Packages/com.unity.visualeffectgraph/Documentation~/sdf-bake-tool-window.md @@ -33,10 +33,10 @@ Note: To use the SDF asset with the [Collide With Signed Distance Field](Block-C ## Properties -The SDF Bake Tool window includes default properties, which should suit most use cases, and additional properties that further tweak the baking process. The additional properties are invisible by default. To show them: +The SDF Bake Tool window includes default properties, which should suit most use cases, and additional properties that further tweak the baking process. The [advanced properties](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest?subfolder=/manual/advanced-properties.html) are invisible by default. To show them: 1. To the right of the window's header, select the **More** menu (⋮). -2. Enable **Show Additional Properties**. +2. Enable **Advanced Properties**. ![](Images/sdf-bake-tool-additional-properties.png) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Utilities/SDF/BakeTool/SDFBakeTool.cs b/Packages/com.unity.visualeffectgraph/Editor/Utilities/SDF/BakeTool/SDFBakeTool.cs index b4af0fcdf35..4e84caf3028 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Utilities/SDF/BakeTool/SDFBakeTool.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Utilities/SDF/BakeTool/SDFBakeTool.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using UnityEditor.Rendering; using UnityEngine; using UnityEngine.Rendering; using Object = UnityEngine.Object; @@ -8,7 +9,7 @@ namespace UnityEditor.VFX.SDF { - class SDFBakeTool : EditorWindow + class SDFBakeTool : EditorWindow, IHasCustomMenu { [MenuItem("Window/Visual Effects/Utilities/SDF Bake Tool", false, 3013)] static void OpenWindow() @@ -25,7 +26,6 @@ static void OpenWindow() private SdfBakerPreview m_MeshPreview; private Texture3DPreview m_TexturePreview; private bool m_RefreshMeshPreview = false; - private bool m_ShowAdvanced; private MeshToSDFBaker m_Baker; private bool m_FoldOutParameters = true; private bool m_PrefabChanged = false; @@ -133,7 +133,6 @@ protected void OnGUI() SaveSettings(); } GUI.enabled = true; - DrawContextIcon(); GUILayout.EndHorizontal(); GUILayout.Space(5); @@ -190,7 +189,7 @@ protected void OnGUI() MessageType.Warning); bool fitPaddingChanged = false; - if (m_ShowAdvanced) + if (AdvancedProperties.BeginGroup()) { liftSizeLimit = EditorGUILayout.Toggle(Contents.liftSizeLimit, liftSizeLimit); m_FoldOutParameters = EditorGUILayout.BeginFoldoutHeaderGroup(m_FoldOutParameters, Contents.bakingParameters); @@ -211,6 +210,7 @@ protected void OnGUI() m_Settings.m_FitPaddingVoxel = EditorGUILayout.Vector3IntField(Contents.fitPadding, m_Settings.m_FitPaddingVoxel); fitPaddingChanged = EditorGUI.EndChangeCheck(); } + AdvancedProperties.EndGroup(); EditorGUIUtility.wideMode = prevWideMode; using (new EditorGUI.DisabledScope(mesh == null)) @@ -373,27 +373,6 @@ private void UpdateMeshPreview() } } - private void DrawContextIcon() - { - GUILayout.FlexibleSpace(); - EditorGUI.BeginChangeCheck(); - var rect = GUILayoutUtility.GetRect(Contents.contextMenuIcon, GUIStyle.none, GUILayout.Height(20), GUILayout.Width(20)); - - GUI.Button(rect, Contents.contextMenuIcon, GUIStyle.none); - if (EditorGUI.EndChangeCheck()) - { - OnContextClick(new Vector2(rect.x, rect.yMax)); - } - } - - private void OnContextClick(Vector2 pos) - { - var menu = new GenericMenu(); - menu.AddItem(EditorGUIUtility.TrTextContent("Show Additional Properties"), m_ShowAdvanced, () => m_ShowAdvanced = !m_ShowAdvanced); - menu.AddItem(EditorGUIUtility.TrTextContent("Create new session"), false, CreateNewSession); - menu.DropDown(new Rect(pos, Vector2.zero)); - } - private void OnEnable() { titleContent = Contents.title; @@ -683,10 +662,6 @@ static class Contents internal static GUIContent saveSDFBlocked = new GUIContent("Save SDF", "There is nothing to save yet. Please use the Bake Mesh button before saving."); - static Texture2D paneOptionsIconDark = (Texture2D)EditorGUIUtility.Load("Builtin Skins/DarkSkin/Images/pane options.png"); - static Texture2D paneOptionsIconLight = (Texture2D)EditorGUIUtility.Load("Builtin Skins/LightSkin/Images/pane options.png"); - static Texture2D paneOptionsIcon { get { return EditorGUIUtility.isProSkin ? paneOptionsIconDark : paneOptionsIconLight; } } - internal static GUIContent contextMenuIcon = new GUIContent(paneOptionsIcon, "Additional Properties"); internal static GUIContent fitPadding = new GUIContent("Fit Padding", "Controls the padding, in voxel, to apply when using \"Fit Box/Cube to Mesh\"."); internal static GUIContent fitBoxToMesh = new GUIContent("Fit box to Mesh", "Fits the bounding box of the bake to the bounding box of the mesh. Padding specified in \"Fit Padding\" (in Additional Properties) will be applied."); @@ -696,5 +671,11 @@ static class Contents internal static GUIContent saveSettings = new GUIContent("Save Settings", "Saves the settings of the tool into an asset."); internal static GUIContent settingsAsset = new GUIContent("Settings Asset"); } + + public void AddItemsToMenu(GenericMenu menu) + { + menu.AddAdvancedPropertiesBoolMenuItem(); + menu.AddItem(EditorGUIUtility.TrTextContent("Create new session"), false, CreateNewSession); + } } } From adcbd3ea4a31827afdf69e796b76459eb50674b5 Mon Sep 17 00:00:00 2001 From: Christian Sasseville Date: Tue, 30 Apr 2024 00:58:28 +0000 Subject: [PATCH 06/67] Disabling instabilities Disabling many instabilities on trunk --- .../Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs index 2bdd743a31d..c041289ac11 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/GPUDrivenRenderingTests.cs @@ -230,6 +230,7 @@ public void TestInstanceCullingTier0() } [Test, ConditionalIgnore("IgnoreGfxAPI", "Graphics API Not Supported.")] + [Ignore("Disabled for Instability https://jira.unity3d.com/browse/UUM-71039")] public void TestSceneViewHiddenRenderersCullingTier0() { var go = GameObject.CreatePrimitive(PrimitiveType.Cube); From 351ba452c78c7a73f741092fc753809072d9c383 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Tue, 30 Apr 2024 10:23:09 +0000 Subject: [PATCH 07/67] [VFX] Fix multiple node search window issues and bring some improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jira: [VFXG-444](https://jira.unity3d.com/browse/VFXG-444) Several small quality of life improvements on the new node search window: - Reorganized some nodes and more consistent naming - Output contexts are organized under separators - Collision nodes are renamed and reorganized - Get and Set Attribute nodes also organized under separators - Position nodes renamed/reorganize - Updated icon for expand/collapsed side panel NodeSearch-expand@2x - Updated icon for show/hide sub-variants sub-variant-visible - Better doc button behavior (hides when useless, disabled when no doc) - Easily find `Add`, `Multiply`, `Blend` composition modes for attribute in search result even when subvariant are not enabled - Sort search result by relevancy inside a category - Open details panel with a button on items with sub-variant available (there was an arrow icon which was not clickable) - Introduce separators to visually better organize nodes (not using folders to avoid the fold/unfold burden) - Added a bunch of synonyms, listed here ([1](https://www.notion.so/unity3d/Create-synonym-List-for-all-Contexts-5f4cc076051445bc9c0b94a9916f8669?pvs=4), [2](https://www.notion.so/unity3d/Create-synonym-List-for-all-Operators-4a2e209abff54e5c9f6acabb8bcdf5a7?pvs=4), [3](https://www.notion.so/unity3d/Create-synonym-List-for-all-Blocks-39ed4a419a504d9096ed6c429a5de2ad?pvs=4) ![Unity_ZD75H7FP9N](https://media.github.cds.internal.unity3d.com/user/4003/files/49c56a21-972f-413e-87d3-35a4ee03a0dd) **Separators**⤴ ![Unity_dwadGwIalN](https://media.github.cds.internal.unity3d.com/user/4003/files/2ba02b18-f915-4a17-886b-fb23e498434b) **Search result sorting & new design to better identify node's setting**⤴ ![Unity_UcBKIkIPWd](https://media.github.cds.internal.unity3d.com/user/4003/files/0bca233c-4e22-40c1-a4ba-12d31838df01) **Prefix search with `+` to temporary include subvariants**⤴ **And new synonyms: `+`=>`Add`, `*`=>`Multiply`, `=`=>`Set`, `%`=>`Blend`** Some other improvements that were needed for consistency: - New Local/World/None buttons, with new icons ![WorldSpace](https://media.github.cds.internal.unity3d.com/user/4003/files/d2b02d9d-89fc-4533-aef5-5d6fc2d0e1f1) ![LocalSpace](https://media.github.cds.internal.unity3d.com/user/4003/files/a4228795-4219-42a0-8585-5931f69991c1) NoneSpace@2x - Node's title have settings displayed with same "pill" design as in the node search ![Unity_fo4rN2EexU](https://media.github.cds.internal.unity3d.com/user/4003/files/00ca3510-2307-4b26-a86a-a2ddeab9ade6) --- .../VFXGraph/Outputs/VFXDecalHDRPOutput.cs | 7 +- .../Outputs/VFXDistortionMeshOutput.cs | 4 +- .../VFXDistortionPlanarPrimitiveOutput.cs | 33 +- .../Outputs/VFXDistortionQuadStripOutput.cs | 4 +- .../VFXGraph/Outputs/VFXLitCubeOutput.cs | 4 +- .../VFXGraph/Outputs/VFXLitMeshOutput.cs | 10 +- .../Outputs/VFXLitPlanarPrimitiveOutput.cs | 42 +- .../VFXGraph/Outputs/VFXLitQuadStripOutput.cs | 4 +- .../VFXGraph/Outputs/VFXLitSphereOutput.cs | 4 +- .../Outputs/VFXVolumetricFogOutput.cs | 4 +- .../Editor/VFXGraph/VFXDecalURPOutput.cs | 4 +- .../Editor/VFXGraph/VFXURPLitMeshOutput.cs | 4 +- .../VFXURPLitPlanarPrimitiveOutput.cs | 39 +- .../VFXGraph/VFXURPLitQuadStripOutput.cs | 4 +- .../Editor/Core/VFXLibraryStringHelper.cs | 84 +++ .../Core/VFXLibraryStringHelper.cs.meta | 3 + .../Expressions/VFXAttributeExpression.cs | 3 + .../Editor/FilterPopup/VFXBlockProvider.cs | 2 +- .../Editor/FilterPopup/VFXFilterWindow.cs | 498 ++++++++++++------ .../GraphView/Controllers/Controller.cs | 10 +- .../Controllers/VFXParameterNodeController.cs | 15 +- .../Editor/GraphView/Elements/VFXContextUI.cs | 21 +- .../GraphView/Elements/VFXDataAnchor.cs | 4 +- .../GraphView/Elements/VFXFlowAnchor.cs | 1 - .../Editor/GraphView/Elements/VFXNodeUI.cs | 53 +- .../GraphView/Elements/VFXOperatorUI.cs | 42 +- .../GraphView/Elements/VFXParameterUI.cs | 19 +- .../Editor/GraphView/VFXViewPreference.cs | 5 + .../Views/Properties/SpaceablePropertiesRM.cs | 34 +- .../Editor/GraphView/Views/VFXNodeProvider.cs | 6 +- .../Editor/GraphView/Views/VFXView.cs | 6 +- .../Attribute/AttributeFromCurve.cs | 65 +-- .../Attribute/AttributeFromMap.cs | 52 +- .../Collision/CollisionBase.cs | 25 +- .../Collision/CollisionDepth.cs | 13 +- .../Collision/CollisionShape.cs | 60 ++- .../Implementations/Forces/ConformToSDF.cs | 4 +- .../Implementations/Forces/ConformToSphere.cs | 4 +- .../Implementations/GPUEvent/TriggerEvent.cs | 4 +- .../Orientation/ConnectTarget.cs | 2 +- .../Implementations/Orientation/Orient.cs | 36 +- .../Implementations/Position/PositionDepth.cs | 2 +- .../Implementations/Position/PositionMesh.cs | 12 +- .../Position/PositionSequential.cs | 6 +- .../Implementations/Position/PositionShape.cs | 28 +- .../Implementations/Position/TileWarp.cs | 2 +- .../Blocks/Implementations/SetAttribute.cs | 72 ++- .../Spawn/VFXSpawnerSetAttribute.cs | 4 +- .../Update/AngularEulerIntegration.cs | 4 +- .../Update/EulerIntegration.cs | 4 +- .../Blocks/Implementations/VFXBlockUtility.cs | 38 +- .../Implementations/Velocity/VelocityBase.cs | 8 +- .../Velocity/VelocityDirection.cs | 11 +- .../Velocity/VelocityRandomize.cs | 10 +- .../Implementations/Velocity/VelocitySpeed.cs | 8 +- .../Velocity/VelocitySpherical.cs | 8 +- .../Velocity/VelocityTangent.cs | 8 +- .../Implementations/VFXBasicCubeOutput.cs | 7 +- .../Contexts/Implementations/VFXBasicEvent.cs | 2 +- .../Implementations/VFXBasicGPUEvent.cs | 2 +- .../Implementations/VFXBasicInitialize.cs | 2 +- .../Implementations/VFXBasicSpawner.cs | 2 +- .../Implementations/VFXBasicUpdate.cs | 2 +- .../VFXComposedParticleOutput.cs | 30 +- .../VFXComposedParticleStripOutput.cs | 6 +- .../Implementations/VFXDecalOutput.cs | 4 +- .../Contexts/Implementations/VFXLineOutput.cs | 4 +- .../Implementations/VFXLineStripOutput.cs | 4 +- .../Contexts/Implementations/VFXMeshOutput.cs | 10 +- .../Implementations/VFXOutputEvent.cs | 2 +- .../VFXPlanarPrimitiveOutput.cs | 36 +- .../Implementations/VFXPointOutput.cs | 4 +- .../Implementations/VFXQuadStripOutput.cs | 10 +- .../Implementations/VFXStaticMeshOutput.cs | 2 +- .../VFXAbstractComposedParticleOutput.cs | 2 +- .../Operators/Implementations/AABoxVolume.cs | 2 +- .../Models/Operators/Implementations/Add.cs | 2 +- .../Operators/Implementations/Branch.cs | 2 +- .../Operators/Implementations/ChangeSpace.cs | 2 +- .../Operators/Implementations/Condition.cs | 2 +- .../Operators/Implementations/CurlNoise.cs | 64 ++- .../Operators/Implementations/HSVtoRGB.cs | 2 +- .../Operators/Implementations/LookAt.cs | 2 +- .../Models/Operators/Implementations/Noise.cs | 49 +- .../Operators/Implementations/RGBtoHSV.cs | 2 +- .../Operators/Implementations/Random.cs | 13 +- .../Implementations/RandomSelector.cs | 6 +- .../Operators/Implementations/SampleBezier.cs | 2 +- .../Operators/Implementations/Subtract.cs | 8 +- .../Operators/Implementations/Switch.cs | 2 +- .../Implementations/ViewportToWorldPoint.cs | 2 +- .../Implementations/WorldToViewportPoint.cs | 2 +- .../Parameters/VFXAttributeParameter.cs | 26 +- .../Parameters/VFXDynamicBuiltInParameter.cs | 60 +-- .../Editor/Models/Parameters/VFXParameter.cs | 5 +- .../Slots/Implementations/VFXSlotUint.cs | 2 +- .../Editor/Models/VFXAttributesManager.cs | 85 +-- .../Editor/Templates/05_Head_Trail.vfx | 148 +++--- .../Editor/UIResources/VFX/LocalSpace.png | Bin 0 -> 530 bytes .../{resizer.png.meta => LocalSpace.png.meta} | 7 +- .../Editor/UIResources/VFX/LocalSpace@2x.png | Bin 0 -> 990 bytes ...overed.png.meta => LocalSpace@2x.png.meta} | 36 +- .../UIResources/VFX/NodeSearch-expand.png | Bin 0 -> 248 bytes ...ed.png.meta => NodeSearch-expand.png.meta} | 36 +- .../UIResources/VFX/NodeSearch-expand@2x.png | Bin 0 -> 338 bytes ...png.meta => NodeSearch-expand@2x.png.meta} | 36 +- .../Editor/UIResources/VFX/NoneSpace@2x.png | Bin 0 -> 618 bytes .../UIResources/VFX/NoneSpace@2x.png.meta | 115 ++++ .../Editor/UIResources/VFX/WorldSpace.png | Bin 0 -> 604 bytes .../UIResources/VFX/WorldSpace.png.meta | 115 ++++ .../Editor/UIResources/VFX/WorldSpace@2x.png | Bin 0 -> 1234 bytes .../UIResources/VFX/WorldSpace@2x.png.meta | 115 ++++ .../Editor/UIResources/VFX/d_LocalSpace.png | Bin 0 -> 488 bytes .../UIResources/VFX/d_LocalSpace.png.meta | 115 ++++ .../UIResources/VFX/d_LocalSpace@2x.png | Bin 0 -> 922 bytes .../UIResources/VFX/d_LocalSpace@2x.png.meta | 115 ++++ .../UIResources/VFX/d_NodeSearch-expand.png | Bin 0 -> 246 bytes .../VFX/d_NodeSearch-expand.png.meta | 115 ++++ .../VFX/d_NodeSearch-expand@2x.png | Bin 0 -> 355 bytes .../VFX/d_NodeSearch-expand@2x.png.meta | 115 ++++ .../Editor/UIResources/VFX/d_NoneSpace@2x.png | Bin 0 -> 610 bytes .../UIResources/VFX/d_NoneSpace@2x.png.meta | 115 ++++ .../Editor/UIResources/VFX/d_WorldSpace.png | Bin 0 -> 552 bytes .../UIResources/VFX/d_WorldSpace.png.meta | 115 ++++ .../UIResources/VFX/d_WorldSpace@2x.png | Bin 0 -> 1144 bytes .../UIResources/VFX/d_WorldSpace@2x.png.meta | 115 ++++ .../UIResources/VFX/d_sub-variant-hidden.png | Bin 0 -> 614 bytes .../VFX/d_sub-variant-hidden.png.meta | 115 ++++ .../UIResources/VFX/d_sub-variant-visible.png | Bin 0 -> 232 bytes .../VFX/d_sub-variant-visible.png.meta | 115 ++++ .../Editor/UIResources/VFX/resizer.png | Bin 17035 -> 0 bytes .../Editor/UIResources/VFX/spacelocal.png | Bin 835 -> 0 bytes .../UIResources/VFX/spacelocal.png.meta | 130 ----- .../UIResources/VFX/spacelocal_hovered.png | Bin 837 -> 0 bytes .../Editor/UIResources/VFX/spacenone.png | Bin 873 -> 0 bytes .../Editor/UIResources/VFX/spacenone.png.meta | 130 ----- .../UIResources/VFX/spacenone_hovered.png | Bin 883 -> 0 bytes .../Editor/UIResources/VFX/spaceworld.png | Bin 1139 -> 0 bytes .../UIResources/VFX/spaceworld.png.meta | 130 ----- .../UIResources/VFX/spaceworld_hovered.png | Bin 1132 -> 0 bytes .../UIResources/VFX/sub-variant-hidden.png | Bin 16598 -> 614 bytes .../UIResources/VFX/sub-variant-visible.png | Bin 16598 -> 231 bytes .../Editor/UIResources/VFX/title-local.png | Bin 2401 -> 0 bytes .../UIResources/VFX/title-local.png.meta | 130 ----- .../Editor/UIResources/VFX/title-local@2x.png | Bin 15603 -> 0 bytes .../UIResources/VFX/title-local@2x.png.meta | 130 ----- .../Editor/UIResources/VFX/title-world.png | Bin 2456 -> 0 bytes .../UIResources/VFX/title-world.png.meta | 130 ----- .../Editor/UIResources/VFX/title-world@2x.png | Bin 15780 -> 0 bytes .../UIResources/VFX/title-world@2x.png.meta | 130 ----- .../Editor/UIResources/uss/PropertyRM.uss | 49 +- .../Editor/UIResources/uss/VFXBlock.uss | 4 + .../Editor/UIResources/uss/VFXContext.uss | 48 +- .../UIResources/uss/VFXFilterWindow.uss | 194 ++++--- .../Editor/UIResources/uss/VFXNode.uss | 33 +- .../Editor/UIResources/uss/VFXOperator.uss | 11 + .../Editor/UIResources/uss/VFXParameter.uss | 44 +- .../UIResources/uss/VFXTemplateWindow.uss | 1 + .../Editor/UIResources/uxml/VFXContext.uxml | 2 +- .../UIResources/uxml/VFXFilterWindow.uxml | 11 +- .../Editor/UIResources/uxml/VFXParameter.uxml | 4 +- .../Tests/Editor/VFXCodeGenerationTest.cs | 2 +- .../Tests/Editor/VFXTestCommon.cs | 2 +- .../ShaderVariantLists/D3D.shadervariantlist | 260 ++++----- .../GameCore.shadervariantlist | 260 ++++----- .../PS5NGGC.shadervariantlist | 198 +++---- .../Editor/Tests/VFXComponentTests.cs | 2 +- .../Editor/Tests/VFXCopyPasteTests.cs | 2 +- .../Editor/Tests/VFXFilterWindowTest.cs | 216 ++++++++ .../Editor/Tests/VFXFilterWindowTest.cs.meta | 3 + .../AllTests/Editor/Tests/VFXGUITests.cs | 14 +- .../Editor/Tests/VFXSerializationTests.cs | 8 +- .../Editor/Tests/VFXSystemNamesTest.cs | 2 +- 173 files changed, 3636 insertions(+), 2223 deletions(-) create mode 100644 Packages/com.unity.visualeffectgraph/Editor/Core/VFXLibraryStringHelper.cs create mode 100644 Packages/com.unity.visualeffectgraph/Editor/Core/VFXLibraryStringHelper.cs.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/LocalSpace.png rename Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/{resizer.png.meta => LocalSpace.png.meta} (95%) create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/LocalSpace@2x.png rename Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/{spacelocal_hovered.png.meta => LocalSpace@2x.png.meta} (75%) create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/NodeSearch-expand.png rename Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/{spacenone_hovered.png.meta => NodeSearch-expand.png.meta} (75%) create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/NodeSearch-expand@2x.png rename Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/{spaceworld_hovered.png.meta => NodeSearch-expand@2x.png.meta} (75%) create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/NoneSpace@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/NoneSpace@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/WorldSpace.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/WorldSpace.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/WorldSpace@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/WorldSpace@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_LocalSpace.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_LocalSpace.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_LocalSpace@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_LocalSpace@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_NodeSearch-expand.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_NodeSearch-expand.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_NodeSearch-expand@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_NodeSearch-expand@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_NoneSpace@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_NoneSpace@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_WorldSpace.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_WorldSpace.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_WorldSpace@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_WorldSpace@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_sub-variant-hidden.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_sub-variant-hidden.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_sub-variant-visible.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/d_sub-variant-visible.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/resizer.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spacelocal.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spacelocal.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spacelocal_hovered.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spacenone.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spacenone.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spacenone_hovered.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spaceworld.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spaceworld.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/spaceworld_hovered.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-local.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-local.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-local@2x.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-local@2x.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-world.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-world.png.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-world@2x.png delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/title-world@2x.png.meta create mode 100644 Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXFilterWindowTest.cs create mode 100644 Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXFilterWindowTest.cs.meta diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDecalHDRPOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDecalHDRPOutput.cs index ace3973d0bc..da95e5c8d98 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDecalHDRPOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDecalHDRPOutput.cs @@ -8,13 +8,10 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Particle HDRP Lit Decal", category = "Output")] + [VFXInfo(name = "Output Particle|HDRP Lit|Decal", category = "#4Output Advanced")] class VFXDecalHDRPOutput : VFXAbstractParticleHDRPOutput { - public override string name - { - get { return "Output Particle HDRP Lit Decal"; } - } + public override string name => "Output Particle".AppendLabel("HDRP Lit", false) + "\nDecal"; public override string codeGeneratorTemplate { diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionMeshOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionMeshOutput.cs index a8858162afb..84a73d6c668 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionMeshOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionMeshOutput.cs @@ -5,10 +5,10 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Particle HDRP Distortion Mesh", category = "Output")] + [VFXInfo(name = "Output Particle|HDRP Distortion|Mesh", category = "#4Output Advanced")] class VFXDistortionMeshOutput : VFXAbstractDistortionOutput { - public override string name { get { return "Output Particle HDRP Distortion Mesh"; } } + public override string name => "Output Particle".AppendLabel("HDRP Distortion", false) + "\nMesh"; public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleDistortionMesh"); } } public override VFXTaskType taskType { get { return VFXTaskType.ParticleMeshOutput; } } public override bool supportsUV { get { return true; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionPlanarPrimitiveOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionPlanarPrimitiveOutput.cs index cbb761960ed..8b86139f8da 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionPlanarPrimitiveOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionPlanarPrimitiveOutput.cs @@ -1,20 +1,30 @@ using System; using System.Collections.Generic; using System.Linq; -using UnityEditor.VFX.Block; + using UnityEngine; namespace UnityEditor.VFX.HDRP { - internal class VFXDistortionPlanarPrimitiveOutputProvider : VariantProvider + internal class VFXDistortionPlanarPrimitiveOutputSubvariantProvider : VariantProvider { + private readonly VFXPrimitiveType mainPrimitiveType; + + public VFXDistortionPlanarPrimitiveOutputSubvariantProvider(VFXPrimitiveType type) + { + mainPrimitiveType = type; + } + public override IEnumerable GetVariants() { foreach (var primitive in Enum.GetValues(typeof(VFXPrimitiveType)).Cast()) { + if (primitive == mainPrimitiveType) + continue; + yield return new Variant( - $"Output Particle HDRP Distortion {primitive}", - "Output", + "Output Particle|HDRP Distortion".AppendLabel(primitive.ToString()), + VFXLibraryStringHelper.Separator("Output Advanced", 4), typeof(VFXDistortionPlanarPrimitiveOutput), new[] {new KeyValuePair("primitiveType", primitive)} ); @@ -22,6 +32,19 @@ public override IEnumerable GetVariants() } } + internal class VFXDistortionPlanarPrimitiveOutputProvider : VariantProvider + { + public override IEnumerable GetVariants() + { + yield return new Variant( + "Output Particle|HDRP Distortion".AppendLabel(VFXPrimitiveType.Quad.ToString()), + VFXLibraryStringHelper.Separator("Output Advanced", 4), + typeof(VFXDistortionPlanarPrimitiveOutput), + new[] {new KeyValuePair("primitiveType", VFXPrimitiveType.Quad)}, + () => new VFXDistortionPlanarPrimitiveOutputSubvariantProvider(VFXPrimitiveType.Quad)); + } + } + [VFXInfo(variantProvider = typeof(VFXDistortionPlanarPrimitiveOutputProvider))] class VFXDistortionPlanarPrimitiveOutput : VFXAbstractDistortionOutput { @@ -31,7 +54,7 @@ class VFXDistortionPlanarPrimitiveOutput : VFXAbstractDistortionOutput //[VFXSetting] // tmp dont expose as settings atm public bool useGeometryShader = false; - public override string name { get { return "Output Particle HDRP Distortion " + primitiveType.ToString(); } } + public override string name => "Output Particle".AppendLabel("HDRP Distortion", false) + $"\n{primitiveType.ToString()}"; public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleDistortionPlanarPrimitive"); } } public override VFXTaskType taskType { diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionQuadStripOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionQuadStripOutput.cs index 15cd11119fd..d672d827d8f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionQuadStripOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXDistortionQuadStripOutput.cs @@ -5,7 +5,7 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Strip HDRP Distortion Quad", category = "Output")] + [VFXInfo(name = "Output ParticleStrip|HDRP Distortion|Quad", category = "#3Output Strip", synonyms = new []{ "Trail", "Ribbon" })] class VFXDistortionQuadStripOutput : VFXAbstractDistortionOutput { [VFXSetting, SerializeField, Tooltip("Specifies the way the UVs are interpolated along the strip. They can either be stretched or repeated per segment.")] @@ -19,7 +19,7 @@ class VFXDistortionQuadStripOutput : VFXAbstractDistortionOutput VFXDistortionQuadStripOutput() : base(true) { } - public override string name { get { return "Output Strip HDRP Distortion Quad"; } } + public override string name => "Output ParticleStrip".AppendLabel("HDRP Distortion", false) + "\nQuad"; public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleDistortionPlanarPrimitive"); } } public override VFXTaskType taskType => VFXTaskType.ParticleQuadOutput; public override bool supportsUV { get { return true; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitCubeOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitCubeOutput.cs index 1588d52a3ad..7a6b85f87e3 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitCubeOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitCubeOutput.cs @@ -3,10 +3,10 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Particle HDRP Lit Cube", category = "Output", experimental = true)] + [VFXInfo(name = "Output Particle|HDRP Lit|Cube", category = "#5Output Debug", experimental = true, synonyms = new []{ "Box" })] class VFXLitCubeOutput : VFXAbstractParticleHDRPLitOutput { - public override string name => "Output Particle HDRP Lit Cube"; + public override string name => "Output Particle".AppendLabel("HDRP Lit", false) + "\nCube"; public override string codeGeneratorTemplate => RenderPipeTemplate("VFXParticleLitCube"); public override VFXTaskType taskType => VFXTaskType.ParticleHexahedronOutput; public override bool implementsMotionVector => true; diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitMeshOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitMeshOutput.cs index 93b141525cf..d627715c6a8 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitMeshOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitMeshOutput.cs @@ -4,16 +4,10 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Particle HDRP Lit Mesh", category = "Output")] + [VFXInfo(name = "Output Particle|HDRP Lit|Mesh", category = "#2Output Basic")] class VFXLitMeshOutput : VFXAbstractParticleHDRPLitOutput, IVFXMultiMeshOutput { - public override string name - { - get - { - return "Output Particle HDRP Lit Mesh"; - } - } + public override string name => "Output Particle".AppendLabel("HDRP Lit") + "\nMesh"; public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleLitMesh"); } } public override VFXTaskType taskType { get { return VFXTaskType.ParticleMeshOutput; } } public override bool supportsUV { get { return GetOrRefreshShaderGraphObject() == null; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitPlanarPrimitiveOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitPlanarPrimitiveOutput.cs index 8db31fc67f3..d4e886f7b6c 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitPlanarPrimitiveOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitPlanarPrimitiveOutput.cs @@ -1,36 +1,54 @@ using System; using System.Collections.Generic; using System.Linq; -using UnityEditor.VFX.Block; + using UnityEngine; namespace UnityEditor.VFX.HDRP { - class VFXLitPlanarPrimitiveOutputProvider : VariantProvider + class VFXLitPlanarPrimitiveOutputSubVariantProvider : VariantProvider { + private readonly VFXPrimitiveType mainVariantType; + + public VFXLitPlanarPrimitiveOutputSubVariantProvider(VFXPrimitiveType type) + { + this.mainVariantType = type; + } + public override IEnumerable GetVariants() { - foreach (var primitive in Enum.GetValues(typeof(VFXPrimitiveType))) + foreach (var primitive in Enum.GetValues(typeof(VFXPrimitiveType)).Cast()) { + if (primitive == this.mainVariantType) + continue; + yield return new Variant( - $"Lit Output Particle {primitive}", - "Output", + "Output Particle".AppendLabel("HDRP Lit", false).AppendLabel(primitive.ToString()), + null, typeof(VFXLitPlanarPrimitiveOutput), new[] {new KeyValuePair("primitiveType", primitive)}); } } } - [VFXInfo(variantProvider = typeof(VFXLitPlanarPrimitiveOutputProvider))] - class VFXLitPlanarPrimitiveOutput : VFXAbstractParticleHDRPLitOutput + class VFXLitPlanarPrimitiveOutputProvider : VariantProvider { - public override string name + public override IEnumerable GetVariants() { - get - { - return "Output Particle HDRP Lit " + primitiveType.ToString(); - } + yield return new Variant( + "Output Particle".AppendLabel("HDRP Lit", false).AppendLabel("Quad", false), + VFXLibraryStringHelper.Separator("Output Basic", 2), + typeof(VFXLitPlanarPrimitiveOutput), + new[] {new KeyValuePair("primitiveType", VFXPrimitiveType.Quad)}, + () => new VFXLitPlanarPrimitiveOutputSubVariantProvider(VFXPrimitiveType.Quad)); + } + } + + [VFXInfo(variantProvider = typeof(VFXLitPlanarPrimitiveOutputProvider))] + class VFXLitPlanarPrimitiveOutput : VFXAbstractParticleHDRPLitOutput + { + public override string name => "Output Particle".AppendLabel("HDRP Lit", false) + $"\n{ObjectNames.NicifyVariableName(primitiveType.ToString())}"; public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleLitPlanarPrimitive"); } } public override VFXTaskType taskType { get { return VFXPlanarPrimitiveHelper.GetTaskType(primitiveType); } } public override bool supportsUV { get { return GetOrRefreshShaderGraphObject() == null; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitQuadStripOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitQuadStripOutput.cs index 77f88db3ba4..8288588d45f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitQuadStripOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitQuadStripOutput.cs @@ -5,12 +5,12 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output ParticleStrip HDRP Lit Quad", category = "Output", experimental = true)] + [VFXInfo(name = "Output ParticleStrip|HDRP Lit|Quad", category = "#3Output Strip", experimental = true, synonyms = new []{ "Trail", "Ribbon" })] class VFXLitQuadStripOutput : VFXAbstractParticleHDRPLitOutput { protected VFXLitQuadStripOutput() : base(true) { } // strips - public override string name { get { return "Output ParticleStrip HDRP Lit Quad"; } } + public override string name => "Output ParticleStrip".AppendLabel("HDRP Lit", false) + "\nQuad"; public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleLitPlanarPrimitive"); } } public override VFXTaskType taskType { get { return VFXTaskType.ParticleQuadOutput; } } public override bool supportsUV { get { return true; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitSphereOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitSphereOutput.cs index 1a87c9b0ef4..f1cbf74a66a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitSphereOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXLitSphereOutput.cs @@ -4,10 +4,10 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Particle HDRP Lit Sphere", category = "Output", experimental = true)] + [VFXInfo(name = "Output Particle|HDRP Lit|Sphere", category = "#5Output Debug", experimental = true)] class VFXLitSphereOutput : VFXAbstractParticleHDRPLitOutput { - public override string name => "Output Particle HDRP Lit Sphere"; + public override string name => "Output Particle".AppendLabel("HDRP Lit", false) + "\nSphere"; public override string codeGeneratorTemplate => RenderPipeTemplate("VFXParticleSphere"); public override VFXTaskType taskType => VFXTaskType.ParticleQuadOutput; diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXVolumetricFogOutput.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXVolumetricFogOutput.cs index b0a92a8396e..ff58e4f0527 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXVolumetricFogOutput.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Outputs/VFXVolumetricFogOutput.cs @@ -7,10 +7,10 @@ namespace UnityEditor.VFX.HDRP { - [VFXInfo(name = "Output Particle HDRP Volumetric Fog", category = "Output", experimental = true)] + [VFXInfo(name = "Output Particle|HDRP Volumetric Fog", category = "#4Output Advanced", experimental = true)] class VFXVolumetricFogOutput : VFXAbstractParticleOutput { - public override string name => "Output Particle HDRP Volumetric Fog"; + public override string name => "Output Particle".AppendLabel("HDRP Lit", false) + "\nVolumetric Fog"; public override string codeGeneratorTemplate => RenderPipeTemplate("VFXVolumetricFogOutput"); public override VFXTaskType taskType => VFXTaskType.ParticleQuadOutput; diff --git a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXDecalURPOutput.cs b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXDecalURPOutput.cs index daaca1a38ca..994961e1596 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXDecalURPOutput.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXDecalURPOutput.cs @@ -7,10 +7,10 @@ namespace UnityEditor.VFX.URP { [VFXHelpURL("Context-OutputParticleURPLitDecal")] - [VFXInfo(name = "Output Particle URP Decal", category = "Output")] + [VFXInfo(name = "Output Particle|URP Lit|Decal", category = "#4Output Advanced")] internal class VFXDecalURPOutput : VFXAbstractParticleURPLitOutput { - public override string name => "Output Particle URP Decal"; + public override string name => "Output Particle".AppendLabel("URP Lit").AppendLabel("Decal"); public override string codeGeneratorTemplate => RenderPipeTemplate("VFXParticleURPDecal"); diff --git a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitMeshOutput.cs b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitMeshOutput.cs index e26ba7ce267..b4fb4f0305f 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitMeshOutput.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitMeshOutput.cs @@ -7,10 +7,10 @@ namespace UnityEditor.VFX.URP { [VFXHelpURL("Context-OutputPrimitive")] - [VFXInfo(name = "Output Particle URP Lit Mesh", category = "Output")] + [VFXInfo(name = "Output Particle|URP Lit|Mesh", category = "#2Output Basic")] class VFXURPLitMeshOutput : VFXAbstractParticleURPLitOutput, IVFXMultiMeshOutput { - public override string name => "Output Particle URP Lit Mesh"; + public override string name => "Output Particle".AppendLabel("URP Lit").AppendLabel("Mesh"); public override string codeGeneratorTemplate => RenderPipeTemplate("VFXParticleLitMesh"); public override VFXTaskType taskType => VFXTaskType.ParticleMeshOutput; public override bool supportsUV => GetOrRefreshShaderGraphObject() == null; diff --git a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitPlanarPrimitiveOutput.cs b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitPlanarPrimitiveOutput.cs index d78172c54e5..084098dbcb2 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitPlanarPrimitiveOutput.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitPlanarPrimitiveOutput.cs @@ -6,32 +6,49 @@ namespace UnityEditor.VFX.URP { - class VFXURPPlanarPrimitiveOutputProvider : VariantProvider + class VFXURPPlanarPrimitiveOutputSubVariantProvider : VariantProvider { + private readonly VFXPrimitiveType mainVariantType; + + public VFXURPPlanarPrimitiveOutputSubVariantProvider(VFXPrimitiveType type) + { + this.mainVariantType = type; + } + public override IEnumerable GetVariants() { - foreach (var primitive in Enum.GetValues(typeof(VFXPrimitiveType))) + foreach (var primitive in Enum.GetValues(typeof(VFXPrimitiveType)).Cast()) { + if (primitive == this.mainVariantType) + continue; + yield return new Variant( - $"Output Particle URP Lit {primitive}", - "Output", + "Output Particle".AppendLabel("URP Lit", false).AppendLabel(primitive.ToString()), + null, typeof(VFXURPLitPlanarPrimitiveOutput), new[] {new KeyValuePair("primitiveType", primitive)}); } } } + class VFXURPPlanarPrimitiveOutputProvider : VariantProvider + { + public override IEnumerable GetVariants() + { + yield return new Variant( + "Output Particle".AppendLabel("URP Lit", false).AppendLabel("Quad", false), + VFXLibraryStringHelper.Separator("Output Basic", 2), + typeof(VFXURPLitPlanarPrimitiveOutput), + new[] {new KeyValuePair("primitiveType", VFXPrimitiveType.Quad)}, + () => new VFXURPPlanarPrimitiveOutputSubVariantProvider(VFXPrimitiveType.Quad)); + } + } + [VFXHelpURL("Context-OutputPrimitive")] [VFXInfo(variantProvider = typeof(VFXURPPlanarPrimitiveOutputProvider))] class VFXURPLitPlanarPrimitiveOutput : VFXAbstractParticleURPLitOutput { - public override string name - { - get - { - return "Output Particle URP Lit " + primitiveType.ToString(); - } - } + public override string name => "Output Particle".AppendLabel("URP Lit").AppendLabel(primitiveType.ToString()); public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleLitPlanarPrimitive"); } } public override VFXTaskType taskType { get { return VFXPlanarPrimitiveHelper.GetTaskType(primitiveType); } } public override bool supportsUV { get { return GetOrRefreshShaderGraphObject() == null; } } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitQuadStripOutput.cs b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitQuadStripOutput.cs index ed6f79515db..ed035ddc46d 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitQuadStripOutput.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitQuadStripOutput.cs @@ -7,12 +7,12 @@ namespace UnityEditor.VFX.URP { [VFXHelpURL("Context-OutputPrimitive")] - [VFXInfo(name = "Output ParticleStrip URP Lit Quad", category = "Output", experimental = true)] + [VFXInfo(name = "Output ParticleStrip|URP Lit|Quad", category = "#3Output Strip", experimental = true)] class VFXURPLitQuadStripOutput : VFXAbstractParticleURPLitOutput { protected VFXURPLitQuadStripOutput() : base(true) {} // strips - public override string name => "Output ParticleStrip URP Lit Quad"; + public override string name => "Output ParticleStrip".AppendLabel("URP Lit").AppendLabel("Quad"); public override string codeGeneratorTemplate => RenderPipeTemplate("VFXParticleLitPlanarPrimitive"); public override VFXTaskType taskType => VFXTaskType.ParticleQuadOutput; public override bool supportsUV => true; diff --git a/Packages/com.unity.visualeffectgraph/Editor/Core/VFXLibraryStringHelper.cs b/Packages/com.unity.visualeffectgraph/Editor/Core/VFXLibraryStringHelper.cs new file mode 100644 index 00000000000..208bf24ad95 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Editor/Core/VFXLibraryStringHelper.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; +using UnityEngine.UIElements; + +namespace UnityEditor.VFX +{ + static class VFXLibraryStringHelper + { + private static readonly Regex s_NodeNameParser = new("(?
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

tD&wsh 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

Xj0;-ZsWXOX5efArI!Z|8vohtDZ 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 diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Images/TestAssetDescription.png b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Images/TestAssetDescription.png deleted file mode 100644 index a2a21404a26b21f320aabb03ba438fc090914d87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67838 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 diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Images/TestDescriptionAsset.png b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Images/TestDescriptionAsset.png deleted file mode 100644 index d6e06c08be5b20b6eb32372ead4438e10ed69759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81200 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 -## Setup -To use the Graphics performance test package, you need to set up a test directory, the assembly definition, and the test assets. You also need to download extra packages so that the shader analysis can function properly. - -For static shader analysis to work, you need to add all of the packages for each of the NDA platforms to your manifest. You can download them all from [Scriptable Render Pipeline extension packages](https://github.cds.internal.unity3d.com/unity/com.unity.render-pipelines.nda) on github. These packages are required for the Graphics performance test package to work. - - -## Create a test directory -To set up a new test directory: - -1. Create a new test directory. To do this, go to **Create > Testing > Test Assembly** Folder. This automatically creates a folder named “**Tests**” and configures an assembly definition (.asmdef) file in test mode. -2. Create an Editor folder within the new Test Assembly folder to store your tests from the Editor. Configure this folder with Editor Only settings in the Inspector, otherwise the project does not compile. -3. Create a Runtime folder to store your tests from runtime. -4. Arrange the folders with the following file hierarchy: - 1. Assets/ - - Performance Tests - - Editor - - Runtime - - Resources - - Scenes - -The **Resources** folder is the default directory for test assets that Unity loads at runtime. - - -## Set up the assembly definition -Your assembly definition file needs to include the references you use to write your tests. To add these references, include the following lines in the corresponding assembly definitions file. - -Add the following lines to your runtime assembly definitions file: - -``` -"references": [ - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:0acc523941302664db1f4e527237feb3", - "GUID:df380645f10b7bc4b97d4f5eb6303d95", - "GUID:295068ed467c2ce4a9cda3833065f650" - ], -``` - -Add the following lines to your Editor assembly definitions file: - - ``` - "references": [ - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:df380645f10b7bc4b97d4f5eb6303d95", - "GUID:295068ed467c2ce4a9cda3833065f650", - "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:cbbcbe5a7206638449ebcb9382eeb3a8", - "GUID:78bd2ddd6e276394a9615c203e574844" - ], - ``` - -You can also add the assembly definition files from the **Assembly Definition References** list in [AssemblyDefinitionFile Import Settings](https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html). Add the following functions for the runtime assembly definitions: - -- `Unity.PerformanceTesting` -- `Unity.GraphicTests.Performance.Runtime` -- `Unity.RenderPipelines.Core.Runtime` - -For the Editor assembly definitions, include all of the above functions and the following: - -- `Unity.GraphicTests.Performance.Editor` - - - -## Set up the test assets - -The Graphics performance testing package comes with two test assets; Performance Test Description and Static Shader Analysis. To use these assets in your tests, you need to set them up in Unity: - -1. Go to **Assets > Create > Testing**, and create the **Performance Test Description** and **Static Shader Analysis** assets. Create both assets inside your Resources folder so that Unity can load them at runtime. To learn how to set up, configure and use these assets, see [Performance Test Description](Performance-Test-Description.md) and [Static Shader Analysis](static-shader-analysis.md). -2. To instruct Unity to use these assets, go to **Project Settings > Performance Tests**. In the **Test Description Asset** field, add the Performance Test Description asset. In the **Static Analysis Asset** field, add the Static Shader Analysis asset. -3. Create a simple scene with a camera to use during the tests. You need at least one scene asset and one Render Pipeline Asset for your first runtime test. -4. Open the **Performance Test Description** asset and click the `+` in the Scenes window to reference your scene. This generates a list of tests in the **Test Runner** window. -5. Click the `+` in the **SRP Assets** window of the Performance Test Description asset to reference the Scriptable Render Pipeline (SRP) asset Unity uses to render the scene. diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Performance-Test-Description.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Performance-Test-Description.md deleted file mode 100644 index 4544405a62d..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Performance-Test-Description.md +++ /dev/null @@ -1,52 +0,0 @@ -# Performance Test Description - -Use the Performance Test Description asset to configure the test suite that Unity uses for three supported test categories: **Performance Counters**, **Memory,** and **Build Time.** - -You can reference multiple SRP assets for each test category. Unity pairs each SRP asset with each scene, then generates a test for each pairing within each test category. - -For example, if you have two SRP assets and four scenes, Unity generates eight tests in the Test Runner window (four for each SRP asset). - -![Test Description Asset](Images/TestDescriptionAsset.png) - -A. **Performance Counters** -The Performance Counters test evaluates timings. It is particularly useful for counting frame timings gathered from profiling scopes using either: - -- The Unity Profiler, using BeginSample and EndSample. -- The markers implemented in SRP. - -B. **Memory** -The Memory test is for any memory-related test that requires Unity to load a scene. - -C. **Build Time** -The Build Time test uses the BuildPipeline to profile the build time of a scene with a particular SRP asset. - -D. **Refresh Test Runner List** -Click this button to update the Test Runner window. This triggers a domain reload and updates the Test Runner window with any new data. - -E. **SRP Asset Aliases** -This section lists the SRP assets that the Performance Test Description asset uses to send the data to the Google BigQuery database. Using aliases allows you to rename your assets without changing your queries in Grafana. You can add an alias; to do this, select the plus (**+**) button at the bottom of this panel. If your SRP asset does not have a defined alias, it takes the name of the asset on the disk. - - -## Test classification -You can use categories to classify your tests. Unity automatically creates categories from asset tags, which you can see on each asset’s Inspector. To create a new tag, type the name of your tag in the search box and press `Enter`. - -![AssetLabels](Images/AssetLabels.png) - -Each category is aggregated in the test name with the '_' symbol. This means that each asset can have multiple categories, which you can then use to filter test results on Grafana. - -![Filename_Aggregate](Images/Filename_Aggregate.png) - -SRP assets and scene assets support these tags. The **ToString()** of the struct in parameter of the test function handles the asset name generation. For example, the **Counters** test function takes a `CounterTestDescription` struct in parameter: - -`public IEnumerator Counters([ValueSource(nameof(GetCounterTests))] CounterTestDescription testDescription)` - -This structure has the following **ToString()** override: -``` -public override string ToString() -​ => PerformanceTestUtils.FormatTestName( -​ sceneData.scene, -​ sceneData.sceneLabels, -​ String.IsNullOrEmpty(assetData.alias) ? assetData.asset.name : assetData.alias, -​ assetData.assetLabels, -​ k_Default) -``` diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/TableOfContents.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/TableOfContents.md deleted file mode 100644 index c7429c652f3..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/TableOfContents.md +++ /dev/null @@ -1,23 +0,0 @@ -- [Graphics performance testing package](Index.md) -- [Installing the Graphics performance testing package](Installation.md) - - [Setup](Installation.md#setup) - - [Create a test directory](Installation.md#create-a-test-directory) - - [Set up the Assembly Definition](Installation.md#set-up-the-assembly-definition) - - [Set up the Test Assets](Installation.md#set-up-the-test-assets) -- [Writing your first performance test](Writing-your-first-performance-test.md) - - [Running and analyzing the result](Writing-your-first-performance-test.md#running-and-analyzing-the-result) -- [Using Yamato to Automate your Tests](Using-Yamato-to-automate-your-tests.md) - - [Yamato setup](Using-Yamato-to-automate-your-tests.md#yamato-setup) - - [Creating Yamato pipelines](Using-Yamato-to-automate-your-tests.md#creating-yamato-pipelines) -- [Using Grafana to view a performance test report](Using-Grafana-to-view-a-performance-test-report.md) - - [Writing a Query](Using-Grafana-to-view-a-performance-test-report.md#writing-a-query) - - [Naming convention](Using-Grafana-to-view-a-performance-test-report.md#naming-convention) -- [Grafana Database Scheme](Grafana-database-scheme.md) -- [Static Shader Analysis](static-shader-analysis.md) - - [Set up](static-shader-analysis.md#set-up) - - [Defining static analysis](static-shader-analysis.md#defining-static-shader-analysis) - - [Shared Filter](static-shader-analysis.md#shared-filters) - - [Asset Definition](static-shader-analysis.md#asset-definitions) - - [Running static analysis](static-shader-analysis.md#running-static-shader-analysis) -- [Performance Test Description](Performance-Test-Description.md) - - [Test classification](Performance-Test-Description.md#test-classification) diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Using-Grafana-to-view-a-performance-test-report.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Using-Grafana-to-view-a-performance-test-report.md deleted file mode 100644 index 76a3bb24d58..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Using-Grafana-to-view-a-performance-test-report.md +++ /dev/null @@ -1,98 +0,0 @@ -# Using Grafana to view a performance test report -You can use [Grafana](https://grafana.com/docs/grafana/latest/getting-started/what-is-grafana/) to display all of your performance metrics. Grafana is easier to customize than the [Observer CDS dashboard](https://observer.cds.internal.unity3d.com/project), and it displays your performance metrics more clearly, which is useful for complex tests. To display your performance metrics, you can write a query with Google BigQuery. If this is your first time using Grafana, see [Grafana Getting Started](https://grafana.com/docs/grafana/latest/guides/getting_started/). To learn what is possible with Grafana, investigate the [Grafana Playground](https://play.grafana.org/). - -To access Unity’s internal Grafana: - -1. Go to the [Unity Grafana](https://grafana.internal.unity3d.com/). -2. Sign in with your Okta details. - -## Writing a query -Grafana uses Google BigQuery to write queries. This means it includes specific functions native to the Google BigQuery database. To check the use case or existence of a function, check the [Google BigQuery SQL documentation page](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators). To check the scheme of Grafana’s performance database, see the [Grafana Database Scheme](#grafana-database-scheme). - -To prepare to write your query, follow these steps: - -1. In the dashboard header, select **Add Panel** to create a new graph. -2. Click **Add Query** in the new panel. -3. Enter the panel’s edit mode. To do this, hover the cursor over the panel and press E on your keyboard. -4. In the **Query** field, which targets the source database, select the performance database `rd-perf-test-data-pdr BigQuery`. -5. The builder doesn’t work with Unity’s data structure. Click **Edit SQL** to hide the builder. - -Some common functions do not work as expected in Grafana, so you need to use an alternative. For example: - -- Replace `run.StartTime` with `Endtime`. - Replace `$_timeFilter` with the following line: `run.EndTime BETWEEN TIMESTAMP_MILLIS($__from) AND TIMESTAMP_MILLI($__to)`. - -The following example query retrieves the frame timings in HDRP: - -```#standardSQL -SELECT - -- Select the average of the median of all tests. - AVG(sampleGroup.Median) as median, - -- Use Endtime here, because run.StartTime doesn’t work. - run.EndTime as time, - -- Extract the name of the sampler from the name of the SampleGroup. - REGEXP_EXTRAC(sampleGroup.Definition.Name, 'Timing,\\w+,(.*)') as metric -FROM -perf_test_results.run, - -- Use UNNEST for every Record type array. Refer to Grafana’s database scheme to learn which arrays are listed as Record. - UNNEST(Results) AS result, - UNNEST(ProjectVersions) as pv, - UNNEST(result.SampleGroups) AS sampleGroup -WHERE - -- Filter using the project name you set in the utr command line. - pv.ProjectName = 'HDRP' - -- Filter by platform. - AND BuildSettings.Platform = "PS4" ANDPlayerSystemInfo.DeviceModel = '$ps4_config' - -- This filter only gets the data in the time window of Grafana, to avoid overloading the database. - -- Use this line instead of $__timeFilter. - AND run.EndTime BETWEEN TIMESTAMP_MILLIS($__from) AND TIMESTAMP_MILLI($__to) - -- Filter by git branch name. The dashboard templating variable displays the results of this branch in the graph. - AND pv.Branch = '$Git_branch_name' - -- Filter by test name. - AND result.TestName LIKE '%PerformanceTests.Counters%$HDRP_asset_config%' - -- Filter by sampleGroup name. - AND REGEXP_CONTAINS(sampleGroup.Definition.Name, 'Timing,CPU,{Selected_counter:regex}') --- Group every data you select. This avoids a BigQuery error. -GROUP BY time, sampleGroup.Definition.Name --- Discard medians that have 0 in value. -HAVING median <> 0 --- Sort by run date and metric name so that the metrics are always in the same order in the graph. -ORDER BY time, metric -``` - -``` - -``` - -## Naming convention -Before you can report your data in Grafana, you need to pack the information required into a SampleGroup name in Unity. Grafana only allows you to pair one [SampleGroup](https://docs.unity3d.com/Packages/com.unity.test-framework.performance@1.0/api/Unity.PerformanceTesting.SampleGroup.html) name to one metric, so you need to have a well-defined naming convention. - -The following functions from the `PerformanceTestUtils` class format the data into an effective naming convention. This naming convention makes it easy for you to parse your SampleGroup in Grafana with regular expressions (regex): - -| Function | Description | Example | -| ----------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| `FormatTestName` | This function formats the name of the test and packs the following:
- Data type
- Category
- Settings (generally the SRP asset alias)
- Settings category
- Test name | The format this function generates for a memory test:

`0001\_LitCube:Small,Deferred\_SRP:Default,RenderTexture`. | -| `FormatSampleGroupName` | This function formats the name of the SampleGroup you use to send a metric value. It contains the following:
- Metric name
- Category
- Data name | The format this function generates for a test that contains a counter test:
`Timing,GPU,Gbuffer`. | - -When you filter your scenes in Grafana, you can use [REGEXP_CONTAINS](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#regexp_contains) to match a certain format and [REGEXP_EXTRACT](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#regexp_extract) to extract a certain part of the name. For example, the following query uses both of these functions to filter timings and display only the name of the counter: - -``` -#standardSQL -SELECT - AVG(sampleGroup.Median) as median, run.EndTime as time, - REGEXP_EXTRACT(sampleGroup.Definition.Name, 'Timing,\\w+,(.*)') as metric -FROM -perf_test_results.run, - UNNEST(Results) AS result, - UNNEST(ProjectVersions) as pv, - UNNEST(result.SampleGroups) AS sampleGroup -WHERE - pv.ProjectName = 'HDRP' AND BuildSettings.Platform = "PS4" AND PlayerSystemInfo.DeviceModel = '$ps4_config' -- Mandatory filters, ensure we use the right project, test suite and time window. - AND run.EndTime BETWEEN TIMESTAMP_MILLIS($__from) AND TIMESTAMP_MILLIS($__to) -- Workaround for the $__timeFilter which doesn’t work for the Google BigQuery datasource. - AND pv.Branch = '$Git_branch_name' - AND result.TestName LIKE '%PerformanceTests.Counters%$HDRP_asset_config%' - AND REGEXP_CONTAINS(sampleGroup.Definition.Name, 'Timing,CPU,${Selected_counter:regex}') -- Test suite filters. -GROUP BY time, sampleGroup.Definition.Name -HAVING median <> 0 -ORDER BY time, metric -``` diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Using-Yamato-to-automate-your-tests.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Using-Yamato-to-automate-your-tests.md deleted file mode 100644 index f161201f90c..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Using-Yamato-to-automate-your-tests.md +++ /dev/null @@ -1,32 +0,0 @@ -# Using Yamato to automate your tests -[Yamato](https://internaldocs.cds.internal.unity3d.com/yamato/) is Unity’s continuous integration (CI) solution. You can use Yamato with the Graphics performance testing package to run your tests automatically. - -## Yamato setup -To automate your tests using Yamato, you need to set up Yamato for your project. For more information, see the [Yamato Quickstart guide](https://internaldocs.cds.internal.unity3d.com/yamato/workflows/quick-start/). - - -## Creating Yamato pipelines -Each test you perform in Unity requires its own Yamato pipeline. For example, if you are running a test for timings, build profiling, and static shader analysis, you need to create a new pipeline for each one. - -To create a new pipeline in Yamato, modify the Unified Test Runner (utr) command line to support performance testing: - -In the command line, add`--performance-project-id=ProjectName`. Replace `ProjectName` with the name of your project in the performance database. - -1. Add `--report-performance-data` in the command line to enable performance reporting. - -Here's an example of a utr command line: - -``` -utr/utr --timeout=2400 --loglevel=verbose --scripting-backend=Il2Cpp --suite={{ suite.mode }} --testfilter={{ suite.filter }} --platform={{ platform.name }} --testproject=C:/Link/TestProjects/{{ project.folder }} --editor-location=.Editor --report-performance-data --performance-project-id=HDRP --artifacts_path=test-results --player-connection-ip=%BOKKEN_HOST_IP% -``` - -You can also instruct Yamato to automatically run daily updates to the performance metrics on a certain branch. To do this, add the following to your Yamato job description: - -``` -triggers: -recurring: -​ -branch: master -​ frequency: daily -``` - -If you have any issues during the data reporting, you can check what Yamato sends to the database in the **Artifacts** field after the reporting has finished. The default path for the file is located in the **Artifacts** field in the Yamato build: **results/test-results/PerformanceTestReport.html.** diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Writing-your-first-performance-test.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Writing-your-first-performance-test.md deleted file mode 100644 index 1315f95c4b1..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/Writing-your-first-performance-test.md +++ /dev/null @@ -1,76 +0,0 @@ -## Writing your first performance test -The following test captures frame timings at runtime. You can use this as a foundation for your first test: - -``` -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using System; -using UnityEngine.Rendering; -using NUnit.Framework; -using UnityEngine.TestTools; -using Unity.PerformanceTesting; -using static PerformanceTestUtils; -// If you are running a test in the Editor, inherit from EditorPerformanceTests instead of PerformanceTests. -public class MyRuntimePerformanceTests : PerformanceTests -{ - // Determine the number of frames before Unity starts recording the profiling samplers. - const int WarmupCount = 20; - // The number of frames Unity measures. - const int MeasurementCount = 30; - // The timeout of a test in milliseconds. - const int GlobalTimeout = 120 * 1000; // 2 min - // The IEnumerable function helps generate the tests that appear in the Test Runner window. - // The testScenesAsset refers to the Performance Test Description asset you referenced in Project Settings > Performance Tests. - static IEnumerable GetCounterTests() - { - if (testScenesAsset == null) - yield break; - foreach (var (scene, asset) in testScenesAsset.counterTestSuite.GetTestList()) - yield return new CounterTestDescription{ assetData = asset, sceneData = scene }; - } - // Returns the list of markers you want to profile. - static IEnumerable GetAllMarkers() - { - foreach (var val in Enum.GetValues(typeof(HDProfileId))) - yield return ProfilingSampler.Get((HDProfileId)val); - } - // This is the test function. Note the Performance attribute. - // The ValueSource attribute helps generate the tests that appear in the Test Runner window. - // The name of the test is a ToString of the CounterTestDescription - // struct that GetCounterTests() returns. If you want to change the test - // name structure, create a new struct and function to iterate - // over your test list. - [Timeout(GlobalTimeout), Version("1"), UnityTest, Performance] - public IEnumerator Counters([ValueSource(nameof(GetCounterTests))] CounterTestDescription testDescription) - { - // The LoadScene function loads the scene and assigns an SRP asset in the parameter. - LoadScene(testDescription.sceneData.scene, testDescription.assetData.asset); - // The SetupTestScene function sets up the camera based on the settings you have in your PerformanceTestSettings MonoBehavior. - // It also returns the PerformanceTestSettings MonoBehavior so you can set up anything else you need for your test. - var sceneSettings = SetupTestScene(); - //The FindObjectOfType function loads GameObjects from the scene. This line prepares the camera for setting up the camera rendering resolution. - var camera = GameObject.FindObjectOfType(); - // Calls a utility function to measure all markers and sends the data using the following format: Timing,CPU,sampler.name. - yield return MeasureProfilingSamplers(GetAllMarkers(), WarmupCount, MeasurementCount); - } -} -``` - - -## Running and analyzing the result -Once Unity has compiled your tests, you can view them and run them locally in the Test Runner window. Once you have run a test, go to **Window > Analysis > Performance Test Report** to open the **Test Report** window and view your test results. - -If you have captured timings over multiple frames, you can view the data in the **Test Report** window to debug the results. - -If you have gathered the timing over 30 frames, a test might not report the detail of every frame. This is because Unity can only send the following details to the database due to data weight constraints: - -- Min -- Max -- Median -- Average -- Standard derivation -- Percentile -- Sum - -If you are running multiple tests, you can use Yamato to automate them (see [Using Yamato to automate your tests](Using-Yamato-to-automate-your-tests.md)). To visualize the data Unity gathers from your tests, you can use Grafana (see [Using Grafana to view a performance test report](Using-Grafana-to-view-a-performance-test-report.md)). diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/index.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/index.md deleted file mode 100644 index f1e474ae44a..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Graphics performance testing package - -The Graphics performance testing package allows you to measure and report performance markers for your graphics package. It is built on top of the [Performance Testing Extension for Unity Test Runner](https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.0/manual/index.html) and contains utility functions to measure the following: - -- Frame timings -- Memory usage -- Build performance -- Static Shader Analysis data such as VGPR, SGPR, and Occupancy - -When you use the performance testing package in a project, it sends measured performance data to Unity’s Google BigQuery database. You can use Grafana to visualise this data. For more information, see [Using Grafana to view a performance test report](Using-Grafana-to-view-a-performance-test-report.md). - -You can use Yamato to run your tests automatically. For more information see [Using Yamato to automate your tests](Using-Yamato-to-automate-your-tests.md). - -![img](Images/Grafana-HDRP.png) -Performance data visualised in Grafana. diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/static-shader-analysis.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/static-shader-analysis.md deleted file mode 100644 index b32793de56c..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Documentation~/static-shader-analysis.md +++ /dev/null @@ -1,54 +0,0 @@ -# Static Shader Analysis -The **Static Shader Analysis** asset analyzes compiled shader byte code. This analysis is per GPU program, per shader variant, and platform-specific. By default, the Static Shader Analysis asset performs the analysis and uploads the measurements to the performance database. If you run a local analysis, the Static Shader Analysis asset doesn’t upload the measurements. - -Note that this is not a regression test. If a failure occurs, this means the analysis failed to execute. - -## Set up - -Before you use Static Shader Analysis, make sure you have all the packages required for testing on your chosen platform: - -1. Download the packages for each platform you intend to analyze for. -2. Add all of the packages from [Scriptable Render Pipeline extension packages](https://github.cds.internal.unity3d.com/unity/com.unity.render-pipelines.nda) to your manifest. - - -## Defining static shader analysis -You can define Static Shader Analysis in the **Static Analysis Tests** asset. - - -### Shared filters - -A shared filter is a convenient way to reuse one or more filters across multiple asset definitions. Define a shared filter in the Static Analysis Tests asset’s **Filters** section. - -![](Images/EditorShaderStaticAnalysisAsset_Filters.png) - -| Property | Description | -| -------------------- | ------------------------------------------------------------ | -| **Name** | Use this field to name the filter. You can then use this name to reference this filter from the asset definition of the same name. | -| **Category** | [Use this field to define the category this filter is in. You can create a new category or use the name of an existing category. For more information, see](https://docs.google.com/document/d/1LEU9hsXGabyV38Y7PW45YZ7_PAawox7iBcuL72SkVmU/edit#heading=h.1naa96lgrkyu) [Test classification](https://docs.google.com/document/d/1LEU9hsXGabyV38Y7PW45YZ7_PAawox7iBcuL72SkVmU/edit#heading=h.1naa96lgrkyu). | -| **Keyword filter** | Use this field to define which keywords you want to filter into or out of your analysis results. For example, `A&B`. A more complex example:`A&B&C|A&B&D|E` | -| **Pass Name Filter** | Use this field to define which pass names you want to filter into or out of your analysis results. Use **+** to include a pass name, or - to exclude a pass name. For example:
- **+GBuffer** analyzes only the GBuffer pass
- **\-META,Shadow** analyzes all passes except META and Shadow. | - - -## Asset definitions - -**Asset Definitions** defines a test involving an asset, such as a shader or material, in the **Static Analysis Tests** asset. Give each property in the **Asset Definitions** section a value. - -| Property | | Description | -| ---------------------- | ------------------ | ------------------------------------------------------------ | -| **Asset Alias** | | An alias for the asset. Use it to filter the reported metric. | -| **Asset Category** | | The category for the asset. Use it to filter the reported metric. | -| **Test Name** | | The name of the test. Use it to filter the reported metric. | -| **Filter** | | This filter selects the [shader passes](##shared-filters) and which variant to analyse. | -| | **Filter Type** | The type of the filter. | -| | **Reference Name** | Enter your filter name to use the shared filter. | -| | **Definition** | Defines the filter. | -| **Include in Targets** | | Unity performs the analysis for the selected platforms. | -| | **Size** | Defines how many platforms to include. | -| | **Element 0** | Defines which platforms are included. | - - -## Running static shader analysis - -You can run Static Shader Analysis from the [Unity Test Runner](https://docs.unity3d.com/2017.4/Documentation/Manual/testing-editortestsrunner.html). - -A Static Shader Analysis entry only appears in the Test Runner for supported platforms. If an entry does not appear in the Test Runner window, this usually means you don’t have the platform package installed for your chosen platform. You need to install the platform package to use the automated static shader analysis process. diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor.meta deleted file mode 100644 index e9ca102afa8..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 781f7d68ecfa99241ad983f08427f232 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common.meta deleted file mode 100644 index 7a653c1aa99..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d7357e1591596cd4a862ea9679e88bd4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss deleted file mode 100644 index 6f43c77258f..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss +++ /dev/null @@ -1,20 +0,0 @@ -Boxed -{ - background-color: var(--unity-colors-tab-background-checked); - border-color: var(--unity-colors-toolbar_button-border); - border-width: 1px 1px 1px 1px; - border-radius: 5px 5px 5px 5px; - padding: 3px 6px 3px 6px; - margin: 4px 0px 2px -10px; -} - -Boxed > Toggle -{ - margin-left: 0px; -} - -Boxed > Toggle Label -{ - -unity-font-style: bold; - -unity-text-align: middle-center; -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss.meta deleted file mode 100644 index 3be9c3161b7..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 84c4b18e4d3ce344fa995155e6c40e0d -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} - disableValidation: 0 diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorLogWatcher.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorLogWatcher.cs deleted file mode 100644 index efcf041525b..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorLogWatcher.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.IO; -using UnityEngine; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor -{ - public class EditorLogWatcher : IDisposable - { - public delegate void OnLogWriteCallback(string newLines); - - OnLogWriteCallback m_LogWriteCallback; - FileStream m_LogStream; - - public EditorLogWatcher(OnLogWriteCallback callback) - { - m_LogWriteCallback = callback ?? throw new ArgumentNullException(nameof(callback)); - - m_LogStream = new FileStream(GetEditorLogPath(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 1 * 1024 * 1024, FileOptions.RandomAccess | FileOptions.SequentialScan); - m_LogStream.Seek(m_LogStream.Length, SeekOrigin.Begin); - } - - string GetEditorLogPath() - { - var args = Environment.GetCommandLineArgs(); - - // In case we have a -logFile argument, then we can get the file path from here - for (int i = 0; i < args.Length; i++) - { - if (args[i] == "-logFile" && i + 1 < args.Length) - return args[i + 1]; - } - - // platform dependent editor log location - #if UNITY_EDITOR_WIN - return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Unity\Editor\Editor.log"; - #elif UNITY_EDITOR_OSX - return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"/Library/Logs/Unity/Editor.log"; - #else - return Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"/unity3d/Editor.log"; - #endif - } - - public void Dispose() - { - using (var s = new StreamReader(m_LogStream)) - { - while (!s.EndOfStream) - m_LogWriteCallback.Invoke(s.ReadLine()); - } - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorLogWatcher.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorLogWatcher.cs.meta deleted file mode 100644 index 45723f3fc92..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorLogWatcher.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1de3d930bbdeb444fb3244c98c41f863 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorPerformanceTests.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorPerformanceTests.cs deleted file mode 100644 index 8d162516437..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorPerformanceTests.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using UnityEngine; -using UnityEditor; -using Unity.PerformanceTesting; -using UnityEngine.TestTools; -using UnityEditor.Rendering; -using UnityEditor.Build.Reporting; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using UnityEngine.Rendering; -using static UnityEngine.TestTools.Graphics.Performance.PerformanceTestUtils; -using static UnityEngine.TestTools.Graphics.Performance.PerformanceMetricNames; - -using Object = UnityEngine.Object; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor -{ - public class EditorPerformanceTests - { - const string buildLocation = "TmpBuild"; - - protected BuildReport BuildPlayer(string scenePath) - { - BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); - buildPlayerOptions.scenes = new[] { scenePath }; - buildPlayerOptions.locationPathName = buildLocation; - buildPlayerOptions.target = EditorUserBuildSettings.activeBuildTarget; - - // Make sure we compile the shaders when we build: - ClearShaderCache(); - - BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions); - - // Wait for the Editor.log file to be updated so we can gather infos from it. - return report; - } - - protected static void ReportBuildData(BuildReport report) - { - BuildSummary summary = report.summary; - Measure.Custom(FormatSampleGroupName(k_Size, k_Total).ToSampleGroup(SampleUnit.Byte), summary.totalSize); - Measure.Custom(FormatSampleGroupName(k_Size, k_Shader).ToSampleGroup(SampleUnit.Byte), GetAssetSizeInBuild(report, typeof(Shader))); - Measure.Custom(FormatSampleGroupName(k_Size, k_ComputeShader).ToSampleGroup(SampleUnit.Byte), GetAssetSizeInBuild(report, typeof(ComputeShader))); - Measure.Custom(FormatSampleGroupName(k_Time, k_Total).ToSampleGroup(SampleUnit.Millisecond), summary.totalTime.TotalMilliseconds); - Measure.Custom(FormatSampleGroupName(k_Build, k_Warnings).ToSampleGroup(), summary.totalWarnings); - Measure.Custom(FormatSampleGroupName(k_Build, k_Success).ToSampleGroup(), summary.result == BuildResult.Succeeded ? 1 : 0); - } - - protected static ulong GetAssetSizeInBuild(BuildReport report, Type assetType) - { - ulong assetSize = 0; - foreach (var packedAsset in report.packedAssets) - { - foreach (var content in packedAsset.contents) - if (content.type == assetType) - assetSize += content.packedSize; - } - - return assetSize; - } - - protected static void ReportShaderSize(BuildReport report, string shaderNameFilter) - { - foreach (var packedAsset in report.packedAssets) - { - foreach (var content in packedAsset.contents) - { - if (content.type == typeof(ComputeShader)) - { - var computeShader = AssetDatabase.LoadAssetAtPath(content.sourceAssetPath); - Measure.Custom(FormatSampleGroupName(k_Size, k_ComputeShader, computeShader.name).ToSampleGroup(SampleUnit.Byte), content.packedSize); - } - else if (content.type == typeof(Shader)) - { - var shader = AssetDatabase.LoadAssetAtPath(content.sourceAssetPath); - - if (shader != null && !shader.Equals(null) && shader.name.Contains(shaderNameFilter)) - Measure.Custom(FormatSampleGroupName(k_Size, k_Shader, shader.name).ToSampleGroup(SampleUnit.Byte), content.packedSize); - } - } - } - } - - protected void ClearShaderCache() - { - // Didn't found any public / internal C# API to clear the shader cache so ... - try - { - Directory.Delete("Library/ShaderCache", true); - } - catch (Exception e) - { - Debug.LogError(e); - } - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorPerformanceTests.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorPerformanceTests.cs.meta deleted file mode 100644 index 80c642542bc..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/EditorPerformanceTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 30b7290e61be2714c89609d36d64083d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/SettingsProvider.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/SettingsProvider.cs deleted file mode 100644 index 51d0577b794..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/SettingsProvider.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEngine; -using UnityEngine.UIElements; -using System; -using System.Text.RegularExpressions; -using Object = UnityEngine.Object; -using UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor -{ - static class PerformanceSettingsProviderGUI - { - [SettingsProvider] - public static SettingsProvider CreatePerformanceTestsProvider() - { - var provider = new SettingsProvider("Project/Performance Tests", SettingsScope.Project) - { - // By default the last token of the path is used as display name if no label is provided. - label = "Performance Tests", - // Create the SettingsProvider and initialize its drawing (IMGUI) function in place: - guiHandler = (searchContext) => - { - var settings = PerformanceTestSettings.GetSerializedSettings(); - - EditorGUI.BeginChangeCheck(); - ShowObjectField(settings.FindProperty("testDescriptionAsset"), typeof(TestSceneAsset), new GUIContent("Test Description Asset")); - #if SHADERANALYSIS_SUPPORT - ShowObjectField(settings.FindProperty("staticAnalysisAsset"), typeof(EditorShaderStaticAnalysisAsset), new GUIContent("Static Analysis Asset")); - #endif - if (EditorGUI.EndChangeCheck()) - settings.ApplyModifiedProperties(); - }, - - // Populate the search keywords to enable smart search filtering and label highlighting: - keywords = new HashSet(new[] { "Performance" }) - }; - - return provider; - } - - static void ShowObjectField(SerializedProperty resourcePathProperty, Type objectType, GUIContent content) - { - Object res = Resources.Load(resourcePathProperty.stringValue, objectType); - res = EditorGUILayout.ObjectField(content, res, objectType, false); - - // Find the resource path of the object: - resourcePathProperty.stringValue = null; - if (res != null) - { - var path = AssetDatabase.GetAssetPath(res); - if (path.Contains("Resources")) - { - var resourcePath = path.Substring(path.LastIndexOf("Resources/") + "Resources/".Length); - resourcePath = Path.ChangeExtension(resourcePath, null); - resourcePathProperty.stringValue = resourcePath; - } - else - { - Debug.LogError("You must choose an asset within a Resources folder"); - } - } - } - } - - // Create PerformanceTestsProvider by deriving from SettingsProvider: - class PerformanceTestsProvider : SettingsProvider - { - private SerializedObject m_CustomSettings; - - const string k_PerformanceTestsPath = "ProjectSettings/PerformanceTestsSettings.asset"; - public PerformanceTestsProvider(string path, SettingsScope scope = SettingsScope.User) - : base(path, scope) {} - - public static bool IsSettingsAvailable() => File.Exists(k_PerformanceTestsPath); - - // Register the SettingsProvider - [SettingsProvider] - public static SettingsProvider CreatePerformanceTestsProvider() - { - if (IsSettingsAvailable()) - return new PerformanceTestsProvider("Project/PerformanceTestsProvider", SettingsScope.Project); - - // Settings Asset doesn't exist yet; no need to display anything in the Settings window. - return null; - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/SettingsProvider.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/SettingsProvider.cs.meta deleted file mode 100644 index 383a9674227..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/SettingsProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f334e060e3b1a2f4c885066b083f2870 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/TestSceneAssetEditor.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/TestSceneAssetEditor.cs deleted file mode 100644 index 21ab64cd9bf..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/TestSceneAssetEditor.cs +++ /dev/null @@ -1,249 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -using UnityEngine.Rendering; -using UnityEditor.Compilation; -using UnityEngine.UIElements; -using UnityEditor.UIElements; -using static UnityEngine.TestTools.Graphics.Performance.PerformanceMetricNames; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor -{ - [CustomEditor(typeof(TestSceneAsset))] - class TestSceneAssetEditor : UnityEditor.Editor - { - static class Styles - { - public const string countersText = "Performance Counters Tests"; - public const string memoryText = "Memory Tests"; - public const string buildTimeText = "Build Time Tests"; - public const string refreshTestRunner = "Refresh Test Runner List (can take up to ~20s)"; - public const string replaceBuildSceneList = "Update build scene list (Replace with Scenes from this asset)"; - public const string additionalInfosText = "Additional Informations"; - public const string scenesText = "Scenes"; - public const string srpAssetsText = "SRP Assets"; - public const string srpAssetAliaseText = "SRP Asset Aliases (Used in the performance Database)"; - public const string additionalLoadableScenesText = - "Additional Loadable Scene (Additional scenes to include in build)"; - } - - SerializedProperty counterSuiteProperty; - SerializedProperty memorySuiteProperty; - SerializedProperty buildSuiteProperty; - SerializedProperty srpAssetAliasProperty; - SerializedProperty additionalScenesProperty; - - public override VisualElement CreateInspectorGUI() - { - counterSuiteProperty = serializedObject.FindProperty(nameof(TestSceneAsset.counterTestSuite)); - memorySuiteProperty = serializedObject.FindProperty(nameof(TestSceneAsset.memoryTestSuite)); - buildSuiteProperty = serializedObject.FindProperty(nameof(TestSceneAsset.buildTestSuite)); - srpAssetAliasProperty = serializedObject.FindProperty(nameof(TestSceneAsset.srpAssetAliases)); - additionalScenesProperty = serializedObject.FindProperty(nameof(TestSceneAsset.additionalLoadableScenes)); - - VisualElement root = new(); - root.Add(new Boxed(Styles.countersText, counterSuiteProperty)); - root.Add(new Boxed(Styles.memoryText, memorySuiteProperty)); - root.Add(new Boxed(Styles.buildTimeText, buildSuiteProperty)); - root.Add(new Button(RefreshTestRunner) { text = Styles.refreshTestRunner }); - root.Add(new Button(ReplaceBuildSceneList) { text = Styles.replaceBuildSceneList }); - root.Add(new Boxed(Styles.additionalInfosText, - new List() { additionalScenesProperty, srpAssetAliasProperty })); - return root; - } - - void RefreshTestRunner() => CompilationPipeline.RequestScriptCompilation(); - - void ReplaceBuildSceneList() => UnityEditor.EditorBuildSettings.scenes = (target as TestSceneAsset).ConvertTestDataScenesToBuildSettings(); - } - - [CustomPropertyDrawer(typeof(TestSceneAsset.SceneData))] - class SceneDataPropertyDrawer : PropertyDrawer - { - static class Styles - { - public const string name = "scene-data"; - public const string sceneFieldLabel = "Test Scene"; - } - - SerializedProperty sceneName; - SerializedProperty scenePath; - SerializedProperty labels; - SerializedProperty enabled; - - public override VisualElement CreatePropertyGUI(SerializedProperty property) - { - sceneName = property.FindPropertyRelative(nameof(TestSceneAsset.SceneData.scene)); - scenePath = property.FindPropertyRelative(nameof(TestSceneAsset.SceneData.scenePath)); - labels = property.FindPropertyRelative(nameof(TestSceneAsset.SceneData.sceneLabels)); - enabled = property.FindPropertyRelative(nameof(TestSceneAsset.SceneData.enabled)); - - VisualElement root = new() { name = Styles.name }; - - ObjectField sceneField = new(Styles.sceneFieldLabel); - sceneField.objectType = typeof(SceneAsset); - sceneField.RegisterValueChangedCallback(OnChangeSceneAsset); - sceneField.SetValueWithoutNotify(string.IsNullOrEmpty(scenePath.stringValue) - ? null - : AssetDatabase.LoadMainAssetAtPath(scenePath.stringValue)); - sceneField.AddToClassList(Helper.inspectorAlignmentClass); - root.Add(sceneField); - - root.Add(new PropertyField(enabled)); - return root; - } - - void OnChangeSceneAsset(ChangeEvent evt) - { - var sceneAsset = evt.newValue as SceneAsset; - sceneName.stringValue = sceneAsset?.name; - scenePath.stringValue = AssetDatabase.GetAssetPath(sceneAsset); - labels.stringValue = Helper.GetLabelForAsset(sceneAsset); - sceneName.serializedObject.ApplyModifiedProperties(); - } - } - - [CustomPropertyDrawer(typeof(TestSceneAsset.SRPAssetData))] - class SRPAssetDataPropertyDrawer : PropertyDrawer - { - protected static class Styles - { - public const string name = "srp-asset-data"; - public const string assetFieldLabel = "SRP Asset"; - public const string empty = "Empty"; - public const string alias = "Alias"; - } - - SerializedProperty srpAsset; - SerializedProperty labels; - protected SerializedProperty alias; - - public override VisualElement CreatePropertyGUI(SerializedProperty property) - { - srpAsset = property.FindPropertyRelative(nameof(TestSceneAsset.SRPAssetData.asset)); - labels = property.FindPropertyRelative(nameof(TestSceneAsset.SRPAssetData.assetLabels)); - alias = property.FindPropertyRelative(nameof(TestSceneAsset.SRPAssetData.alias)); - - VisualElement root = new() { name = Styles.name }; - PropertyField assetField = new(srpAsset, Styles.assetFieldLabel); - assetField.RegisterValueChangeCallback(OnChangeSRPAsset); - root.Add(assetField); - return root; - } - - void OnChangeSRPAsset(SerializedPropertyChangeEvent evt) - { - var srpAsset = evt.changedProperty.objectReferenceValue as RenderPipelineAsset; - labels.stringValue = Helper.GetLabelForAsset(srpAsset); - AutoUpdateAlias(srpAsset); - labels.serializedObject.ApplyModifiedProperties(); - } - - protected virtual void AutoUpdateAlias(RenderPipelineAsset srpAsset) - => alias.stringValue = srpAsset == null - ? Styles.empty - : PerformanceTestUtils.testScenesAsset?.GetSRPAssetAlias(srpAsset); - } - - [CustomPropertyDrawer(typeof(TestSceneAsset.SRPAssetDataAliasByHand))] - class SRPAssetDataAliasByHandPropertyDrawer : SRPAssetDataPropertyDrawer - { - public override VisualElement CreatePropertyGUI(SerializedProperty property) - { - var root = base.CreatePropertyGUI(property); - PropertyField aliasField = new(alias, Styles.alias); - root.Add(aliasField); - return root; - } - - protected override void AutoUpdateAlias(RenderPipelineAsset srpAsset) - { - } - } - - static class Helper - { - public const string inspectorAlignmentClass = "unity-base-field__aligned"; - public const string boxFouldoutClass = "box"; - - public static string GetLabelForAsset(Object asset) - { - if (asset == null) - return k_Default; - - var labels = AssetDatabase.GetLabels(asset); - if (labels.Length > 0) - return string.Join("_", labels); - else - return k_Default; - } - } - - class Boxed : Foldout - { - const string k_Stylesheet = "Packages/com.unity.testing.graphics-performance/Editor/Common/Boxed.uss"; - - public Boxed(string title, List contentList) : base() - { - Initialize(title, contentList); - } - - public Boxed(string title, SerializedProperty parentProperty) : base() - { - List contentList = new(); - SerializedProperty iterator = parentProperty.Copy(); - SerializedProperty endIterator = iterator.GetEndProperty(); - iterator.Next(enterChildren: true); - while (!SerializedProperty.EqualContents(iterator, endIterator)) - { - contentList.Add(iterator.Copy()); - iterator.Next(enterChildren: false); - } - - Initialize(title, contentList); - } - - void Initialize(string title, List contentList) - { - styleSheets.Add(AssetDatabase.LoadAssetAtPath(k_Stylesheet)); - text = title; - foreach (var property in contentList) - contentContainer.Add(new PropertyField(property)); - } - } - - class ScenePathUpdater : AssetPostprocessor - { - static TestSceneAsset testSceneAsset = null; - - static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, - string[] movedFromAssetPaths, bool didDomainReload) - { - for (int i = 0; i < movedAssets.Length; i++) - { - if (!movedFromAssetPaths[i].EndsWith(".unity")) - continue; - - string oldPath = movedFromAssetPaths[i]; - string newPath = movedAssets[i]; - testSceneAsset ??= PerformanceTestSettings.GetTestSceneDescriptionAsset(); - - void UpdateScenePathInSceneList(ref List sceneList) - { - var index = sceneList.FindIndex(s => s.scenePath == oldPath); - if (index < 0) - return; - - sceneList[index].scenePath = newPath; - var pos = newPath.LastIndexOf('/') + 1; - sceneList[index].scene = newPath.Substring(pos, newPath.Length - pos - ".unity".Length); - } - - UpdateScenePathInSceneList(ref testSceneAsset.counterTestSuite.scenes); - UpdateScenePathInSceneList(ref testSceneAsset.memoryTestSuite.scenes); - UpdateScenePathInSceneList(ref testSceneAsset.buildTestSuite.scenes); - UpdateScenePathInSceneList(ref testSceneAsset.additionalLoadableScenes); - } - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/TestSceneAssetEditor.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/TestSceneAssetEditor.cs.meta deleted file mode 100644 index ec55fc1c5d2..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/TestSceneAssetEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a2aaca73d9fef4740a4ad15e80c1ec85 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/UnityEngine.TestTools.Graphics.Performance.Editor.asmdef b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/UnityEngine.TestTools.Graphics.Performance.Editor.asmdef deleted file mode 100644 index a73f54b91e2..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/UnityEngine.TestTools.Graphics.Performance.Editor.asmdef +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "UnityEngine.TestTools.Graphics.Performance.Editor", - "rootNamespace": "", - "references": [ - "GUID:295068ed467c2ce4a9cda3833065f650", - "GUID:c8ae5dd6a09ec7449b58a77c5361f6e0", - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:df380645f10b7bc4b97d4f5eb6303d95", - "GUID:c0dd0d10738d4ad4a9de57c559d0ca1b" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_TESTS_FRAMEWORK" - ], - "versionDefines": [ - { - "name": "com.unity.testing.graphics-performance", - "expression": "", - "define": "UNITY_TESTS_FRAMEWORK" - }, - { - "name": "com.unity.shaderanalysis", - "expression": "0.0", - "define": "SHADERANALYSIS_SUPPORT" - } - ], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/UnityEngine.TestTools.Graphics.Performance.Editor.asmdef.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/UnityEngine.TestTools.Graphics.Performance.Editor.asmdef.meta deleted file mode 100644 index 5f49abdb70b..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Common/UnityEngine.TestTools.Graphics.Performance.Editor.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: cbbcbe5a7206638449ebcb9382eeb3a8 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources.meta deleted file mode 100644 index aa4cbb45b63..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 41a87c3ada323f24f9c10aed068e6760 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources/PerformanceTestingCamera.prefab b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources/PerformanceTestingCamera.prefab deleted file mode 100644 index f6e30a123c3..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources/PerformanceTestingCamera.prefab +++ /dev/null @@ -1,98 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &3144022662242275815 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3144022662242275811} - - component: {fileID: 3144022662242275810} - - component: {fileID: 3144022662242275809} - - component: {fileID: 5437325063093376927} - m_Layer: 0 - m_Name: PerformanceTestingCamera - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3144022662242275811 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3144022662242275815} - m_LocalRotation: {x: 0.20223878, y: -0, z: -0, w: 0.9793363} - m_LocalPosition: {x: 0, y: 2.016, z: -2.497} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 23.336, y: 0, z: 0} ---- !u!20 &3144022662242275810 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3144022662242275815} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 20.78461 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!81 &3144022662242275809 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3144022662242275815} - m_Enabled: 1 ---- !u!114 &5437325063093376927 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3144022662242275815} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 53034a8f335f777448ca871c47aa61aa, type: 3} - m_Name: - m_EditorClassIdentifier: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources/PerformanceTestingCamera.prefab.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources/PerformanceTestingCamera.prefab.meta deleted file mode 100644 index f328b81ef35..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/Resources/PerformanceTestingCamera.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 8fb4a2cd0d7be7b45a63e8d78ffb903a -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis.meta deleted file mode 100644 index 7d8c5412369..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4cf7c9ff4cd607e4aaae4b763abc74e2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common.meta deleted file mode 100644 index e5f25f2955a..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8504b9133c9a3b546bcd446df8eaaf44 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorShaderStaticAnalysisAsset.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorShaderStaticAnalysisAsset.cs deleted file mode 100644 index 9d4b9e5cba4..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorShaderStaticAnalysisAsset.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Collections.Generic; -using JetBrains.Annotations; -using UnityEditor; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis -{ - [CreateAssetMenu(menuName = "Testing/Static Analysis Tests")] - public class EditorShaderStaticAnalysisAsset : ScriptableObject, ISerializationCallbackReceiver - { - [Serializable] - public struct ProcessAssetDefinition - { - public string assetAlias; - public string assetCategory; - public string testName; - public Object asset; - public Filter filter; - public BuildTarget[] includeInTargets; - } - - [Serializable] - public enum FilterType - { - None, - Definition, - Reference, - } - - [Serializable] - public struct Filter - { - public FilterType filterType; - public string referenceName; - public FilterDefinition definition; - - [Pure] - public bool Resolve(Dictionary filters, - out FilterDefinition filter, - out string errorMessage) - { - switch (filterType) - { - case FilterType.None: - filter = default; - errorMessage = null; - return true; - case FilterType.Definition: - filter = definition; - errorMessage = null; - return true; - case FilterType.Reference: - if (filters.TryGetValue(referenceName, out filter)) - { - errorMessage = null; - return true; - } - else - { - errorMessage = $"Missing filter {referenceName}"; - return false; - } - default: throw new ArgumentOutOfRangeException(nameof(filterType)); - } - } - } - - [Serializable] - public struct FilterDefinition - { - public string name; - public string category; - public string keywordFilter; - public string passNameFilter; - } - - [SerializeField] - List m_Filters = new List(); - [SerializeField] - List m_AssetDefinitions = new List(); - [SerializeField] - float m_StaticAnalysisTimeout = 600; - - Dictionary m_FilterDefinitions = new Dictionary(); - - public Dictionary filters => m_FilterDefinitions; - public IList processAssetDefinitions => m_AssetDefinitions; - public float staticAnalysisTimeout => m_StaticAnalysisTimeout; - - public void OnBeforeSerialize() - { - - } - - public void OnAfterDeserialize() - { - m_FilterDefinitions.Clear(); - foreach (var filter in m_Filters) - m_FilterDefinitions[filter.name] = filter; - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorShaderStaticAnalysisAsset.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorShaderStaticAnalysisAsset.cs.meta deleted file mode 100644 index 61426a3edc6..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorShaderStaticAnalysisAsset.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cef5cd0c710b9824db38d22da94bdc21 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorStaticAnalysisTests.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorStaticAnalysisTests.cs deleted file mode 100644 index c8255eb8f53..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorStaticAnalysisTests.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Unity.PerformanceTesting; -using UnityEditor; -using UnityEditor.ShaderAnalysis; -using UnityEditor.ShaderAnalysis.Internal; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis -{ - public class EditorStaticAnalysisTests - { - public struct StaticAnalysisEntry - { - public readonly Object asset; - public readonly ShaderProgramFilter filter; - - public readonly TestName testName; - - public readonly string errorString; - public readonly BuildTarget buildTarget; - public readonly ShaderProfile profile; - public readonly float timeout; - - public StaticAnalysisEntry(string error) - { - errorString = error; - asset = null; - filter = null; - testName = default; - buildTarget = 0; - profile = default; - timeout = 0; - } - - public StaticAnalysisEntry( - Object asset, - string assetAlias, - string assetCategory, - ShaderProgramFilter filter, - string filterName, - string filterCategory, - string testName, - BuildTarget buildTarget, - ShaderProfile profile, - float timeout - ) - { - errorString = null; - this.asset = asset; - this.filter = filter; - this.buildTarget = buildTarget; - this.profile = profile; - this.timeout = timeout; - this.testName = new TestName( - string.IsNullOrEmpty(assetAlias) ? asset.ToString() : assetAlias, - assetCategory, - filterName, - filterCategory, - testName - ); - } - - public override string ToString() => - string.IsNullOrEmpty(errorString) - ? testName.ToString() - : PerformanceTestUtils.FormatTestName( - errorString, "NA", "NA", "NA", "NA" - ); - } - - const int k_MaxMeasurePerTest = 500; - - public static IEnumerable GetStaticAnalysisEntries(BuildTarget buildTarget) - { - var resource = PerformanceTestSettings.GetStaticAnalysisAsset() as EditorShaderStaticAnalysisAsset; - if (resource == null) - yield break; - - foreach (var definition in resource.processAssetDefinitions) - { - // Skip when not included in this build target - if (definition.includeInTargets != null && Array.IndexOf(definition.includeInTargets, buildTarget) == -1) - continue; - - if (definition.asset == null || definition.asset.Equals(null)) - { - yield return new StaticAnalysisEntry("Missing asset in definition."); - continue; - } - - var assetType = definition.asset.GetType(); - - if (assetType != typeof(Material) - && assetType != typeof(Shader) - && assetType != typeof(ComputeShader)) - { - yield return new StaticAnalysisEntry($"Invalid asset type {assetType}"); - continue; - } - - if (!definition.filter.Resolve(resource.filters, out var filter, out var errorMessage)) - { - yield return new StaticAnalysisEntry($"Invalid filter ({errorMessage})"); - continue; - } - - var programFilter = ShaderProgramFilter.Parse(filter.passNameFilter, filter.keywordFilter); - var profile = assetType == typeof(ComputeShader) ? ShaderProfile.ComputeProgram : ShaderProfile.PixelProgram; - yield return new StaticAnalysisEntry(definition.asset, - definition.assetAlias, - definition.assetCategory, - programFilter, - filter.name, - filter.category, - definition.testName, - buildTarget, - profile, - resource.staticAnalysisTimeout); - } - } - - public static void StaticAnalysisExecute(StaticAnalysisEntry entry) - { - var buildReportJob = (AsyncBuildReportJob)EditorShaderTools.GenerateBuildReportAsyncGeneric(ShaderAnalysisReport.New(entry.asset, entry.buildTarget, entry.profile, entry.filter)); - buildReportJob.throwOnError = true; - - var time = Time.realtimeSinceStartup; - var startTime = time; - while (!buildReportJob.IsComplete()) - { - if (Time.realtimeSinceStartup - time > 3) - { - Debug.Log($"[Build Report] {entry.asset} {buildReportJob.progress:P} {buildReportJob.message}"); - time = Time.realtimeSinceStartup; - } - - if (Time.realtimeSinceStartup - startTime > entry.timeout) - { - buildReportJob.Cancel(); - throw new Exception($"Timeout {entry.timeout} s"); - } - - try - { - if (buildReportJob.Tick()) - buildReportJob.SetProgress(1, "Completed") ; - EditorUpdateManager.Tick(); - } - catch (Exception e) - { - buildReportJob.Cancel(); - Debug.LogException(e); - Assert.Fail(e.Message); - } - } - - var report = buildReportJob.builtReport; - - // Evaluate the number of metrics to send - // We fail if we exceed the allowed number of metrics per test - var numberOfMetrics = 0; - foreach (var program in report.programs) - numberOfMetrics += k_MesureCount * program.performanceUnits.Count(); - Assert.LessOrEqual(numberOfMetrics, k_MaxMeasurePerTest, $"We are trying to send {numberOfMetrics} metrics while the capacity is {k_MaxMeasurePerTest}." + - $"Please reduce the number of variants to evaluate for this test."); - - foreach (var program in report.programs) - { - foreach (var performanceUnit in program.performanceUnits) - SendMeasure(performanceUnit); - } - } - - static ( - SampleGroup vgprCount, - SampleGroup vgprUsedCount, - SampleGroup sgprCount, - SampleGroup sgprUsedCount, - SampleGroup sgprUserCount, - SampleGroup microCodeSize, - SampleGroup threadGroupWaves, - SampleGroup CUOccupancyCount, - SampleGroup CUOccupancyMax, - SampleGroup LDSSize, - SampleGroup SIMDOccupancyCount, - SampleGroup SIMDOccupancyMax - ) GetReportSampleGroups(ShaderBuildReport.PerformanceUnit unit) - { - var name = string.Join(";", unit.compileUnit.defines); - var fullName = $"{unit.program.name}:{name}"; - return ( - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("VGPR_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("VGPR_Used_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("SGPR_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("SGPR_Used_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("SGPR_User_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("MicroCode_Size", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("ThreadGroup_Waves", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("CU_Occupancy_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("CU_Occupancy_Max", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("LDS_Size", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("SIMD_Occupancy_Count", "GPU", fullName), SampleUnit.Undefined), - new SampleGroup(PerformanceTestUtils.FormatSampleGroupName("SIMD_Occupancy_Max", "GPU", fullName), SampleUnit.Undefined) - ); - } - - // Update this counter if you add a measure in the 'SendMeasure' function - // We use this to know if we reach the measure capacity per test. - const int k_MesureCount = 12; - static void SendMeasure(ShaderBuildReport.PerformanceUnit unit) - { - var sg = GetReportSampleGroups(unit); - Measure.Custom(sg.sgprCount, unit.parsedReport.SGPRCount); - Measure.Custom(sg.sgprUsedCount, unit.parsedReport.SGPRUsedCount); - Measure.Custom(sg.sgprUserCount, unit.parsedReport.UserSGPRCount); - Measure.Custom(sg.vgprCount, unit.parsedReport.VGPRCount); - Measure.Custom(sg.vgprUsedCount, unit.parsedReport.VGPRUsedCount); - Measure.Custom(sg.microCodeSize, unit.parsedReport.microCodeSize); - Measure.Custom(sg.threadGroupWaves, unit.parsedReport.threadGroupWaves); - Measure.Custom(sg.CUOccupancyCount, unit.parsedReport.CUOccupancyCount); - Measure.Custom(sg.CUOccupancyMax, unit.parsedReport.CUOccupancyMax); - Measure.Custom(sg.LDSSize, unit.parsedReport.LDSSize); - Measure.Custom(sg.SIMDOccupancyCount, unit.parsedReport.SIMDOccupancyCount); - Measure.Custom(sg.SIMDOccupancyMax, unit.parsedReport.SIMDOccupancyMax); - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorStaticAnalysisTests.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorStaticAnalysisTests.cs.meta deleted file mode 100644 index 5a194743d87..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/EditorStaticAnalysisTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c143ba1d85c690f45a16d9ce01819884 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.asmdef b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.asmdef deleted file mode 100644 index 5142a6dcd27..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.asmdef +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis", - "rootNamespace": "", - "references": [ - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:0acc523941302664db1f4e527237feb3", - "GUID:28e5f1c81336e0a45b3a1bf37e997b43", - "GUID:fed8b660da062c54790cf8b0512bea0e", - "GUID:295068ed467c2ce4a9cda3833065f650", - "GUID:c0dd0d10738d4ad4a9de57c559d0ca1b" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "SHADERANALYSIS_SUPPORT", - "UNITY_TESTS_FRAMEWORK" - ], - "versionDefines": [ - { - "name": "com.unity.testing.graphics-performance", - "expression": "", - "define": "UNITY_TESTS_FRAMEWORK" - }, - { - "name": "com.unity.shaderanalysis", - "expression": "0.0", - "define": "SHADERANALYSIS_SUPPORT" - } - ], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.asmdef.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.asmdef.meta deleted file mode 100644 index c8ac88e0f85..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Common/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c8ae5dd6a09ec7449b58a77c5361f6e0 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation.meta deleted file mode 100644 index 433cb7c9827..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 004e4a1c8d2e3314d88e152678e189f4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/EditorStaticAnalysisTestPlayStation.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/EditorStaticAnalysisTestPlayStation.cs deleted file mode 100644 index 89287857085..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/EditorStaticAnalysisTestPlayStation.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using NUnit.Framework; -using Unity.PerformanceTesting; -using UnityEditor; -using UnityEditor.TestTools; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis -{ - public class EditorStaticAnalysisTestPlayStation - { - const int StaticAnalysisTimeout = 20 * 60 * 1000; // 20 min for shader compilation - - static IEnumerable GetStaticAnalysisEntriesPlayStation() => EditorStaticAnalysisTests.GetStaticAnalysisEntries(BuildTarget.PS4); - - [Test, Timeout(StaticAnalysisTimeout), Version("1"), Performance] - [RequirePlatformSupport(BuildTarget.PS4)] - public void StaticAnalysisPlayStation([ValueSource(nameof(GetStaticAnalysisEntriesPlayStation))] EditorStaticAnalysisTests.StaticAnalysisEntry entries) => EditorStaticAnalysisTests.StaticAnalysisExecute(entries); - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/EditorStaticAnalysisTestPlayStation.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/EditorStaticAnalysisTestPlayStation.cs.meta deleted file mode 100644 index 44203a49e7c..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/EditorStaticAnalysisTestPlayStation.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e23d2e461a5b9344bbede03ffb5d4e08 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation.asmdef b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation.asmdef deleted file mode 100644 index 8222554a6b0..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation.asmdef +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation", - "rootNamespace": "", - "references": [ - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:0acc523941302664db1f4e527237feb3", - "GUID:28e5f1c81336e0a45b3a1bf37e997b43", - "GUID:c8ae5dd6a09ec7449b58a77c5361f6e0", - "GUID:c0dd0d10738d4ad4a9de57c559d0ca1b" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_TESTS_FRAMEWORK", - "SHADERANALYSIS_SUPPORT" - ], - "versionDefines": [ - { - "name": "com.unity.testing.graphics-performance", - "expression": "", - "define": "UNITY_TESTS_FRAMEWORK" - }, - { - "name": "com.unity.shaderanalysis", - "expression": "0.0", - "define": "SHADERANALYSIS_SUPPORT" - } - ], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation.asmdef.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation.asmdef.meta deleted file mode 100644 index 4bc84ae4a3f..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/PlayStation/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.PlayStation.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 37a10fc5f72a948499da7b11a22a9449 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox.meta deleted file mode 100644 index 7bbc7fea68b..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6746d988b6d995042ac5b9b86ac92ad6 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/EditorStaticAnalysisTestXbox.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/EditorStaticAnalysisTestXbox.cs deleted file mode 100644 index 32b5daff475..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/EditorStaticAnalysisTestXbox.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using NUnit.Framework; -using Unity.PerformanceTesting; -using UnityEditor; -using UnityEditor.TestTools; - -namespace UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis -{ - public class EditorStaticAnalysisTestXbox - { - const int StaticAnalysisTimeout = 10 * 60 * 1000; // 10 min for shader compilation - - static IEnumerable GetStaticAnalysisEntriesXbox() => EditorStaticAnalysisTests.GetStaticAnalysisEntries(BuildTarget.XboxOne); - - [Test, Timeout(StaticAnalysisTimeout), Version("1"), Performance] - [RequirePlatformSupport(BuildTarget.XboxOne)] - public void StaticAnalysisXboxOne([ValueSource(nameof(GetStaticAnalysisEntriesXbox))] EditorStaticAnalysisTests.StaticAnalysisEntry entry) => EditorStaticAnalysisTests.StaticAnalysisExecute(entry); - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/EditorStaticAnalysisTestXbox.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/EditorStaticAnalysisTestXbox.cs.meta deleted file mode 100644 index 93835d15931..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/EditorStaticAnalysisTestXbox.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f2a65dc4d08d6bd42bdee71e489bcb78 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox.asmdef b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox.asmdef deleted file mode 100644 index 37fe9ced8de..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox.asmdef +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox", - "rootNamespace": "", - "references": [ - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:0acc523941302664db1f4e527237feb3", - "GUID:28e5f1c81336e0a45b3a1bf37e997b43", - "GUID:c8ae5dd6a09ec7449b58a77c5361f6e0", - "GUID:c0dd0d10738d4ad4a9de57c559d0ca1b" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_TESTS_FRAMEWORK" - ], - "versionDefines": [ - { - "name": "com.unity.testing.graphics-performance", - "expression": "", - "define": "UNITY_TESTS_FRAMEWORK" - }, - { - "name": "com.unity.shaderanalysis", - "expression": "0.0", - "define": "SHADERANALYSIS_SUPPORT" - } - ], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox.asmdef.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox.asmdef.meta deleted file mode 100644 index 7457e363f28..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Editor/StaticAnalysis/Xbox/UnityEngine.TestTools.Graphics.Performance.Editor.StaticAnalysis.Xbox.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: abd5aa28d35da6648bc6f47d9518b84f -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/LICENSE.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/LICENSE.md deleted file mode 100644 index 54f5a1272ab..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/LICENSE.md +++ /dev/null @@ -1,5 +0,0 @@ -com.unity.testframework.graphics copyright © 2020 Unity Technologies ApS - -Licensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). - -Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/LICENSE.md.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/LICENSE.md.meta deleted file mode 100644 index 7dc26a5354d..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/LICENSE.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 245bb42c6352c484c82bcfe1b8467b05 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/README.md b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/README.md deleted file mode 100644 index 42ead5e3671..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Graphics Tests Framework - -This package provides a foundation for writing tests for Graphics features in Unity projects. - -Currently it contains: - -* ImageAssert, for doing image renders and comparisons with reference images -* Automatic collection and deployment of reference images -* Automatic generation of tests from scenes in the project - -It's currently a bit rough, but as improvements to Unity's test framework are made we should be able to make it nicer, as well as expand the functionality it offers. - -See [the Documentation](https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.testing.graphics-performance/Documentation~/TableOfContents.md) for more information. diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/README.md.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/README.md.meta deleted file mode 100644 index 03921338717..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 41971d1eb54b7014396a00715bcf2846 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime.meta deleted file mode 100644 index dddc5a294ec..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 561d61e29ad2173418e66daaf386f16d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceMetricNames.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceMetricNames.cs deleted file mode 100644 index 8a1cd05ec42..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceMetricNames.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace UnityEngine.TestTools.Graphics.Performance -{ - public static class PerformanceMetricNames - { - public readonly static string k_NA = "NA"; - public readonly static string k_Default = "Default"; - public readonly static string k_Timing = "Timing"; - public readonly static string k_CPU = "CPU"; - public readonly static string k_GPU = "GPU"; - public readonly static string k_InlineCPU = "InlineCPU"; - public readonly static string k_Memory = "AllocatedBytes"; - public readonly static string k_TotalMemory = "TotalAllocatedBytes"; - public readonly static string k_Build = "Build"; - public readonly static string k_Total = "Total"; - public readonly static string k_Shader = "Shader"; - public readonly static string k_ComputeShader = "ComputeShader"; - public readonly static string k_Time = "Time"; - public readonly static string k_Warnings = "Warnings"; - public readonly static string k_Success = "Success"; - public readonly static string k_Size = "Size"; - public readonly static string k_Striping = "ShaderStriping"; - public readonly static string k_StripingTime = "ShaderStripingTime"; - public readonly static string k_CompilationTime = "CompilationTime"; - public readonly static string k_ShaderProgramCount = "ShaderProgramCount"; - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceMetricNames.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceMetricNames.cs.meta deleted file mode 100644 index de682fb495c..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceMetricNames.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 38c7f35cf1e80c64f97fcdfe95a8a0c9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSceneSettings.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSceneSettings.cs deleted file mode 100644 index 633f9d353cf..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSceneSettings.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Experimental.Rendering; - -namespace UnityEngine.TestTools.Graphics.Performance -{ - public class PerformanceTestSceneSettings : MonoBehaviour - { - public enum ColorBufferFormat - { - R8G8B8A8 = GraphicsFormat.R8G8B8A8_SNorm, - R16G16B16A16 = GraphicsFormat.R16G16B16A16_SFloat, - R11G11B10 = GraphicsFormat.B10G11R11_UFloatPack32, - R8G8B8A8_SRGB = GraphicsFormat.R8G8B8A8_SRGB - } - - [HideInInspector, System.NonSerialized] - public Camera testCamera; - - [Header("Camera Settings")] - [Tooltip("Width of the render texture assigned to the camera during the test execution.")] - public int cameraWidth = 1920; - [Tooltip("Height of the render texture assigned to the camera during the test execution.")] - public int cameraHeight = 1080; - [Tooltip("Graphics Format of the render texture assigned to the camera during the test execution.")] - public ColorBufferFormat colorBufferFormat = ColorBufferFormat.R8G8B8A8; - - [Header("Performance Counters Settings")] - [Tooltip("Number of frame the performance counter test will use to record the timings.")] - public int measurementCount = 30; - - [Header("Memory Settings")] - [Tooltip("Minimum size in byte for an object to be detected by the performance test.")] - public int minObjectSize = 1024 * 64; - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSceneSettings.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSceneSettings.cs.meta deleted file mode 100644 index 4e631fe00fc..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSceneSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 53034a8f335f777448ca871c47aa61aa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSettings.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSettings.cs deleted file mode 100644 index 14a3742fec9..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSettings.cs +++ /dev/null @@ -1,60 +0,0 @@ -using UnityEngine; -using System.IO; - -namespace UnityEngine.TestTools.Graphics.Performance -{ - #if UNITY_EDITOR - using UnityEditor; - [CustomEditor(typeof(PerformanceTestSettings))] - class PerformanceTestSettingsEditor : Editor - { - public override void OnInspectorGUI() - { - EditorGUILayout.HelpBox("You can edit this asset in Project Settings > Performance Tests", MessageType.Info); - if (GUILayout.Button("Open")) - SettingsService.OpenProjectSettings("Project/Performance Tests"); - } - } - - #endif - - public class PerformanceTestSettings : ScriptableObject - { - public const string k_TestAssetName = "PerformanceTestsSettings"; - public static string k_PerformanceTestsPath => $"Assets/Resources/{k_TestAssetName}.asset"; - - public string testDescriptionAsset = null; - public string staticAnalysisAsset = null; - - public static PerformanceTestSettings instance { get => GetOrCreateSettings(); } - - internal static PerformanceTestSettings GetOrCreateSettings() - { - var settings = Resources.Load(k_TestAssetName); - - #if UNITY_EDITOR - if (settings == null) - { - settings = ScriptableObject.CreateInstance(); - if (!Directory.Exists("Assets/Resources")) - AssetDatabase.CreateFolder("Assets", "Resources"); - AssetDatabase.CreateAsset(settings, k_PerformanceTestsPath); - AssetDatabase.SaveAssets(); - } - #endif - return settings; - } - - public static TestSceneAsset GetTestSceneDescriptionAsset() => Resources.Load(instance.testDescriptionAsset); - - #if UNITY_EDITOR - // We use an object for this method because we don't have access to the type. - public static Object GetStaticAnalysisAsset() => Resources.Load(instance.staticAnalysisAsset); - - public static SerializedObject GetSerializedSettings() - { - return new SerializedObject(GetOrCreateSettings()); - } - #endif - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSettings.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSettings.cs.meta deleted file mode 100644 index f2064ac160a..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e106e93a76c4c9d47a878fe43b5a3db7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestUtils.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestUtils.cs deleted file mode 100644 index 1120037d69f..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestUtils.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System.Collections; -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.SceneManagement; -using Unity.PerformanceTesting; -using UnityEngine.Experimental.Rendering; - -namespace UnityEngine.TestTools.Graphics.Performance -{ - public static class PerformanceTestUtils - { - public static TestSceneAsset testScenesAsset = PerformanceTestSettings.GetTestSceneDescriptionAsset(); - - /// - /// Note that you need to call this function using yield return LoadScene(...) Otherwise the scene doesn't have the time to load properly. - /// - /// - /// - /// Call yield return LoadScene() - public static IEnumerator LoadScene(string sceneName, RenderPipelineAsset asset) - { - if (QualitySettings.renderPipeline != null) - { - if (QualitySettings.renderPipeline != asset) - QualitySettings.renderPipeline = asset; - } - else if (GraphicsSettings.defaultRenderPipeline != asset) - GraphicsSettings.defaultRenderPipeline = asset; - - SceneManager.LoadScene(sceneName); - - // Wait one frame so the scene finish to load. - yield return null; - } - - /// - /// This function finds the PerformanceTestSceneSettings component in your scene and use it to allocate the render texture for the test camera. - /// Don't forget to call CleanupTestSceneIfNeeded to release the render texture. - /// - /// - public static PerformanceTestSceneSettings SetupTestScene(Vector2Int overrideCameraSize = default(Vector2Int)) - { - var sceneSettings = GameObject.FindFirstObjectByType(); - var camera = sceneSettings?.GetComponent() ?? GameObject.FindFirstObjectByType(); - - if (overrideCameraSize != default(Vector2Int)) - { - sceneSettings.cameraWidth = overrideCameraSize.x; - sceneSettings.cameraHeight = overrideCameraSize.y; - } - - if (sceneSettings != null) - { - RenderTexture tmpCameraRT = new RenderTexture(sceneSettings.cameraWidth, sceneSettings.cameraHeight, 32, (GraphicsFormat)sceneSettings.colorBufferFormat); - camera.targetTexture = tmpCameraRT; - sceneSettings.testCamera = camera; - } - else - { - throw new System.Exception($"No camera test settings detected in the test scene {SceneManager.GetActiveScene().name}. Failed to setup the test camera."); - } - - return sceneSettings; - } - - /// - /// Call this function to release the allocated render texture. - /// - public static void CleanupTestSceneIfNeeded() - { - var settings = GameObject.FindFirstObjectByType(); - - if (settings == null || settings.testCamera == null) - return; - - settings.testCamera.targetTexture = null; - CoreUtils.Destroy(settings.testCamera.targetTexture); - } - - // Counter example: 0001_LitCube:Small,Memory:Default,RenderTexture - // Static analysis example: Deferred:Default,Gbuffer:OpaqueAndDecal,NA - public static string FormatTestName(string inputData, string inputDataCategory, string settings, string settingsCategory, string testName) - => $"{inputData}:{inputDataCategory},{settings}:{settingsCategory},{testName}"; - - // Counter example: Timing,GPU,Gbuffer - // Memory example: AllocatedBytes,Texture2D,Default - public static string FormatSampleGroupName(string metricName, string category, string dataName = null) - => $"{metricName},{category},{dataName ?? "Default"}"; - - // Turn a string into a sample group - public static SampleGroup ToSampleGroup(this string groupName, SampleUnit unit = SampleUnit.Undefined, bool increaseIsBetter = false) - => new SampleGroup(groupName, unit, increaseIsBetter); - } - - public struct TestName - { - public readonly string inputData; - public readonly string inputDataCategory; - public readonly string settings; - public readonly string settingsCategory; - public readonly string name; - - public TestName(string inputData, string inputDataCategory, string settings, string settingsCategory, string name) - { - this.inputData = string.IsNullOrEmpty(inputData) ? "NA" : inputData; - this.inputDataCategory = string.IsNullOrEmpty(inputDataCategory) ? "NA" : inputDataCategory; - this.settings = string.IsNullOrEmpty(settings) ? "NA" : settings; - this.settingsCategory = string.IsNullOrEmpty(settingsCategory) ? "NA" : settingsCategory; - this.name = string.IsNullOrEmpty(name) ? "NA" : name; - } - - public override string ToString() - => PerformanceTestUtils.FormatTestName(inputData, inputDataCategory, settings, settingsCategory, name); - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestUtils.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestUtils.cs.meta deleted file mode 100644 index 2c8ed745902..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTestUtils.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3fc1d5fdec40dd441bafd568ad878a73 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTests.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTests.cs deleted file mode 100644 index 71c14164ec3..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using NUnit.Framework; -using UnityEngine; -using Unity.PerformanceTesting; -using UnityEngine.TestTools; -using UnityEngine.Rendering; -using UnityEngine.SceneManagement; -using System.Linq; -using UnityEngine.Profiling; -using static UnityEngine.TestTools.Graphics.Performance.PerformanceTestUtils; -using static UnityEngine.TestTools.Graphics.Performance.PerformanceMetricNames; - -#if UNITY_EDITOR -using UnityEditor; -#endif - -namespace UnityEngine.TestTools.Graphics.Performance -{ - public class PerformanceTests : IPrebuildSetup - { - public void Setup() - { - #if UNITY_EDITOR - // Add all test scenes from the asset to the build settings: - if (testScenesAsset) - { - EditorBuildSettings.scenes = testScenesAsset.ConvertTestDataScenesToBuildSettings(); - } - - EditorUserBuildSettings.ps4HardwareTarget = PS4HardwareTarget.BaseOnly; - #endif - } - - // Auto cleanup when the test exits - [TearDown] - public void TearDown() => CleanupTestSceneIfNeeded(); - - protected IEnumerator MeasureProfilingSamplers(IEnumerable samplers, int warmupFramesCount = 20, int measureFrameCount = 30) - { - // Enable all the markers - foreach (var sampler in samplers) - sampler.enableRecording = true; - - // Allocate all sample groups: - var sampleGroups = new Dictionary(); - foreach (var sampler in samplers) - CreateSampleGroups(sampler); - - // Wait for the markers to be initialized - for (int i = 0; i < warmupFramesCount; i++) - yield return null; - - for (int i = 0; i < measureFrameCount; i++) - { - foreach (var sampler in samplers) - MeasureTime(sampler); - yield return null; - } - - // disable all the markers - foreach (var sampler in samplers) - sampler.enableRecording = false; - - void CreateSampleGroups(ProfilingSampler sampler) - { - SampleGroup cpuSample = new SampleGroup(FormatSampleGroupName(k_Timing, k_CPU, sampler.name), SampleUnit.Millisecond, false); - SampleGroup gpuSample = new SampleGroup(FormatSampleGroupName(k_Timing, k_GPU, sampler.name), SampleUnit.Millisecond, false); - SampleGroup inlineCPUSample = new SampleGroup(FormatSampleGroupName(k_Timing, k_InlineCPU, sampler.name), SampleUnit.Millisecond, false); - sampleGroups[sampler] = (cpuSample, inlineCPUSample, gpuSample); - } - - void MeasureTime(ProfilingSampler sampler) - { - if (sampler.cpuElapsedTime > 0) - Measure.Custom(sampleGroups[sampler].cpu, sampler.cpuElapsedTime); - if (sampler.gpuElapsedTime > 0) - Measure.Custom(sampleGroups[sampler].gpu, sampler.gpuElapsedTime); - if (sampler.inlineCpuElapsedTime > 0) - Measure.Custom(sampleGroups[sampler].inlineCPU, sampler.inlineCpuElapsedTime); - } - } - - protected static IEnumerable GetMemoryObjectTypes() - { - yield return typeof(RenderTexture); - yield return typeof(Texture2D); - yield return typeof(Texture2DArray); - yield return typeof(Texture3D); - yield return typeof(CubemapArray); - yield return typeof(Cubemap); - yield return typeof(Material); - yield return typeof(Mesh); - yield return typeof(Shader); - yield return typeof(ComputeShader); - } - - protected IEnumerator ReportMemoryUsage(PerformanceTestSceneSettings sceneSettings, MemoryTestDescription testDescription) - { - long totalMemory = 0; - var data = Resources.FindObjectsOfTypeAll(testDescription.assetType); - var results = new List<(string name, long size)>(); - - // Measure memory - foreach (var item in data) - { - string name = String.IsNullOrEmpty(item.name) ? item.GetType().Name : item.name; - long currSize = Profiler.GetRuntimeMemorySizeLong(item); - - // There are too many items here so we only keep the one that have a minimun of weight - if (currSize > sceneSettings.minObjectSize) - results.Add((name, currSize)); - - totalMemory += currSize; - } - - results.Sort((a, b) => b.size.CompareTo(a.size)); - - string resolution = $"{sceneSettings.cameraWidth}x{sceneSettings.cameraHeight}"; - - // Report data - foreach (var result in results) - Measure.Custom(new SampleGroup(FormatSampleGroupName(k_Memory, result.name, resolution), SampleUnit.Byte, false), result.size); - Measure.Custom(new SampleGroup(FormatSampleGroupName(k_TotalMemory, testDescription.assetType.Name, resolution), SampleUnit.Byte, false), totalMemory); - - yield return null; - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTests.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTests.cs.meta deleted file mode 100644 index a8a74ef27e6..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/PerformanceTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5be69377071c3d8499fca2a6735e9555 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/TestSceneAsset.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/TestSceneAsset.cs deleted file mode 100644 index 3fe61e7f6b9..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/TestSceneAsset.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; -using System; -using System.Linq; -using UnityEditor; -using UnityEngine.Rendering; -using static UnityEngine.TestTools.Graphics.Performance.PerformanceMetricNames; - -namespace UnityEngine.TestTools.Graphics.Performance -{ - [CreateAssetMenu(menuName = "Testing/Performance Test Description")] - public class TestSceneAsset : ScriptableObject - { - - [Serializable] - public class SceneData - { - public string scene; - public string sceneLabels; - public string scenePath; //See also ScenePathUpdater - public bool enabled; - } - - [Serializable] - public class SRPAssetData - { - public RenderPipelineAsset asset; - public string assetLabels; - public string alias; // reference named used in the test - } - - [Serializable] - public class SRPAssetDataAliasByHand : SRPAssetData { } - - [Serializable] - public class TestSuiteData - { - public List scenes; - public List srpAssets; - - public IEnumerable<(SceneData sceneData, SRPAssetData assetData)> GetTestList() - { - foreach (var srpAsset in srpAssets) - foreach (var scene in scenes) - if (scene.enabled) - yield return (scene, srpAsset); - } - } - - // Store the name of the scenes so we can load them at runtime - public TestSuiteData counterTestSuite = new TestSuiteData(); - public TestSuiteData memoryTestSuite = new TestSuiteData(); - public TestSuiteData buildTestSuite = new TestSuiteData(); - - public List srpAssetAliases = new List(); - public List additionalLoadableScenes = new List(); - - public IEnumerable<(SceneData sceneData, SRPAssetData assetData)> GetAllTests() - { - foreach (var test in counterTestSuite.GetTestList()) - yield return test; - foreach (var test in memoryTestSuite.GetTestList()) - yield return test; - foreach (var test in buildTestSuite.GetTestList()) - yield return test; - } - - public string GetScenePath(string sceneName) - => GetAllTests().FirstOrDefault(s => s.sceneData.scene == sceneName).sceneData?.scenePath - ?? additionalLoadableScenes.FirstOrDefault(s => s.scene == sceneName)?.scenePath; - - public string GetSRPAssetAlias(RenderPipelineAsset srpAsset) - => srpAssetAliases.Where(a => a.asset == srpAsset).FirstOrDefault()?.alias; - - IEnumerable GetAllSceneData() - { - foreach (var scene in counterTestSuite.scenes) - yield return scene; - foreach (var scene in memoryTestSuite.scenes) - yield return scene; - foreach (var scene in buildTestSuite.scenes) - yield return scene; - foreach (var scene in additionalLoadableScenes) - yield return scene; - } - -#if UNITY_EDITOR - public UnityEditor.EditorBuildSettingsScene[] ConvertTestDataScenesToBuildSettings() - { - var scenesForTests = GetAllSceneData(); - - var scenesForTestsConvertedBuildSettingsScenes = - scenesForTests.Select(x => new EditorBuildSettingsScene(x.scenePath, x.enabled)).ToArray(); - - return scenesForTestsConvertedBuildSettingsScenes; - } - -#endif -} - public struct CounterTestDescription - { - public TestSceneAsset.SceneData sceneData; - public TestSceneAsset.SRPAssetData assetData; - public override string ToString() - { - var formatTestName = PerformanceTestUtils.FormatTestName(sceneData.scene, sceneData.sceneLabels, - String.IsNullOrEmpty(assetData.alias) ? assetData.asset?.name ?? "Builtin" : assetData.alias, assetData.assetLabels, - k_Default); - return formatTestName; - } - } - public struct MemoryTestDescription - { - public TestSceneAsset.SceneData sceneData; - public TestSceneAsset.SRPAssetData assetData; - public Type assetType; - public override string ToString() - => PerformanceTestUtils.FormatTestName(sceneData.scene, sceneData.sceneLabels, String.IsNullOrEmpty(assetData.alias) ? assetData.asset?.name ?? "Builtin" : assetData.alias, assetData.assetLabels, assetType.Name); - } - public struct BuildTestDescription - { - public TestSceneAsset.SceneData sceneData; - public TestSceneAsset.SRPAssetData assetData; - public string testName; - public override string ToString() - => PerformanceTestUtils.FormatTestName(sceneData.scene, sceneData.sceneLabels, String.IsNullOrEmpty(assetData.alias) ? assetData.asset?.name ?? "Builtin" : assetData.alias, assetData.assetLabels, testName); - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/TestSceneAsset.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/TestSceneAsset.cs.meta deleted file mode 100644 index 8bcbccb2397..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/TestSceneAsset.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 887bac95e5e1dbd45b80fc9604f8f3b7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/UnityEngine.TestTools.Graphics.Performance.asmdef b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/UnityEngine.TestTools.Graphics.Performance.asmdef deleted file mode 100644 index b309cbd14fc..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/UnityEngine.TestTools.Graphics.Performance.asmdef +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "UnityEngine.TestTools.Graphics.Performance", - "rootNamespace": "", - "references": [ - "GUID:91836b14885b8a34196f4aa8303d7793", - "GUID:27619889b8ba8c24980f49ee34dbb44a", - "GUID:df380645f10b7bc4b97d4f5eb6303d95", - "GUID:c0dd0d10738d4ad4a9de57c559d0ca1b" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": true, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_TESTS_FRAMEWORK" - ], - "versionDefines": [ - { - "name": "com.unity.testing.graphics-performance", - "expression": "", - "define": "UNITY_TESTS_FRAMEWORK" - } - ], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/UnityEngine.TestTools.Graphics.Performance.asmdef.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/UnityEngine.TestTools.Graphics.Performance.asmdef.meta deleted file mode 100644 index c6d05b1230e..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Runtime/UnityEngine.TestTools.Graphics.Performance.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 295068ed467c2ce4a9cda3833065f650 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests.meta deleted file mode 100644 index 03d845a976c..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dc53ec11242615c47994e4e3c472634c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation.meta deleted file mode 100644 index 06a8e641ec5..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d9af4830d156eec4f9716706f7b8b716 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/PackageValidationTests.cs b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/PackageValidationTests.cs deleted file mode 100644 index 46b3f545b84..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/PackageValidationTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using NUnit.Framework; -using UnityEngine; -using UnityEngine.TestTools; - -namespace UnityEngine.TestTools.Graphics.Performance.PackageValidationTests -{ - [Category("PackageValidation")] - public class PackageValidationTests - { - [Test] - public void DummyTest() - { - Assert.Pass(); - } - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/PackageValidationTests.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/PackageValidationTests.cs.meta deleted file mode 100644 index d0562567154..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/PackageValidationTests.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 0cb448d5ff3fcd8469911c541574af54 \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/Unity.GraphicTests.Tests.PackageValidation.asmdef b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/Unity.GraphicTests.Tests.PackageValidation.asmdef deleted file mode 100644 index 856a6eaa167..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/Unity.GraphicTests.Tests.PackageValidation.asmdef +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "Unity.GraphicTests.Tests.PackageValidation", - "rootNamespace": "", - "references": [ - "UnityEngine.TestRunner", - "UnityEditor.TestRunner" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll", - "Newtonsoft.Json.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_INCLUDE_TESTS" - ], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/Unity.GraphicTests.Tests.PackageValidation.asmdef.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/Unity.GraphicTests.Tests.PackageValidation.asmdef.meta deleted file mode 100644 index 4f7d3c37e06..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/Tests/PackageValidation/Unity.GraphicTests.Tests.PackageValidation.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f4729d0a55ba54846b630f27a8584678 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/ValidationExceptions.json b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/ValidationExceptions.json deleted file mode 100644 index 0b21ce55360..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/ValidationExceptions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ErrorExceptions": - [ - { - "ValidationTest": "NDA Filename Validation", - "PackageVersion": "17.2.0" - } - ] -} \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/ValidationExceptions.json.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/ValidationExceptions.json.meta deleted file mode 100644 index c415135f74c..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/ValidationExceptions.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 27be2ad0f2ccc204e8d16516af0c59df -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/package.json b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/package.json deleted file mode 100644 index ec9ef6019d9..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "com.unity.testing.graphics-performance", - "displayName": "Performance Graphics Tests Framework", - "version": "17.2.0", - "unity": "6000.0", - "unityRelease": "0b15", - "rootNamespace": "UnityEngine.TestTools.Graphics.Performance", - "description": "Provides performance framework helpers for writing tests for graphics code, such as test scene asset description, performance performance report and shader static analysis.", - "keywords": [ - "qa", - "test", - "testing", - "tests", - "graphics", - "performance" - ], - "dependencies": { - "com.unity.test-framework.performance": "3.0.3", - "com.unity.shaderanalysis": "1.0.0", - "com.unity.render-pipelines.core": "17.0.3" - } -} diff --git a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/package.json.meta b/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/package.json.meta deleted file mode 100644 index d70868de60a..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.graphics-performance/package.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 121d5c316c8c36149b6b7d15393d9945 -PackageManifestImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/package.json b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/package.json index 7720f96b85d..4caaca1ae46 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/package.json +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/package.json @@ -6,7 +6,7 @@ "unityRelease": "0b4", "description": "This package contains common graphics tests from several scriptable renderpipeline", "dependencies": { - "com.unity.testing.graphics-performance": "17.0.0", + "com.unity.test-framework.graphics.performance": "1.0.0", "nuget.moq": "2.0.0-exp.2" } } diff --git a/Tests/SRPTests/Projects/HDRP_PerformanceTests/Packages/manifest.json b/Tests/SRPTests/Projects/HDRP_PerformanceTests/Packages/manifest.json index 93becdb10f3..76c368f4d6c 100644 --- a/Tests/SRPTests/Projects/HDRP_PerformanceTests/Packages/manifest.json +++ b/Tests/SRPTests/Projects/HDRP_PerformanceTests/Packages/manifest.json @@ -11,7 +11,7 @@ "com.unity.shadergraph": "file:../../../../../Packages/com.unity.shadergraph", "local.utf.references": "file:../../../Packages/local.utf.references", "com.unity.testframework.graphics": "file:../../../Packages/com.unity.testframework.graphics", - "com.unity.testing.graphics-performance": "file:../../../Packages/com.unity.testing.graphics-performance", + "com.unity.test-framework.graphics.performance": "file:../../../Packages/com.unity.test-framework.graphics.performance", "com.unity.ugui": "2.0.0", "com.unity.visualeffectgraph": "file:../../../../../Packages/com.unity.visualeffectgraph", "com.unity.modules.ai": "1.0.0", diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Packages/manifest.json b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Packages/manifest.json index 1677ec72da3..f68604d8432 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Packages/manifest.json +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Packages/manifest.json @@ -12,7 +12,7 @@ "com.unity.shaderanalysis": "file:../../../../../Packages/com.unity.shaderanalysis", "com.unity.shadergraph": "file:../../../../../Packages/com.unity.shadergraph", "com.unity.rendering.light-transport": "file:../../../../../Packages/com.unity.rendering.light-transport", - "com.unity.testing.graphics-performance": "file:../../../Packages/com.unity.testing.graphics-performance", + "com.unity.test-framework.graphics.performance": "file:../../../Packages/com.unity.test-framework.graphics.performance", "com.unity.testing.visualeffectgraph": "file:../../../Packages/com.unity.testing.visualeffectgraph", "com.unity.testing.xr": "file:../../../Packages/com.unity.testing.xr", "com.unity.timeline": "1.8.4", diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Packages/manifest.json b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Packages/manifest.json index 8023b56c20c..858ab5e9dca 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Packages/manifest.json +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Packages/manifest.json @@ -11,7 +11,7 @@ "com.unity.shaderanalysis": "file:../../../../../Packages/com.unity.shaderanalysis", "com.unity.shadergraph": "file:../../../../../Packages/com.unity.shadergraph", "com.unity.rendering.light-transport": "file:../../../../../Packages/com.unity.rendering.light-transport", - "com.unity.testing.graphics-performance": "file:../../../Packages/com.unity.testing.graphics-performance", + "com.unity.test-framework.graphics.performance": "file:../../../Packages/com.unity.test-framework.graphics.performance", "com.unity.testing.visualeffectgraph": "file:../../../Packages/com.unity.testing.visualeffectgraph", "com.unity.testing.xr": "file:../../../Packages/com.unity.testing.xr", "com.unity.ugui": "2.0.0", From 199f5b3a61fefa5ebeabde30c731ccd88b1515da Mon Sep 17 00:00:00 2001 From: Richard Horton Date: Wed, 1 May 2024 15:04:18 +0000 Subject: [PATCH 16/67] Graphics Docs Quality Sprint: ShaderGraph Fixes Fix issues in the ShaderGraph documentation from the following tickets: - [DOCG-4743](https://jira.unity3d.com/browse/DOCG-4743) - [DOCG-4827](https://jira.unity3d.com/browse/DOCG-4827) - [DOCG-4973](https://jira.unity3d.com/browse/DOCG-4973) - [DOCG-5430](https://jira.unity3d.com/browse/DOCG-5430) --- .../Documentation~/Baked-GI-Node.md | 6 +-- .../Documentation~/Boolean-Node.md | 2 +- .../Documentation~/Color-Modes.md | 8 +++- .../Compute-Deformation-Node.md | 2 +- .../Documentation~/Custom-Function-Node.md | 6 ++- .../Documentation~/Data-Types.md | 2 +- .../Documentation~/Diffusion-Profile-Node.md | 2 +- .../Documentation~/Edge.md | 2 +- .../Documentation~/Getting-Started.md | 2 +- .../Documentation~/Gradient-Node.md | 2 +- .../Documentation~/HD-Sample-Buffer-Node.md | 5 +-- .../Documentation~/Input-Nodes.md | 2 +- .../Documentation~/Keywords.md | 42 ++++++++---------- .../Linear-Blend-Skinning-Node.md | 2 +- .../Documentation~/Preview-Node.md | 2 +- .../Documentation~/Property-Types.md | 8 ++-- .../Documentation~/UV-Nodes.md | 11 +++-- .../images/ParallaxMappingNodeThumb.PNG | Bin 0 -> 22422 bytes .../ParallaxOcclusionMappingNodeThumb.PNG | Bin 0 -> 36992 bytes 19 files changed, 56 insertions(+), 50 deletions(-) create mode 100644 Packages/com.unity.shadergraph/Documentation~/images/ParallaxMappingNodeThumb.PNG create mode 100644 Packages/com.unity.shadergraph/Documentation~/images/ParallaxOcclusionMappingNodeThumb.PNG diff --git a/Packages/com.unity.shadergraph/Documentation~/Baked-GI-Node.md b/Packages/com.unity.shadergraph/Documentation~/Baked-GI-Node.md index bc00aa10c38..1a75b2837d7 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Baked-GI-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Baked-GI-Node.md @@ -8,9 +8,9 @@ Note: The behavior of this [Node](Node.md) is undefined globally. Shader Graph d Different Render Pipelines may produce different results. If you're building a shader in one Render Pipeline that you want to use in both, try checking it in both pipelines before production. A [Node](Node.md) might be defined in one Render Pipeline and undefined in the other. If this [Node](Node.md) is undefined, it returns 0 (black). -#### Unity Render Pipelines Support -- High Definition Render Pipeline. Although, this Node does not work in a Shader Graph that targets HDRP's [Unlit Master Node](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/Master-Node-Unlit.html). -- Universal Render Pipeline +### Unity Render Pipelines Support + +This node is compatible with both the High Definition Render Pipeline (HDRP) and the Universal Render Pipeline (URP). However, this node does not work within unlit shaders for either pipeline. ## Ports diff --git a/Packages/com.unity.shadergraph/Documentation~/Boolean-Node.md b/Packages/com.unity.shadergraph/Documentation~/Boolean-Node.md index 01c1715e0a4..e0785189acd 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Boolean-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Boolean-Node.md @@ -2,7 +2,7 @@ ## Description -Defines a constant **Boolean** value in the [Shader Graph](Shader-Graph.md), although internally to the shader this is treated as a constant **float** value that is ether 0 or 1, similar to Shaderlab's [Toggle](https://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html) property. Can be converted to a **Boolean** type [Property](Property-Types.md) via the [Node's](Node.md) context menu. +Defines a constant **Boolean** value in the [Shader Graph](index.md), although internally to the shader this is treated as a constant **float** value that is ether 0 or 1, similar to Shaderlab's [Toggle](https://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html) property. Can be converted to a **Boolean** type [Property](Property-Types.md) via the [Node's](Node.md) context menu. ## Ports diff --git a/Packages/com.unity.shadergraph/Documentation~/Color-Modes.md b/Packages/com.unity.shadergraph/Documentation~/Color-Modes.md index 3b1dff5e8e0..630ac204f20 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Color-Modes.md +++ b/Packages/com.unity.shadergraph/Documentation~/Color-Modes.md @@ -7,6 +7,7 @@ Shader Graph can display colors on nodes in your graph to improve readability. T ![](images/Shader-Graph-Toolbar.png) ## Modes + | Name | Description | |:-----|:------------| | None | Does not display colors on the nodes. All nodes use the default gray. | @@ -15,6 +16,7 @@ Shader Graph can display colors on nodes in your graph to improve readability. T | User Defined | Lets you set the display colors on a per-node basis. These are custom colors for your graph. See **User Defined Colors** below. | ### Category Colors + This mode displays colors on the nodes based on their category. See the [Node Library](Node-Library.md) to learn about the different categories available. ![](images/Color-Mode-Category.png) @@ -31,13 +33,14 @@ The table below lists current categories and their corresponding colors. | Utility | ![#AEAEAE](https://placehold.it/15/AEAEAE/000000?text=+) | #AEAEAE | | UV | ![#08D78B](https://placehold.it/15/08D78B/000000?text=+) | #08D78B | -**Note:** [Sub Graph](Sub-Graph.md) nodes in a main [Shader Graph](Shader-Graph.md) fall in the Utility category. If you select **Category** mode, all Sub Graphs use the Utility color. +**Note:** [Sub Graph](Sub-Graph.md) nodes in a main [Shader Graph](index.md) fall in the Utility category. If you select **Category** mode, all Sub Graphs use the Utility color. ### Precision Colors -This mode displays colors on the nodes based on their current precision. If you set a node to **Inherit Precision**, the display color reflects the currently active precision. See [Precision Modes](Precision-Modes.md) for more information about inheritance. +This mode displays colors on the nodes based on their current precision. If you set a node to **Inherit Precision**, the display color reflects the currently active precision. See [Precision Modes](Precision-Modes.md) for more information about inheritance. ### User Defined Colors + This mode displays colors on the nodes based on user preferences. In this mode, the user defines colors for each node. If a custom color is not set, the node displays in the default gray. To set a custom color for a node, right-click on the target node to bring up the the context menu, and select **Color**. @@ -50,6 +53,7 @@ To set a custom color for a node, right-click on the target node to bring up the ![](images/Color-Mode-User-Defined.png) ## Overriding Default Colors + For each project, you can override preset colors in the **Category** and **Precision** modes. Unity uses a `.uss` style sheet and Hex color codes to set colors. The default style sheet in your project is `Packages/com.unity.shadergraph/Editor/Resources/Styles/ColorMode.uss`. The best practice is to create a copy of this file to override the presets. Under your project's **Assets** folder, create a new `Editor/Resources/Styles` folder structure, and place a copy of `ColorMode.uss` in the `Styles` folder. Change the Hex color codes in this `.uss` file to override the presets and use your own custom colors for the **Category** and **Precision** modes. diff --git a/Packages/com.unity.shadergraph/Documentation~/Compute-Deformation-Node.md b/Packages/com.unity.shadergraph/Documentation~/Compute-Deformation-Node.md index 7c42b23459d..e57aca9f2de 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Compute-Deformation-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Compute-Deformation-Node.md @@ -2,7 +2,7 @@ ## Description -This node lets you pass compute deformed vertex data to a vertex shader, and only works with the [DOTS Hybrid Renderer](https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@latest/). You must provide `DeformedVertexData` in the `_DeformedMeshData` buffer. The node uses the `_ComputeMeshIndex` property to calculate where the `DeformedVertexData` associated with the current mesh are located in the `_DeformedMeshData` buffer. To output data, you must either install both the DOTS Hybrid Renderer and DOTS Animation packages, or use a custom solution. +This node lets you pass compute deformed vertex data to a vertex shader, and only works with the [Entities Graphics package](https://docs.unity3d.com/Packages/com.unity.entities.graphics@latest/). You must provide `DeformedVertexData` in the `_DeformedMeshData` buffer. The node uses the `_ComputeMeshIndex` property to calculate where the `DeformedVertexData` associated with the current mesh are located in the `_DeformedMeshData` buffer. To output data, you must either install both the Entities Graphics package and DOTS Animation packages, or use a custom solution. ## Ports | Name | Direction | Type | Stage | Description | diff --git a/Packages/com.unity.shadergraph/Documentation~/Custom-Function-Node.md b/Packages/com.unity.shadergraph/Documentation~/Custom-Function-Node.md index fe17184e2a6..e03495397c8 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Custom-Function-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Custom-Function-Node.md @@ -39,11 +39,12 @@ void MyFunction_float(float3 A, float B, out float3 Out) ``` ### Defining the Function via file + If you select `File` mode, the graph does not automatically generate the shader function. This mode injects an include reference in the final generated shader, and uses a function from within the referenced file. The `Name` field must match the name of the function you wish to call. The `Source` field contains a reference to the HLSL file that includes the function. ![06](images/Custom-Function-Node-File-wFunction.png) -When you use `File` mode for the Custom Function node, you must manually format the functions properly. One thing to note when creating custom functions for [Shader Graph](Shader-Graph.md) is the precision suffixes. The generated code appends a precision suffix to function names. Your include file function must also append your desired precision suffix (shown below with `_float`), or contain multiple functions with both `_float` and `_half` suffixes, but your `Name` field **must not include the precision suffix**. +When you use `File` mode for the Custom Function node, you must manually format the functions properly. One thing to note when creating custom functions for [Shader Graph](index.md) is the precision suffixes. The generated code appends a precision suffix to function names. Your include file function must also append your desired precision suffix (shown below with `_float`), or contain multiple functions with both `_float` and `_half` suffixes, but your `Name` field **must not include the precision suffix**. ``` //UNITY_SHADER_NO_UPGRADE @@ -107,6 +108,7 @@ void MyFunction_float(float3 A, float B, out float3 Out) ``` ### Reusing Custom Function Nodes + The Custom Function node, on its own, is a single node instance. If you wish to re-use the same custom functions without re-creating the inputs, outputs, and function referencing, use [Sub Graphs](Sub-graph.md). Sub Graphs appear in the [Create Node Menu](Create-Node-Menu.md), and they enable you to share or re-use your custom functions. ![11](images/Custom-Function-Node-Subgraph.png) @@ -114,9 +116,11 @@ The Custom Function node, on its own, is a single node instance. If you wish to Create your custom function either directly in a Sub Graph, or right-click the existing Custom Function node and select `Convert to Sub Graph`. To add the appropriate input and output ports, use the [Graph Inspector](Internal-Inspector.md) and [Custom Port Menu](Custom-Port-Menu.md). After this, you can reuse your custom function as many times as needed, even within other Sub Graphs. ### Working with texture wires + From version 10.3, Shader Graph has five new data structures to ensure that Custom Function Nodes (CFNs) and SubGraphs input and output data from texture wires in a consistent way. The new structures also make it possible for SamplerState to compile on [GLES2](https://en.wikipedia.org/wiki/OpenGL_ES#OpenGL_ES_2.0) platforms and access data associated with textures via `myInputTex.samplerstate` and `myInputTex.texelSize`. Four structures are for the texture types, and one is for the sampler state: + * UnityTexture2D * UnityTexture2DArray * UnityTexture3D diff --git a/Packages/com.unity.shadergraph/Documentation~/Data-Types.md b/Packages/com.unity.shadergraph/Documentation~/Data-Types.md index eb642b4c449..608c0d126dc 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Data-Types.md +++ b/Packages/com.unity.shadergraph/Documentation~/Data-Types.md @@ -2,7 +2,7 @@ ## Description -There are a number of **Data Types** in [Shader Graph](Shader-Graph.md). Each **Port** on a [Node](Node.md) has an associated **Data Type** that defines what edges can be connected to it. The **Data Types** have colors for usability, these colors are applied to ports and edges of that **Data Type**. +There are a number of **Data Types** in [Shader Graph](index.md). Each **Port** on a [Node](Node.md) has an associated **Data Type** that defines what edges can be connected to it. The **Data Types** have colors for usability, these colors are applied to ports and edges of that **Data Type**. Some **Data Types** have associated [Property Types](Property-Types.md) for exposing these values to the [Inspector](https://docs.unity3d.com/Manual/UsingTheInspector.html) for [Materials](https://docs.unity3d.com/Manual/class-Material.html) that use the shader. diff --git a/Packages/com.unity.shadergraph/Documentation~/Diffusion-Profile-Node.md b/Packages/com.unity.shadergraph/Documentation~/Diffusion-Profile-Node.md index 9518f47eefd..cbf498235bf 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Diffusion-Profile-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Diffusion-Profile-Node.md @@ -1,6 +1,6 @@ # Diffusion Profile Node -The Diffusion Profile Node allows you to sample a [Diffusion Profile](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/Diffusion-Profile.html) Asset in your Shader Graph. For information on what a Diffusion Profile is and the properties that it contains, see the [Diffusion Profile documentation](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/Diffusion-Profile.html). +The Diffusion Profile Node allows you to sample a [Diffusion Profile](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/diffusion-profile-reference.html) Asset in your Shader Graph. For information on what a Diffusion Profile is and the properties that it contains, see the [Diffusion Profile documentation](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/diffusion-profile-reference.html). ## Render pipeline compatibility diff --git a/Packages/com.unity.shadergraph/Documentation~/Edge.md b/Packages/com.unity.shadergraph/Documentation~/Edge.md index c9598eec13b..988acaeb150 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Edge.md +++ b/Packages/com.unity.shadergraph/Documentation~/Edge.md @@ -2,7 +2,7 @@ ## Description -An **Edge** defines a connection between two [Ports](Port.md). **Edges** define how data flows through the [Shader Graph](Shader-Graph.md) node network. They can only be connected from an input [Port](Port.md) to an output [Port](Port.md). +An **Edge** defines a connection between two [Ports](Port.md). **Edges** define how data flows through the [Shader Graph](index.md) node network. They can only be connected from an input [Port](Port.md) to an output [Port](Port.md). Each **Edge** has a [Data Type](Data-Types.md) which defines what [Ports](Port.md) it can be connected to. Each [Data Type](Data-Types.md) has an associated color for identifying its type. diff --git a/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md b/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md index f82da938b73..eb9171b14a0 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md +++ b/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md @@ -12,4 +12,4 @@ As of Unity version 2021.2, you can also use Shader Graph with the [Built-In Ren When you install HDRP or URP into your project, Unity also installs the Shader Graph package automatically. You can manually install Shader Graph for use with the Built-In Render Pipeline on Unity version 2021.2 and later with the Package Manager. For more information on how to install a package, see [Adding and removing packages](https://docs.unity3d.com/Manual/upm-ui-actions.html) in the Unity User Manual. -For more information about how to set up a Scriptable Render Pipeline, see [Getting started with HDRP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/Getting-started-with-HDRP.html) or [Getting started with URP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/index.html?subfolder=/manual/InstallingAndConfiguringURP.html). +For more information about how to set up a Scriptable Render Pipeline, see [Getting started with HDRP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@17.0/manual/getting-started-in-hdrp.html) or [Getting started with URP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@17.0/manual/InstallingAndConfiguringURP.html). diff --git a/Packages/com.unity.shadergraph/Documentation~/Gradient-Node.md b/Packages/com.unity.shadergraph/Documentation~/Gradient-Node.md index 3a535911e36..5e0f92d1a7b 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Gradient-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Gradient-Node.md @@ -2,7 +2,7 @@ ## Description -Defines a constant **Gradient** for use in [Shader Graph](Shader-Graph.md), although internally to the shader this is defined as a **struct**. To sample the **Gradient** it should be used in conjunction with a [Sample Gradient Node](Sample-Gradient-Node.md). When using a separate **Gradient Node**, you can sample a **Gradient** multiple times with different Time parameters. +Defines a constant **Gradient** for use in [Shader Graph](index.md), although internally to the shader this is defined as a **struct**. To sample the **Gradient** it should be used in conjunction with a [Sample Gradient Node](Sample-Gradient-Node.md). When using a separate **Gradient Node**, you can sample a **Gradient** multiple times with different Time parameters. ## Ports diff --git a/Packages/com.unity.shadergraph/Documentation~/HD-Sample-Buffer-Node.md b/Packages/com.unity.shadergraph/Documentation~/HD-Sample-Buffer-Node.md index fd06333af29..a000aabae3a 100644 --- a/Packages/com.unity.shadergraph/Documentation~/HD-Sample-Buffer-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/HD-Sample-Buffer-Node.md @@ -33,10 +33,7 @@ The following example code represents one possible outcome of this node: ```c# float4 Unity_HDRP_SampleBuffer_float(float2 uv, SamplerState samplerState) - { - -return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0); - + return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0); } ``` diff --git a/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md b/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md index 62243e97042..f6ee64ffb26 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md +++ b/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md @@ -63,7 +63,7 @@ | [Compute Deformation Node](Compute-Deformation-Node) | [Linear Blend Skinning Node](Linear-Blend-Skinning-Node) | | :----------------------------------------------------------- | :----------------------------------------------------------- | | ![Image](images/ComputeDeformationNodeThumb.png) | ![Image](images/LinearBlendSkinningNodeThumb.png) | -| Passes compute deformed vertex data to a vertex shader. Only works with the [DOTS Hybrid Renderer](https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@latest/). | Applies Linear Blend Vertex Skinning. Only works with the [DOTS Hybrid Renderer](https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@latest/). | +| Passes compute deformed vertex data to a vertex shader. Only works with the [Entities Graphics package](https://docs.unity3d.com/Packages/com.unity.entities.graphics@latest/). | Applies Linear Blend Vertex Skinning. Only works with the [Entities Graphics package](https://docs.unity3d.com/Packages/com.unity.entities.graphics@latest/). | ## PBR diff --git a/Packages/com.unity.shadergraph/Documentation~/Keywords.md b/Packages/com.unity.shadergraph/Documentation~/Keywords.md index 2b1d7df8624..f4af27cd164 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Keywords.md +++ b/Packages/com.unity.shadergraph/Documentation~/Keywords.md @@ -1,10 +1,11 @@ # Keywords ## Description -Use Keywords to create different variants for your Shader Graph. +Use Keywords to create different variants for your Shader Graph. Keywords enable you to create shaders: + * With features that you can turn on or off for each Material instance. * With features that behave differently on certain platforms. * That scale in complexity based on conditions you set. @@ -15,44 +16,37 @@ In Shader Graph, you first define a Keyword on the [Blackboard](Blackboard.md), The Editor is able to compile variants on demand when it needs them to render content. If you declare many different variants, you can end up with millions or trillions of possibilities. However, the Player needs to determine at build time which variants are in use and include them when it pre-compiles your shaders. To manage memory effectively, the Player strips unused variants based on their keyword and Editor settings. See the next section, Common parameters, to learn more about how you can give the Player hints about what it needs to compile and what it can ignore. When the Player strips out a variant in the build process, it displays the pink error shader. - ## Common parameters + Although some fields are specific to certain types of Keywords, all Keywords have the following parameters. | **Name** | **Type** | **Description** | | ------------------ | -------- | ------------------------------------------------------------ | | **Display Name** | String | The display name of the Keyword. Unity shows this name in the title bar of nodes that reference the corresponding Keyword, and also in the Material Inspector if you expose that Keyword. | -| **Exposed** | Boolean | When you set this parameter to **true**, Unity displays this Keyword in the Material Inspector. If you set it to **false**, the Keyword does not appear in the Material Inspector.

If you intend to access a GLOBAL shader variable, be sure to add it as you would normally add an input variable, but deselect **Exposed**.| -| **Reference Name** | String | The internal name for the Keyword in the shader.

If you overwrite the Reference Name parameter, take note of the following:
• Keyword Reference Names are always in full capitals, so Unity converts all lowercase letters to uppercase.
• If the Reference Name contains any characters that HLSL does not support, Unity replaces those characters with underscores.
• Right-click on a Reference Name, and select **Reset Reference** to revert to the default Reference Name. | -| **Definition** | Enum | Sets how the Keyword is defined in the shader. Determines when to compile keyword variants. -

There are three available options.
• **Shader Feature**: Unity only compiles keyword variants when a Material selects the relevant option. For this option to be available in the Player, a Material selecting it must exist at build-time.
• **Multi Compile**:Pre-compiles all the variant possibilities. This is slower and uses more memory, but allows the option to be dynamically switched in the Player. -
• **Predefined**: The render pipeline defines this keyword and controls the settings for it. | -| **Scope** | Enum | Sets the scope at which to define the Keyword.

• **Global Keywords**: Defines Keyword for the entire project, and it counts towards the global keyword limit.
• **Local Keywords**: Defines Keyword for only one shader, which has its own local keyword limit.

When you use Predefined Keywords, Unity disables this field. | -| **Stages** | |
• **All** - Applies this keyword to all shader stages. -
•**Vertex** - Applies this keyword to the vertex stage. -
•**Fragment** - Applies this keyword to the fragment stage. -| - +| **Exposed** | Boolean | When you set this parameter to **true**, Unity displays this Keyword in the Material Inspector. If you set it to **false**, the Keyword does not appear in the Material Inspector.

If you intend to access a GLOBAL shader variable, be sure to add it as you would normally add an input variable, but deselect **Exposed**.| +| **Reference Name** | String | The internal name for the Keyword in the shader.

If you overwrite the Reference Name parameter, take note of the following:
  • Keyword Reference Names are always in full capitals, so Unity converts all lowercase letters to uppercase.
  • If the Reference Name contains any characters that HLSL does not support, Unity replaces those characters with underscores.
  • Right-click on a Reference Name, and select **Reset Reference** to revert to the default Reference Name.
    • | +| **Definition** | Enum | Sets how the Keyword is defined in the shader. Determines when to compile keyword variants.

      There are three available options:
      • **Shader Feature**: Unity only compiles keyword variants when a Material selects the relevant option. For this option to be available in the Player, a Material selecting it must exist at build-time.
      • **Multi Compile**: Pre-compiles all the variant possibilities. This is slower and uses more memory, but allows the option to be dynamically switched in the Player.
      • **Predefined**: The render pipeline defines this keyword and controls the settings for it.
        • | +| **Scope** | Enum | Sets the scope at which to define the Keyword.

          The following options are available:
          • **Global Keywords**: Defines Keyword for the entire project, and it counts towards the global keyword limit.
          • **Local Keywords**: Defines Keyword for only one shader, which has its own local keyword limit.
            • When you use Predefined Keywords, Unity disables this field. | +| **Stages** | | Set the stage the keyword applies to.

              The following options are available:
              • **All** - Applies this keyword to all shader stages.
              • **Vertex** - Applies this keyword to the vertex stage.
              • **Fragment** - Applies this keyword to the fragment stage.
                • | ## Boolean Keywords -Boolean Keywords are either on or off. This results in two shader variants. Unity exposes Boolean Keywords in the Material Inspector if the Exposed parameter is set to is true. To enable the keyword from a script, use EnableKeyword on the keyword's Reference name. DisableKeyword disables the keyword. To learn more about Boolean Keywords, see [Shader variants and keywords](https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html). +Boolean Keywords are either on or off. This results in two shader variants. Unity exposes Boolean Keywords in the Material Inspector if the Exposed parameter is set to is true. To enable the keyword from a script, use EnableKeyword on the keyword's Reference name. DisableKeyword disables the keyword. To learn more about Boolean Keywords, see [Shader variants and keywords](https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html). ![](images/keywords_boolean.png) ### Type-specific parameters + Boolean Keywords have one Boolean-specific parameter in addition to the common parameters listed above. | **Name** | **Type** | **Description** | | ----------- | -------- | ------------------------------------------------------------ | -| **Default** | Boolean |Enable this parameter to set the Keyword's default state to on, and disable it to set the Keyword's default state to off. -

                  -This parameter determines the value to use for the Keyword when Shader Graph generates previews. It also defines the Keyword's default value when you use this shader to create a new Material. - | +| **Default** | Boolean |Enable this parameter to set the Keyword's default state to on, and disable it to set the Keyword's default state to off.

                  This parameter determines the value to use for the Keyword when Shader Graph generates previews. It also defines the Keyword's default value when you use this shader to create a new Material. | ## Enum Keywords + Enum Keywords can have two or more states, which you define in the **Entries** list. If you expose an Enum Keyword, the **Display Names** in its **Entries** list appear in a dropdown menu in the Material Inspector. Special characters such as ( ) or ! @ are not valid in the **Entry Name** of an Enum Keyword. Shader Graph converts invalid characters to underscores ( _ ). @@ -60,11 +54,10 @@ Special characters such as ( ) or ! @ are not valid in the **Entry Name** of an When you define an Enum Keyword, Shader Graph displays labels for each state consisting of a sanitized version of the Enum's **Entry Name** appended to the main **Reference** name. When controlling a keyword via script with a, Material.EnableKeyword or Shader.EnableKeyword function, enter the state label in the format {REFERENCE}_{REFERENCESUFFIX}. For example, if your reference name is MYENUM and the desired entry is OPTION1, then you would call Material.EnableKeyword("MYENUM_OPTION1"). When you select an option, this disables the other options. - - ![](images/keywords_enum.png) ### Type-specific parameters + In addition to the common parameters listed above, Enum Keywords have the following additional parameters. | **Name** | **Type** | **Description** | @@ -72,14 +65,17 @@ In addition to the common parameters listed above, Enum Keywords have the follow | **Default** | Enum | Select an entry from the drop-down menu to determine which value to use for the Keyword when Shader Graph generates previews. This also defines the Keyword's default value when you use this shader to create a new Material. When you edit the Entries list, Shader Graph automatically updates the options in this control. | | **Entries** | Reorderable List | This list defines all the states for the Keyword. Each state has a separate **Display Name** and **Reference Suffix**.

                  • **Display Name**: Appears in drop-down menus for the Keyword on the [Internal Inspector](Internal-Inspector.md) and the Material Inspector. Shader Graph also uses this name for port labels on nodes that reference the Keyword.
                  • **Reference Suffix**: This is the final keyword, presented in the format Reference_ReferenceSuffix. | - ## Built-in Keywords + Built-in Keywords are always of either the Boolean or Enum type, but they behave slightly differently from Boolean or Enum Keywords that you create. The Unity Editor or active Render Pipeline sets their values, and you cannot edit these. All Built-in Keyword fields in the **Node Settings** tab of the [Graph Inspector](Internal-Inspector.md) are grayed out except for the **Default** field, which you can enable or disable to show the differences in Shader Graph previews. You also cannot expose Built-in Keywords in the Material Inspector. -In an HDRP project, you can find the current quality level in the Material section of the [HDRP Asset](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/manual/quality-settings.html#using-the-current-quality-settings-parameters). For URP projects, the feature is not supported, but you can use the SetGloalShaderKeywords command to set the [MaterialQuality](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/api/UnityEngine.Rendering.MaterialQuality.html) Enum in the script. For example, the following line would set Material Quality to High: -`MaterialQualityUtilities.SetGlobalShaderKeywords( MaterialQuality.High );` +In an HDRP project, you can find the current quality level in the Material section of the [HDRP Asset](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/manual/quality-settings.html#using-the-current-quality-settings-parameters). For URP projects, the feature is not supported, but you can use the `SetGloalShaderKeywords` command to set the [MaterialQuality](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/api/UnityEngine.Rendering.MaterialQuality.html) Enum in the script. For example, the following line would set Material Quality to High: + +```c# +MaterialQualityUtilities.SetGlobalShaderKeywords( MaterialQuality.High ); +``` ![](images/keywords_built-in.png) diff --git a/Packages/com.unity.shadergraph/Documentation~/Linear-Blend-Skinning-Node.md b/Packages/com.unity.shadergraph/Documentation~/Linear-Blend-Skinning-Node.md index 79a0db69422..6af3d752a57 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Linear-Blend-Skinning-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Linear-Blend-Skinning-Node.md @@ -2,7 +2,7 @@ ## Description -This node lets you apply Linear Blend Vertex Skinning, and only works with the [DOTS Hybrid Renderer](https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@latest/). You must provide skinned matrices in the `_SkinMatrices` buffer. The node uses the `_SkinMatrixIndex` property to calculate where the matrices associated with the current mesh are located in the `_SkinMatrices` buffer. +This node lets you apply Linear Blend Vertex Skinning, and only works with the [Entities Graphics package](https://docs.unity3d.com/Packages/com.unity.entities.graphics@latest/). You must provide skinned matrices in the `_SkinMatrices` buffer. The node uses the `_SkinMatrixIndex` property to calculate where the matrices associated with the current mesh are located in the `_SkinMatrices` buffer. ## Ports | Name | Direction | Type | Stage | Description | diff --git a/Packages/com.unity.shadergraph/Documentation~/Preview-Node.md b/Packages/com.unity.shadergraph/Documentation~/Preview-Node.md index 94ce611493c..ec033b95565 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Preview-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Preview-Node.md @@ -2,7 +2,7 @@ ## Description -This node enables you to inspect a preview at a specific point in a [Shader Graph](Shader-Graph.md). It does not modify any input values. +This node enables you to inspect a preview at a specific point in a [Shader Graph](index.md). It does not modify any input values. By default, the Editor automatically selects a preview mode. That decision is determined by both the type of the node you are previewing and other upstream nodes. With [Preview Mode Control](Preview-Mode-Control), you can manually select your preferred preview mode. diff --git a/Packages/com.unity.shadergraph/Documentation~/Property-Types.md b/Packages/com.unity.shadergraph/Documentation~/Property-Types.md index 684e1a7c367..ac71da5e5aa 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Property-Types.md +++ b/Packages/com.unity.shadergraph/Documentation~/Property-Types.md @@ -19,9 +19,10 @@ In addition to values specific to their [Data Types](Data-Types.md), most proper | Shader Declaration | Enumeration | Controls the shader declaration of this property | NOTE: If you overwrite the **Reference Name** parameter be aware of the following conditions: -- If your **Reference Name** does not begin with an underscore, one will be automatically appended. -- If your **Reference Name** contains any characters which are unsupported in HLSL they will be removed. -- You can revert to the default **Reference Name** by right clicking on it and selecting **Reset Reference**. + +* If your **Reference Name** does not begin with an underscore, one will be automatically appended. +* If your **Reference Name** contains any characters which are unsupported in HLSL they will be removed. +* You can revert to the default **Reference Name** by right clicking on it and selecting **Reset Reference**. ## Float @@ -167,6 +168,7 @@ Defines a [Cubemap](https://docs.unity3d.com/Manual/class-Cubemap.html) value. D | Field | Type | Description | |:-------------|:------|:------------| | Default | Cubemap | The default value of the [Property](https://docs.unity3d.com/Manual/SL-Properties.html). | + ## Virtual Texture diff --git a/Packages/com.unity.shadergraph/Documentation~/UV-Nodes.md b/Packages/com.unity.shadergraph/Documentation~/UV-Nodes.md index 5a3b32474b4..e5076f9438b 100644 --- a/Packages/com.unity.shadergraph/Documentation~/UV-Nodes.md +++ b/Packages/com.unity.shadergraph/Documentation~/UV-Nodes.md @@ -2,14 +2,17 @@ | [Flipbook](Flipbook-Node.md) | [Polar Coordinates](Polar-Coordinates-Node.md) | | :--------------- | :-------- | -| ![Image](images/FlipbookNodeThumb.png) | ![Image](images/PolarCoordinatesNodeThumb.png) | +| ![Example of the Flipbook Node](images/FlipbookNodeThumb.png) | ![Example of the Polar Coordinates Node](images/PolarCoordinatesNodeThumb.png) | | Creates a flipbook, or texture sheet animation, of the UVs supplied to input In. | Converts the value of input UV to polar coordinates. | | [**Radial Shear**](Radial-Shear-Node.md) | [**Rotate**](Rotate-Node.md) | -| ![Image](images/RadialShearNodeThumb.png) | ![Image](images/RotateNodeThumb.png) | +| ![Example of the Radial Shear Node](images/RadialShearNodeThumb.png) | ![Example of the Rotate Node](images/RotateNodeThumb.png) | | Applies a radial shear warping effect similar to a wave to the value of input UV. | Rotates the value of input UV around a reference point defined by input Center by the amount of input Rotation. | | [**Spherize**](Spherize-Node.md) | [**Tiling and Offset**](Tiling-And-Offset-Node.md) | -| ![Image](images/SpherizeNodeThumb.png) | ![Image](images/TilingAndOffsetNodeThumb.png) | +| ![Example of the Spherize Node](images/SpherizeNodeThumb.png) | ![Example of the Tiling and Offset Node](images/TilingAndOffsetNodeThumb.png) | | Applies a spherical warping effect similar to a fisheye camera lens to the value of input UV. | Tiles and offsets the value of input UV by the inputs Tiling and Offset respectively. | | [**Triplanar**](Triplanar-Node.md) | [**Twirl**](Twirl-Node.md) | -| ![Image](images/TriplanarNodeThumb.png) | ![Image](images/TwirlNodeThumb.png) | +| ![Example of the Triplanar Node](images/TriplanarNodeThumb.png) | ![Example of the Twirl Node](images/TwirlNodeThumb.png) | | A method of generating UVs and sampling a texture by projecting in world space. | Applies a twirl warping effect similar to a black hole to the value of input UV. | +| [**Parallax Mapping**](Parallax-Mapping-Node.md) | [**Parallax Occlusion Mapping**](Parallax-Occlusion-Mapping-Node.md) | +| ![Example of the Parallax Mapping Node](images/ParallaxOcclusionMappingThumb.png) | ![Example of the Parallax Occlusion Mapping Node](images/ParallaxOcclusionMappingNodeThumb.PNG) | +| Creates a parallax effect that displaces a material's UVs. | Creates a parallax effect that displaces a material's UVs and depth. | diff --git a/Packages/com.unity.shadergraph/Documentation~/images/ParallaxMappingNodeThumb.PNG b/Packages/com.unity.shadergraph/Documentation~/images/ParallaxMappingNodeThumb.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5a7fbe8f5ab1d849fb7ae6756fdb82bb03243f1c GIT binary patch literal 22422 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 QkfqCIVQORY0`C&_UoN&4hX4Qo literal 0 HcmV?d00001 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/ParallaxOcclusionMappingNodeThumb.PNG b/Packages/com.unity.shadergraph/Documentation~/images/ParallaxOcclusionMappingNodeThumb.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a5cf5b89257f93ea9ab404127ba0fa6e318b2150 GIT binary patch literal 36992 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 j22FIYgf{#|3f}!^PZChAG)yQKW&i?DS3j3^P6 Date: Thu, 2 May 2024 16:14:34 +0000 Subject: [PATCH 17/67] [Graphics Tools] Fix icons used by HDRP Wizard Wrong icons used by the HDRP wizard. https://jira.unity3d.com/browse/UUM-69942 --- .../Editor/Wizard/HDWizard.UIElement.cs | 23 ++-- .../Editor/Wizard/WizardResources.meta | 8 -- .../Editor/Wizard/WizardResources/Error.png | Bin 230 -> 0 bytes .../Wizard/WizardResources/Error.png.meta | 115 ------------------ .../Editor/Wizard/WizardResources/OK.png | Bin 241 -> 0 bytes .../Editor/Wizard/WizardResources/OK.png.meta | 115 ------------------ 6 files changed, 14 insertions(+), 247 deletions(-) delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources.meta delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png.meta delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png.meta diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/HDWizard.UIElement.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/HDWizard.UIElement.cs index ed2417fe064..ba90aab1e4e 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/HDWizard.UIElement.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/HDWizard.UIElement.cs @@ -329,11 +329,6 @@ class ConfigInfoLine : VisualElementUpdatable { static class Style { - const string k_IconFolder = @"Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/"; - public static readonly Texture ok = CoreEditorUtils.LoadIcon(k_IconFolder, "OK"); - public static readonly Texture error = CoreEditorUtils.LoadIcon(k_IconFolder, "Error"); - public static readonly Texture warning = CoreEditorUtils.LoadIcon(k_IconFolder, "Warning"); - public const int k_IndentStepSize = 15; } @@ -360,13 +355,23 @@ public ConfigInfoLine(string label, string error, MessageType messageType, strin { var statusOK = new Image() { - image = Style.ok, - name = "StatusOK" + image = CoreEditorStyles.iconComplete, + name = "StatusOK", + style = + { + height = 16, + width = 16 + } }; var statusKO = new Image() { - image = Style.error, - name = "StatusError" + image = CoreEditorStyles.iconFail, + name = "StatusError", + style = + { + height = 16, + width = 16 + } }; testRow.Add(statusOK); testRow.Add(statusKO); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources.meta b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources.meta deleted file mode 100644 index f07e2cbb099..00000000000 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 783b6a6383182294b8e9b465e2d7d684 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png deleted file mode 100644 index 8bba82fc9a5f22a525e19c2b52eabedba2755063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k&H|6fVg?31We{epSZZGe6l5>) z^mS!_%qqyo$$Gt9?i5g{)zif>MC1I_{@sGj1_G?%ub8C*RtZQPFiZXTve`$`wBdJv zahcPCiSLhXxHx;~&FXTsDt9;TJ?H;0^p#}%Oby(mvBe>{t=A}r;p)vrT-_HevYpsX zngSU8J!f2;S+p>G+j8CYAv1oQ=SWyoZo8ql_n_By@$3Z=%{P)7qvFzz#QS`CcbIqI YR6Q|H)f3%|fevEuboFyt=akR{00`|;J^%m! diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png.meta b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png.meta deleted file mode 100644 index 89af7e523c2..00000000000 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/Error.png.meta +++ /dev/null @@ -1,115 +0,0 @@ -fileFormatVersion: 2 -guid: b9ba8ba73504d5344a9b8a1c64107c86 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 10 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: 1 - wrapV: 1 - wrapW: -1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 0 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 8 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 32 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Standalone - maxTextureSize: 32 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Windows Store Apps - maxTextureSize: 32 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png deleted file mode 100644 index 77a552e3a4bcf693d6285005a8c4a18c15d8a211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k&H|6fVg?31We{epSZZGe6l5>) z^mS!_%qqyoY5H-UUK&tnf~SjPh{pM;mk#na8}PI~ygzdZb3rR_0`rX}u}!`w*fuck zEEDg07Ov9y6%)^|=K jLz7O>G5cnlzf#u!Ut3P}jyO;bbQ^=GtDnm{r-UW|M*dT_ diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png.meta b/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png.meta deleted file mode 100644 index e4d60ce96e5..00000000000 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Wizard/WizardResources/OK.png.meta +++ /dev/null @@ -1,115 +0,0 @@ -fileFormatVersion: 2 -guid: a8359114ca9cc0a448b8172a6a236330 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 10 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: 1 - wrapV: 1 - wrapW: -1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 0 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 8 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 32 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Standalone - maxTextureSize: 32 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Windows Store Apps - maxTextureSize: 32 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: From 4915f848c4dc92bde8cccaae86e7347cb4327407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Thu, 2 May 2024 16:14:36 +0000 Subject: [PATCH 18/67] Rendering Debugger - Keep the selected panel when entering playmode and the panel count changes. There are debug panels that only appear when the editor is in playmode. Such as Display Stats. Display stats, always appears on top of the Rendering Debugger panels list. This makes the indexes shift. The editor debug window is storing the id of the selected panel, and not the name. Names do not change between entering/exiting playmode. So is safer to keep the display name, And retrieve the current panel index from the DebugManager when requested. --- .../Editor/Debugging/DebugWindow.cs | 14 +++++++++++++- .../Runtime/Debugging/DebugManager.cs | 13 +++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs b/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs index d2b5373c36e..f55dd0ec0e2 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugWindow.cs @@ -25,7 +25,19 @@ sealed class DebugWindowSettings : ScriptableObject // Keep these settings in a separate scriptable object so we can handle undo/redo on them // without the rest of the debug window interfering public int currentStateHash; - public int selectedPanel; + + public int selectedPanel + { + get => Mathf.Max(0, DebugManager.instance.PanelIndex(selectedPanelDisplayName)); + set + { + var displayName = DebugManager.instance.PanelDiplayName(value); + if (!string.IsNullOrEmpty(displayName)) + selectedPanelDisplayName = displayName; + } + } + + public string selectedPanelDisplayName; void OnEnable() { diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs index c40e089f39e..846edd43722 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugManager.cs @@ -247,6 +247,19 @@ public int PanelIndex([DisallowNull] string displayName) return -1; } + /// + /// Returns the panel display name + /// + /// The panelIndex for the panel to get the name + /// The display name of the panel, or empty string otherwise + public string PanelDiplayName([DisallowNull] int panelIndex) + { + if (panelIndex < 0 || panelIndex > m_Panels.Count - 1) + return string.Empty; + + return m_Panels[panelIndex].displayName; + } + /// /// Request DebugWindow to open the specified panel. /// From 23c35f4824a66fe0cc5ba965ae3f037133466935 Mon Sep 17 00:00:00 2001 From: Ludovic Theobald Date: Thu, 2 May 2024 20:00:27 +0000 Subject: [PATCH 19/67] [VFX][Fix] Fix NullReferenceException in RefreshVfxErrors() This PR fixes a NullReferenceException occuring when changing decals settings in HDRP while VFX window is present but hidden in the layout. --- .../Editor/VFXGraph/Utility/VFXHDRPSettingsUtility.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Utility/VFXHDRPSettingsUtility.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Utility/VFXHDRPSettingsUtility.cs index b9fd4331b60..7378c0a226a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Utility/VFXHDRPSettingsUtility.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/VFXGraph/Utility/VFXHDRPSettingsUtility.cs @@ -9,7 +9,7 @@ public static void RefreshVfxErrorsIfNeeded() { foreach (var vfxWindow in VFXViewWindow.GetAllWindows()) { - if (vfxWindow != null) + if (vfxWindow != null && vfxWindow.graphView != null ) { var vfxGraph = vfxWindow.graphView.controller.graph; foreach (var output in vfxGraph.children.OfType()) From 336648b869a2efaef2cbf9a9cdd369d35c33ff01 Mon Sep 17 00:00:00 2001 From: Oleksandr Kokoshyn Date: Fri, 3 May 2024 21:20:02 +0000 Subject: [PATCH 20/67] Docs quality sprint 17 April, Oleks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs quality sprint 17 April, Oleks Tickets in this PR: DOCG-5296. "a combination of 2D and 3D Lights and 2D and 3D Renderers in a single Scene" DOCG-4772. Unlit shaders edit. DOCG-5083 cameraOutput is not a property of UniversalAdditionalCamera… DOCG-4935 There should be {} at the end of the property after "white" DOCG-5449. Spelling error. --- .../Documentation~/Lights-2D-intro.md | 2 +- .../cameras/apply-different-post-proc-to-cameras.md | 2 +- .../Documentation~/cameras/camera-stacking-concepts.md | 4 ++++ .../Documentation~/rendering-to-a-render-texture.md | 3 +-- .../Documentation~/shading-model.md | 2 +- .../Documentation~/writing-shaders-urp-unlit-texture.md | 4 ++-- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/Lights-2D-intro.md b/Packages/com.unity.render-pipelines.universal/Documentation~/Lights-2D-intro.md index 1ddf1db50d6..1a1d872cd4e 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/Lights-2D-intro.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/Lights-2D-intro.md @@ -16,7 +16,7 @@ The 2D lighting model was designed specifically to work with 2D worlds that are The lighting calculation in 2D Lights is not physics based as it is with 3D Lights. The details of the lighting model calculation can be found here. ### No interoperability with 3D Lights and 3D Renderers -Currently both 3D and 2D Lights can only affect 3D and 2D Renderers respectively. 2D Lighting does not work on or effect 3D Renderers such as the [Mesh Renderer](https://docs.unity3d.com/Manual/class-MeshRenderer.html), while 3D Lighting will similarly have no effect on 2D Renderers such as the [Sprite Renderer](https://docs.unity3d.com/Manual/class-SpriteRenderer.html). While interoperability between the respective Lights and Renderers may be developed in the future, currently a combination of 2D and 3D Lights and 2D and 3D Renderers in a single scene can be achieved by using the camera stacking technique. +3D and 2D Lights can only affect 3D and 2D Renderers respectively. 2D Lighting does not work on or effect 3D Renderers such as the [Mesh Renderer](https://docs.unity3d.com/Manual/class-MeshRenderer.html), while 3D Lighting will similarly have no effect on 2D Renderers such as the [Sprite Renderer](https://docs.unity3d.com/Manual/class-SpriteRenderer.html). Currently, to achieve a combination of 2D and 3D Lights and 2D and 3D Renderers in a single Scene, you can use multiple cameras and have one of the cameras render to a [Render Texture](https://docs.unity3d.com/Manual/class-RenderTexture.html), and sample that texture in a material rendered by another camera. ## Technical details of the 2D Lighting graphics pipeline The 2D Lighting graphics pipeline rendering process can be broken down into 2 distinct phases: diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/apply-different-post-proc-to-cameras.md b/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/apply-different-post-proc-to-cameras.md index 73de81df8db..7831e223eb9 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/apply-different-post-proc-to-cameras.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/apply-different-post-proc-to-cameras.md @@ -24,7 +24,7 @@ With the scene set up, the following steps show how to create and apply a post-p 3. Select the **Layer** dropdown and choose one of the layers created when you set up the scene. 4. Select the camera you want to apply this effect to. 5. In the Inspector window, go to **Environment** > **Volume Mask** and select the same layer that you chose for the GameObject. -6. Repeat stpes 1-5 for each GameObject and Camera pair that your scene requires. +6. Repeat steps 1-5 for each GameObject and Camera pair that your scene requires. > [!NOTE] > Some effects apply to all cameras in a scene by default. As a result of this, you might need to add the same effect to each volume. This overrides the effects from other volumes on individual cameras with the new values that you set. diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/camera-stacking-concepts.md b/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/camera-stacking-concepts.md index 1fa87f935db..e8cf8405574 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/camera-stacking-concepts.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/cameras/camera-stacking-concepts.md @@ -17,6 +17,10 @@ You should only apply post-processing to the last camera in the stack, so the fo * URP renders the post-processing effects only once, not repeatedly for each camera. * The visual effects are consistent, because all the cameras in the stack receive the same post-processing. +## Limitations + +You cannot use a mix of different types of renderers (2D and 3D) for cameras in a camera stack. + ## Additional resources * [Set up a camera stack](../camera-stacking.md) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/rendering-to-a-render-texture.md b/Packages/com.unity.render-pipelines.universal/Documentation~/rendering-to-a-render-texture.md index 8eb8b0be1a3..c1b84c5b984 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/rendering-to-a-render-texture.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/rendering-to-a-render-texture.md @@ -18,9 +18,8 @@ If you have a Camera that is rendering to a Render Texture, you must have a seco The first Camera now renders its view to the Render Texture. The second Camera renders the scene including the Render Texture to the screen. -You can set the Output Target for a Camera in a script by setting the `cameraOutput` property of the Camera's [Universal Additional Camera Data](xref:UnityEngine.Rendering.Universal.UniversalAdditionalCameraData) component, like this: +You can set the output target for a camera in a script by setting the `targetTexture` property of the camera: ```c# -myUniversalAdditionalCameraData.cameraOutput = CameraOutput.Texture; myCamera.targetTexture = myRenderTexture; ``` diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/shading-model.md b/Packages/com.unity.render-pipelines.universal/Documentation~/shading-model.md index aff4029b2ac..235c3005d16 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/shading-model.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/shading-model.md @@ -52,7 +52,7 @@ The URP Baked Lit shader is the only shader that uses the Baked Lit shading mode ## Shaders with no lighting -URP comes with some Shaders that are Unlit. This means that they have no directional lights and no baked lighting. Because there are no light calculations, these shaders compile faster than Shaders with lighting. If you know in advance that your GameObject or visual doesn’t need lighting, choose an Unlit shader to save calculation and build time in your final product. +URP comes with some unlit-type shaders. Materials with unlit-type shaders are not affected by neither real-time, nor baked lighting. Unlit shaders let you create unique visual look of the objects in your scene. Unlit shaders have significantly faster compilation speed compared with lit shaders. The following URP Shaders have no lighting: * [Unlit](unlit-shader.md) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/writing-shaders-urp-unlit-texture.md b/Packages/com.unity.render-pipelines.universal/Documentation~/writing-shaders-urp-unlit-texture.md index 5ee7d062a95..93026b35dc0 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/writing-shaders-urp-unlit-texture.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/writing-shaders-urp-unlit-texture.md @@ -9,7 +9,7 @@ Use the Unity shader source file from section [URP unlit shader with color input ```c++ Properties { - [MainTexture] _BaseMap("Base Map", 2D) = "white" + [MainTexture] _BaseMap("Base Map", 2D) = "white" {} } ``` @@ -78,7 +78,7 @@ Shader "Example/URPUnlitShaderTexture" // called Base Map. Properties { - [MainTexture] _BaseMap("Base Map", 2D) = "white" + [MainTexture] _BaseMap("Base Map", 2D) = "white" {} } SubShader From 6f0aaefd9246601d8c1e3d00f5e4eebbe96df290 Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Fri, 3 May 2024 21:20:04 +0000 Subject: [PATCH 21/67] Graphics/SRP/RPF - Render Graph - Adding better warning message in empty RecordRenderGraph This PR improves the warning message displayed when a URP Render Pass has no Render Graph implementation. --- .../Runtime/Passes/ScriptableRenderPass.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs index 5e44031798c..534df03310a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs @@ -671,7 +671,7 @@ public virtual void Execute(ScriptableRenderContext context, ref RenderingData r /// public virtual void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - Debug.LogWarning("RecordRenderGraph is not implemented, the pass " + this.ToString() + " won't be recorded in the current RenderGraph."); + Debug.LogWarning("The render pass " + this.ToString() + " does not have an implementation of the RecordRenderGraph method. Please implement this method, or consider turning on Compatibility Mode (RenderGraph disabled) in the menu Edit > Project Settings > Graphics > URP. Otherwise the render pass will have no effect. For more information, refer to https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/index.html?subfolder=/manual/customizing-urp.html."); } /// From 1063b539918e553bb820aba6c6e02a4376e5a151 Mon Sep 17 00:00:00 2001 From: Gabriel de la Cruz Date: Sat, 4 May 2024 06:38:23 +0000 Subject: [PATCH 22/67] [VFX] Fix exposed properties reset when editing multiple VFX at the same time on inspector When selecting multiple VFX with exposed properties, if those exposed properties had different values, any change in the inspector was resetting the values of the exposed properties, because we were not tracking GUI changes locally. This issue was also responsible of the Allow Instancing property not being properly applied when selecting multiple objects. This PR also adds a property drawer for animation curves, that were not displayed if multiple objects with different exposed animation curves were selected. image --- .../Editor/Inspector/VisualEffectEditor.cs | 78 +++++++++++++------ 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs index cbb829b2879..a71a2c23888 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs @@ -205,16 +205,18 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser { Vector4 vVal = valueProperty.vector4Value; Color c = new Color(vVal.x, vVal.y, vVal.z, vVal.w); + EditorGUI.BeginChangeCheck(); c = EditorGUI.ColorField(rect, nameContent, c, true, true, true); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) valueProperty.vector4Value = new Vector4(c.r, c.g, c.b, c.a); } else if (parameter.realType == typeof(Gradient).Name) { + EditorGUI.BeginChangeCheck(); Gradient newGradient = EditorGUI.GradientField(rect, nameContent, valueProperty.gradientValue, true, ColorSpace.Linear); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) valueProperty.gradientValue = newGradient; } else if (valueProperty.propertyType == SerializedPropertyType.Vector4) @@ -261,9 +263,10 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser { Vector4 vVal = valueProperty.vector4Value; Color c = new Color(vVal.x, vVal.y, vVal.z, vVal.w); + EditorGUI.BeginChangeCheck(); c = EditorGUI.ColorField(rect, nameContent, c, true, true, true); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.vector4Value = new Vector4(c.r, c.g, c.b, c.a); changed = true; @@ -271,8 +274,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser } else { + EditorGUI.BeginChangeCheck(); Vector4 result = EditorGUI.Vector4Field(rect, nameContent, Vector4.zero); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.vector4Value = result; changed = true; @@ -281,8 +285,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser break; case SerializedPropertyType.Vector3: { + EditorGUI.BeginChangeCheck(); Vector3 result = EditorGUI.Vector3Field(rect, nameContent, Vector3.zero); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.vector3Value = result; changed = true; @@ -291,14 +296,26 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser break; case SerializedPropertyType.Vector2: { + EditorGUI.BeginChangeCheck(); Vector2 result = EditorGUI.Vector2Field(rect, nameContent, Vector2.zero); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.vector2Value = result; changed = true; } } break; + case SerializedPropertyType.Boolean: + { + EditorGUI.BeginChangeCheck(); + bool result = EditorGUI.Toggle(rect, nameContent, false); + if (EditorGUI.EndChangeCheck()) + { + valueProperty.boolValue = result; + changed = true; + } + } + break; case SerializedPropertyType.ObjectReference: { Type objTyp = typeof(UnityObject); @@ -313,8 +330,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser objTyp = typeof(Mesh); } } + EditorGUI.BeginChangeCheck(); UnityObject result = EditorGUI.ObjectField(rect, nameContent, null, objTyp, false); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.objectReferenceValue = result; changed = true; @@ -324,8 +342,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser case SerializedPropertyType.Float: if (parameter.min != Mathf.NegativeInfinity && parameter.max != Mathf.Infinity) { + EditorGUI.BeginChangeCheck(); float value = EditorGUI.Slider(rect, nameContent, 0, parameter.min, parameter.max); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.floatValue = value; changed = true; @@ -333,8 +352,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser } else { + EditorGUI.BeginChangeCheck(); float value = EditorGUI.FloatField(rect, nameContent, 0); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.floatValue = value; changed = true; @@ -344,8 +364,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser case SerializedPropertyType.Integer: if (parameter.min != Mathf.NegativeInfinity && parameter.max != Mathf.Infinity) { + EditorGUI.BeginChangeCheck(); int value = EditorGUI.IntSlider(rect, nameContent, 0, (int)parameter.min, (int)parameter.max); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.intValue = value; changed = true; @@ -353,8 +374,9 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser } else if (parameter.enumValues != null && parameter.enumValues.Count > 0) { + EditorGUI.BeginChangeCheck(); int newIndex = EditorGUI.Popup(rect, nameContent, (int)0, parameter.enumValues.ToArray()); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.intValue = newIndex; changed = true; @@ -362,26 +384,36 @@ bool DisplayProperty(ref VFXParameterInfo parameter, GUIContent nameContent, Ser } else { + EditorGUI.BeginChangeCheck(); int value = EditorGUI.IntField(rect, nameContent, 0); - if (GUI.changed) + if (EditorGUI.EndChangeCheck()) { valueProperty.intValue = value; changed = true; } } break; - default: - if (parameter.realType == typeof(Gradient).Name) + case SerializedPropertyType.AnimationCurve: + EditorGUI.BeginChangeCheck(); + AnimationCurve animationCurve = EditorGUI.CurveField(rect, nameContent, new AnimationCurve()); + if (EditorGUI.EndChangeCheck()) { - Gradient newGradient = EditorGUI.GradientField(rect, nameContent, s_DefaultGradient, true); - - if (GUI.changed) - { - valueProperty.gradientValue = newGradient; - changed = true; - } + valueProperty.animationCurveValue = animationCurve; + changed = true; + } + break; + case SerializedPropertyType.Gradient: + EditorGUI.BeginChangeCheck(); + Gradient newGradient = EditorGUI.GradientField(rect, nameContent, s_DefaultGradient, true); + if (EditorGUI.EndChangeCheck()) + { + valueProperty.gradientValue = newGradient; + changed = true; } break; + default: + Debug.Assert(parameter.realType != typeof(Gradient).Name); + break; } EditorGUI.showMixedValue = false; } @@ -514,9 +546,11 @@ protected virtual void SceneViewGUICallback() GUILayout.BeginHorizontal(); GUILayout.Label(Contents.playRate, Contents.playRateWidth); EditorGUI.showMixedValue = mixedValues; + EditorGUI.BeginChangeCheck(); var newPlayRateVal = EditorGUILayout.PowerSlider("", (float)Math.Round(playRateValue), VisualEffectControl.minSlider, VisualEffectControl.maxSlider, VisualEffectControl.sliderPower, Contents.powerSliderWidth); EditorGUI.showMixedValue = false; - if (playRate >= 0 && GUI.changed) + bool playRateChanged = EditorGUI.EndChangeCheck(); + if (playRateChanged && playRate >= 0) { effects.ForEach(x => x.playRate = newPlayRateVal * VisualEffectControl.valueToPlayRate); } From 964f962f1f52e84d334eca6d97b2b0375b590739 Mon Sep 17 00:00:00 2001 From: Arttu Peltonen Date: Sat, 4 May 2024 06:38:25 +0000 Subject: [PATCH 23/67] Hide Native Render Pass checkbox in UniversalRenderer when using Render Graph Fix https://jira.unity3d.com/browse/UUM-71269 Only display the Native Render Pass checkbox (and its subheader) when URP Compatibility Mode is enabled (i.e. Render Graph is disabled). This checkbox does nothing when Render Graph is enabled, so it should be hidden to avoid confusing users. --- .../Editor/UniversalRendererDataEditor.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs index a97cebb8adb..b5354547071 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs @@ -203,11 +203,15 @@ public override void OnInspectorGUI() EditorGUI.indentLevel--; - EditorGUILayout.Space(); - EditorGUILayout.LabelField(Styles.RenderPassSectionLabel, EditorStyles.boldLabel); - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(m_UseNativeRenderPass, Styles.RenderPassLabel); - EditorGUI.indentLevel--; + var renderGraphSettings = GraphicsSettings.GetRenderPipelineSettings(); + if (renderGraphSettings.enableRenderCompatibilityMode) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField(Styles.RenderPassSectionLabel, EditorStyles.boldLabel); + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(m_UseNativeRenderPass, Styles.RenderPassLabel); + EditorGUI.indentLevel--; + } EditorGUILayout.Space(); EditorGUILayout.LabelField(Styles.ShadowsSectionLabel, EditorStyles.boldLabel); EditorGUI.indentLevel++; From a24bda4b1a3463690fabe5ed332b3e3f43fe81ce Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Mon, 6 May 2024 20:11:29 +0000 Subject: [PATCH 24/67] Update buginfo (remove HD RP) Remove all "HD RP" reference in buginfo files and replace with relevant Area --- .../Editor/Lighting/ProbeVolume/.buginfo | 1 - .../Tests/Runtime/Threading/.buginfo | 1 - .../com.unity.render-pipelines.high-definition-config/.buginfo | 1 + Packages/com.unity.render-pipelines.high-definition/.buginfo | 2 +- .../Editor/Lighting/.buginfo | 1 + .../Editor/RayTracing/.buginfo | 1 + .../Runtime/Lighting/.buginfo | 1 + .../Runtime/Tools/.buginfo | 1 + .../Runtime/VirtualTexturing/.buginfo | 1 + Tests/SRPTests/Packages/com.unity.testing.hdrp/.buginfo | 2 +- 10 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/.buginfo delete mode 100644 Packages/com.unity.render-pipelines.core/Tests/Runtime/Threading/.buginfo create mode 100644 Packages/com.unity.render-pipelines.high-definition-config/.buginfo create mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/.buginfo create mode 100644 Packages/com.unity.render-pipelines.high-definition/Editor/RayTracing/.buginfo create mode 100644 Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/.buginfo create mode 100644 Packages/com.unity.render-pipelines.high-definition/Runtime/Tools/.buginfo create mode 100644 Packages/com.unity.render-pipelines.high-definition/Runtime/VirtualTexturing/.buginfo diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/.buginfo b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/.buginfo deleted file mode 100644 index e13772f5bdb..00000000000 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/.buginfo +++ /dev/null @@ -1 +0,0 @@ -area: HD RP diff --git a/Packages/com.unity.render-pipelines.core/Tests/Runtime/Threading/.buginfo b/Packages/com.unity.render-pipelines.core/Tests/Runtime/Threading/.buginfo deleted file mode 100644 index d4fba8df287..00000000000 --- a/Packages/com.unity.render-pipelines.core/Tests/Runtime/Threading/.buginfo +++ /dev/null @@ -1 +0,0 @@ -area: HD RP \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.high-definition-config/.buginfo b/Packages/com.unity.render-pipelines.high-definition-config/.buginfo new file mode 100644 index 00000000000..aa7f21cd9cd --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition-config/.buginfo @@ -0,0 +1 @@ +area: SRP Architecture & API diff --git a/Packages/com.unity.render-pipelines.high-definition/.buginfo b/Packages/com.unity.render-pipelines.high-definition/.buginfo index 9b282103beb..6b6b1d34448 100644 --- a/Packages/com.unity.render-pipelines.high-definition/.buginfo +++ b/Packages/com.unity.render-pipelines.high-definition/.buginfo @@ -1,5 +1,5 @@ old: - area: HD RP + area: SRP Architecture & API Workflow: when: diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/.buginfo b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/.buginfo new file mode 100644 index 00000000000..484b54b848d --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/.buginfo @@ -0,0 +1 @@ +area: Lighting diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RayTracing/.buginfo b/Packages/com.unity.render-pipelines.high-definition/Editor/RayTracing/.buginfo new file mode 100644 index 00000000000..484b54b848d --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RayTracing/.buginfo @@ -0,0 +1 @@ +area: Lighting diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/.buginfo b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/.buginfo new file mode 100644 index 00000000000..484b54b848d --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/.buginfo @@ -0,0 +1 @@ +area: Lighting diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Tools/.buginfo b/Packages/com.unity.render-pipelines.high-definition/Runtime/Tools/.buginfo new file mode 100644 index 00000000000..beeea491820 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Tools/.buginfo @@ -0,0 +1 @@ +area: Material diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/VirtualTexturing/.buginfo b/Packages/com.unity.render-pipelines.high-definition/Runtime/VirtualTexturing/.buginfo new file mode 100644 index 00000000000..9d12516e2df --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/VirtualTexturing/.buginfo @@ -0,0 +1 @@ +area: Texture diff --git a/Tests/SRPTests/Packages/com.unity.testing.hdrp/.buginfo b/Tests/SRPTests/Packages/com.unity.testing.hdrp/.buginfo index d4fba8df287..58a380d0528 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.hdrp/.buginfo +++ b/Tests/SRPTests/Packages/com.unity.testing.hdrp/.buginfo @@ -1 +1 @@ -area: HD RP \ No newline at end of file +area: Graphics test framework From 3006e7a581dfad3ae041b81bee56e4d66480f638 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Tue, 7 May 2024 01:33:47 +0000 Subject: [PATCH 25/67] [VFX] Fix incorrect load of spawnCount with GPUEvent Fix unexpected return value of spawnCount while using GPUEvent, it was returning zero. The expected value is available with GPUEvent through elementCount. --- .../Shaders/VFXInit.template | 6 + .../GraphicsTests/17_GPUEvent_Simple.unity | 319 +- .../GraphicsTests/17_GPUEvent_SpawnCount.vfx | 4016 +++++++++++++++++ .../17_GPUEvent_SpawnCount.vfx.meta | 8 + 4 files changed, 4327 insertions(+), 22 deletions(-) create mode 100644 Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx create mode 100644 Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx.meta diff --git a/Packages/com.unity.visualeffectgraph/Shaders/VFXInit.template b/Packages/com.unity.visualeffectgraph/Shaders/VFXInit.template index 43b988aac94..51404b57c3f 100644 --- a/Packages/com.unity.visualeffectgraph/Shaders/VFXInit.template +++ b/Packages/com.unity.visualeffectgraph/Shaders/VFXInit.template @@ -140,6 +140,12 @@ void CSMain(uint3 groupId : SV_GroupID, #if VFX_USE_SPAWNINDEX_CURRENT attributes.spawnIndex = id; #endif + +#if VFX_USE_SPAWNER_FROM_GPU && VFX_USE_SPAWNCOUNT_SOURCE + //Fix previously incorrectly read or initialized source spawnCount + sourceAttributes.spawnCount = (float)elementCount; +#endif + #if HAS_STRIPS #if !VFX_USE_SPAWNER_FROM_GPU ${VFXLoadParameter:{stripIndex}} diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_Simple.unity b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_Simple.unity index 4dd8da2b58a..2954ce10f2c 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_Simple.unity +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_Simple.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -43,8 +43,7 @@ RenderSettings: --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 + serializedVersion: 12 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 0 @@ -96,14 +92,16 @@ LightmapSettings: m_PVRFilteringAtrousPositionSigmaAO: 1 m_ExportTrainingData: 0 m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 + m_LightingSettings: {fileID: 4890085278179872738, guid: 04902a309b6dfaa44b2060514fde4ddd, + type: 2} --- !u!196 &4 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -116,7 +114,9 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 debug: m_Flags: 0 m_NavMeshData: {fileID: 0} @@ -132,6 +132,7 @@ GameObject: - component: {fileID: 819424538} - component: {fileID: 819424537} - component: {fileID: 819424536} + - component: {fileID: 819424540} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -169,9 +170,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -191,8 +200,8 @@ Camera: m_TargetTexture: {fileID: 0} m_TargetDisplay: 0 m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 + m_HDR: 0 + m_AllowMSAA: 0 m_AllowDynamicResolution: 0 m_ForceIntoRT: 0 m_OcclusionCulling: 1 @@ -205,12 +214,266 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 819424535} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0.4, y: 0.3, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &819424540 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 819424535} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + clearColorMode: 1 + backgroundColorHDR: {r: 0, g: 0, b: 0, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + taaSharpenStrength: 0.5 + TAAQuality: 1 + taaSharpenMode: 0 + taaRingingReduction: 0 + taaHistorySharpening: 0.35 + taaAntiFlicker: 0.5 + taaMotionVectorRejection: 0 + taaAntiHistoryRinging: 0 + taaBaseBlendFactor: 0.875 + taaJitterScale: 1 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + xrRendering: 1 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + hasPersistentHistory: 0 + screenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + screenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + allowDeepLearningSuperSampling: 1 + deepLearningSuperSamplingUseCustomQualitySettings: 0 + deepLearningSuperSamplingQuality: 0 + deepLearningSuperSamplingUseCustomAttributes: 0 + deepLearningSuperSamplingUseOptimalSettings: 1 + deepLearningSuperSamplingSharpening: 0 + allowFidelityFX2SuperResolution: 1 + fidelityFX2SuperResolutionUseCustomQualitySettings: 0 + fidelityFX2SuperResolutionQuality: 0 + fidelityFX2SuperResolutionUseCustomAttributes: 0 + fidelityFX2SuperResolutionUseOptimalSettings: 1 + fidelityFX2SuperResolutionEnableSharpening: 0 + fidelityFX2SuperResolutionSharpening: 0 + fsrOverrideSharpness: 0 + fsrSharpness: 0.92 + exposureTarget: {fileID: 0} + materialMipBias: 0 + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 5770166122053453 + data2: 12934340311651418136 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + sssCustomDownsampleSteps: 0 + msaaMode: 1 + materialQuality: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 + m_Version: 9 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 +--- !u!1 &916886615 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 916886618} + - component: {fileID: 916886617} + - component: {fileID: 916886616} + m_Layer: 0 + m_Name: 17_GPUEvent_SpawnCount + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!73398921 &916886616 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916886615} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!2083052967 &916886617 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916886615} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 44472ae94f42aad44b8a9158f25ba230, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 123 + m_ResetSeedOnPlay: 0 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] +--- !u!4 &916886618 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916886615} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1211796539 GameObject: @@ -224,7 +487,7 @@ GameObject: - component: {fileID: 1211796540} - component: {fileID: 1211796542} m_Layer: 0 - m_Name: GameObject + m_Name: 17_GPUEvent_Simple m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -239,8 +502,12 @@ VisualEffect: m_GameObject: {fileID: 1211796539} m_Enabled: 1 m_Asset: {fileID: 8926484042661614526, guid: 31aae5e5bd5617e4fbc89ed7a5d5d9b7, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 m_StartSeed: 0 m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 m_PropertySheet: m_Float: m_Array: [] @@ -271,15 +538,17 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1211796539} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!73398921 &1211796542 VFXRenderer: + serializedVersion: 1 m_ObjectHideFlags: 2 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} @@ -289,18 +558,17 @@ VFXRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 0 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 - m_Materials: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -321,3 +589,10 @@ VFXRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 819424539} + - {fileID: 1211796541} + - {fileID: 916886618} diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx new file mode 100644 index 00000000000..756abee64e0 --- /dev/null +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx @@ -0,0 +1,4016 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &114067796737040528 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 330e0fca1717dde4aaa144f48232aa64, type: 3} + m_Name: VFXParameter + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: + - {fileID: 114806886036765300} + m_ExposedName: zero + m_Exposed: 0 + m_Order: 3 + m_Category: + m_Min: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Max: + m_Type: + m_SerializableType: + m_SerializableObject: + m_IsOutput: 0 + m_EnumValues: [] + m_ValueFilter: 0 + m_Tooltip: + m_Nodes: [] +--- !u!114 &114189545465194604 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 330e0fca1717dde4aaa144f48232aa64, type: 3} + m_Name: VFXParameter + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: + - {fileID: 114927839686412258} + m_ExposedName: life_x + m_Exposed: 0 + m_Order: 1 + m_Category: + m_Min: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Max: + m_Type: + m_SerializableType: + m_SerializableObject: + m_IsOutput: 0 + m_EnumValues: [] + m_ValueFilter: 0 + m_Tooltip: + m_Nodes: [] +--- !u!114 &114322938919124394 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: VFXSlotFloat + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114322938919124394} + m_MasterData: + m_Owner: {fileID: 114957243896027732} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.4 + m_Space: -1 + m_Property: + name: o + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &114323964600485438 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: VFXSlotFloat + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114323964600485438} + m_MasterData: + m_Owner: {fileID: 114394281995064738} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1.5 + m_Space: -1 + m_Property: + name: o + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &114394281995064738 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 330e0fca1717dde4aaa144f48232aa64, type: 3} + m_Name: VFXParameter + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: + - {fileID: 114323964600485438} + m_ExposedName: life_y + m_Exposed: 0 + m_Order: 0 + m_Category: + m_Min: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Max: + m_Type: + m_SerializableType: + m_SerializableObject: + m_IsOutput: 0 + m_EnumValues: [] + m_ValueFilter: 0 + m_Tooltip: + m_Nodes: [] +--- !u!114 &114410201718983626 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} + m_Name: 17_GPUEvent_SpawnCount + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114394281995064738} + - {fileID: 114189545465194604} + - {fileID: 114067796737040528} + - {fileID: 114957243896027732} + - {fileID: 8926484042661614951} + - {fileID: 8926484042661614953} + - {fileID: 8926484042661614968} + - {fileID: 8926484042661614990} + - {fileID: 8926484042661614993} + - {fileID: 8926484042661615008} + - {fileID: 8926484042661615010} + - {fileID: 8926484042661615064} + - {fileID: 8926484042661615066} + - {fileID: 8926484042661615070} + - {fileID: 8926484042661615073} + - {fileID: 8926484042661615078} + - {fileID: 8926484042661615093} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_UIInfos: {fileID: 114429855662514572} + m_CustomAttributes: [] + m_ParameterInfo: [] + m_ImportDependencies: [] + m_GraphVersion: 18 + m_ResourceVersion: 1 + m_SubgraphDependencies: [] + m_CategoryPath: +--- !u!114 &114429855662514572 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d01270efd3285ea4a9d6c555cb0a8027, type: 3} + m_Name: VFXUI + m_EditorClassIdentifier: + groupInfos: [] + stickyNoteInfos: [] + categories: [] + uiBounds: + serializedVersion: 2 + x: -268 + y: -9 + width: 1565 + height: 2168 +--- !u!114 &114806886036765300 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: VFXSlotFloat + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114806886036765300} + m_MasterData: + m_Owner: {fileID: 114067796737040528} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: o + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &114927839686412258 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: VFXSlotFloat + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114927839686412258} + m_MasterData: + m_Owner: {fileID: 114189545465194604} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 2 + m_Space: -1 + m_Property: + name: o + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &114957243896027732 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 330e0fca1717dde4aaa144f48232aa64, type: 3} + m_Name: VFXParameter + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: + - {fileID: 114322938919124394} + m_ExposedName: Initial_Velocity + m_Exposed: 0 + m_Order: 2 + m_Category: + m_Min: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Max: + m_Type: + m_SerializableType: + m_SerializableObject: + m_IsOutput: 0 + m_EnumValues: [] + m_ValueFilter: 0 + m_Tooltip: + m_Nodes: [] +--- !u!2058629511 &8926484042661614527 +VisualEffectResource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 17_GPUEvent_SpawnCount + m_Graph: {fileID: 114410201718983626} + m_Infos: + m_RendererSettings: + motionVectorGenerationMode: 0 + shadowCastingMode: 0 + rayTracingMode: 0 + receiveShadows: 0 + reflectionProbeUsage: 0 + lightProbeUsage: 0 + m_CullingFlags: 3 + m_UpdateMode: 0 + m_PreWarmDeltaTime: 0.05 + m_PreWarmStepCount: 0 + m_InitialEventName: OnPlay + m_InstancingMode: -1 + m_InstancingCapacity: 64 +--- !u!114 &8926484042661614951 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: + - {fileID: 8926484042661614979} + m_UIPosition: {x: 26, y: -9} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Spawn System + m_Data: {fileID: 8926484042661614952} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614953} + slotIndex: 0 + loopDuration: 0 + loopCount: 0 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &8926484042661614952 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614951} +--- !u!114 &8926484042661614953 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: + - {fileID: 8926484042661614983} + - {fileID: 8926484042661615106} + m_UIPosition: {x: 26, y: 340} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614954} + m_OutputSlots: [] + m_Label: Initialize Particles + m_Data: {fileID: 8926484042661614967} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614951} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614968} + slotIndex: 0 +--- !u!114 &8926484042661614954 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614955} + - {fileID: 8926484042661614959} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 8926484042661614953} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":0.0,"z":0.0},"size":{"x":1.0,"y":1.0,"z":1.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614955 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614954} + m_Children: + - {fileID: 8926484042661614956} + - {fileID: 8926484042661614957} + - {fileID: 8926484042661614958} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614956 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614955} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614957 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614955} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614958 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614955} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614959 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614954} + m_Children: + - {fileID: 8926484042661614960} + - {fileID: 8926484042661614961} + - {fileID: 8926484042661614962} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614960 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614962 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614967 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: Feeder + m_Owners: + - {fileID: 8926484042661614953} + - {fileID: 8926484042661614968} + dataType: 0 + capacity: 4 + stripCapacity: 16 + particlePerStripCount: 16 + needsComputeBounds: 0 + boundsMode: 1 + m_Space: 0 +--- !u!114 &8926484042661614968 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: + - {fileID: 8926484042661614986} + m_UIPosition: {x: 26, y: 712} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Update Particles + m_Data: {fileID: 8926484042661614967} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614953} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661614979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5e382412bb691334bb79457a6c127924, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614951} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614980} + - {fileID: 8926484042661614981} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614982} + repeat: 1 + spawnMode: 0 + delayMode: 0 +--- !u!114 &8926484042661614980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 8926484042661614979} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: Count + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614981} + m_MasterData: + m_Owner: {fileID: 8926484042661614979} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: Delay + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614982 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614982} + m_MasterData: + m_Owner: {fileID: 8926484042661614979} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614983 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614953} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614984} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614985} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661614984 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614984} + m_MasterData: + m_Owner: {fileID: 8926484042661614983} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.3 + m_Space: -1 + m_Property: + name: _Lifetime + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614985} + m_MasterData: + m_Owner: {fileID: 8926484042661614983} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614986 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9a7ad767f61018d4d951e205b5b51a56, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614987} + m_OutputSlots: + - {fileID: 8926484042661614988} + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614989} + mode: 3 + clampToOne: 1 +--- !u!114 &8926484042661614987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c52d920e7fff73b498050a6b3c4404ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614987} + m_MasterData: + m_Owner: {fileID: 8926484042661614986} + m_Value: + m_Type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 8 + m_Space: -1 + m_Property: + name: count + m_serializedType: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615077} +--- !u!114 &8926484042661614988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614988} + m_MasterData: + m_Owner: {fileID: 8926484042661614986} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.GPUEvent, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{}' + m_Space: -1 + m_Property: + name: evt + m_serializedType: + m_SerializableType: UnityEditor.VFX.GPUEvent, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661614991} +--- !u!114 &8926484042661614989 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614989} + m_MasterData: + m_Owner: {fileID: 8926484042661614986} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614990 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f42a6449da2296343af0d8536de8588a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 873, y: 706} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614991} + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 8926484042661614992} + m_InputFlowSlot: + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614993} + slotIndex: 0 +--- !u!114 &8926484042661614991 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614991} + m_MasterData: + m_Owner: {fileID: 8926484042661614990} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.GPUEvent, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{}' + m_Space: -1 + m_Property: + name: evt + m_serializedType: + m_SerializableType: UnityEditor.VFX.GPUEvent, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661614988} +--- !u!114 &8926484042661614992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614990} +--- !u!114 &8926484042661614993 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: + - {fileID: 8926484042661615104} + - {fileID: 8926484042661615014} + - {fileID: 8926484042661615018} + - {fileID: 8926484042661615032} + - {fileID: 8926484042661615087} + m_UIPosition: {x: 873, y: 964} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614994} + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 8926484042661615007} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614990} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661615008} + slotIndex: 0 +--- !u!114 &8926484042661614994 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614995} + - {fileID: 8926484042661614999} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 8926484042661614993} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":0.0,"z":0.0},"size":{"x":1.0,"y":1.0,"z":1.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614994} + m_Children: + - {fileID: 8926484042661614996} + - {fileID: 8926484042661614997} + - {fileID: 8926484042661614998} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614996 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614995} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614997 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614995} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614998 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614995} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614999 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614994} + m_Children: + - {fileID: 8926484042661615000} + - {fileID: 8926484042661615001} + - {fileID: 8926484042661615002} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614999} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615001 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614999} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615002 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614999} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614994} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615007 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: Receiver + m_Owners: + - {fileID: 8926484042661614993} + - {fileID: 8926484042661615008} + - {fileID: 8926484042661615010} + dataType: 0 + capacity: 128 + stripCapacity: 1 + particlePerStripCount: 128 + needsComputeBounds: 0 + boundsMode: 1 + m_Space: 0 +--- !u!114 &8926484042661615008 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 873, y: 1658} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 8926484042661615007} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614993} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661615010} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661615010 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: + - {fileID: 8926484042661615061} + m_UIPosition: {x: 873, y: 1810} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615011} + - {fileID: 8926484042661615103} + m_OutputSlots: [] + m_Label: Otacon + m_Data: {fileID: 8926484042661615007} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661615008} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 0 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 8926484042661615017} + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 0 + sortMode: 0 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 0 + needsOwnAabbBuffer: 0 + shaderGraph: {fileID: 0} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 + primitiveType: 2 + useGeometryShader: 0 +--- !u!114 &8926484042661615011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615011} + m_MasterData: + m_Owner: {fileID: 8926484042661615010} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"127279d577f25ac4ea17dae3782e5074","type":3}}' + m_Space: -1 + m_Property: + name: mainTexture + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615015} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615016} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615015} + m_MasterData: + m_Owner: {fileID: 8926484042661615014} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1.5 + m_Space: -1 + m_Property: + name: _Lifetime + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615016 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615016} + m_MasterData: + m_Owner: {fileID: 8926484042661615014} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615017 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 081ffb0090424ba4cb05370a42ead6b9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + opaqueRenderQueue: 0 + transparentRenderQueue: 1 +--- !u!114 &8926484042661615018 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: [] + m_UIPosition: {x: 0, y: 75} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615019} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615024} + attribute: velocity + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615019 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615020} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615019} + m_MasterData: + m_Owner: {fileID: 8926484042661615018} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":-0.15000000596046449,"z":0.0}}' + m_Space: 0 + m_Property: + name: _Velocity + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615019} + m_Children: + - {fileID: 8926484042661615021} + - {fileID: 8926484042661615022} + - {fileID: 8926484042661615023} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615021 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615020} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615020} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615020} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615024 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615024} + m_MasterData: + m_Owner: {fileID: 8926484042661615018} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615051} + - {fileID: 8926484042661615060} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615050} + compositionPosition: 1 + compositionAxes: 0 + compositionDirection: 0 + positionMode: 0 + spawnMode: 1 + shape: 5 + heightMode: 1 + applyOrientation: 1 + killOutliers: 0 + projectionSteps: 2 +--- !u!114 &8926484042661615050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615050} + m_MasterData: + m_Owner: {fileID: 8926484042661615032} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615051 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615052} + - {fileID: 8926484042661615056} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 8926484042661615032} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Line, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"start":{"x":0.10000000149011612,"y":0.0,"z":0.0},"end":{"x":0.4000000059604645,"y":0.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: line + m_serializedType: + m_SerializableType: UnityEditor.VFX.Line, Unity.VisualEffectGraph.Editor, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615052 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615051} + m_Children: + - {fileID: 8926484042661615053} + - {fileID: 8926484042661615054} + - {fileID: 8926484042661615055} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: start + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615052} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615054 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615052} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615052} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615056 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615051} + m_Children: + - {fileID: 8926484042661615057} + - {fileID: 8926484042661615058} + - {fileID: 8926484042661615059} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: end + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615057 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615056} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615058 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615056} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615059 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615056} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615051} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615060 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615060} + m_MasterData: + m_Owner: {fileID: 8926484042661615032} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: LineSequencer + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615069} +--- !u!114 &8926484042661615061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615010} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615062} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615063} + attribute: size + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615062} + m_MasterData: + m_Owner: {fileID: 8926484042661615061} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.04 + m_Space: -1 + m_Property: + name: _Size + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615063 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615063} + m_MasterData: + m_Owner: {fileID: 8926484042661615061} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615064 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 486e063e1ed58c843942ea4122829ab1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 88, y: 1415} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: + - {fileID: 8926484042661615065} + attribute: spawnCount + location: 1 + mask: xyz +--- !u!114 &8926484042661615065 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615065} + m_MasterData: + m_Owner: {fileID: 8926484042661615064} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: spawnCount + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661615085} +--- !u!114 &8926484042661615066 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 39201e37c9a341c45bace12065f0cb90, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 549, y: 1343} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615072} + - {fileID: 8926484042661615068} + m_OutputSlots: + - {fileID: 8926484042661615069} + m_Operands: + - name: a + type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + - name: b + type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 +--- !u!114 &8926484042661615068 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615068} + m_MasterData: + m_Owner: {fileID: 8926484042661615066} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: b + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615086} +--- !u!114 &8926484042661615069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615069} + m_MasterData: + m_Owner: {fileID: 8926484042661615066} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: + m_Space: -1 + m_Property: + name: + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661615060} + - {fileID: 8926484042661615095} +--- !u!114 &8926484042661615070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 486e063e1ed58c843942ea4122829ab1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 88, y: 1289} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: + - {fileID: 8926484042661615071} + attribute: spawnIndex + location: 0 + mask: xyz +--- !u!114 &8926484042661615071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c52d920e7fff73b498050a6b3c4404ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615071} + m_MasterData: + m_Owner: {fileID: 8926484042661615070} + m_Value: + m_Type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: spawnIndex + m_serializedType: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661615072} +--- !u!114 &8926484042661615072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c52d920e7fff73b498050a6b3c4404ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615072} + m_MasterData: + m_Owner: {fileID: 8926484042661615066} + m_Value: + m_Type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: a + m_serializedType: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615071} +--- !u!114 &8926484042661615073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c42128e17c583714a909b4997c80c916, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: -268, y: 680} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615074} + - {fileID: 8926484042661615075} + m_OutputSlots: + - {fileID: 8926484042661615077} + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + seed: 0 + constant: 0 + independentSeed: 0 +--- !u!114 &8926484042661615074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615074} + m_MasterData: + m_Owner: {fileID: 8926484042661615073} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 3 + m_Space: -1 + m_Property: + name: Min + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615075 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615075} + m_MasterData: + m_Owner: {fileID: 8926484042661615073} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 8 + m_Space: -1 + m_Property: + name: Max + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615077 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615077} + m_MasterData: + m_Owner: {fileID: 8926484042661615073} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: + m_Space: -1 + m_Property: + name: r + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661614987} +--- !u!114 &8926484042661615078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0155ae97d9a75e3449c6d0603b79c2f4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 403, y: 1487} + m_UICollapsed: 0 + m_UISuperCollapsed: 1 + m_InputSlots: + - {fileID: 8926484042661615085} + - {fileID: 8926484042661615083} + m_OutputSlots: + - {fileID: 8926484042661615086} + m_Operands: + - name: a + type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + - name: b + type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 +--- !u!114 &8926484042661615083 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c52d920e7fff73b498050a6b3c4404ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615083} + m_MasterData: + m_Owner: {fileID: 8926484042661615078} + m_Value: + m_Type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: b + m_serializedType: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615085} + m_MasterData: + m_Owner: {fileID: 8926484042661615078} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: a + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615065} +--- !u!114 &8926484042661615086 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615086} + m_MasterData: + m_Owner: {fileID: 8926484042661615078} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661615068} +--- !u!114 &8926484042661615087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615088} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615092} + attribute: color + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615088 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615089} + - {fileID: 8926484042661615090} + - {fileID: 8926484042661615091} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615088} + m_MasterData: + m_Owner: {fileID: 8926484042661615087} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":1.0,"y":1.0,"z":1.0}' + m_Space: -1 + m_Property: + name: _Color + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615098} +--- !u!114 &8926484042661615089 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615088} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615088} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615090 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615088} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615088} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615088} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615088} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615092 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615092} + m_MasterData: + m_Owner: {fileID: 8926484042661615087} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615093 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 997b3d8a71b0cd441b68e9a8d00dc6c4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114410201718983626} + m_Children: [] + m_UIPosition: {x: 661, y: 1524} + m_UICollapsed: 0 + m_UISuperCollapsed: 1 + m_InputSlots: + - {fileID: 8926484042661615094} + m_OutputSlots: + - {fileID: 8926484042661615098} +--- !u!114 &8926484042661615094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615095} + - {fileID: 8926484042661615096} + - {fileID: 8926484042661615097} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615094} + m_MasterData: + m_Owner: {fileID: 8926484042661615093} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":1.0,"y":1.0,"z":0.699999988079071}' + m_Space: -1 + m_Property: + name: HSV + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615094} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615094} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: + - {fileID: 8926484042661615069} +--- !u!114 &8926484042661615096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615094} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615094} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615097 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615094} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615094} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615098 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c499060cea9bbb24b8d723eafa343303, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615099} + - {fileID: 8926484042661615100} + - {fileID: 8926484042661615101} + - {fileID: 8926484042661615102} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615098} + m_MasterData: + m_Owner: {fileID: 8926484042661615093} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector4, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.0,"y":0.0,"z":0.0,"w":0.0}' + m_Space: -1 + m_Property: + name: RGB + m_serializedType: + m_SerializableType: UnityEngine.Vector4, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 1 + m_LinkedSlots: + - {fileID: 8926484042661615088} +--- !u!114 &8926484042661615099 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615098} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615098} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &8926484042661615100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615098} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615098} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &8926484042661615101 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615098} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615098} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &8926484042661615102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615098} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615098} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: w + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 1 + m_LinkedSlots: [] +--- !u!114 &8926484042661615103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615103} + m_MasterData: + m_Owner: {fileID: 8926484042661615010} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.293 + m_Space: -1 + m_Property: + name: cropFactor + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615104 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615105} + attribute: position + Composition: 0 + Source: 1 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615105 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615105} + m_MasterData: + m_Owner: {fileID: 8926484042661615104} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614953} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615107} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615112} + attribute: position + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615107 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5265657162cc1a241bba03a3b0476d99, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615108} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615107} + m_MasterData: + m_Owner: {fileID: 8926484042661615106} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Position, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"position":{"x":0.0,"y":0.6000000238418579,"z":0.0}}' + m_Space: 0 + m_Property: + name: _Position + m_serializedType: + m_SerializableType: UnityEditor.VFX.Position, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615108 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615107} + m_Children: + - {fileID: 8926484042661615109} + - {fileID: 8926484042661615110} + - {fileID: 8926484042661615111} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615107} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615108} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615107} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615108} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615107} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615111 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615108} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615107} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615112 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615112} + m_MasterData: + m_Owner: {fileID: 8926484042661615106} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx.meta b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx.meta new file mode 100644 index 00000000000..ee1996cd6f4 --- /dev/null +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/VFXTests/GraphicsTests/17_GPUEvent_SpawnCount.vfx.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 44472ae94f42aad44b8a9158f25ba230 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8926484042661614526 + userData: + assetBundleName: + assetBundleVariant: From fdfe5258c96d4064ba8c4bf6952d3a3a81f318c2 Mon Sep 17 00:00:00 2001 From: Arttu Peltonen Date: Tue, 7 May 2024 01:33:52 +0000 Subject: [PATCH 26/67] Fix URP sample warnings and add sample import tests This PR fixes obsolete API usage in URP samples. In addition, new tests are added to SRP_SmokeTests that import all samples in URP and HDRP and ensure there are no errors or warnings: ![image](https://media.github.cds.internal.unity3d.com/user/3380/files/a026759e-42bb-4054-954d-babf20ecbafe) --- .../BlitToRTHandle/BlitToRTHandlePass.cs | 26 ++++++----- .../DepthBlit/DepthBlitCopyDepthPass.cs | 36 ++++++++------- .../DepthBlit/DepthBlitDepthOnlyPass.cs | 24 +++++----- .../DepthBlit/DepthBlitEdgePass.cs | 16 ++++--- .../DepthBlit/DepthBlitFeature.cs | 30 ++++++------- .../DistortTunnelPass_CopyColor.cs | 20 +++++---- .../DistortTunnelPass_Distort.cs | 30 +++++++------ .../DistortTunnel/DistortTunnelPass_Tunnel.cs | 26 ++++++----- .../DistortTunnelRendererFeature.cs | 26 +++++------ .../KeepFrame/KeepFrameFeature.cs | 11 ++++- .../Blit w. FrameData/BlitRendererFeature.cs | 4 +- .../Assets/Tests/Editor/SampleImportTests.cs | 44 +++++++++++++++++++ .../Tests/Editor/SampleImportTests.cs.meta | 2 + 13 files changed, 189 insertions(+), 106 deletions(-) create mode 100644 Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs create mode 100644 Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs.meta diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs index 7680d8e9d4c..67765856408 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs @@ -13,7 +13,7 @@ class PassData public Material material; public Vector4 scaleBias; } - + private Vector4 m_ScaleBias = new Vector4(1f, 1f, 0f, 0f); private ProfilingSampler m_ProfilingSampler = new ProfilingSampler("BlitToRTHandle_CopyColor"); private RTHandle m_InputHandle; @@ -28,6 +28,8 @@ public BlitToRTHandlePass(RenderPassEvent evt, Material mat) m_Material = mat; } +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { @@ -36,7 +38,7 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera desc.depthBufferBits = 0; desc.msaaSamples = 1; RenderingUtils.ReAllocateIfNeeded(ref m_OutputHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_OutputName ); - + // Set the RTHandle as the output target in the Compatibility mode ConfigureTarget(m_OutputHandle); } @@ -46,7 +48,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData { // Set camera color as the input m_InputHandle = renderingData.cameraData.renderer.cameraColorTargetHandle; - + CommandBuffer cmd = CommandBufferPool.Get(); using (new ProfilingScope(cmd, m_ProfilingSampler)) { @@ -60,7 +62,9 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cmd.Clear(); CommandBufferPool.Release(cmd); } - + +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -69,16 +73,16 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (cameraData.camera.cameraType != CameraType.Game) return; - + // Create the custom RTHandle var desc = cameraData.cameraTargetDescriptor; desc.depthBufferBits = 0; desc.msaaSamples = 1; - RenderingUtils.ReAllocateIfNeeded(ref m_OutputHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_OutputName ); - + RenderingUtils.ReAllocateHandleIfNeeded(ref m_OutputHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_OutputName ); + // Set camera color as a texture resource for this render graph instance TextureHandle source = resourceData.activeColorTexture; - + // Set RTHandle as a texture resource for this render graph instance TextureHandle destination = renderGraph.ImportTexture(m_OutputHandle); @@ -100,15 +104,15 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer Blitter.BlitTexture(context.cmd, data.source, data.scaleBias, data.material, 0); }); } - + // In this example the pass executes after rendering transparent objects, and the transparent objects are reading the destination texture. // The following code sets the TextureHandle as the camera color target to avoid visual artefacts. resourceData.cameraColor = destination; } - + public void Dispose() { m_InputHandle?.Release(); m_OutputHandle?.Release(); } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs index 1ef62736fe9..267eb37a8dc 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs @@ -17,7 +17,7 @@ public class DepthBlitCopyDepthPass : ScriptableRenderPass private GlobalKeyword m_Keyword_DepthMsaa4; private GlobalKeyword m_Keyword_DepthMsaa8; private GlobalKeyword m_Keyword_OutputDepth; - + class PassData { public Material copyDepthMaterial; @@ -25,7 +25,7 @@ class PassData public Vector4 scaleBias; public int depthBufferId; } - + public DepthBlitCopyDepthPass(RenderPassEvent evt, Shader copyDepthShader, RTHandle destination) { renderPassEvent = evt; @@ -36,20 +36,22 @@ public DepthBlitCopyDepthPass(RenderPassEvent evt, Shader copyDepthShader, RTHan m_Keyword_DepthMsaa8 = GlobalKeyword.Create(ShaderKeywordStrings.DepthMsaa8); m_Keyword_OutputDepth = GlobalKeyword.Create(ShaderKeywordStrings._OUTPUT_DEPTH); } - + +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Set the RTHandle as the output target in the Compatibility mode. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { ConfigureTarget(m_DestRT); } - + // Unity calls the Execute method in the Compatibility mode public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var cameraData = renderingData.cameraData; if (cameraData.camera.cameraType != CameraType.Game) return; - + // Bind the depth buffer to material RTHandle source = cameraData.renderer.cameraDepthTargetHandle; m_CopyDepthMaterial.SetTexture(m_DepthBufferId, source); @@ -62,7 +64,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cmd.SetKeyword(m_Keyword_DepthMsaa2, cameraSamples == 2); cmd.SetKeyword(m_Keyword_DepthMsaa4, cameraSamples == 4); cmd.SetKeyword(m_Keyword_DepthMsaa8, cameraSamples == 8); - + // This example does not copy the depth values back to the depth buffer, so we disable this keyword. cmd.SetKeyword(m_Keyword_OutputDepth, false); @@ -74,32 +76,34 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData CommandBufferPool.Release(cmd); } - + +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { UniversalResourceData resourceData = frameData.Get(); DepthBlitFeature.TexRefData texRefData = frameData.GetOrCreate(); - + // Avoid blitting from the backbuffer if (resourceData.isActiveTargetBackBuffer) return; - + // Set the texture resources for this render graph instance. TextureHandle src = resourceData.cameraDepth; TextureHandle dest = renderGraph.ImportTexture(m_DestRT); texRefData.depthTextureHandle = dest; - + if(!src.IsValid() || !dest.IsValid()) return; - + using (var builder = renderGraph.AddRasterRenderPass(k_PassName, out var passData, m_ProfilingSampler)) { passData.copyDepthMaterial = m_CopyDepthMaterial; passData.source = src; passData.scaleBias = m_ScaleBias; passData.depthBufferId = m_DepthBufferId; - + builder.UseTexture(src, AccessFlags.Read); builder.SetRenderAttachment(dest, 0, AccessFlags.Write); builder.AllowGlobalStateModification(true); @@ -113,10 +117,10 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer context.cmd.SetKeyword(m_Keyword_DepthMsaa2, cameraSamples == 2); context.cmd.SetKeyword(m_Keyword_DepthMsaa4, cameraSamples == 4); context.cmd.SetKeyword(m_Keyword_DepthMsaa8, cameraSamples == 8); - + // This example does not copy the depth values back to the depth buffer, so we disable this keyword. context.cmd.SetKeyword(m_Keyword_OutputDepth, false); - + // Bind the depth buffer to the material data.copyDepthMaterial.SetTexture(data.depthBufferId, data.source); @@ -125,9 +129,9 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer }); } } - + public void Dispose() { CoreUtils.Destroy(m_CopyDepthMaterial); } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs index 69a45292226..daa97dc4465 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs @@ -12,32 +12,34 @@ public class DepthBlitDepthOnlyPass : ScriptableRenderPass private RTHandle m_DestRT; // The RTHandle for storing the depth texture, set by the Renderer Feature FilteringSettings m_FilteringSettings; private static readonly ShaderTagId k_ShaderTagId = new ShaderTagId("DepthOnly"); - + class PassData { public RendererListHandle rendererList; } - + public DepthBlitDepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, RTHandle destination) { renderPassEvent = evt; m_DestRT = destination; m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); } - + +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { ConfigureTarget(m_DestRT); } - + // Unity calls the Execute method in the Compatibility mode public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var cameraData = renderingData.cameraData; if (cameraData.camera.cameraType != CameraType.Game) return; - + // Setup the RendererList for drawing objects with the shader tag "DepthOnly". var sortFlags = cameraData.defaultOpaqueSortFlags; var drawSettings = RenderingUtils.CreateDrawingSettings(k_ShaderTagId, ref renderingData, sortFlags); @@ -58,6 +60,8 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData CommandBufferPool.Release(cmd); } +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -65,14 +69,14 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer UniversalCameraData cameraData = frameData.Get(); UniversalLightData lightData = frameData.Get(); DepthBlitFeature.TexRefData texRefData = frameData.GetOrCreate(); - + // Set the texture resources for this render graph instance. TextureHandle dest = renderGraph.ImportTexture(m_DestRT); texRefData.depthTextureHandle = dest; - + if(!dest.IsValid()) return; - + using (var builder = renderGraph.AddRasterRenderPass(k_PassName, out var passData, m_ProfilingSampler)) { // Setup the RendererList for drawing objects with the shader tag "DepthOnly". @@ -82,7 +86,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer RendererListParams param = new RendererListParams(renderingData.cullResults, drawSettings, m_FilteringSettings); param.filteringSettings.batchLayerMask = uint.MaxValue; passData.rendererList = renderGraph.CreateRendererList(param); - + builder.UseRendererList(passData.rendererList); builder.SetRenderAttachmentDepth(dest, AccessFlags.Write); builder.AllowPassCulling(false); @@ -94,4 +98,4 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer }); } } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs index 391191ea19d..bc9036b59f8 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs @@ -12,7 +12,7 @@ class PassData public Material material; public Vector4 scaleBias; } - + private Vector4 m_ScaleBias = new Vector4(1f, 1f, 0f, 0f); private ProfilingSampler m_ProfilingSampler = new ProfilingSampler("DepthBlitEdgePass"); private RTHandle m_DepthHandle; // The RTHandle of the depth texture, set by the Renderer Feature, only used in the Compatibility mode (non-RenderGraph path) @@ -29,6 +29,8 @@ public void SetRTHandle(ref RTHandle depthHandle) m_DepthHandle = depthHandle; } +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Unity calls the Execute method in the Compatibility mode public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { @@ -48,7 +50,9 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData CommandBufferPool.Release(cmd); } - + +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -58,15 +62,15 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (cameraData.camera.cameraType != CameraType.Game) return; - + using (var builder = renderGraph.AddRasterRenderPass("DepthBlitEdgePass", out var passData)) { // Set the DepthHandle as a texture resource for this render graph instance TextureHandle source = texRefData.depthTextureHandle; - + // Set camera color as a texture resource for this render graph instance TextureHandle destination = resourceData.activeColorTexture; - + if (!source.IsValid() || !destination.IsValid()) return; @@ -82,4 +86,4 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer }); } } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitFeature.cs index 4251c66fb22..b45de53c9a6 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitFeature.cs @@ -13,31 +13,31 @@ public class DepthBlitFeature : ScriptableRendererFeature public RenderPassEvent evt_Depth = RenderPassEvent.AfterRenderingOpaques; public RenderPassEvent evt_Edge = RenderPassEvent.AfterRenderingOpaques; public UniversalRendererData rendererDataAsset; // The field for accessing opaqueLayerMask on the renderer asset - + public Shader copyDepthShader; - + public Material m_DepthEdgeMaterial; - + // The RTHandle for storing the depth texture private RTHandle m_DepthRTHandle; private const string k_DepthRTName = "_MyDepthTexture"; - + // This class is for keeping the TextureHandle reference in the frame data so that it can be shared with multiple passes in the render graph system. public class TexRefData : ContextItem { public TextureHandle depthTextureHandle = TextureHandle.nullHandle; - + public override void Reset() { depthTextureHandle = TextureHandle.nullHandle; } } - + // The passes for the effect private DepthBlitCopyDepthPass m_CopyDepthPass; private DepthBlitDepthOnlyPass m_DepthOnlyPass; // DepthOnlyPass is for platforms that run OpenGL ES, which does not support CopyDepth. private DepthBlitEdgePass m_DepthEdgePass; - + // Check if the platform supports CopyDepthPass private bool CanCopyDepth(ref CameraData cameraData) { @@ -47,7 +47,7 @@ private bool CanCopyDepth(ref CameraData cameraData) bool supportsDepthCopy = !msaaEnabledForCamera && (supportsDepthTarget || supportsTextureCopy); bool msaaDepthResolve = msaaEnabledForCamera && SystemInfo.supportsMultisampledTextures != 0; - + // Avoid copying MSAA depth on GLES3 platform to avoid invalid results if (IsGLESDevice() && msaaDepthResolve) return false; @@ -59,13 +59,13 @@ private bool IsGLESDevice() { return SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES3; } - + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { var cameraData = renderingData.cameraData; if (renderingData.cameraData.cameraType != CameraType.Game) return; - + // Create an RTHandle for storing the depth var desc = renderingData.cameraData.cameraTargetDescriptor; if (CanCopyDepth(ref cameraData)) @@ -78,21 +78,21 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref Rendering desc.graphicsFormat = GraphicsFormat.None; desc.msaaSamples = 1; } - RenderingUtils.ReAllocateIfNeeded(ref m_DepthRTHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_DepthRTName ); - + RenderingUtils.ReAllocateHandleIfNeeded(ref m_DepthRTHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_DepthRTName ); + // Setup passes if (CanCopyDepth(ref cameraData)) { if (m_CopyDepthPass == null) m_CopyDepthPass = new DepthBlitCopyDepthPass(evt_Depth, copyDepthShader, m_DepthRTHandle); - + renderer.EnqueuePass(m_CopyDepthPass); } else { if (m_DepthOnlyPass == null) m_DepthOnlyPass = new DepthBlitDepthOnlyPass(evt_Depth, RenderQueueRange.opaque, rendererDataAsset.opaqueLayerMask, m_DepthRTHandle); - + renderer.EnqueuePass(m_DepthOnlyPass); } @@ -114,4 +114,4 @@ protected override void Dispose(bool disposing) m_CopyDepthPass = null; m_DepthOnlyPass = null; } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs index 0b8864b54d2..00d305bdeeb 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs @@ -11,7 +11,7 @@ class PassData public TextureHandle source; public Vector4 scaleBias; } - + private Vector4 m_ScaleBias = new Vector4(1f, 1f, 0f, 0f); private ProfilingSampler m_ProfilingSampler = new ProfilingSampler("DistortTunnelPass_CopyColor"); private RTHandle m_OutputHandle; @@ -20,12 +20,14 @@ public DistortTunnelPass_CopyColor(RenderPassEvent evt) { renderPassEvent = evt; } - + public void SetRTHandles(ref RTHandle dest) { m_OutputHandle = dest; } +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor) { @@ -38,9 +40,9 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData var cameraData = renderingData.cameraData; if (cameraData.camera.cameraType != CameraType.Game) return; - + RTHandle source = cameraData.renderer.cameraColorTargetHandle; - + CommandBuffer cmd = CommandBufferPool.Get(); using (new ProfilingScope(cmd, m_ProfilingSampler)) { @@ -50,7 +52,9 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cmd.Clear(); CommandBufferPool.Release(cmd); } - + +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -65,11 +69,11 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer { // Set camera color as a texture resource for this render graph instance TextureHandle source = resourceData.activeColorTexture; - + // Set RTHandle as a texture resource for this render graph instance TextureHandle destination = renderGraph.ImportTexture(m_OutputHandle); texRefData.copyColorTexHandle = destination; - + if (!source.IsValid() || !destination.IsValid()) return; @@ -84,4 +88,4 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer }); } } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs index ca0eb4f7b4a..f52c642db22 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs @@ -10,12 +10,12 @@ class PassData { public Material material; } - + private ProfilingSampler m_ProfilingSampler = new ProfilingSampler("DistortTunnelPass_Distort"); private Material m_Material; - + // The RTHandles to be used as input and output in the Compatibility mode (non-RenderGraph path) - private RTHandle m_CopyColorHandle; + private RTHandle m_CopyColorHandle; private RTHandle m_TunnelHandle; private RTHandle m_OutputHandle; @@ -24,19 +24,21 @@ public DistortTunnelPass_Distort(Material mat, RenderPassEvent evt) renderPassEvent = evt; m_Material = mat; } - + public void SetRTHandles(ref RTHandle copyColorRT, ref RTHandle tunnelRT) { m_CopyColorHandle = copyColorRT; m_TunnelHandle = tunnelRT; - + if (m_Material == null) return; - + m_Material.SetTexture(m_CopyColorHandle.name,m_CopyColorHandle); m_Material.SetTexture(m_TunnelHandle.name,m_TunnelHandle); } - + +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Unity calls the OnCameraSetup method in the Compatibility mode (non-RenderGraph path) public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { @@ -53,7 +55,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData if (m_Material == null) return; - + CommandBuffer cmd = CommandBufferPool.Get(); using (new ProfilingScope(cmd, m_ProfilingSampler)) { @@ -63,7 +65,9 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cmd.Clear(); CommandBufferPool.Release(cmd); } - + +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -73,7 +77,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (cameraData.camera.cameraType != CameraType.Game) return; - + if (m_Material == null) return; @@ -81,10 +85,10 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer { // Set camera color as a texture resource for this render graph instance TextureHandle destination = resourceData.activeColorTexture; - + if (!texRefData.copyColorTexHandle.IsValid() || !texRefData.tunnelTexHandle.IsValid() || !destination.IsValid()) return; - + passData.material = m_Material; builder.UseTexture(texRefData.copyColorTexHandle, AccessFlags.Read); builder.UseTexture(texRefData.tunnelTexHandle, AccessFlags.Read); @@ -95,4 +99,4 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer }); } } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs index ab686eea8e4..9c9287377bf 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs @@ -11,7 +11,7 @@ class PassData public Renderer tunnelObject; public Material tunnelMaterial; } - + private ProfilingSampler m_ProfilingSampler = new ProfilingSampler("DistortTunnelPass_Tunnel"); private RTHandle m_OutputHandle; private Renderer m_TunnelObject; @@ -23,37 +23,39 @@ public DistortTunnelPass_Tunnel(RenderPassEvent evt) private void SetTunnelObject() { - if (m_TunnelObject != null) + if (m_TunnelObject != null) return; - + var tunnelGO = GameObject.Find("Tunnel"); if (tunnelGO != null) m_TunnelObject = tunnelGO.GetComponent(); } - + public void SetRTHandles(ref RTHandle dest) { m_OutputHandle = dest; } +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor) { ConfigureTarget(m_OutputHandle); } - + // Unity calls the Execute method in the Compatibility mode public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var cameraData = renderingData.cameraData; if (cameraData.camera.cameraType != CameraType.Game) return; - + // Get the "Tunnel" renderer object from the scene (example-specific code) SetTunnelObject(); if (!m_TunnelObject) return; - + CommandBuffer cmd = CommandBufferPool.Get(); using (new ProfilingScope(cmd, m_ProfilingSampler)) { @@ -63,7 +65,9 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cmd.Clear(); CommandBufferPool.Release(cmd); } - + +#pragma warning restore 618, 672 + // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -72,7 +76,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (cameraData.camera.cameraType != CameraType.Game) return; - + // Get the "Tunnel" renderer object from the scene (example-specific code) SetTunnelObject(); if (!m_TunnelObject) @@ -83,7 +87,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // Set RTHandle as a texture resource used by this render graph instance TextureHandle destination = renderGraph.ImportTexture(m_OutputHandle); texRefData.tunnelTexHandle = destination; - + if (!destination.IsValid()) return; @@ -96,4 +100,4 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer }); } } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelRendererFeature.cs index 96e649b219b..1a34ded160f 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelRendererFeature.cs @@ -11,25 +11,25 @@ public class DistortTunnelRendererFeature : ScriptableRendererFeature { public RenderPassEvent passEvent = RenderPassEvent.AfterRenderingSkybox; - + public Shader distortShader; private Material m_DistortMaterial; - + private DistortTunnelPass_CopyColor m_CopyColorPass; private DistortTunnelPass_Tunnel m_TunnelPass; private DistortTunnelPass_Distort m_DistortPass; - + private RTHandle m_CopyColorTexHandle; private const string k_CopyColorTexName = "_TunnelDistortBgTexture"; private RTHandle m_TunnelTexHandle; private const string k_TunnelTexName = "_TunnelDistortTexture"; - + // This class stores TextureHandle references in the frame data so that they can be shared with multiple passes in the render graph system. public class TexRefData : ContextItem { public TextureHandle copyColorTexHandle = TextureHandle.nullHandle; public TextureHandle tunnelTexHandle = TextureHandle.nullHandle; - + public override void Reset() { copyColorTexHandle = TextureHandle.nullHandle; @@ -44,19 +44,19 @@ public override void Create() m_DistortMaterial = CoreUtils.CreateEngineMaterial(distortShader); m_DistortPass = new DistortTunnelPass_Distort(m_DistortMaterial, passEvent); } - + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { if (renderingData.cameraData.cameraType != CameraType.Game) return; - + // Create RTHandles var desc = renderingData.cameraData.cameraTargetDescriptor; desc.depthBufferBits = 0; desc.msaaSamples = 1; - RenderingUtils.ReAllocateIfNeeded(ref m_CopyColorTexHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_CopyColorTexName ); - RenderingUtils.ReAllocateIfNeeded(ref m_TunnelTexHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_TunnelTexName ); - + RenderingUtils.ReAllocateHandleIfNeeded(ref m_CopyColorTexHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_CopyColorTexName ); + RenderingUtils.ReAllocateHandleIfNeeded(ref m_TunnelTexHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_TunnelTexName ); + // Provide the necessary RTHandles to the passes m_CopyColorPass.SetRTHandles(ref m_CopyColorTexHandle); m_TunnelPass.SetRTHandles(ref m_TunnelTexHandle); @@ -70,12 +70,12 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD protected override void Dispose(bool disposing) { CoreUtils.Destroy(m_DistortMaterial); - + m_DistortPass = null; m_TunnelPass = null; m_CopyColorPass = null; - + m_CopyColorTexHandle?.Release(); m_TunnelTexHandle?.Release(); } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs index fc4f8bea4e4..311595dae69 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs @@ -28,7 +28,9 @@ public void Setup(RTHandle destination) m_Destination = destination; } - // The Execute method gets called by the non-RenderGraph pipeline +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + + // Unity calls the Execute method in the Compatibility mode public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { if (renderingData.cameraData.camera.cameraType != CameraType.Game) @@ -44,6 +46,8 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData CommandBufferPool.Release(cmd); } +#pragma warning restore 618, 672 + // RecordRenderGraph is called for the RenderGraph path. // Because RenderGraph has to calculate internally how resources are used we must be aware of 2 // distinct timelines inside this method: one for recording resource usage and one for recording draw commands. @@ -114,6 +118,9 @@ static void ExecutePass(RasterCommandBuffer cmd, RTHandle source, Material mater Blitter.BlitTexture(cmd, source, viewportScale, material, 0); } +#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member + + // Unity calls the Execute method in the Compatibility mode public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(nameof(DrawOldFramePass)); @@ -126,6 +133,8 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData CommandBufferPool.Release(cmd); } +#pragma warning restore 618, 672 + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { UniversalResourceData resourceData = frameData.Get(); diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs index aeee876b614..7af9e23b813 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs @@ -34,8 +34,8 @@ public void Init(RenderGraph renderGraph, RenderTextureDescriptor targetDescript // Checks if the texture name is valid and puts in default value if not. var texName = String.IsNullOrEmpty(textureName) ? "_BlitTextureData" : textureName; // Reallocate if the RTHandles are being initialized for the first time or if the targetDescriptor has changed since last frame. - RenderingUtils.ReAllocateIfNeeded(ref m_TextureFront, targetDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: texName + "Front"); - RenderingUtils.ReAllocateIfNeeded(ref m_TextureBack, targetDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: texName + "Back"); + RenderingUtils.ReAllocateHandleIfNeeded(ref m_TextureFront, targetDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: texName + "Front"); + RenderingUtils.ReAllocateHandleIfNeeded(ref m_TextureBack, targetDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: texName + "Back"); // Create the texture handles inside render graph by importing the RTHandles in render graph. m_TextureHandleFront = renderGraph.ImportTexture(m_TextureFront); m_TextureHandleBack = renderGraph.ImportTexture(m_TextureBack); diff --git a/Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs b/Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs new file mode 100644 index 00000000000..cffc50a367c --- /dev/null +++ b/Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs @@ -0,0 +1,44 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using UnityEditor.PackageManager.UI; +using UnityEngine.TestTools; + +namespace UnityEditor.Rendering.Tests +{ + public class SampleImportTests + { + static string[] s_PackagePaths = + { + "Packages/com.unity.render-pipelines.universal", + "Packages/com.unity.render-pipelines.high-definition" + }; + + static IEnumerable PackageSampleCases() + { + foreach (var packagePath in s_PackagePaths) + { + var packageInfo = PackageManager.PackageInfo.FindForAssetPath(packagePath); + var samples = Sample.FindByPackage(packageInfo.name, packageInfo.version); + foreach (var sample in samples) + { + yield return new TestCaseData(sample) + .SetName($"Import {packageInfo.displayName} > {sample.displayName}") + .Returns(null); + } + } + } + + [UnityTest, TestCaseSource(nameof(PackageSampleCases))] + public IEnumerator ImportSamples(Sample sample) + { + sample.Import(Sample.ImportOptions.OverridePreviousImports | Sample.ImportOptions.HideImportWindow); + + EditorUtility.RequestScriptReload(); // Sample might not contain scripts, so ensure domain reload happens + + yield return new WaitForDomainReload(); + + FileUtil.DeleteFileOrDirectory("Assets/Samples"); + } + } +} diff --git a/Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs.meta b/Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs.meta new file mode 100644 index 00000000000..a2b8afd6679 --- /dev/null +++ b/Tests/SRPTests/Projects/SRP_SmokeTest/Assets/Tests/Editor/SampleImportTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 77f61304d553bbf4798d17edd420f3fc From f188c84754ef48295b92941e139222c448b51037 Mon Sep 17 00:00:00 2001 From: Arttu Peltonen Date: Tue, 7 May 2024 01:33:54 +0000 Subject: [PATCH 27/67] Fix shader warnings from HDRP TAA shader on Metal This PR fixes https://jira.unity3d.com/browse/UUM-70287 On Metal, shader compiler warns about using `int` on divide operations, and suggests to use `uint` instead to improve performance. This is fine so we do as the warning suggests. --- .../PostProcessing/Shaders/TemporalAntialiasing.hlsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl index 1a6ef147b7c..70de30c7f4a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl @@ -66,8 +66,8 @@ static float2 NeighbourOffsets[8]; void SetNeighbourOffsets(float4 neighbourOffsets[4]) { - UNITY_UNROLL for (int i = 0; i < 16; ++i) - NeighbourOffsets[i/2][i%2] = neighbourOffsets[i/4][i%4]; + UNITY_UNROLL for (uint i = 0; i < 16; ++i) + NeighbourOffsets[i / 2][i % 2] = neighbourOffsets[i / 4][i % 4]; } float2 ClampAndScaleForBilinearWithCustomScale(float2 uv, float2 scale) @@ -595,9 +595,9 @@ CTYPE FilterCentralColor(NeighbourhoodSamples samples, float centralWeight, floa { CTYPE filtered = samples.central * centralWeight; - for (int i = 0; i < NEIGHBOUR_COUNT; ++i) + for (uint i = 0; i < NEIGHBOUR_COUNT; ++i) { - float w = weights[i/4][i%4]; + float w = weights[i / 4][i % 4]; filtered += samples.neighbours[i] * w; } From 9479b1e5e41606da8acb112e4a53d453a2426d06 Mon Sep 17 00:00:00 2001 From: Mark Green Date: Tue, 7 May 2024 11:01:49 +0000 Subject: [PATCH 28/67] DOCG-5317/5318 Add GPU Resident Drawer and GPU occlusion culling documentation Add documentation for the following in URP and HDRP - GPU Resident Drawer - GPU culling Jira tickets: - https://jira.unity3d.com/browse/DOCG-5317 - https://jira.unity3d.com/browse/DOCG-5318 --- .../Documentation~/HDRP-Asset.md | 41 ++++++------ .../renderingdebugger-gpuculling-heatmap.jpg | Bin 0 -> 104483 bytes .../renderingdebugger-gpuculling-overlay.jpg | Bin 0 -> 105234 bytes .../Documentation~/Optimization.md | 7 ++ .../Documentation~/TableOfContents.md | 6 +- .../Documentation~/gpu-culling.md | 35 ++++++++++ .../Documentation~/gpu-resident-drawer.md | 55 ++++++++++++++++ .../make-object-compatible-gpu-rendering.md | 25 ++++++++ .../reduce-rendering-work-on-cpu.md | 13 ++++ .../rendering-debugger-window-reference.md | 60 ++++++++++++++++++ .../renderingdebugger-gpuculling-heatmap.jpg | Bin 0 -> 104483 bytes .../renderingdebugger-gpuculling-overlay.jpg | Bin 0 -> 105234 bytes .../Documentation~/TableOfContents.md | 4 ++ .../features/rendering-debugger.md | 58 +++++++++++++++++ .../Documentation~/gpu-culling.md | 39 ++++++++++++ .../Documentation~/gpu-resident-drawer.md | 58 +++++++++++++++++ .../make-object-compatible-gpu-rendering.md | 26 ++++++++ .../reduce-rendering-work-on-cpu.md | 13 ++++ .../Documentation~/universalrp-asset.md | 25 ++++---- 19 files changed, 434 insertions(+), 31 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/renderingdebugger-gpuculling-heatmap.jpg create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/renderingdebugger-gpuculling-overlay.jpg create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Optimization.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-culling.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-resident-drawer.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/make-object-compatible-gpu-rendering.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/reduce-rendering-work-on-cpu.md create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/Images/renderingdebugger-gpuculling-heatmap.jpg create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/Images/renderingdebugger-gpuculling-overlay.jpg create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/gpu-culling.md create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/gpu-resident-drawer.md create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/make-object-compatible-gpu-rendering.md create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/reduce-rendering-work-on-cpu.md diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Asset.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Asset.md index 13f455552e6..f4b4934a2eb 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Asset.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/HDRP-Asset.md @@ -6,25 +6,28 @@ Unity only allocates memory and builds shader variants for features you enable i ## Rendering -| **Property** | **Description** | -|------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Color Buffer Format** | The format of the color buffer that HDRP will use for rendering, using R16G16B16A16 instead of R11G11B10 will double the memory usage but help you to avoid banding. R16G16B16A16 is also required for [Alpha-Output](Alpha-Output.md). | -| **Lit Shader Mode** | Use the drop-down to choose which mode HDRP uses for the [Lit Shader](lit-material.md).
                  • **Forward Only**: forces HDRP to only use forward rendering for Lit Shaders.
                  • **Deferred Only**: forces HDRP to use deferred rendering for Lit Shaders (HDRP still renders advanced Materials using forward rendering).
                  • **Both**: allows the Camera to use deferred and forward rendering.

                  Select **Both** to allow you to switch between forward and deferred rendering for Lit Shaders at runtime per Camera. Selecting a specific mode reduces build time and Shader memory because HDRP requires less Shader variants, but it is not possible to switch from one mode to the other at runtime. | -| **- Multisample Anti-aliasing Quality** | Use the drop-down to set the number of samples HDRP uses for multisample anti-aliasing (MSAA). The larger the sample count, the better the quality. Select **None** to disable MSAA.
                  This property is only visible when **Lit Shader Mode** is set to **Forward Only** or **Both**. | -| **Motion Vectors** | Enable the checkbox to make HDRP support motion vectors. HDRP uses motion vectors for effects like screen space reflection (SSR) and motion blur. When disabled, motion blur has no effect and HDRP calculates SSR with lower quality. | -| **Runtime Debug Display** | Enable the checkbox to make HDRP able to use debug modes from the [Rendering Debugger](use-the-rendering-debugger.md) at runtime. Disable the checkbox to reduce build time and shader memory. This disables the following debug modes: All material property debug modes except GBuffer debug, the various property override options, and all the lighting debug modes. | -| **Runtime AOV API** | Enable the checkbox to make HDRP able to use the AOV API (rendering of material properties and lighting modes) at runtime. Disable this checkbox to reduce build time and shader memory. This disables the following AOV modes: All material properties and lighting modes. | | -| **Terrain Hole** | Enable the checkbox to make HDRP support [Terrain Holes](https://docs.unity3d.com/2019.3/Documentation/Manual/terrain-PaintHoles.html). If you do not enable this, Terrain Holes are not visible in your Scene. | -| **Transparent Backface** | Enable the checkbox to make HDRP support transparent back-face render passes. If your Unity Project does not need to make a transparent back-face pass, disable this checkbox to reduce build time. | -| **Transparent Depth Prepass** | Enable the checkbox to make HDRP support transparent depth render prepasses. If your Unity Project does not need to make a transparent depth prepass, disable this checkbox to reduce build time . | -| **Transparent Depth Postpass** | Enable the checkbox to make HDRP support transparent depth render postpasses. If your Unity Project does not make use of a transparent depth postpass. Uncheck this checkbox to reduce build time . | -| **Custom Pass** | Enable the checkbox to make HDRP support custom passes. If your Unity Project does not make use [Custom Passes](Custom-Pass.md), Uncheck this checkbox to save memory . | -| - **Custom Buffer Format** | Specify the texture format for the custom buffer. If you experience banding issues due to your custom passes, you can change it to either `R11G11B10` if you don't need alpha or `R16G16B16A16`. | -| **Realtime Raytracing (Preview)** | Enable the checkbox to enable HDRP realtime ray tracing (Preview). It requires to have ray tracing compatible hardware. For more information, please refer to the [Ray Tracing Getting Started](Ray-Tracing-Getting-Started.md) page. | -| **Visual Effects Ray Tracing (Preview)** | Enable the checkbox to make HDRP support ray tracing with Visual Effects. **Realtime Raytracing (Preview)** must be enabled. | -| **Supported Ray Tracing Mode (Preview)** | Select the supported modes for ray tracing effects (Performance, Quality or Both). For more information, see the [Ray Tracing Getting Started](Ray-Tracing-Getting-Started.md) page. | -| - **LOD Bias** | Set the value that Cameras use to calculate their LOD bias. The Camera uses this value differently depending on the **LOD Bias Mode** you select. | -| - **Maximum LOD Level** | Set the value that Cameras use to calculate their maximum level of detail. The Camera uses this value differently depending on the **Maximum LOD Level Mode** you select. | +| **Property** | **Sub-property** | **Description** | +|-|-|-| +| **Color Buffer Format** || The format of the color buffer that HDRP uses for rendering. Using R16G16B16A16 instead of R11G11B10 doubles the memory usage, but helps avoid banding. R16G16B16A16 is also required for [Alpha-Output](Alpha-Output.md). | +| **Lit Shader Mode** || Use the drop-down to choose which mode HDRP uses for the [Lit Shader](lit-material.md).
                  • **Forward Only**: forces HDRP to only use forward rendering for Lit Shaders.
                  • **Deferred Only**: forces HDRP to use deferred rendering for Lit Shaders (HDRP still renders advanced Materials using forward rendering).
                  • **Both**: allows the Camera to use deferred and forward rendering.

                  Select **Both** to allow you to switch between forward and deferred rendering for Lit Shaders at runtime per Camera. Selecting a specific mode reduces build time and Shader memory because HDRP requires less Shader variants, but it is not possible to switch from one mode to the other at runtime. | +| **- Multisample Anti-aliasing Quality** || Use the drop-down to set the number of samples HDRP uses for multisample anti-aliasing (MSAA). The larger the sample count, the better the quality. Select **None** to disable MSAA.
                  This property is only visible when **Lit Shader Mode** is set to **Forward Only** or **Both**. | +| **Motion Vectors** || Enable the checkbox to enable motion vector support in HDRP. HDRP uses motion vectors for effects like screen space reflection (SSR) and motion blur. When disabled, motion blur has no effect and HDRP calculates SSR with lower quality. | +| **Runtime Debug Display** || Enable the checkbox to enable HDRP to use debug modes from the [Rendering Debugger](use-the-rendering-debugger.md) at runtime. Disable the checkbox to reduce build time and shader memory. This disables all property override options, all lighting debug modes, and all material property debug modes except GBuffer debug. | +| **Runtime AOV API** || Enable the checkbox to enable HDRP able to use the AOV API (rendering of material properties and lighting modes) at runtime. Disable this checkbox to reduce build time and shader memory. This disables all material properties and lighting modes. | | +| **Terrain Hole** || Enable the checkbox to enable suppot for [Terrain Holes](https://docs.unity3d.com/2019.3/Documentation/Manual/terrain-PaintHoles.html) in HDRP. If you do not enable this, Terrain Holes are not visible in your Scene. | +| **Transparent Backface** || Enable the checkbox to enable support for transparent back-face render passes in HDRP. If your Unity Project does not need to make a transparent back-face pass, disable this checkbox to reduce build time. | +| **Transparent Depth Prepass** || Enable the checkbox to enable support for transparent depth render prepasses in HDRP. If your Unity Project does not need to make a transparent depth prepass, disable this checkbox to reduce build time. | +| **Transparent Depth Postpass** || Enable the checkbox to enable support for transparent depth render postpasses in HDRP. If your Unity Project does not make use of a transparent depth postpass, disable this checkbox to reduce build time. | +| **Custom Pass** || Enable the checkbox to enable support for [custom passes](Custom-Pass.md) in HDRP. If your Unity Project does not use custom passes, disable this checkbox to save memory. | +| - **Custom Buffer Format** || Specify the texture format for the custom buffer. If you experience banding issues due to your custom passes, you can change it to either `R11G11B10` if you don't need alpha, or `R16G16B16A16` if you do need alpha. | +| **Realtime Raytracing (Preview)** || Enable the checkbox to enable HDRP realtime ray tracing (Preview). It requires ray tracing-compatible hardware. For more information, refer to [Ray Tracing Getting Started](Ray-Tracing-Getting-Started.md). | +| **Visual Effects Ray Tracing (Preview)** || Enable the checkbox to enable support for ray tracing with Visual Effects in HDRP. **Realtime Raytracing (Preview)** must be enabled. | +| **Supported Ray Tracing Mode (Preview)** || Select the supported modes for ray tracing effects (**Performance**, **Quality**, or **Both**). For more information, refer to [Ray Tracing Getting Started](Ray-Tracing-Getting-Started.md). | +| - **LOD Bias** || Set the value that Cameras use to calculate their LOD bias. The Camera uses this value differently depending on the **LOD Bias Mode** you select. | +| - **Maximum LOD Level** || Set the value that Cameras use to calculate their maximum level of detail. The Camera uses this value differently depending on the **Maximum LOD Level Mode** you select. | +| **GPU Resident Drawer**||The GPU Resident Drawer automatically uses the [`BatchRendererGroup`](https://docs.unity3d.com/Manual/batch-renderer-group.html) API to draw GameObjects with GPU instancing. Refer to [Use the GPU Resident Drawer](gpu-resident-drawer.md) for more information.

                  • **Disabled**: Unity doesn't automatically draw GameObjects with GPU instancing.
                  • **Instanced Drawing**: Unity automatically draws GameObjects with GPU instancing.
                  | +|| **Small-Mesh Screen-Percentage** | Set the screen percentage Unity uses to cull small GameObjects, to speed up rendering. Unity culls GameObjects that fill less of the screen than this value. This setting might not work if you use your own [Level of Detail (LOD) meshes](https://docs.unity3d.com/Manual/LevelOfDetail.html). Set the value to 0 to stop Unity culling small GameObjects.

                  To prevent Unity culling an individual GameObject that covers less screen space than this value, go to the **Inspector** window for the GameObject and add a **Disallow Small Mesh Culling** component. | +|| **GPU Occlusion Culling** | Enable Unity using the GPU instead of the CPU to exclude GameObjects from rendering when they're hidden behind other GameObjects. Refer to [Use GPU occlusion culling](gpu-culling.md) for more information. | diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/renderingdebugger-gpuculling-heatmap.jpg b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/renderingdebugger-gpuculling-heatmap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..024d6b6f53482eddb50df9f789f2c35ed0e1ec84 GIT binary patch literal 104483 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 k? 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 YF^30%7{YHK#s2^^i}@T+$o#+m*`B9|lK=n! literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/renderingdebugger-gpuculling-overlay.jpg b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/renderingdebugger-gpuculling-overlay.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5898fbc40837c83686b216a2d5e60222f062c2b5 GIT binary patch literal 105234 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�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 literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Optimization.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Optimization.md new file mode 100644 index 00000000000..d1a4073d9a8 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Optimization.md @@ -0,0 +1,7 @@ +# Optimization + +Optimize the High Definition Render Pipeline (HDRP) to improve the performance of your project. + +|Page|Description| +|-|-| +|[Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md)|Use the GPU Resident Drawer or GPU occlusion culling to speed up rendering.| diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md index 3270a53b6e9..799957bc32f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md @@ -297,7 +297,11 @@ * [Understand and fix Not a Number (NAN) and Infinite (Inf) values](Post-Processing-Propagating-NaNs.md) * [Known issues](Known-Issues.md) * [Stencil Buffer Usage](Stencil-Usage.md) - +* [Optimization](Optimization.md) + * [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) + * [Use the GPU Resident Drawer](gpu-resident-drawer.md) + * [Make a GameObject compatible with the GPU Resident Drawer](make-object-compatible-gpu-rendering.md) + * [Use GPU occlusion culling](gpu-culling.md) * [Reference](Reference.md) * [Menu Items](Menu-Items.md) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-culling.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-culling.md new file mode 100644 index 00000000000..a4409169fba --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-culling.md @@ -0,0 +1,35 @@ +# Use GPU occlusion culling + +GPU occlusion culling means Unity uses the GPU instead of the CPU to exclude objects from rendering when they're occluded behind other objects. Unity uses this information to speed up rendering in scenes that have a lot of occlusion. + +The GPU Resident Drawer works only with [Graphics APIs](https://docs.unity3d.com/6000.0/Documentation/Manual/GraphicsAPIs.html) and platforms that support compute shaders. + +## How GPU occlusion culling works + +Unity generates depth textures from the perspective of cameras and lights in the scene. + +The GPU then uses the depth textures from the current frame and the previous frame to cull objects. Unity renders only objects that are unoccluded in either frame. Unity culls the remaining objects, which are occluded in both frames. + +Whether GPU occlusion culling speeds up rendering depends on your scene. GPU occlusion culling is most effective in the following setups: + +- Multiple objects use the same mesh, so Unity can group them into a single draw call. +- The scene has a lot of occlusion, especially if the occluded objects have a high number of vertices. + +If occlusion culling doesn't have a big effect on your scene, rendering time might increase because of the extra work the GPU does to set up GPU occlusion culling. + +## Enable GPU occlusion culling + +1. [Enable the GPU Resident Drawer](gpu-resident-drawer.md#enable-the-gpu-resident-drawer). +2. In the active [HDRP Asset](HDRP-Asset.md), in the **Rendering** section, enable **GPU Occlusion**. + +## Analyze GPU occlusion culling + +You can use the following to analyze GPU occlusion culling: + +- [Rendering Statistics](https://docs.unity3d.com/Manual/RenderingStatistics.html) overlay to check rendering speed increases. +- [Rendering Debugger](rendering-debugger-window-reference.md) to troubleshoot issues. + +## Additional resources + +- [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) +- [Occlusion culling](https://docs.unity3d.com/Manual/OcclusionCulling.html) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-resident-drawer.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-resident-drawer.md new file mode 100644 index 00000000000..036c132a6e3 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/gpu-resident-drawer.md @@ -0,0 +1,55 @@ + +# Use the GPU Resident Drawer + +The GPU Resident Drawer automatically uses the [`BatchRendererGroup`](https://docs.unity3d.com/Manual/batch-renderer-group.html) API to draw GameObjects with GPU instancing, which reduces the number of draw calls and frees CPU processing time. For more information, refer to [How BatchRendererGroup works](https://docs.unity3d.com/Manual/batch-renderer-group-how.html). + +The GPU Resident Drawer works only with the following: + +- [Graphics APIs](https://docs.unity3d.com/6000.0/Documentation/Manual/GraphicsAPIs.html) and platforms that support compute shaders. +- GameObjects that have a [**Mesh Renderer** component](https://docs.unity3d.com/Manual/class-MeshRenderer.html). + +Otherwise, Unity falls back to drawing the GameObject without GPU instancing. + +If you enable the GPU Resident Drawer, the following applies: + +- Build times are longer because Unity compiles all the `BatchRendererGroup` shader variants into your build. + +## Enable the GPU Resident Drawer + +To enable the GPU Resident Drawer, follow these steps: + +1. Go to **Project Settings** > **Graphics**, then in the **Shader Stripping** section set **BatchRendererGroup Variants** to **Keep All**. +2. Go to the active [HDRP Asset](HDRP-Asset.md), then in the **Rendering** section set **GPU Resident Drawer** to **Instanced Drawing**. + +If you change or create GameObjects each frame, the GPU Resident Drawer updates with the changes. + +To include or exclude GameObjects from the GPU Resident Drawer, refer to [Make a GameObject compatible with the GPU Resident Drawer](make-object-compatible-gpu-rendering.md). + +## Analyze the GPU Resident Drawer + +To analyze the results of the GPU Resident Drawer, you can use the following: + +- [Frame Debugger](https://docs.unity3d.com/Manual/FrameDebugger.html). If the GPU Resident Drawer groups GameObjects, the Frame Debugger displays draw calls called **Hybrid Batch Group**. +- [Rendering Debugger](rendering-debugger-window-reference.md) +- [Rendering Statistics](https://docs.unity3d.com/Manual/RenderingStatistics.html) to check if the number of frames per second has increased, and the CPU processing time and SetPass calls have decreased. +- [Unity Profiler](https://docs.unity3d.com/Manual/Profiler.html) + +## Optimize the GPU Resident Drawer + +How much the GPU Resident Drawer speeds up rendering depends on your scene. The GPU Resident Drawer is most effective in the following setups: + +- The scene is large. +- Multiple GameObjects use the same mesh, so Unity can group them into a single draw call. + +Rendering usually speeds up less in the Scene view and the Game view, compared to Play mode or a final built project. + +The following might speed up the GPU Resident Drawer: + +- Go to **Project Settings** > **Player**, then in the **Other Settings** section, disable **Static Batching**. +- Go to **Window** > **Panels** > **Lighting**, then in the **Lightmapping Settings** section enable **Fixed Lightmap Size** and disable **Use Mipmap Limits**. + +## Additional resources + +- [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) +- [Graphics performance fundamentals](https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html) +- [GPU occlusion culling](gpu-culling.md) \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/make-object-compatible-gpu-rendering.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/make-object-compatible-gpu-rendering.md new file mode 100644 index 00000000000..4e90a838362 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/make-object-compatible-gpu-rendering.md @@ -0,0 +1,25 @@ +# Make a GameObject compatible with the GPU Resident Drawer + +To make a GameObject compatible with the [GPU Resident Drawer](gpu-resident-drawer.md), check it has the following properties: + +- Has a [Mesh Renderer component](https://docs.unity3d.com/Manual/class-MeshRenderer.html). +- In the Mesh Renderer component, **Light Probes** isn't set to **Use Proxy Volume**. +- Uses only static global illumination, not real time global illumination. +- Uses a shader that supports DOTS instancing. Refer to [Supporting DOTS Instancing](https://docs.unity3d.com/Manual/dots-instancing-shaders.html) for more information. +- Doesn't move position after one camera finishes rendering and before another camera starts rendering. +- Doesn't use the `MaterialPropertyBlock` API. +- Doesn't have a script that uses a per-instance callback, for example `OnRenderObject`. + +## Exclude a GameObject from the GPU Resident Drawer + +To exclude a GameObject from the GPU Resident Drawer, add a **Disallow GPU Driven Rendering** component to the GameObject. + +1. Select the GameObject. +2. In the **Inspector** window, select **Add Component**. +3. Select **Disallow GPU Driven Rendering**. + +Select **Apply to Children Recursively** to exclude both the GameObject and its children. + +## Additional resources + +- [Mesh Renderer component](https://docs.unity3d.com/Manual/class-MeshRenderer.html) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/reduce-rendering-work-on-cpu.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/reduce-rendering-work-on-cpu.md new file mode 100644 index 00000000000..31271cd9021 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/reduce-rendering-work-on-cpu.md @@ -0,0 +1,13 @@ +# Reduce rendering work on the CPU + +You can use the GPU Resident Drawer or GPU occlusion culling to speed up rendering. When you enable these features, Unity optimizes the rendering pipeline so the CPU has less work to do each frame, and the GPU draws GameObjects more efficiently. + +|Page|Description| +|-|-| +|[Use the GPU Resident Drawer](gpu-resident-drawer.md)|Automatically use the `BatchRendererGroup` API to use instancing and reduce the number of draw calls.| +|[Make a GameObject compatible with the GPU Resident Drawer](make-object-compatible-gpu-rendering.md)|Include or exclude a GameObject from the GPU Resident Drawer.| +|[Use GPU occlusion culling](gpu-culling.md)|Use the GPU instead of the CPU to exclude GameObjects from rendering when they're occluded behind other GameObjects.| + +## Additional resources + +- [Graphics performance fundamentals](https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md index 4a2fab735f0..160440a0220 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md @@ -12,6 +12,7 @@ The Rendering Debugger separates debug items into the following sections: * [Probe Volume](#ProbeVolume) * [Camera](#CameraPanel) * [Virtual Texturing](#VirtualTexturingPanel) +* [GPU Resident Drawer](#GPUResidentDrawer) Refer to [Use the Rendering debugger](use-the-rendering-debugger.md) for more information. @@ -780,3 +781,62 @@ You can use the **Virtual Texturing** panel to visualize [Streaming Virtual Text | ------------------------------------ | ------------------------------------------------------------- | | **Debug disable Feedback Streaming** | Deactivate Streaming Virtual Texturing to quickly assess its cost in performance and memory at runtime. | | **Textures with Preloaded Mips** | Display the total number of virtual textures Unity has loaded into the scene. Unity tries to preload the least detailed mipmap level (least being 128x128) into GPU memory. This number increases every time a material is loaded. | + + + +## GPU Resident Drawer + +The properties in this section let you visualize settings that [reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md). + +### Occlusion Culling + +|**Property**|**Sub-property**|**Description**| +|-|-|-| +| **Occlusion Test Overlay** || Display a heatmap of culled instances. The heatmap displays blue if there are few culled instances, through to red if there are many culled instances. If you enable this setting, culling might be slower. | +| **Occlusion Test Overlay Count Visible** || Display a heatmap of instances that Unity doesn't cull. The heatmap displays blue if there are many culled instances, through to red if there are few culled instances. This setting only has an effect if you enable **Occlusion Test Overlay**. | +| **Override Occlusion Test To Always Pass** || Set occluded objects as unoccluded. This setting affects both the Rendering Debugger and the scene. | +| **Occluder Context Stats** || Display the [**Occlusion Context Stats**](#occlusion-context-stats) section. | +| **Occluder Debug View** || Display an overlay with the occlusion textures and mipmaps Unity generates. | +|| **Occluder Debug View Index** | Set the occlusion texture to display. | +|| **Occluder Debug View Range Min** | Set the brightness of the minimum depth value. Increase this value to brighten objects that are far away from the view. | +|| **Occluder Debug View Range Max** | Set the brightness of the maximum depth value. Decrease this value to darken objects that are close to the view. | + +![](Images/renderingdebugger-gpuculling-heatmap.jpg)
                  +The Rendering Debugger with **Occlusion Test Overlay** enabled. The red areas are where Unity culls many objects. The blue area is where Unity culls few objects. + +![](Images/renderingdebugger-gpuculling-overlay.jpg)
                  +The Rendering Debugger with **Occluder Debug View** enabled. The overlay displays each mipmap level of the occlusion texture. + +### Occlusion Context Stats + +The **Occlusion Context Stats** section lists the occlusion textures Unity generates. + +|**Property**|**Description**| +|-|-| +| **Active Occlusion Contexts** | The number of occlusion textures. | +| **View Instance ID** | The instance ID of the camera Unity renders the view from, to create the occlusion texture. | +| **Subview Count** | The number of subviews. The value might be 2 or more if you use XR. | +| **Size Per Subview** | The size of the subview texture in bytes. | + +### GPU Resident Drawer Settings + +|**Section**|**Property**|**Sub-property**|**Description**| +|-|-|-|-| +|**Display Culling Stats**|||Display information about the cameras Unity uses to create occlusion textures.| +|**Instance Culler Stats**|||| +||**View Count**|| The number of views Unity uses for GPU culling. Unity uses one view per shadow cascade or shadow map. For example, Unity uses three views for a Directional Light that generates three shadow cascades. | +||**Per View Stats**||| +|||**View Type**| The object or shadow split Unity renders the view from. | +|||**View Instance ID**| The instance ID of the camera or light Unity renders the view from. | +|||**Split Index**| The shadow split index value. This value is 0 if the object doesn't have shadow splits. | +|||**Visible Instances**| How many objects are visible in this split. | +|||**Draw Commands**| How many draw commands Unity uses for this split. | +|**Occlusion Culling Events**|||| +||**View Instance ID**|| The instance ID of the camera Unity renders the view from. | +||**Event type**|| The type of render pass.

                  • **OccluderUpdate**
                  • The GPU samples the depth buffer and creates a new occlusion texture and its mipmap.
                  • **OcclusionTest**
                  • The GPU tests all the instances against the occlusion texture.
                  | +||**Occluder Version**|| How many times Unity updates the occlusion texture in this frame. | +||**Subview Mask**|| A bitmask that represents which subviews are affected in this frame. | +||**Occlusion Test**|| Which test the GPU runs against the occlusion texture.
                  • **TestNone**
                  • Unity found no occluders, so all instances are visible.
                  • **TestAll**: Unity tests all instances against the occlusion texture.
                  • **TestCulled**: Unity tests only instances that the previous **TestAll** test culled.
                  | +||**Visible Instances**|| The number of visible instances after occlusion culling. | +||**Culled Instances**|| The number of culled instances after occlusion culling. | + diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/Images/renderingdebugger-gpuculling-heatmap.jpg b/Packages/com.unity.render-pipelines.universal/Documentation~/Images/renderingdebugger-gpuculling-heatmap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..024d6b6f53482eddb50df9f789f2c35ed0e1ec84 GIT binary patch literal 104483 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 k? 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 YF^30%7{YHK#s2^^i}@T+$o#+m*`B9|lK=n! literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/Images/renderingdebugger-gpuculling-overlay.jpg b/Packages/com.unity.render-pipelines.universal/Documentation~/Images/renderingdebugger-gpuculling-overlay.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5898fbc40837c83686b216a2d5e60222f062c2b5 GIT binary patch literal 105234 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�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 literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md b/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md index 02da07cd287..5abba43cac8 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md @@ -201,6 +201,10 @@ * [Rendering Debugger](features/rendering-debugger.md) * [Add controls to the Rendering Debugger](features/rendering-debugger-add-controls.md) * [Optimize for better performance](optimize-for-better-performance.md) + * [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) + * [Use the GPU Resident Drawer](gpu-resident-drawer.md) + * [Make a GameObject compatible with the GPU Resident Drawer](make-object-compatible-gpu-rendering.md) + * [Use GPU occlusion culling](gpu-culling.md) * [Update Quality Setting Presets for URP](birp-onboarding/quality-presets.md) * [2D graphics features](2d-index.md) * [Introduction to the 2D Lighting system](Lights-2D-intro.md) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/features/rendering-debugger.md b/Packages/com.unity.render-pipelines.universal/Documentation~/features/rendering-debugger.md index 4ddddd51622..f105e1a7f58 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/features/rendering-debugger.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/features/rendering-debugger.md @@ -60,6 +60,8 @@ The **Rendering Debugger** window contains the following sections: * [Lighting](#lighting) +* [GPU Resident Drawer](#gpu-resident-drawer) + * [Render Graph](#render-graph) * [Probe Volume](#probe-volume-panel) @@ -198,6 +200,62 @@ The properties in this section let you visualize different settings and elements | **Lighting Debug Mode** | Specifies which lighting and shadow information to overlay on-screen to debug. The options are:

                  • **None**: Renders the scene normally without a debug overlay.
                  • **Shadow Cascades**: Overlays shadow cascade information so you can determine which shadow cascade each pixel uses. Use this to debug shadow cascade distances. For information on which color represents which shadow cascade, refer to the [Shadows section of the URP Asset](../universalrp-asset.md#shadows).
                  • **Lighting Without Normal Maps**: Renders the scene to visualize lighting. This mode uses neutral materials and disables normal maps. This and the **Lighting With Normal Maps** mode are useful for debugging lighting issues caused by normal maps.
                  • **Lighting With Normal Maps**: Renders the scene to visualize lighting. This mode uses neutral materials and allows normal maps.
                  • **Reflections**: Renders the scene to visualize reflections. This mode applies perfectly smooth, reflective materials to every Mesh Renderer.
                  • **Reflections With Smoothness**: Renders the scene to visualize reflections. This mode applies reflective materials without an overridden smoothness to every GameObject.
                  | | **Lighting Features** | Specifies flags for which lighting features contribute to the final lighting result. Use this to view and debug specific lighting features in your scene. The options are:
                  • **Nothing**: Shortcut to disable all flags.
                  • **Everything**: Shortcut to enable all flags.
                  • **Global Illumination**: Indicates whether to render [global illumination](https://docs.unity3d.com/Manual/realtime-gi-using-enlighten.html).
                  • **Main Light**: Indicates whether the main directional [Light](../light-component.md) contributes to lighting.
                  • **Additional Lights**: Indicates whether lights other than the main directional light contribute to lighting.
                  • **Vertex Lighting**: Indicates whether additional lights that use per-vertex lighting contribute to lighting.
                  • **Emission**: Indicates whether [emissive](https://docs.unity3d.com/Manual/StandardShaderMaterialParameterEmission.html) materials contribute to lighting.
                  • **Ambient Occlusion**: Indicates whether [ambient occlusion](../post-processing-ssao.md) contributes to lighting.
                  | +### GPU Resident Drawer + +The properties in this section let you visualize settings that [reduce rendering work on the CPU](../reduce-rendering-work-on-cpu.md). + +#### Occlusion Culling + +|**Property**|**Sub-property**|**Description**| +|-|-|-| +| **Occlusion Test Overlay** || Display a heatmap of culled instances. The heatmap displays blue if there are few culled instances, through to red if there are many culled instances. If you enable this setting, culling might be slower. | +| **Occlusion Test Overlay Count Visible** || Display a heatmap of instances that Unity doesn't cull. The heatmap displays blue if there are many culled instances, through to red if there are few culled instances. This setting only has an effect if you enable **Occlusion Test Overlay**. | +| **Override Occlusion Test To Always Pass** || Set occluded objects as unoccluded. This setting affects both the Rendering Debugger and the scene. | +| **Occluder Context Stats** || Display the [**Occlusion Context Stats**](#occlusion-context-stats) section. | +| **Occluder Debug View** || Display an overlay with the occlusion textures and mipmaps Unity generates. | +|| **Occluder Debug View Index** | Set the occlusion texture to display. | +|| **Occluder Debug View Range Min** | Set the brightness of the minimum depth value. Increase this value to brighten objects that are far away from the view. | +|| **Occluder Debug View Range Max** | Set the brightness of the maximum depth value. Decrease this value to darken objects that are close to the view. | + +![](../Images/renderingdebugger-gpuculling-heatmap.jpg)
                  +The Rendering Debugger with **Occlusion Test Overlay** enabled. The red areas are where Unity culls many objects. The blue area is where Unity culls few objects. + +![](../Images/renderingdebugger-gpuculling-overlay.jpg)
                  +The Rendering Debugger with **Occluder Debug View** enabled. The overlay displays each mipmap level of the occlusion texture. + +#### Occlusion Context Stats + +The **Occlusion Context Stats** section lists the occlusion textures Unity generates. + +|**Property**|**Description**| +|-|-| +| **Active Occlusion Contexts** | The number of occlusion textures. | +| **View Instance ID** | The instance ID of the camera Unity renders the view from, to create the occlusion texture. | +| **Subview Count** | The number of subviews. The value might be 2 or more if you use XR. | +| **Size Per Subview** | The size of the subview texture in bytes. | + +#### GPU Resident Drawer Settings + +|**Section**|**Property**|**Sub-property**|**Description**| +|-|-|-|-| +|**Display Culling Stats**|||Display information about the cameras Unity uses to create occlusion textures.| +|**Instance Culler Stats**|||| +||**View Count**|| The number of views Unity uses for GPU culling. Unity uses one view per shadow cascade or shadow map. For example, Unity uses three views for a Directional Light that generates three shadow cascades. | +||**Per View Stats**||| +|||**View Type**| The object or shadow split Unity renders the view from. | +|||**View Instance ID**| The instance ID of the camera or light Unity renders the view from. | +|||**Split Index**| The shadow split index value. This value is 0 if the object doesn't have shadow splits. | +|||**Visible Instances**| How many objects are visible in this split. | +|||**Draw Commands**| How many draw commands Unity uses for this split. | +|**Occlusion Culling Events**|||| +||**View Instance ID**|| The instance ID of the camera Unity renders the view from. | +||**Event type**|| The type of render pass.
                  • **OccluderUpdate**
                  • The GPU samples the depth buffer and creates a new occlusion texture and its mipmap.
                  • **OcclusionTest**
                  • The GPU tests all the instances against the occlusion texture.
                  | +||**Occluder Version**|| How many times Unity updates the occlusion texture in this frame. | +||**Subview Mask**|| A bitmask that represents which subviews are affected in this frame. | +||**Occlusion Test**|| Which test the GPU runs against the occlusion texture.
                  • **TestNone**
                  • Unity found no occluders, so all instances are visible.
                  • **TestAll**: Unity tests all instances against the occlusion texture.
                  • **TestCulled**: Unity tests only instances that the previous **TestAll** test culled.
                  | +||**Visible Instances**|| The number of visible instances after occlusion culling. | +||**Culled Instances**|| The number of culled instances after occlusion culling. | + ### Render Graph The properties in this section let you change how the [render graph system](../render-graph.md) works. diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/gpu-culling.md b/Packages/com.unity.render-pipelines.universal/Documentation~/gpu-culling.md new file mode 100644 index 00000000000..4d61380d2d6 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/gpu-culling.md @@ -0,0 +1,39 @@ +# Use GPU occlusion culling + +GPU occlusion culling means Unity uses the GPU instead of the CPU to exclude objects from rendering when they're occluded behind other objects. Unity uses this information to speed up rendering in scenes that have a lot of occlusion. + +The GPU Resident Drawer works only with the following: + +- The [Forward+](rendering/forward-plus-rendering-path.md) rendering path. +- [Graphics APIs](https://docs.unity3d.com/6000.0/Documentation/Manual/GraphicsAPIs.html) and platforms that support compute shaders. + +## How GPU occlusion culling works + +Unity generates depth textures from the perspective of cameras and lights in the scene. + +The GPU then uses the depth textures from the current frame and the previous frame to cull objects. Unity renders only objects that are unoccluded in either frame. Unity culls the remaining objects, which are occluded in both frames. + +Whether GPU occlusion culling speeds up rendering depends on your scene. GPU occlusion culling is most effective in the following setups: + +- Multiple objects use the same mesh, so Unity can group them into a single draw call. +- The scene has a lot of occlusion, especially if the occluded objects have a high number of vertices. + +If occlusion culling doesn't have a big effect on your scene, rendering time might increase because of the extra work the GPU does to set up GPU occlusion culling. + +## Enable GPU occlusion culling + +1. Go to **Graphics**, select the **URP** tab, then in the **Render Graph** section make sure **Compatibility Mode (Render Graph Disabled)** is disabled. +2. [Enable the GPU Resident Drawer](gpu-resident-drawer.md#enable-the-gpu-resident-drawer). +3. In the active [Universal Renderer](urp-universal-renderer.md), enable **GPU Occlusion**. + +## Analyze GPU occlusion culling + +You can use the following to analyze GPU occlusion culling: + +- [Rendering Statistics](https://docs.unity3d.com/Manual/RenderingStatistics.html) overlay to check rendering speed increases. +- [Rendering Debugger](features/rendering-debugger.md#gpu-resident-drawer) to troubleshoot issues. + +## Additional resources + +- [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) +- [Occlusion culling](https://docs.unity3d.com/Manual/OcclusionCulling.html) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/gpu-resident-drawer.md b/Packages/com.unity.render-pipelines.universal/Documentation~/gpu-resident-drawer.md new file mode 100644 index 00000000000..b10a6e56289 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/gpu-resident-drawer.md @@ -0,0 +1,58 @@ + +# Use the GPU Resident Drawer + +The GPU Resident Drawer automatically uses the [`BatchRendererGroup`](https://docs.unity3d.com/Manual/batch-renderer-group.html) API to draw GameObjects with GPU instancing, which reduces the number of draw calls and frees CPU processing time. For more information, refer to [How BatchRendererGroup works](https://docs.unity3d.com/Manual/batch-renderer-group-how.html). + +The GPU Resident Drawer works only with the following: + +- The [Forward+](rendering/forward-plus-rendering-path.md) rendering path. +- [Graphics APIs](https://docs.unity3d.com/6000.0/Documentation/Manual/GraphicsAPIs.html) and platforms that support compute shaders. +- GameObjects that have a [Mesh Renderer component](https://docs.unity3d.com/Manual/class-MeshRenderer.html). + +Otherwise, Unity falls back to drawing the GameObject without GPU instancing. + +If you enable the GPU Resident Drawer, the following applies: + +- Build times are longer because Unity compiles all the `BatchRendererGroup` shader variants into your build. + +## Enable the GPU Resident Drawer + +Follow these steps: + +1. Go to **Project Settings** > **Graphics**, then in the **Shader Stripping** section set **BatchRendererGroup Variants** to **Keep All**. +2. Go to the active [URP Asset](universalrp-asset.md) and enable **SRP Batcher**. +3. Double-click the renderer in the **Renderer List** to open the Universal Renderer, then set **Rendering Path** to **Forward+**. +4. Set **GPU Resident Drawer** to **Instanced Drawing**. + +If you change or create GameObjects each frame, the GPU Resident Drawer updates with the changes. + +To include or exclude GameObjects from the GPU Resident Drawer, refer to [Make a GameObject compatible with the GPU Resident Drawer](make-object-compatible-gpu-rendering.md). + +## Analyze the GPU Resident Drawer + +To analyze the results of the GPU Resident Drawer, you can use the following: + +- [Frame Debugger](https://docs.unity3d.com/Manual/FrameDebugger.html). The GPU Resident Drawer groups GameObjects into draw calls with the name **Hybrid Batch Group**. +- [Rendering Debugger](features/rendering-debugger.md#gpu-resident-drawer). +- [Rendering Statistics](https://docs.unity3d.com/Manual/RenderingStatistics.html) to check if the number of frames per second increases, and the CPU processing time and SetPass calls decreases. +- [Unity Profiler](optimize-for-better-performance.md) + +## Optimize the GPU Resident Drawer + +How much the GPU Resident Drawer speeds up rendering depends on your scene. The GPU Resident Drawer is most effective in the following setups: + +- The scene is large. +- Multiple GameObjects use the same mesh, so Unity can group them into a single draw call. + +Rendering usually speeds up less in the Scene view and the Game view, compared to Play mode or your final built project. + +The following might speed up the GPU Resident Drawer: + +- Go to **Project Settings** > **Player**, then in the **Other Settings** section disable **Static Batching**. +- Go to **Window** > **Panels** > **Lighting**, then in the **Lightmapping Settings** section enable **Fixed Lightmap Size** and disable **Use Mipmap Limits**. + +## Additional resources + +- [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) +- [Graphics performance fundamentals](https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html) +- [GPU occlusion culling](gpu-culling.md) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/make-object-compatible-gpu-rendering.md b/Packages/com.unity.render-pipelines.universal/Documentation~/make-object-compatible-gpu-rendering.md new file mode 100644 index 00000000000..3f704feb4ae --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/make-object-compatible-gpu-rendering.md @@ -0,0 +1,26 @@ +# Make a GameObject compatible with the GPU Resident Drawer + +To make a GameObject compatible with the [GPU Resident Drawer](gpu-resident-drawer.md), check it has the following properties: + +- Has a [Mesh Renderer component](https://docs.unity3d.com/Manual/class-MeshRenderer.html). +- In the Mesh Renderer component, **Light Probes** isn't set to **Use Proxy Volume**. +- Uses only static global illumination, not real time global illumination. +- Uses a shader that supports DOTS instancing. Refer to [Supporting DOTS Instancing](https://docs.unity3d.com/Manual/dots-instancing-shaders.html) for more information. +- Doesn't move position after one camera finishes rendering and before another camera starts rendering. +- Doesn't use the `MaterialPropertyBlock` API. +- Doesn't have a script that uses a per-instance callback, for example `OnRenderObject`. + +## Exclude a GameObject from the GPU Resident Drawer + +To exclude a GameObject from the GPU Resident Drawer, add a **Disallow GPU Driven Rendering** component to the GameObject. + +1. Select the GameObject. +2. In the **Inspector** window, select **Add Component**. +3. Select **Disallow GPU Driven Rendering**. + +Select **Apply to Children Recursively** to exclude both the GameObject and its children. + +## Additional resources + +- [Mesh Renderer component](https://docs.unity3d.com/Manual/class-MeshRenderer.html) + diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/reduce-rendering-work-on-cpu.md b/Packages/com.unity.render-pipelines.universal/Documentation~/reduce-rendering-work-on-cpu.md new file mode 100644 index 00000000000..31271cd9021 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/reduce-rendering-work-on-cpu.md @@ -0,0 +1,13 @@ +# Reduce rendering work on the CPU + +You can use the GPU Resident Drawer or GPU occlusion culling to speed up rendering. When you enable these features, Unity optimizes the rendering pipeline so the CPU has less work to do each frame, and the GPU draws GameObjects more efficiently. + +|Page|Description| +|-|-| +|[Use the GPU Resident Drawer](gpu-resident-drawer.md)|Automatically use the `BatchRendererGroup` API to use instancing and reduce the number of draw calls.| +|[Make a GameObject compatible with the GPU Resident Drawer](make-object-compatible-gpu-rendering.md)|Include or exclude a GameObject from the GPU Resident Drawer.| +|[Use GPU occlusion culling](gpu-culling.md)|Use the GPU instead of the CPU to exclude GameObjects from rendering when they're occluded behind other GameObjects.| + +## Additional resources + +- [Graphics performance fundamentals](https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/universalrp-asset.md b/Packages/com.unity.render-pipelines.universal/Documentation~/universalrp-asset.md index 1a7dfad4a1c..fe550c4b0a6 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/universalrp-asset.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/universalrp-asset.md @@ -42,17 +42,20 @@ To show all additional properties in all sections: The **Rendering** settings control the core part of the pipeline rendered frame. -| **Property** | **Description** | -| ----------------------- | ------------------------------------------------------------ | -| **Depth Texture** | Enables URP to create a `_CameraDepthTexture`. URP then uses this [depth texture](https://docs.unity3d.com/Manual/SL-DepthTextures.html) by default for all Cameras in your scene. You can override this for individual cameras in the [Camera Inspector](camera-component-reference.md). | -| **Opaque Texture** | Enable this to create a `_CameraOpaqueTexture` as default for all cameras in your scene. This works like the [GrabPass](https://docs.unity3d.com/Manual/SL-GrabPass.html) in the built-in render pipeline. The **Opaque Texture** provides a snapshot of the scene right before URP renders any transparent meshes. You can use this in transparent Shaders to create effects like frosted glass, water refraction, or heat waves. You can override this for individual cameras in the [Camera Inspector](camera-component-reference.md). | -| **Opaque Downsampling** | Set the sampling mode on the opaque texture to one of the following:
                  **None**: Produces a copy of the opaque pass in the same resolution as the camera.
                  **2x Bilinear**: Produces a half-resolution image with bilinear filtering.
                  **4x Box**: Produces a quarter-resolution image with box filtering. This produces a softly blurred copy.
                  **4x Bilinear**: Produces a quarter-resolution image with bi-linear filtering. | -| **Terrain Holes** | If you disable this option, the URP removes all Terrain hole Shader variants when you build for the Unity Player, which decreases build time. | -| **SRP Batcher** | Check this box to enable the SRP Batcher. This is useful if you have many different Materials that use the same Shader. The SRP Batcher is an inner loop that speeds up CPU rendering without affecting GPU performance. When you use the SRP Batcher, it replaces the SRP rendering code inner loop. If both **SRP Batcher** and **Dynamic Batching** are enabled, SRP Batcher will take precedence over dynamic batching as long as the shader is SRP Batcher compatible.

                  **Note**: If assets or shaders in a project are not optimized for use with the SRP Batcher, low performance devices might be more performant when you disable the SRP Batcher. | -| **Dynamic Batching** | Enable [Dynamic Batching](https://docs.unity3d.com/Manual/DrawCallBatching.html), to make the render pipeline automatically batch small dynamic objects that share the same Material. This is useful for platforms and graphics APIs that do not support GPU instancing. If your targeted hardware does support GPU instancing, disable **Dynamic Batching**. You can change this at run time. | -| **Debug Level** | Set the level of debug information that the render pipeline generates. The values are:
                  **Disabled**: Debugging is disabled. This is the default.
                  **Profiling**: Makes the render pipeline provide detailed information tags, which you can find in the FrameDebugger. | -| **Shader Variant Log Level** | Set the level of information about Shader Stripping and Shader Variants you want to display when Unity finishes a build. Values are:
                  **Disabled**: Unity doesn’t log anything.
                  **Only Universal**: Unity logs information for all of the [URP Shaders](shaders-in-universalrp.md).
                  **All**: Unity logs information for all Shaders in your build.
                  You can check the information in Console panel when your build has finished. | -| **Store Actions** | Defines if Unity discards or stores the render targets of the DrawObjects Passes. Selecting the **Store** option significantly increases the memory bandwidth on mobile and tile-based GPUs.
                  **Auto**: Unity uses the **Discard** option by default, and falls back to the **Store** option if it detects any injected Passes.
                  **Discard**: Unity discards the render targets of render Passes that are not reused later (lower memory bandwidth).
                  **Store**: Unity stores all render targets of each Pass (higher memory bandwidth). | +|**Property**|**Sub-property**|**Description**| +|-|-|-| +| **Depth Texture**|| Enables URP to create a `_CameraDepthTexture`. URP then uses this [depth texture](https://docs.unity3d.com/Manual/SL-DepthTextures.html) by default for all Cameras in your scene. You can override this for individual cameras in the [Camera Inspector](camera-component-reference.md). | +| **Opaque Texture**|| Enable this to create a `_CameraOpaqueTexture` as default for all cameras in your scene. This works like the [GrabPass](https://docs.unity3d.com/Manual/SL-GrabPass.html) in the built-in render pipeline. The **Opaque Texture** provides a snapshot of the scene right before URP renders any transparent meshes. You can use this in transparent Shaders to create effects like frosted glass, water refraction, or heat waves. You can override this for individual cameras in the [Camera Inspector](camera-component-reference.md). | +| **Opaque Downsampling**|| Set the sampling mode on the opaque texture to one of the following:
                  **None**: Produces a copy of the opaque pass in the same resolution as the camera.
                  **2x Bilinear**: Produces a half-resolution image with bilinear filtering.
                  **4x Box**: Produces a quarter-resolution image with box filtering. This produces a softly blurred copy.
                  **4x Bilinear**: Produces a quarter-resolution image with bi-linear filtering. | +| **Terrain Holes**|| If you disable this option, the URP removes all Terrain hole Shader variants when you build for the Unity Player, which decreases build time. | +| **GPU Resident Drawer**||The GPU Resident Drawer automatically uses the [`BatchRendererGroup`](https://docs.unity3d.com/Manual/batch-renderer-group.html) API to draw GameObjects with GPU instancing. Refer to [Use the GPU Resident Drawer](gpu-resident-drawer.md) for more information.

                  • **Disabled**: Unity doesn't automatically draw GameObjects with GPU instancing.
                  • **Instanced Drawing**: Unity automatically draws GameObjects with GPU instancing.
                  | +|| **Small-Mesh Screen-Percentage** | Set the screen percentage Unity uses to cull small GameObjects, to speed up rendering. Unity culls GameObjects that fill less of the screen than this value. This setting might not work if you use your own [Level of Detail (LOD) meshes](https://docs.unity3d.com/Manual/LevelOfDetail.html). Set the value to 0 to stop Unity culling small GameObjects.

                  To prevent Unity culling an individual GameObject that covers less screen space than this value, go to the **Inspector** window for the GameObject and add a **Disallow Small Mesh Culling** component. | +|| **GPU Occlusion Culling** | Enable Unity to use the GPU instead of the CPU to exclude GameObjects from rendering when they're hidden behind other GameObjects. Refer to [Use GPU occlusion culling](gpu-culling.md) for more information. | +| **SRP Batcher**|| Enable the SRP Batcher. This is useful if you have many different Materials that use the same Shader. The SRP Batcher is an inner loop that speeds up CPU rendering without affecting GPU performance. When you use the SRP Batcher, it replaces the SRP rendering code inner loop. If both **SRP Batcher** and **Dynamic Batching** are enabled, SRP Batcher will take precedence over dynamic batching as long as the shader is SRP Batcher compatible.

                  **Note**: If assets or shaders in a project are not optimized for use with the SRP Batcher, low performance devices might be more performant when you disable the SRP Batcher. | +| **Dynamic Batching**|| Enable [Dynamic Batching](https://docs.unity3d.com/Manual/DrawCallBatching.html), to make the render pipeline automatically batch small dynamic objects that share the same Material. This is useful for platforms and graphics APIs that do not support GPU instancing. If your targeted hardware does support GPU instancing, disable **Dynamic Batching**. You can change this at run time. | +| **Debug Level**|| Set the level of debug information that the render pipeline generates. The values are:
                  **Disabled**: Debugging is disabled. This is the default.
                  **Profiling**: Makes the render pipeline provide detailed information tags, which you can find in the FrameDebugger. | +| **Shader Variant Log Level**||Set the level of information about Shader Stripping and Shader Variants you want to display when Unity finishes a build. Values are:
                  **Disabled**: Unity doesn’t log anything.
                  **Only Universal**: Unity logs information for all of the [URP Shaders](shaders-in-universalrp.md).
                  **All**: Unity logs information for all Shaders in your build.
                  You can check the information in Console panel when your build has finished. | +| **Store Actions**|| Defines if Unity discards or stores the render targets of the DrawObjects Passes.
                  **Auto**: Unity uses the **Discard** option by default, and falls back to the **Store** option if it detects any injected Passes.
                  **Discard**: Unity discards the render targets of render Passes that are not reused later (lower memory bandwidth).
                  **Store**: Unity stores all render targets of each Pass. **Store** significantly increases the memory bandwidth on mobile and tile-based GPUs. | ### Quality From a8d0f258f1d01c7017bbbb5ad1b5b53e4259d6d0 Mon Sep 17 00:00:00 2001 From: Arttu Peltonen Date: Tue, 7 May 2024 11:01:51 +0000 Subject: [PATCH 29/67] Render Graph Viewer additional UX fixes List of fixes: - Display subpass index and attachment index in side panel to improve debugging and performance analysis (including better tooltips for both) ![image](https://media.github.cds.internal.unity3d.com/user/3380/files/3108fe66-9203-4893-933f-17d7510af761) - Limit side panel foldout minHeight when both are expanded, so that you can't drag it all the way to the top/bottom: ![rg-viewer-sidepanel-minheight](https://media.github.cds.internal.unity3d.com/user/3380/files/371cd481-e22b-4b34-a151-467e4446e81a) - Fix a bug in pass break reasoning where previous pass type was incorrect - Fix bug where pass tooltip size was incorrect resulting in text being cut: Before: ![image](https://media.github.cds.internal.unity3d.com/user/3380/files/75361d4e-f6b0-484e-982d-859ad1124c8a) After: (see below) - Fix an issue where having multiple usage icons (i.e. Global & FB Fetch) for a given resource block was not properly supported. Add a new icon in this case, and update tooltip structure: ![image](https://media.github.cds.internal.unity3d.com/user/3380/files/7374a9aa-6c5c-4099-9fbc-3e0e996f050b) - Fixed possible NullReferenceException described in https://jira.unity3d.com/browse/UUM-69981 --- .../Icons/RenderGraphViewer/Global@2x.png | Bin 988 -> 1033 bytes .../Icons/RenderGraphViewer/MultipleUsage.png | Bin 0 -> 307 bytes .../RenderGraphViewer/MultipleUsage.png.meta | 336 ++++++++++++++++++ .../Icons/RenderGraphViewer/d_Global@2x.png | Bin 992 -> 1032 bytes .../RenderGraphViewer/d_MultipleUsage.png | Bin 0 -> 526 bytes .../d_MultipleUsage.png.meta | 336 ++++++++++++++++++ .../RenderGraphViewer.SidePanel.cs | 73 +++- .../Editor/RenderGraph/RenderGraphViewer.cs | 111 ++++-- .../Editor/StyleSheets/RenderGraphViewer.uss | 33 +- .../StyleSheets/RenderGraphViewerDark.uss | 5 + .../StyleSheets/RenderGraphViewerLight.uss | 5 + .../Editor/UXML/RenderGraphViewer.uxml | 2 +- .../Compiler/NativePassCompiler.Debug.cs | 4 +- .../RenderGraph/RenderGraph.DebugData.cs | 4 + 14 files changed, 860 insertions(+), 49 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_MultipleUsage.png create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_MultipleUsage.png.meta diff --git a/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/Global@2x.png b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/Global@2x.png index 02c06ba242a09670f54aba2597f5c1839e61a067..77b66fc564097155991391c1653c4a8f79172082 100644 GIT binary patch delta 961 zcmV;y13vuR2Z;!fR)3yJL_t(|0qs}WQR6@m9UH;7HiIDoL1HMi2ykQv=OYn!NH3)S*VoqvpAHtcOpzn8;O0Oc&Jzg7{Zs{ zv=oaaZRL?6$X>!Z!m!~PMP4aJV^5 zBY~n1p#6?-r`zo&!i(Nbkt3^P3b4osf@9_j_*qEA0D7_JidEoFS>d37TUv|^dn_o4 z5I1NY@nBI$-))I`h%iOWcvDBwIr8iid*xp00@c9EIx(%n||>?c#g=- z7fz7)XMeasjCa1L6IkdY2&R|MB%Fm@g_COt;pY=7mla`UXF0GaX?<7NX24 zp$k!IDJFs{pJk=k7-f+X;P&acCwdOwZ>S9k9-5EXVD`nmOl#GJ!> zPk;JMcv+0p?-R%B0O~p0E4~9qcshqlNYb@U@ve`xSZ>dMuE~SE$dmn{PdBE3RI6iQ z)&PSuXEC2xK`U#oM!F@^kd{2SMlKwbmGOyPvBaFYkaxR`9eV^=%0vxyCQBnTOfb1o zTw7Bl=dpy>%&h=H+VV%E+HCpejM;eNraD+9EHR@$ED3Nnr#)c*_K%4V?$?a9fmPF} jUo)0+siq74nti|z4h%G91K{Yb00000NkvXXu0mjf=z7f> delta 916 zcmV;F18e+=2;2vdR)29xL_t(|0qs}WQ5!)J9W8?IC4(UXqzDiZSQO_UI08fjk|JOg z0pgG1DC7uOM}UaH>j=ExT=ILON3=$J$-kznw&v{V*T?kq8uPzXZJEt`dwZ?PWYP|T zU<*TwFO;Pe-}wFg{i#-~jc#vmGr)X=Zo0a<`p09VHJoLVmzS6A(P)(9$q4cm4h{~EA>`2)K4l7mV;&0O zR!t{x&-TsD%{uzuImTzP=W%y;x4jeqGT^YG(qxXXwj=Fqotiq|1H=&Hrho_m_?`+? z0zk8a;ldOU)_rRhLCKR^E{6Al+LI2k`7&gk(bVQxarwbokJ3;-f~Q}w4p zudc3mw+Hllnf9V>X#mUlTduETprH{0`7ic)pR1T&@4`PY6o?p2?8dlm z17#J>KX!e64S!0vWh#=sPFeK&`Z~I} z?SC+|&}irG?rvmCh%OW>@+_0bms=IHE|k)Yv5-ic@|83tB+oB-t@*I#nG`CfG60g4 znfpH%fxKkpAh{ qjMa_Y@!78#Q#rHgvcG0u^cM!!>6|}z`3F diff --git a/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png new file mode 100644 index 0000000000000000000000000000000000000000..5024cc74a3ae10ee0c113cc7fe989aa4e2e479ec GIT binary patch literal 307 zcmV-30nGl1P)9iOH27sbC;t@UtV5Ah<-HT zChEFQg%EojQ@Da_c-eK`IgaCUmY`{x6Mz|ox(QK4QFO3#GE|K7Ln*}#N-LK!&Ld#i zZf7aw(-ghzJmVPeD)3~tZ5tce3-T=+5dgGu5rIN-@x1~yf$MY0%-uksr$BgX5+Kkc z0-ksPw1rphg^lkO6ceB;7ANN~`8ME(MS|SIY+!E{7bCZ^pMm&-W!kw42;DMXSBoG4 z_(;wS@Ov9OmUduB);QkiGbnB1$|zXUw}xltTI)Og)82hVbj10QUY`H}002ovPDHLk FV1jfLelh?6 literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png.meta b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png.meta new file mode 100644 index 00000000000..5caa38131fd --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/MultipleUsage.png.meta @@ -0,0 +1,336 @@ +fileFormatVersion: 2 +guid: cd47f6d5edd2c7541a0baf3774a54fdd +TextureImporter: + internalIDToNameTable: + - first: + 213: -2210434942944035985 + second: MultipleUsage_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: PS4 + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Nintendo Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Win64 + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: QNX + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreXboxOne + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: EmbeddedLinux + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: PS5 + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: VisionOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreScarlett + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: MultipleUsage_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 16 + height: 16 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: f6bb5ba7125f251e0800000000000000 + internalID: -2210434942944035985 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: + MultipleUsage_0: -2210434942944035985 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_Global@2x.png b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_Global@2x.png index b4aa84a2cacee5c304353a1ce04e730359a00103..d34ae5d30565bc8c5055917050a4f33ae85a0ed2 100644 GIT binary patch delta 960 zcmV;x13&!W2Z#ueR)3vIL_t(|0qs{?QW{YZ9S|))Cp#Ed0DfBKV^~3O1<@5mS0JuH zvjTAiniYUNiceq#OjeNj=9zPbZqi(a*M~`}Vpk3K)$iNgxADCH9WuKhHyVu)Ln)KV zTui6a0He=+%wx>E7<*X0o}Hc5w&l5%0`+?R3Igu%1>4|5k$(ud<+o8s|kov`R*H)j_-6{*ue(Iw}lb5w87& z(H9|Qx|+51RhT&lWXw;4d}pwrJWQY!FW8bkRcd-BU1{Ks|bKnv+k8U=jTJ< z)%p2(g*2q)UVk>5eW5{HDL}VF$P?#aa1Z7;urf}NvsqSD)gB@q#-SNa1DbV z$$O&$aC=oP2ZORvjIIwk9}b7#T{;MO#XvDASsH z#DeT~IX^f!xUgsBB>`G!Hk%7qv5*DG^S<2i6|ICf7=QhFd`HZEZx)ag6uT)Y0(_|r ztO@kePkcQn&?PUNRfz|$94#rpB0~gawr$Su0Q8Qgb5V;`&LGTFMXn*qc~&?CSeI!h z7M2ik22x z{l`#*nSYY(*#IWs?h6Ri5V76ra;6W1WJhk;}Yvjw@yJVwTf$jbO`RRvh3=9 z&Iouz@KEpr*NA%CWb_pefs}`!*o_rhhX_v;XMeVUp2Aqbn2O8*rm)KDDcv6{L{e9@ zgPIqj)KW|YEuUU`DfX0^6=3%1xi^e`j6d)Qby1{3)QBgy6z3c!_wp3;J2vlp(j&0S z@mi46MK1*qJM>^E?b!UqVK7tvOxU70aD77JO~9*(1Q6ec78wG8-8iVDkUr z$-Jt!aD63B&c?P}TC_l{h!UdNI)*~WI5`hgm^X|5z+?!c|8iYh{%`*=al!mGORAgm i*DR9U-|4T}2mAuqB4?oo;8zd;0000^!;l!f{j;;PZ&kdd z28_pJe}8}f8Pm3-VAyOngV}7BVEwnVmMCQ6#bR*o3MGKS3#^5Z2qGG$G`eK3JG3k7VsrvCbJd6mZSmtC@MxY>taOSJcBV zfYK?(1HG`fw|5Eo9-!|zGA+rcWBqaq0YHCOk?A~YLyU0|1L4OIk=Krb5~=<6_SV(> zTL{qdqK#EXC#HnpM93O}d^ptaSwpb@7;E=<4D5T)VSn(oLS;FP>sKikz79i(+R=lz zw{~v~N3!nA^R@vXeN-ZPz)Z$`qjWx>e>W9`Bx_6lv|xN6V+bSG^c=q+PnV}GKT`9J zQf4+|&R>=HQa8p_ZYqc<*}2YvwBSJDHDLP5IZ>zsz0?g;lYBeTA+VN5wtz?_>zR5~ zX=IMBY=0fV1#)HQh-nM3b`i%-NoG=_ss*Q~rvq0G2n(7@v_t~8ARDt$}?AogJ2 z%UuxJXYjCSJ(?^{)BV+^KV*7oY7&#RY#m28EPs&u%oqR~@eeTHYi7pQ6cBhLQ$oBK z3YJD00|=kZeqE^;Tccpr1pZ&9gzT;9$i%v3+q#U z*Uwu9h__QY|7r5LO=g`|%gV{^naa6+Vx}QM;;`G{F}ce-Zle6SO1ULCvlh98MrYRZ zgn!r<;P~0DD1cD|_J>3UVY5DJQSd@hnJEZ*!3#fX+Pm>d)Lp3fsm;wKs` zUGf8<5A%2{+j42qe0jyn$QX_Q=hR+Otez}jFt{V%4>p0P3~5=oYF%H_s`YmKFd4$@ upo;fzKh2Jyr0sl~#Zpao`ZW7be*nyM8WHthb_>)10000Jq$H%(KAu?l%wtyU*2o}+_S zt0m~Vew$1tGpST6BM3s=SWy&GE|;xL1NRY!O6eMpcTOY{Y4+sJW^n`i{KmInFa0ldy>s&T}{M5Jg87D0{BhPBrIq+9FlIgOGcxSivaP4VNCxP zn$70Ja=Cmn9RVksoleJGuh-6HQ&rUuc)~|oYZ(cQ@zU${+UPX8fz2xxi>@Ak>2#jw zWjgoZM-)XppU*3c#lpMW?bJ{xUZ3f5%!cWvbO` z=J1+~}o-v~rMIEO=WpePRWD6QkjKcil+3!o}zJ8)d7R770=1!s5ry3}Vq Qp8x;=07*qoM6N<$f+>vW$N&HU literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_MultipleUsage.png.meta b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_MultipleUsage.png.meta new file mode 100644 index 00000000000..42e96863854 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Icons/RenderGraphViewer/d_MultipleUsage.png.meta @@ -0,0 +1,336 @@ +fileFormatVersion: 2 +guid: 60e80b0fa23ea904b92263803d64319c +TextureImporter: + internalIDToNameTable: + - first: + 213: -4520544496107484141 + second: d_MultipleUsage_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: PS4 + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Nintendo Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Win64 + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: QNX + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreXboxOne + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: EmbeddedLinux + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: PS5 + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: VisionOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreScarlett + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: tvOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: d_MultipleUsage_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 16 + height: 16 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 31c8a2e4bbcc341c0800000000000000 + internalID: -4520544496107484141 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: + d_MultipleUsage_0: -4520544496107484141 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.SidePanel.cs b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.SidePanel.cs index 430bd9510d8..5a98999d1b3 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.SidePanel.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.SidePanel.cs @@ -34,7 +34,8 @@ static partial class Classes public const string kPanelResourceListItem = "panel-resource-list__item"; public const string kPanelPassListItem = "panel-pass-list__item"; public const string kSubHeaderText = "sub-header-text"; - public const string kAttachmentInfoItem = "attachment-info__item"; + public const string kInfoFoldout = "info-foldout"; + public const string kInfoFoldoutSecondaryText = "info-foldout__secondary-text"; public const string kCustomFoldoutArrow = "custom-foldout-arrow"; } @@ -47,6 +48,7 @@ static partial class Classes bool m_PassListExpanded = true; float m_SidePanelVerticalAspectRatio = 0.5f; float m_SidePanelFixedPaneHeight = 0; + float m_ContentSplitViewFixedPaneWidth = 280; Dictionary> m_ResourceDescendantCache = new (); Dictionary> m_PassDescendantCache = new (); @@ -60,8 +62,19 @@ void InitializeSidePanel() UpdatePanelHeights(); }); + var contentSplitView = rootVisualElement.Q(Names.kContentContainer); + contentSplitView.fixedPaneInitialDimension = m_ContentSplitViewFixedPaneWidth; + contentSplitView.fixedPaneIndex = 1; + contentSplitView.fixedPane?.RegisterCallback(_ => + { + float? w = contentSplitView.fixedPane?.resolvedStyle?.width; + if (w.HasValue) + m_ContentSplitViewFixedPaneWidth = w.Value; + }); + // Callbacks for dynamic height allocation between resource & pass lists HeaderFoldout resourceListFoldout = rootVisualElement.Q(Names.kResourceListFoldout); + resourceListFoldout.value = m_ResourceListExpanded; resourceListFoldout.RegisterValueChangedCallback(evt => { if (m_ResourceListExpanded) @@ -74,6 +87,7 @@ void InitializeSidePanel() resourceListFoldout.contextMenuGenerator = () => CreateContextMenu(resourceListFoldout.Q()); HeaderFoldout passListFoldout = rootVisualElement.Q(Names.kPassListFoldout); + passListFoldout.value = m_PassListExpanded; passListFoldout.RegisterValueChangedCallback(evt => { if (m_PassListExpanded) @@ -185,13 +199,14 @@ void PopulateResourceList() var foldoutCheckmark = resourceItem.Q("unity-checkmark"); // Add resource type icon before the label foldoutCheckmark.parent.Insert(1, CreateResourceTypeIcon(visibleResourceElement.type)); + foldoutCheckmark.parent.Add(iconContainer); foldoutCheckmark.BringToFront(); // Move foldout checkmark to the right // Add imported icon to the right of the foldout checkmark var toggleContainer = resourceItem.Q(); toggleContainer.tooltip = resourceData.name; - toggleContainer.Add(iconContainer); - RenderGraphResourceType type = (RenderGraphResourceType)visibleResourceElement.type; + + RenderGraphResourceType type = visibleResourceElement.type; if (type == RenderGraphResourceType.Texture && resourceData.textureData != null) { var lineBreak = new VisualElement(); @@ -302,11 +317,27 @@ void CreateTextElement(VisualElement parent, string text, string className = nul { var pass = m_CurrentDebugData.passList[passId]; Debug.Assert(pass.nrpInfo != null); // This overlay currently assumes NRP compiler + var passFoldout = new Foldout(); - passFoldout.text = $"{pass.name} ({k_PassTypeNames[(int) pass.type]})"; - passFoldout.AddToClassList(Classes.kAttachmentInfoItem); + passFoldout.text = $"{pass.name} ({k_PassTypeNames[(int) pass.type]})"; + + var foldoutTextElement = passFoldout.Q(className: Foldout.textUssClassName); + foldoutTextElement.displayTooltipWhenElided = false; // no tooltip override when ellipsis is active + + bool hasSubpassIndex = pass.nativeSubPassIndex != -1; + if (hasSubpassIndex) + { + // Abuse Foldout to allow two-line header: add line break
                  at the end of the actual foldout text to increase height, + // then inject a second label into the hierarchy starting with a line break to offset it to the second line. + passFoldout.text += "
                  "; + Label subpassIndexLabel = new Label($"
                  Subpass #{pass.nativeSubPassIndex}"); + subpassIndexLabel.AddToClassList(Classes.kInfoFoldoutSecondaryText); + foldoutTextElement.Add(subpassIndexLabel); + } + + passFoldout.AddToClassList(Classes.kInfoFoldout); passFoldout.AddToClassList(Classes.kCustomFoldoutArrow); - passFoldout.Q().tooltip = passFoldout.text; + passFoldout.Q().tooltip = $"The {k_PassTypeNames[(int) pass.type]} {pass.name} belongs to native subpass {pass.nativeSubPassIndex}."; var foldoutCheckmark = passFoldout.Q("unity-checkmark"); foldoutCheckmark.BringToFront(); // Move foldout checkmark to the right @@ -330,10 +361,19 @@ void CreateTextElement(VisualElement parent, string text, string className = nul foreach (var attachmentInfo in nativePassInfo.attachmentInfos) { var attachmentFoldout = new Foldout(); - attachmentFoldout.text = attachmentInfo.resourceName; - attachmentFoldout.AddToClassList(Classes.kAttachmentInfoItem); + + // Abuse Foldout to allow two-line header (same as above) + attachmentFoldout.text = $"{attachmentInfo.resourceName}
                  "; + Label attachmentIndexLabel = new Label($"
                  Attachment #{attachmentInfo.attachmentIndex}"); + attachmentIndexLabel.AddToClassList(Classes.kInfoFoldoutSecondaryText); + + var foldoutTextElement = attachmentFoldout.Q(className: Foldout.textUssClassName); + foldoutTextElement.displayTooltipWhenElided = false; // no tooltip override when ellipsis is active + foldoutTextElement.Add(attachmentIndexLabel); + + attachmentFoldout.AddToClassList(Classes.kInfoFoldout); attachmentFoldout.AddToClassList(Classes.kCustomFoldoutArrow); - attachmentFoldout.Q().tooltip = attachmentFoldout.text; + attachmentFoldout.Q().tooltip = $"Texture {attachmentInfo.resourceName} is bound at attachment index {attachmentInfo.attachmentIndex}."; var foldoutCheckmark = attachmentFoldout.Q("unity-checkmark"); foldoutCheckmark.BringToFront(); // Move foldout checkmark to the right @@ -385,9 +425,16 @@ void UpdatePanelHeights() { bool passListExpanded = m_PassListExpanded && (m_CurrentDebugData != null && m_CurrentDebugData.isNRPCompiler); const int kFoldoutHeaderHeightPx = 18; + const int kFoldoutHeaderExpandedMinHeightPx = 50; const int kWindowExtraMarginPx = 6; - float panelHeightPx = focusedWindow.position.height - kHeaderContainerHeightPx - kWindowExtraMarginPx; + var resourceList = rootVisualElement.Q(Names.kResourceListFoldout); + var passList = rootVisualElement.Q(Names.kPassListFoldout); + + resourceList.style.minHeight = kFoldoutHeaderHeightPx; + passList.style.minHeight = kFoldoutHeaderHeightPx; + + float panelHeightPx = position.height - kHeaderContainerHeightPx - kWindowExtraMarginPx; if (!m_ResourceListExpanded) { m_SidePanelSplitView.fixedPaneInitialDimension = kFoldoutHeaderHeightPx; @@ -404,8 +451,14 @@ void UpdatePanelHeights() m_SidePanelVerticalAspectRatio = m_SidePanelFixedPaneHeight / panelHeightPx; } m_SidePanelSplitView.fixedPaneInitialDimension = panelHeightPx * m_SidePanelVerticalAspectRatio; + + resourceList.style.minHeight = kFoldoutHeaderExpandedMinHeightPx; + passList.style.minHeight = kFoldoutHeaderExpandedMinHeightPx; } + // Ensure fixed pane initial dimension gets applied in case it has already been set + m_SidePanelSplitView.fixedPane.style.height = m_SidePanelSplitView.fixedPaneInitialDimension; + // Disable drag line when one of the foldouts is collapsed var dragLine = m_SidePanelSplitView.Q("unity-dragline"); var dragLineAnchor = m_SidePanelSplitView.Q("unity-dragline-anchor"); diff --git a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs index a39f587dce1..c86ab3582ab 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphViewer.cs @@ -56,6 +56,7 @@ static partial class Classes public const string kResourceIconContainer = "resource-icon-container"; public const string kResourceIcon = "resource-icon"; public const string kResourceIconImported = "resource-icon--imported"; + public const string kResourceIconMultipleUsage = "resource-icon--multiple-usage"; public const string kResourceIconGlobalDark = "resource-icon--global-dark"; public const string kResourceIconGlobalLight = "resource-icon--global-light"; public const string kResourceIconFbfetch = "resource-icon--fbfetch"; @@ -117,6 +118,7 @@ static partial class Classes const string kPassFilterLegacyEditorPrefsKey = "RenderGraphViewer.PassFilterLegacy"; const string kPassFilterEditorPrefsKey = "RenderGraphViewer.PassFilter"; const string kResourceFilterEditorPrefsKey = "RenderGraphViewer.ResourceFilter"; + const string kSelectedExecutionEditorPrefsKey = "RenderGraphViewer.SelectedExecution"; PassFilter m_PassFilter = PassFilter.CulledPasses | PassFilter.RasterPasses | PassFilter.UnsafePasses | PassFilter.ComputePasses; PassFilterLegacy m_PassFilterLegacy = PassFilterLegacy.CulledPasses; @@ -193,13 +195,26 @@ class ResourceElementInfo class ResourceRWBlock { + [Flags] + public enum UsageFlags + { + None = 0, + UpdatesGlobalResource = 1 << 0, + FramebufferFetch = 1 << 1, + } + public VisualElement element; public string tooltip; public int visibleResourceIndex; public bool read; public bool write; - public bool frameBufferFetch; - public bool setGlobalResource; + public UsageFlags usage; + + public bool HasMultipleUsageFlags() + { + // Check if usage is a power of 2, meaning only one bit is set + return usage != 0 && (usage & (usage - 1)) != 0; + } } class PassElementInfo @@ -664,7 +679,7 @@ void HoverResourceByIndex(int visibleResourceIndex, int visiblePassIndex) foreach (var res in passInfo.resourceBlocks) { if (res.visibleResourceIndex == visibleResourceIndex && - res.setGlobalResource) + res.usage.HasFlag(ResourceRWBlock.UsageFlags.UpdatesGlobalResource)) { disablePanning = true; } @@ -810,6 +825,9 @@ void SelectedRenderGraphChanged(string newRenderGraphName) void SelectedExecutionChanged(string newExecutionName) { + if (newExecutionName == selectedExecutionName) + return; + selectedExecutionName = newExecutionName; if (m_CurrentDebugData != null) @@ -869,8 +887,19 @@ void RebuildExecutionPopup() executionDropdownField.choices = choices; executionDropdownField.RegisterValueChangedCallback(evt => selectedExecutionName = evt.newValue); - executionDropdownField.value = choices[0]; - SelectedExecutionChanged(choices[0]); + + int selectedIndex = 0; + if (EditorPrefs.HasKey(kSelectedExecutionEditorPrefsKey)) + { + string previousSelectedExecution = EditorPrefs.GetString(kSelectedExecutionEditorPrefsKey); + int previousSelectedIndex = choices.IndexOf(previousSelectedExecution); + if (previousSelectedIndex != -1) + selectedIndex = previousSelectedIndex; + } + + // Set value without triggering serialization of the editorpref + executionDropdownField.SetValueWithoutNotify(choices[selectedIndex]); + SelectedExecutionChanged(choices[selectedIndex]); } void OnPassFilterChanged(ChangeEvent evt) @@ -1263,30 +1292,39 @@ void CreateRWResourceBlockElement(int offsetPx, ResourceRWBlock block) } } - if (block.frameBufferFetch) - { - var fbFetchIcon = new VisualElement(); - fbFetchIcon.AddToClassList(Classes.kResourceIcon); - fbFetchIcon.AddToClassList(Classes.kResourceIconFbfetch); - block.element.Add(fbFetchIcon); - } - else if (block.setGlobalResource) + string tooltip = string.Empty; + if (!string.IsNullOrEmpty(accessType)) + tooltip += $"{accessType} access to this resource."; + + if (block.usage != ResourceRWBlock.UsageFlags.None) { - var globalIcon = new VisualElement(); - globalIcon.AddToClassList(Classes.kResourceIcon); - string globalIconAsset = block.read || block.write ? Classes.kResourceIconGlobalLight : Classes.kResourceIconGlobalDark; - globalIcon.AddToClassList(globalIconAsset); - block.element.Add(globalIcon); + string resourceIconClassName = string.Empty; + + if (block.HasMultipleUsageFlags()) + resourceIconClassName = Classes.kResourceIconMultipleUsage; + else if (block.usage.HasFlag(ResourceRWBlock.UsageFlags.FramebufferFetch)) + resourceIconClassName = Classes.kResourceIconFbfetch; + else if (block.usage.HasFlag(ResourceRWBlock.UsageFlags.UpdatesGlobalResource)) + resourceIconClassName = block.read || block.write ? Classes.kResourceIconGlobalLight : Classes.kResourceIconGlobalDark; + + if (!string.IsNullOrEmpty(resourceIconClassName)) + { + var usageIcon = new VisualElement(); + usageIcon.AddToClassList(Classes.kResourceIcon); + usageIcon.AddToClassList(resourceIconClassName); + block.element.Add(usageIcon); + } + + if (tooltip.Length > 0) + tooltip += "

                  "; + tooltip += "Usage details:"; + if (block.usage.HasFlag(ResourceRWBlock.UsageFlags.FramebufferFetch)) + tooltip += "
                  - Read is using framebuffer fetch."; + if (block.usage.HasFlag(ResourceRWBlock.UsageFlags.UpdatesGlobalResource)) + tooltip += "
                  - Updates a global resource slot."; } - List tooltipMessages = new List(3); - if (accessType != null) - tooltipMessages.Add($"{accessType} access to this resource."); - if (block.frameBufferFetch) - tooltipMessages.Add("Read is using framebuffer fetch."); - if (block.setGlobalResource) - tooltipMessages.Add("Updates global resource."); - block.tooltip = string.Join($"{Environment.NewLine}{Environment.NewLine}", tooltipMessages); + block.tooltip = tooltip; block.element.style.left = offsetPx; block.element.AddToClassList(Classes.kResourceDependencyBlock); } @@ -1356,12 +1394,12 @@ VisualElement CreateResourceGridRow( if (resourceType == RenderGraphResourceType.Texture && pass.nrpInfo != null) { if (pass.nrpInfo.textureFBFetchList.Contains(resourceIndex)) - block.frameBufferFetch = true; + block.usage |= ResourceRWBlock.UsageFlags.FramebufferFetch; if (pass.nrpInfo.setGlobals.Contains(resourceIndex)) - block.setGlobalResource = true; + block.usage |= ResourceRWBlock.UsageFlags.UpdatesGlobalResource; } - if (!block.read && !block.write && !block.frameBufferFetch && !block.setGlobalResource) + if (!block.read && !block.write && block.usage == ResourceRWBlock.UsageFlags.None) continue; // No need to create a visual element int offsetPx = visiblePassIndex * kPassWidthPx; @@ -1438,6 +1476,7 @@ void RebuildGraphViewerUI() int numVisiblePasses = visiblePassIndex; if (numVisiblePasses == 0) { + SaveSplitViewFixedPaneHeight(); ClearGraphViewerUI(); SetEmptyStateMessage(EmptyStateReason.EmptyPassFilterResult); return; @@ -1481,6 +1520,7 @@ void RebuildGraphViewerUI() int numVisibleResources = visibleResourceIndex; if (numVisibleResources == 0) { + SaveSplitViewFixedPaneHeight(); ClearGraphViewerUI(); SetEmptyStateMessage(EmptyStateReason.EmptyResourceFilterResult); return; @@ -1546,7 +1586,18 @@ void InitializePersistentElements() renderGraphDropdownField.RegisterValueChangedCallback(evt => SelectedRenderGraphChanged(evt.newValue)); var executionDropdownField = rootVisualElement.Q(Names.kCurrentExecutionDropdown); - executionDropdownField.RegisterValueChangedCallback(evt => SelectedExecutionChanged(evt.newValue)); + executionDropdownField.RegisterValueChangedCallback(evt => + { + EditorPrefs.SetString(kSelectedExecutionEditorPrefsKey, evt.newValue); + SelectedExecutionChanged(evt.newValue); + }); + + // After delay, serialize currently selected execution. This avoids an issue where activating a new camera + // causes RG Viewer to change the execution just because it was serialized some time in the past. + executionDropdownField.schedule.Execute(() => + { + EditorPrefs.SetString(kSelectedExecutionEditorPrefsKey, selectedExecutionName); + }).ExecuteLater(500); var passFilter = rootVisualElement.Q(Names.kPassFilterField); passFilter.style.display = DisplayStyle.None; // Hidden until the compiler is known diff --git a/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewer.uss b/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewer.uss index 972e89d847f..c55af2fcf28 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewer.uss +++ b/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewer.uss @@ -2,7 +2,7 @@ --header-container-height: 24px; --resource-column-width: 220px; --resource-list-icon-size: 16px; - --resource-grid-icon-size: 12px; + --resource-grid-icon-size: 16px; --pass-width: 26px; --pass-list-height: 180px; --pass-list-tilted-label-length: 200px; @@ -278,7 +278,7 @@ #resource-grid .resource-icon { width: var(--resource-grid-icon-size); height: var(--resource-grid-icon-size); - margin-top: 8px; + margin-top: 5px; align-self: center; } @@ -530,6 +530,18 @@ ScrollView TextElement { margin-top: 1px; margin-left: 2px; margin-right: 6px; + flex-grow: 0; + flex-shrink: 0; +} + +.panel-resource-list__item > Toggle > VisualElement { + max-width: 100% +} + +.panel-resource-list__item > Toggle > VisualElement > Label { + overflow: hidden; + flex-shrink: 1; + text-overflow: ellipsis; } /* Pass List panel only */ @@ -553,7 +565,7 @@ ScrollView TextElement { -unity-font-style: bold; } -.attachment-info__item { +.info-foldout { border-radius: 4px; border-width: 1px; border-color: var(--side-panel-item-border-color); @@ -562,13 +574,13 @@ ScrollView TextElement { margin-right: 4px; padding-top: 4px; padding-bottom: 6px; - -unity-font-style: bold; } -.attachment-info__item > Toggle > VisualElement { +.info-foldout > Toggle > VisualElement { max-width: 100%; } -.attachment-info__item > Toggle > VisualElement > Label { + +.info-foldout > Toggle > VisualElement > Label { margin-left: 6px; flex-shrink: 1; flex-grow: 1; @@ -577,13 +589,20 @@ ScrollView TextElement { text-overflow: ellipsis; } -.attachment-info__item > TextElement { +.info-foldout > TextElement { -unity-font-style: normal; margin-right: 4px; margin-left: -6px; color: var(--unity-colors-default-text); } +.info-foldout__secondary-text { + margin-left: 0px; + overflow: hidden; + text-overflow: ellipsis; + color: var(--side-panel-secondary-text-color); +} + .panel-pass-list__item > #unity-content { margin-bottom: 12px; } diff --git a/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerDark.uss b/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerDark.uss index da48058d3c2..182870c48c4 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerDark.uss +++ b/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerDark.uss @@ -18,6 +18,7 @@ --main-background-color: #313131; --side-panel-background-color: #383838; --side-panel-item-border-color: #666666; + --side-panel-secondary-text-color: #808080; } #capture-button { @@ -60,6 +61,10 @@ background-image: url("../Icons/RenderGraphViewer/FramebufferFetch@2x.png"); } +.resource-icon--multiple-usage { + background-image: url("../Icons/RenderGraphViewer/d_MultipleUsage.png"); +} + .pass-block.pass-block-script-link { background-image: url("../Icons/RenderGraphViewer/d_ScriptLink@2x.png"); background-color: #C4C4C4; diff --git a/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerLight.uss b/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerLight.uss index f350db8905f..17e663c347c 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerLight.uss +++ b/Packages/com.unity.render-pipelines.core/Editor/StyleSheets/RenderGraphViewerLight.uss @@ -18,6 +18,7 @@ --main-background-color: #c8c8c8; --side-panel-background-color: #cbcbcb; --side-panel-item-border-color: #666666; + --side-panel-secondary-text-color: #707070; } #capture-button { @@ -60,6 +61,10 @@ background-image: url("../Icons/RenderGraphViewer/d_FramebufferFetch@2x.png"); } +.resource-icon--multiple-usage { + background-image: url("../Icons/RenderGraphViewer/MultipleUsage.png"); +} + .resource-helper-line--highlight { background-size: 8px 20px; /* light theme needs a wider dashed line to be properly visible */ } diff --git a/Packages/com.unity.render-pipelines.core/Editor/UXML/RenderGraphViewer.uxml b/Packages/com.unity.render-pipelines.core/Editor/UXML/RenderGraphViewer.uxml index 4175cf61a88..bc58e87832c 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/UXML/RenderGraphViewer.uxml +++ b/Packages/com.unity.render-pipelines.core/Editor/UXML/RenderGraphViewer.uxml @@ -8,7 +8,7 @@ - + diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.Debug.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.Debug.cs index 3d02a1c6664..abc9230810c 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.Debug.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.Debug.cs @@ -34,6 +34,7 @@ static RenderGraph.DebugData.PassData.NRPInfo.NativeRenderPassInfo.AttachmentInf return new RenderGraph.DebugData.PassData.NRPInfo.NativeRenderPassInfo.AttachmentInfo { resourceName = pointTo.GetName(ctx, attachment.handle), + attachmentIndex = attachmentIndex, loadAction = attachment.loadAction.ToString(), loadReason = loadReason, storeAction = attachment.storeAction.ToString(), @@ -78,7 +79,7 @@ internal static string MakePassMergeMessage(CompilerContextData ctx, in PassData message += "The next pass reads one of the outputs as a regular texture, the pass needs to break."; break; case PassBreakReason.NonRasterPass: - message += $"{prevPassName} is type {pass.type}. Only Raster passes can be merged."; + message += $"{prevPassName} is type {prevPass.type}. Only Raster passes can be merged."; break; case PassBreakReason.DifferentDepthTextures: message += $"{prevPassName} uses a different depth buffer than {passName}."; @@ -210,6 +211,7 @@ internal void GenerateNativeCompilerDebugData(ref RenderGraph.DebugData debugDat debugPass.type = passData.type; debugPass.culled = passData.culled; debugPass.async = passData.asyncCompute; + debugPass.nativeSubPassIndex = passData.nativeSubPassIndex; debugPass.generateDebugData = graphPass.generateDebugData; debugPass.resourceReadLists = new List[(int)RenderGraphResourceType.Count]; debugPass.resourceWriteLists = new List[(int)RenderGraphResourceType.Count]; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.DebugData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.DebugData.cs index 387bec53594..3dd5b98652a 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.DebugData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.DebugData.cs @@ -48,6 +48,9 @@ public struct PassData // Whether the pass is an async compute pass. public bool async; + // Native subpass index. + public int nativeSubPassIndex; + // Index of the pass that needs to be waited for. public int syncToPassIndex; @@ -65,6 +68,7 @@ public class NativeRenderPassInfo public class AttachmentInfo { public string resourceName; + public int attachmentIndex; public string loadAction; public string loadReason; public string storeAction; From fa5121034d99156a42569e1a3cc9071b5e26bcb5 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Tue, 7 May 2024 18:59:37 +0000 Subject: [PATCH 30/67] Fixed NRE when node search's category color is reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jira: UUM-71376 Steps to reproduce: 1. Create project using High Definition 3D Template 2. Create VFX Asset and open it 3. In New VFX window press space or right-click to open VFX Node Search Window 4. In VFX Node Search window press on “>” to show details panel 5. Select the “Context” folder and change the folder color 6. Once the color of the folder is changed press “Reset color to default” button 7. Observe the Console window Actual results: "NullReferenceException: Object reference not set to an instance of an object" error is thrown when pressing reset button Expected results: No errors when pressing reset button Reproducible with versions: 6000.0.1f1 Not reproducible with versions: 6000.0.0f1 Tested on (OS): macOS Sonoma 14.4.1 (M1), Windows 10 ![Video](https://jira.unity3d.com/secure/attachment/1443182/Screen%20Recording%202024-05-03%20at%2010.51.02.mov) --- .../Editor/FilterPopup/VFXFilterWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/FilterPopup/VFXFilterWindow.cs b/Packages/com.unity.visualeffectgraph/Editor/FilterPopup/VFXFilterWindow.cs index ced69d67529..51cff4fc496 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/FilterPopup/VFXFilterWindow.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/FilterPopup/VFXFilterWindow.cs @@ -318,7 +318,7 @@ private void OnResetCategoryColor(ClickEvent evt) var descriptor = (Descriptor)m_Treeview.selectedItem; settings.ResetCategoryColor(descriptor.name); var element = m_Treeview.GetRootElementForIndex(m_Treeview.selectedIndex); - var label = element.Q

@@ -79,5 +79,39 @@ Refer to the following for more information about using the Probe Adjustment Vol

Change the brightness of all probes covered by the Probe Volumes Adjustment Volume component. Use this sparingly, because changing the intensity of probe data can lead to inconsistencies in the lighting. This option only appears if you set Mode to Intensity Scale.

+
+ + + + + + +
Preview Probe Adjustments +

Preview the effect of the adjustments in the Scene view and the Rendering Debugger.

+
Bake Probe Volumes +

Bake the Adaptive Probe Volumes with the adjustments.

+
+ +## Override Sample Count properties + +These properties are visible only when you set **Mode** to **Override Sample Count**. + +### Probes + +| Property | Description | +|-|-| +| **Direct Sample Count** | Set the number of samples Unity uses to calculate direct lighting. | +| **Indirect Sample Count** | Set the number of samples Unity uses to calculate indirect lighting. | +| **Sample Count Multiplier** | Set a value to multiply **Direct Sample Count** and **Indirect Sample Count** by. | +| **Max Bounces** | Set the maximum number of times Unity bounces light off objects when it calculates indirect lighting. | + +### Sky Occlusion + +These properties only have an effect if you enable sky occlusion. Refer to [Update light from the sky at runtime with sky occlusion](probevolumes-skyocclusion.md) for more information. + +| Property | Description | +|-|-| +| **Sample Count** | Set the number of samples Unity uses to calculate a sky occlusion value for each probe. | +| **Max Bounces** | Set the maximum number of times Unity bounces light off objects when it calculates a sky occlusion value. | diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-concept.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-concept.md index d25c7974f0f..8591c72a8fd 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-concept.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-concept.md @@ -21,7 +21,7 @@ Adaptive Probe Volumes have the following advantages: - Because Adaptive Probe Volumes can cover a whole scene, screen space effects can fall back to Light Probes to get lighting data from GameObjects that are off-screen or occluded. Refer to [Screen Space Global Illumination](Override-Screen-Space-GI.md) for more information. - Unity can use the data in Adaptive Probe Volumes to adjust lighting from Reflection Probes so it more closely matches the local environment, which reduces the number of Reflection Probes you need. Refer to [Frame Settings properties](frame-settings-reference.md). - Adaptive Probe Volumes include [streaming](probevolumes-streaming.md) functionality to support large open worlds. -- Adaptive Probe Volumes support [Sky Occlusion](probevolumes-skyocclusion.md) for dynamic sky relighting at runtime. +- You can use Adaptive Probe Volumes to [update light from the sky at runtime with sky occlusion](probevolumes-skyocclusion.md). ![](Images/probevolumes-per-pixel.png)
The car model is made up of separate GameObjects. The left scene uses Light Probe Groups, which use per-object lighting, so each part of the car samples a single blended probe value. The right scene uses Adaptive Probe Volumes, which use per-pixel lighting, so each part of the car samples its nearest probes. This image uses the ArchVizPRO Photostudio HDRP asset from the Unity Asset Store. diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-lighting-panel-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-lighting-panel-reference.md index 6cbdb0dd60b..ddc24e4b37a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-lighting-panel-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-lighting-panel-reference.md @@ -94,6 +94,16 @@ This section appears only if you enable **Lighting Scenarios** under **Light Pro ||| **Not Baked** | An information icon appears if you haven't baked any lighting data for the active Lighting Scenario.| ||| **Not Loaded** | An information icon appears if scenes in the Baking Set aren't currently loaded in the Hierarchy window, so HDRP can't determine the Lighting Scenario status. | +## Sky Occlusion Settings + +| **Property** | **Description** | +|-|-| +| **Sky Occlusion** | Enable [sky occlusion](probevolumes-skyocclusion.md). | +| **Samples** | Set the number of samples Unity uses to calculate the light each probe receives from the sky. Higher values increase the accuracy of the sky occlusion data, but increasing baking time. The default value is 2048. | +| **Bounces** | Set the number of times Unity bounces light from the sky off objects when calculating the sky occlusion data. Higher values increase the accuracy of the sky occlusion data, but increase baking time. Use higher values if objects block the direct view from probes to the sky. The default value is 2. | +| **Albedo Override** | Set the brightness of the single color Unity uses to represent objects the sky light bounces off, instead of the actual color of the objects. Higher values brighten the baked sky occlusion lighting. The default value is 0.6. | +| **Sky Direction** | Enable Unity storing and using more accurate data about the directions from probes towards the sky. Refer to [Enable more accurate sky direction data](probevolumes-skyocclusion.md#enable-more-accurate-sky-direction-data) for more information. | + ## Probe Invalidity Settings diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-options-override-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-options-override-reference.md index 929e72a0fb9..87e617f0018 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-options-override-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-options-override-reference.md @@ -17,3 +17,5 @@ Refer to [Fix issues with Adaptive Probe Volumes](probevolumes-fixissues.md) for | **Leak Reduction Mode** | Enable to choose the method Unity uses to reduce leaks. Refer to [Fix light leaks](probevolumes-fixissues.md#fix-light-leaks).
Options:
• **None**: No leak reduction.
• **Validity Based**: Prevent invalid Light Probes from contributing to the lighting result.
• **Validity and Normal Based**: Prevent invalid Light Probes from contributing to the lighting result, and give Light Probes more weight than others based on the GameObject pixel's sampling position. | **Min Valid Dot Product Value** | Enable to make HDRP reduce a Light Probe's influence on a GameObject if the direction towards the Light Probe is too different to the GameObject's surface normal direction. The value is the minimum [dot product](https://docs.unity3d.com/ScriptReference/Vector3.Dot.html) between the two directions where HDRP will reduce the Light Probe's influence. | | **Occlusion Only Reflection Normalization** | Enable to limit Reflection Probe Normalization so it only decreases the intensity of reflections. Keep this enabled to reduce light leaks. Refer to [Frame Settings](frame-settings-reference.md#lighting). | +| **Intensity Multiplier** | Set the strength of the light contribution from Adaptive Probe Volumes. A value of 0 means Unity doesn't use the Adaptive Probe Volume data. | +| **Sky Occlusion Intensity Multiplier** | Set the strength of the light contribution from sky occlusion data in Adaptive Probe Volumes, if you enable [sky occlusion](probevolumes-skyocclusion.md). | diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md index 295afd97f45..0124c58c3b5 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md @@ -1,70 +1,61 @@ -# Sky Occlusion +# Update light from the sky at runtime with sky occlusion -Sky Occlusion stores the amount of lighting from the Sky affecting probes in an Adaptive Probe Volume. During run-time, this data can be combined with lighting from the Scene’s Ambient Probe to dynamically relight the Scene based on changes to the Sky. See [Visual Environment Volume override](Override-Visual-Environment.md). +You can enable sky occlusion when you use Adaptive Probe Volumes. Sky occlusion means that when a GameObject samples a color from the sky, Unity dims the color if the light can't reach the GameObject. -When Sky Occlusion is enabled for Adaptive Probe Volumes, an additional directional visibility factor is calculated for each probe during bake time. This gray value - stored as a spherical harmonic - is used during shading to attenuate the lighting contribution from the Sky. As multiple bounces can be used, the Sky’s effect upon probes with indirect paths to the Sky can also be calculated. +Sky occlusion in Unity uses the sky color from the [ambient probe](https://docs.unity3d.com/2023.3/Documentation/ScriptReference/RenderSettings-ambientProbe.html), which updates at runtime. This means you can dynamically light GameObjects as the sky color changes. For example, you can change the sky color from light to dark, to simulate the effect of a day-night cycle. -Static and dynamic objects can both receive lighting with Sky Occlusion. However, only static objects can affect the baked result. Enabling Sky Occlusion can lengthen the time required to bake lighting and uses additional memory at run-time. +If you enable sky occlusion, Adaptive Probe Volumes might take longer to bake, and Unity might use more memory at runtime. -## Enable Sky Occlusion +## How sky occlusion works -Sky Occlusion is enabled from the **Sky Occlusion** section of the **Adaptive Probe Volumes** tab within the **Lighting Window**. +When you enable sky occlusion, Unity bakes an additional static sky occlusion value into each probe in an Adaptive Probe Volume. The sky occlusion value is the amount of indirect light the probe receives from the sky, including light that bounced off static GamesObjects. -Note that lighting data must be recalculated if Sky Occlusion is enabled for the first time, or is disabled following a bake. +At runtime, when a static or dynamic GameObject samples an Adaptive Probe Volume probe, Unity approximates the light from the sky using two values: -## Modifying Sky Occlusion properties +- A sky color from the ambient probe, which updates when the sky color changes. +- The sky occlusion value, which is static. -It is possible to affect the visual quality and appearance of Sky Occlusion using these properties: +## Enable sky occlusion -
- - - - - - - - - - - - - - - - - - - - - - - - -
PropertyDescription
SamplesDetermines the number of samples used when calculating the sky contribution for each probe. Increasing this value improves the accuracy of lighting data at the cost of the time required to bake Adaptive Probe Volumes.
BouncesThe number of bounces used when calculating the sky’s contribution on probes. Increasing the number of bounces can be useful in Scenes where probes may have very indirect routes to the Sky. This will also affect the time required to bake Adaptive Probe Volumes.
Albedo OverrideSky Occlusion does not consider the albedo (color) of Materials used throughout the Scene when calculating bounced lighting. Instead a single color is a used throughout the Scene. Albedo Override allows this color to be modified. Lower values darken and higher values will brighten the intensity of this value.
Sky DirectionWhether probes should store the dominant direction of incoming light from the Sky. Sky Direction increases memory usage but produces more accurate lighting. Without Sky Direction, the surface normals of objects are used instead and in some Scenes this can produce visual inaccuracies.
+First, enable the GPU lightmapper. Unity doesn't support sky occlusion if you use **Progressive CPU** instead. -## Sky Direction +1. Go to **Window** > **Rendering** > **Lighting**. +2. Go to the **Scene** panel. +3. Set **Lightmapper** to **Progressive GPU**. -By default, Sky Direction is disabled and the surface normals of objects lit by probes are used to sample the Ambient Probe generated from the Sky. -When Sky Direction is enabled, Unity calculates - for each probe - the most appropriate incoming sky lighting direction. Where desirable, this can be locally overridden in specific areas of the Scene using a [Probe Adjustment Volume](probevolumes-concept.md#volume). +To enable sky occlusion, follow these steps: -Enabling Sky Direction can improve visual results, especially in cave-like scenarios where the sky lighting needs to bounce several times on surfaces before reaching a surface. However the additional data required increases the time needed to bakelighting data. It also increases memory usage during run-time. +1. Go to the **Adaptive Probe Volumes** panel. +2. Enable **Sky Occlusion**. -## Debugging Sky Occlusion +To update the lighting data, you must also [bake the Adaptive Probe Volume](probevolumes-use.md#add-and-bake-an-adaptive-probe-volume) after you enable or disable sky occlusion. -You can inspect the Sky Occlusion value using the **Display Probes** option in the [Rendering Debugger](rendering-debugger-window-reference.md#probe-volume-panel). Two views are provided in the **Probe Shading Mode** dropdown: -1. **Sky Occlusion SH**: Display the gray value (scalar) used to attenuate Sky lighting. -2. **Sky Direction**: Displays a green dot corresponding to the direction used to sample the Ambient Probe. If **Sky Direction** was not enabled or could not be computed this displays a red probe. +## Update light at runtime -## Limitations +To update the light from the sky at runtime, follow these steps to make sure the ambient probe updates when the sky updates. -1. Currently Sky Occlusion does not work if the **Progressive CPU Lightmapper** is selected. -2. If Sky Occlusion is enabled or disabled, the Scene must be rebaked to update lighting data. -3. Sky Direction is not interpolated between probes. This may result in harsh lighting transitions where neighboring probes are storing very different results. +1. In the **Hierarchy** window, select the volume that affects the current camera. +2. In the **Inspector** window, double-click the Volume Profile Asset to open the asset. +3. In the **Visual Environment** > **Sky** section, set **Ambient Mode** to **Dynamic**. -# Additional resources +Refer to [Environment lighting](environment-lighting.md) for more information. +## Enable more accurate sky direction data +When an object samples the ambient probe, by default Unity uses the surface normal of the object as the direction to the sky. This direction might not match the direction the light comes from, for example if the object is inside and the sky light bounces off other objects to reach it. -* [Understand Adaptive Probe Volumes](probevolumes-concept.md) -* [Visual Environment Volume override](Override-Visual-Environment.md) \ No newline at end of file +Unity can instead calculate, store, and use an accurate direction from each Adaptive Probe Volume probe, and take bounce lighting into account. This makes sky occlusion more accurate, especially in areas like caves where probes don't have a direct line of sight to the sky, or when the sky has contrasting colors and the light comes from a specific direction such as through a window. + +To enable this feature, in the **Adaptive Probe Volumes** of the Lighting window, enable **Sky Direction**. + +If you enable **Sky Direction**, the following applies: + +- Baking takes longer and Unity uses more memory at runtime. +- There might be visible seams, because Unity doesn't interpolate sky direction data between probes. + +To override the directions Unity uses, use a [Probe Adjustment Volume component](probevolumes-adjustment-volume-component-reference.md). + +## Additional resources + +- [Adaptive Probe Volumes panel properties](probevolumes-lighting-panel-reference.md#sky-occlusion-settings) for more information about sky occlusion settings +- [Rendering Debugger](rendering-debugger-window-reference.md#probe-volume-panel) for information about displaying baked sky occlusion data diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-understand-changing-lighting-at-runtime.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-understand-changing-lighting-at-runtime.md new file mode 100644 index 00000000000..fd365d611e4 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-understand-changing-lighting-at-runtime.md @@ -0,0 +1,19 @@ +# Choose how to change lighting at runtime + +You can change how objects use the baked data in Adaptive Probe Volumes, to create lighting that changes at runtime. For example, you can turn the lights on and off in a scene, or change the time of day. + +You can use one of the following processes: + +- [Bake different lighting setups with Lighting Scenarios](probevolumes-bakedifferentlightingsetups.md), for example you can bake a Lighting Scenario for each stage in a day-night cycle. +- [Update light from the sky at runtime with sky occlusion](probevolumes-skyocclusion.md). + +Lighting Scenarios have the following advantages: + +- Lighting Scenarios are more accurate. Lighting Scenarios don't approximate the light from the sky, or the color of objects that light bounces off. +- Lighting Scenarios store all the lighting in a scene, so you can update light from both the sky and scene lights. + +Sky occlusion has the following advantages: + +- Easier to set up. For example, you only need to bake once to set up the data you need for a day-night cycle. +- Better performance. +- Faster and smoother transitions, because sky occlusion doesn't have to blend between different sets of data. diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-use.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-use.md index cbe021e9a1c..32d2ad96e3b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-use.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-use.md @@ -56,6 +56,6 @@ You can use the following to configure an Adaptive Probe Volume: ## Additional resources - [Bake multiple scenes together with Baking Sets](probevolumes-usebakingsets.md) -- [Bake different lighting setups with Lighting Scenarios](probevolumes-bakedifferentlightingsetups.md) +- [Change lighting at runtime](change-lighting-at-runtime.md) - [Fix issues with Adaptive Probe Volumes](probevolumes-fixissues.md) - [Work with multiple Scenes in Unity](https://docs.unity3d.com/Documentation/Manual/MultiSceneEditing.html) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes.md index 4519a066e06..6b2b9d8c9e7 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes.md @@ -9,9 +9,8 @@ Adaptive Probe Volumes (APV) make [Light Probes](https://docs.unity3d.com/Manual | [Display Adaptive Probe Volumes](probevolumes-showandadjust.md) | Visualize the structure of Adaptive Probe Volumes. | | [Configure the size and density of Adaptive Probe Volumes](probevolumes-changedensity.md) | Change the size of an Adaptive Probe Volume, or increase the density of Light Probes. | | [Bake multiple scenes together with Baking Sets](probevolumes-usebakingsets.md) | Add scenes to a Baking Set so you can bake the lighting for all the scenes together. | -| [Bake different lighting setups with Lighting Scenarios](probevolumes-bakedifferentlightingsetups.md) | Use multiple Lighting Scenarios to store baking results for different scene setups, and switch between them at runtime. | +| [Change lighting at runtime](change-lighting-at-runtime.md) | Use Lighting Scenarios or sky occlusion to change how objects use the data in Adaptive Probe Volumes at runtime. | | [Streaming Adaptive Probe Volumes](probevolumes-streaming.md) | How Adaptive Probe Volumes stream lighting data to provide lighting for large open worlds. | -| [Sky Occlusion](probevolumes-skyocclusion.md) | How to use Sky Occlusion with Adaptive Probe Volumes for dynamic sky lighting. | | [Fix issues with Adaptive Probe Volumes](probevolumes-fixissues.md) | Reduce light leaks and seams in your lighting result. | | [Adaptive Probe Volume Inspector window reference](probevolumes-inspector-reference.md) | Reference for the Adaptive Probe Volume Inspector window. | | [Adaptive Probe Volumes panel reference](probevolumes-lighting-panel-reference.md) | Reference for the Adaptive Probe Volumes panel in the Lighting settings. | diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md index 160440a0220..cd7f7bb5eba 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-debugger-window-reference.md @@ -495,8 +495,8 @@ These settings make it possible for you to visualize [Adaptive Probe Volumes](pr | **Property** | **Sub-property** | **Description** | |-|-|-| -| **Display Cells** || Display cells. Refer to [Understanding Adaptive Probe Volumes](../probevolumes-concept.md) for more information. | -| **Display Bricks** || Display bricks. Refer to [Understanding Adaptive Probe Volumes](../probevolumes-concept.md) for more information. | +| **Display Cells** || Display cells. Refer to [Understanding Adaptive Probe Volumes](probevolumes-concept.md) for more information. | +| **Display Bricks** || Display bricks. Refer to [Understanding Adaptive Probe Volumes](probevolumes-concept.md) for more information. | | **Live Subdivision Preview** || Enable a preview of Adaptive Probe Volume data in the scene without baking. This might make the Editor slower. This setting appears only if you select **Display Cells** or **Display Bricks**. | || **Cell Updates Per Frame** | Set the number of cells, bricks, and probe positions to update per frame. Higher values might make the Editor slower. The default value is 4. This property appears only if you enable **Live Subdivision Preview**. | || **Update Frequency** | Set how frequently Unity updates cell, bricks, and probe positions, in seconds. The default value is 1. This property appears only if you enable **Live Subdivision Preview**. | @@ -507,7 +507,7 @@ These settings make it possible for you to visualize [Adaptive Probe Volumes](pr | **Property** | **Sub-property** | **Description** | |-|-|-| | **Display Probes** || Display probes. | -|| **Probe Shading Mode** | Set what the Rendering Debugger displays. The options are:
  • SH: Display the [spherical harmonics (SH) lighting data](https://docs.unity3d.com/Manual/LightProbes-TechnicalInformation.html) for the final color calculation. The number of bands depends on the **SH Bands** setting in the active [HDRP Asset](HDRP-Asset.md).
  • SHL0: Display the spherical harmonics (SH) lighting data with only the first band.
  • SHL0L1: Display the spherical Harmonics (SH) lighting data with the first two bands.
  • Validity: Display whether probes are valid, based on the number of backfaces the probe samples. Refer to [Fix issues with Adaptive Probe Volumes](probevolumes-fixissues.md) for more information about probe validity.
  • Probe Validity Over Dilation Threshold: Display red if a probe samples too many backfaces, based on the **Validity Threshold** set in the [Adaptive Probe Volumes panel](probevolumes-lighting-panel-reference.md). This means the probe can't be baked or sampled.
  • Invalidated By Touchup Volumes: Display probes that a [Probe Adjustment Volume component](probevolumes-adjustment-volume-component-reference.md) has made invalid.
  • Size: Display a different color for each size of [brick](probevolumes-concept.md).
| +|| **Probe Shading Mode** | Set what the Rendering Debugger displays. The options are:
  • SH: Display the [spherical harmonics (SH) lighting data](https://docs.unity3d.com/Manual/LightProbes-TechnicalInformation.html) for the final color calculation. The number of bands depends on the **SH Bands** setting in the active [HDRP Asset](HDRP-Asset.md).
  • SHL0: Display the spherical harmonics (SH) lighting data with only the first band.
  • SHL0L1: Display the spherical Harmonics (SH) lighting data with the first two bands.
  • Validity: Display whether probes are valid, based on the number of backfaces the probe samples. Refer to [Fix issues with Adaptive Probe Volumes](probevolumes-fixissues.md) for more information about probe validity.
  • Probe Validity Over Dilation Threshold: Display red if a probe samples too many backfaces, based on the **Validity Threshold** set in the [Adaptive Probe Volumes panel](probevolumes-lighting-panel-reference.md). This means the probe can't be baked or sampled.
  • Invalidated By Touchup Volumes: Display probes that a [Probe Adjustment Volume component](probevolumes-adjustment-volume-component-reference.md) has made invalid.
  • Size: Display a different color for each size of [brick](probevolumes-concept.md).
  • Sky Occlusion SH: If you enable [sky occlusion](probevolumes-skyocclusion.md), this setting displays the amount of indirect light the probe receives from the sky that bounced off static GameObjects. The value is a scalar, so it displays as a shade of gray.
  • Sky Direction: Display a green circle that represents the direction from the probe to the sky. This setting displays a red circle if Unity can't calculate the direction, or **Sky Direction** in the [Adaptive Probe Volumes panel](probevolumes-lighting-panel-reference.md) is disabled.
| || **Debug Size** | Set the size of the displayed probes. The default is 0.3. | || **Exposure Compensation** | Set the brightness of the displayed probes. Decrease the value to increase brightness. The default is 0. This property appears only if you set **Probe Shading Mode** to **SH**, **SHL0**, or **SHL0L1**. | || **Max Subdivisions Displayed** | Set the lowest probe density to display. For example, set this to 0 to display only the highest probe density. | @@ -518,6 +518,8 @@ These settings make it possible for you to visualize [Adaptive Probe Volumes](pr | **Virtual Offset Debug** || Display the offsets Unity applies to Light Probe capture positions. | || **Debug Size** | Set the size of the arrows that represent Virtual Offset values. | | **Debug Draw Distance** || Set how far from the scene camera Unity draws debug visuals for cells and bricks, in meters. The default is 200. | +| **Auto Display Probes** || Display probes in the Scene view, if you select a volume with a Probe Adjustment Volume component in the Hierarchy window. | +| **Isolate Affected** || Display only probes affected by a volume with a Probe Adjustment Volume component, if you select the volume in the Hierarchy window. | ### Streaming diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/probevolumes-lighting-panel-reference.md b/Packages/com.unity.render-pipelines.universal/Documentation~/probevolumes-lighting-panel-reference.md index 1bc09fc9455..73da9854283 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/probevolumes-lighting-panel-reference.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/probevolumes-lighting-panel-reference.md @@ -98,9 +98,9 @@ This section appears only if you enable **Lighting Scenarios** under **Light Pro | **Property** | **Description** | |-|-| -| **Sky Occlusion** | Enable [sky occlusion](probevolumes-skyocclusion.md) | +| **Sky Occlusion** | Enable [sky occlusion](probevolumes-skyocclusion.md). | | **Samples** | Set the number of samples Unity uses to calculate the light each probe receives from the sky. Higher values increase the accuracy of the sky occlusion data, but increasing baking time. The default value is 2048. | -| **Bounces** | The number of times Unity bounces light from the sky off objects when calculating the sky occlusion data. Higher values increase the accuracy of the sky occlusion data, but increase baking time. Use higher values if objects block the direct view from probes to the sky. The default value is 2. | +| **Bounces** | Set the number of times Unity bounces light from the sky off objects when calculating the sky occlusion data. Higher values increase the accuracy of the sky occlusion data, but increase baking time. Use higher values if objects block the direct view from probes to the sky. The default value is 2. | | **Albedo Override** | Set the brightness of the single color Unity uses to represent objects the sky light bounces off, instead of the actual color of the objects. Higher values brighten the baked sky occlusion lighting. The default value is 0.6. | | **Sky Direction** | Enable Unity storing and using more accurate data about the directions from probes towards the sky. Refer to [Add dynamic color and shadows from the sky](probevolumes-skyocclusion.md#enable-more-accurate-sky-direction-data) for more information. | From 71d2f57a2f6ad0edaa64bfeb7df82466af6c3af0 Mon Sep 17 00:00:00 2001 From: Arttu Peltonen Date: Wed, 8 May 2024 07:31:46 +0000 Subject: [PATCH 33/67] Reduce NRP RenderGraph compiler memory usage This PR fixes a memory usage regression reported in https://jira.unity3d.com/browse/UUM-60476. The PR that caused the regression was RG Compilation Caching https://github.cds.internal.unity3d.com/unity/unity/pull/40721, which for NRP RG Compiler creates 20 instances of `CompilerContextData` ([see code](https://github.cds.internal.unity3d.com/unity/unity/blob/trunk/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs#L36-L43)) which in its constructor reserves native list capacity according to worst case, resulting in many megabytes of reserved memory. This multiplied by 20 causes tens of MBs of upfront memory allocation whenever RG Compilation Caching is enabled (which it is by default). The fix removes the upfront allocation from `ResourcesData` constructor based on a couple of observations: - I only touched `ResourcesData` because by my count, `ResourcesData.readerData` accounts for ~90% of all memory allocated in `CompilerContextData` constructor. - This change should be 100% safe & correct, because `ResourcesData.Initialize()` is called as the first step of NRP Compilation (by `NativePassCompiler.SetupContextData`), and that function resizes each array to the size it needs to be. - As a side effect of above, it is not required to estimate the amount of resources, since it is known by the time `Initialize` is called. This reduces unnecessary allocation of unused memory. - These are native memory allocations and do not generate garbage. When a new graph hash is encountered (meaning we must compile a graph), we take a new `CompilerContextData` from the pool and the resourceData arrays are allocated at that point. This is expected to have some small overhead, but likely negligible compared to the overhead already incurred by having to compile the graph. - In addition, it's good to be aware that `NativeList` always rounds requested capacity to the next power-of-two (`newCapacity = math.ceilpow2(newCapacity)`). So if you resize to 100000 elements, it will actually reserve memory for 131072 elements. Note that memory usage can clearly be improved further - I want to make the low-risk simple fix first and improve upon it afterwards. --- .../RenderGraph/Compiler/CompilerContextData.cs | 6 +++--- .../RenderGraph/Compiler/NativePassCompiler.cs | 3 +-- .../Runtime/RenderGraph/Compiler/ResourcesData.cs | 12 +++++++----- .../RenderGraph/RenderGraphCompilationCache.cs | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs index 7a8a4d549c4..112ff0040a2 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs @@ -44,7 +44,7 @@ internal static int LastIndex(this ref NativeList list) where T : unmanage // Datastructure that contains passes and dependencies and allow you to iterate and reason on them more like a graph internal class CompilerContextData : IDisposable, RenderGraph.ICompiledGraph { - public CompilerContextData(int estimatedNumPasses, int estimatedNumResourcesPerType) + public CompilerContextData(int estimatedNumPasses) { passData = new NativeList(estimatedNumPasses, AllocatorManager.Persistent); fences = new Dictionary(); @@ -53,7 +53,7 @@ public CompilerContextData(int estimatedNumPasses, int estimatedNumResourcesPerT outputData = new NativeList(estimatedNumPasses * 2, AllocatorManager.Persistent); fragmentData = new NativeList(estimatedNumPasses * 4, AllocatorManager.Persistent); randomAccessResourceData = new NativeList(4, AllocatorManager.Persistent); // We assume not a lot of passes use random write - resources = new ResourcesData(estimatedNumResourcesPerType); + resources = new ResourcesData(); nativePassData = new NativeList(estimatedNumPasses, AllocatorManager.Persistent);// assume nothing gets merged nativeSubPassData = new NativeList(estimatedNumPasses, AllocatorManager.Persistent);// there should "never" be more subpasses than graph passes createData = new NativeList(estimatedNumPasses * 2, AllocatorManager.Persistent); // assume every pass creates two resources @@ -183,7 +183,7 @@ public bool AddToFragmentList(TextureAccess access, int listFirstIndex, int numI [MethodImpl(MethodImplOptions.AggressiveInlining)] public string GetResourceVersionedName(ResourceHandle h) => GetResourceName(h) + " V" + h.version; - + // resources can be added as fragment both as input and output so make sure not to add them twice (return true upon new addition) public bool AddToRandomAccessResourceList(ResourceHandle h, int randomWriteSlotIndex, bool preserveCounterValue, int listFirstIndex, int numItems) { diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs index f692f70fdaa..f9e39250805 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs @@ -26,7 +26,6 @@ internal struct RenderGraphInputInfo RenderGraphCompilationCache m_CompilationCache; internal const int k_EstimatedPassCount = 100; - internal const int k_EstimatedResourceCountPerType = 50; internal const int k_MaxSubpass = 8; // Needs to match with RenderPassSetup.h NativeList m_BeginRenderPassAttachments; @@ -34,7 +33,7 @@ internal struct RenderGraphInputInfo public NativePassCompiler(RenderGraphCompilationCache cache) { m_CompilationCache = cache; - defaultContextData = new CompilerContextData(k_EstimatedPassCount, k_EstimatedResourceCountPerType); + defaultContextData = new CompilerContextData(k_EstimatedPassCount); toVisitPassIds = new Stack(k_EstimatedPassCount); m_BeginRenderPassAttachments = new NativeList(FixedAttachmentArray.MaxAttachments, Allocator.Persistent); } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs index 5ae11571d2c..a6e6e1f1245 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs @@ -198,7 +198,7 @@ internal class ResourcesData public DynamicArray[] resourceNames; - public ResourcesData(int estimatedNumResourcesPerType) + public ResourcesData() { unversionedData = new NativeList[(int)RenderGraphResourceType.Count]; versionedData = new NativeList[(int)RenderGraphResourceType.Count]; @@ -207,10 +207,12 @@ public ResourcesData(int estimatedNumResourcesPerType) for (int t = 0; t < (int)RenderGraphResourceType.Count; t++) { - versionedData[t] = new NativeList(MaxVersions * estimatedNumResourcesPerType, AllocatorManager.Persistent); - unversionedData[t] = new NativeList(estimatedNumResourcesPerType, AllocatorManager.Persistent); - readerData[t] = new NativeList(MaxVersions * estimatedNumResourcesPerType * MaxReaders, AllocatorManager.Persistent); - resourceNames[t] = new DynamicArray(estimatedNumResourcesPerType); // T in NativeList cannot contain managed types, so the names are stored separately + // Note: All these lists are allocated with zero capacity, they will be resized in Initialize when + // the amount of resources is known. + versionedData[t] = new NativeList(0, AllocatorManager.Persistent); + unversionedData[t] = new NativeList(0, AllocatorManager.Persistent); + readerData[t] = new NativeList(0, AllocatorManager.Persistent); + resourceNames[t] = new DynamicArray(0); // T in NativeList cannot contain managed types, so the names are stored separately } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs index 459f180400c..d32a0baeea5 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs @@ -38,7 +38,7 @@ public RenderGraphCompilationCache() for (int i = 0; i < k_CachedGraphCount; ++i) { m_CompiledGraphPool.Push(new RenderGraph.CompiledGraph()); - m_NativeCompiledGraphPool.Push(new CompilerContextData(NativePassCompiler.k_EstimatedPassCount, NativePassCompiler.k_EstimatedResourceCountPerType)); + m_NativeCompiledGraphPool.Push(new CompilerContextData(NativePassCompiler.k_EstimatedPassCount)); } } From b37baa5637d37e90c3d27aad66b899d26f02807b Mon Sep 17 00:00:00 2001 From: Wilfrid Girard Date: Wed, 8 May 2024 07:32:08 +0000 Subject: [PATCH 34/67] [URP] [Docs] Add details about Camera StopNans This PR slightly updates doc page https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@17.0/manual/camera-component-reference.html to add details about how to enable StopNans. Based on information from thread https://unity.slack.com/archives/C89KFUUCT/p1715078059200189 --- .../Documentation~/camera-component-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/camera-component-reference.md b/Packages/com.unity.render-pipelines.universal/Documentation~/camera-component-reference.md index 66a199a4cb5..92705c2066c 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/camera-component-reference.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/camera-component-reference.md @@ -84,7 +84,7 @@ Overlay cameras expose the following properties: |         *Jitter Scale* | Set the scale of the jitter applied when TAA is enabled. A lower value reduces visible flickering and jittering, but also reduces the effectiveness of the anti-aliasing.

This property only appears when you select **Temporal Anti-aliasing (TAA)** from the **Anti-aliasing** drop-down and enable **Show Additional Properties** in the Inspector. | |         *Mip Bias* | Set how much texture mipmap selection is biased when rendering.

A positive bias makes a texture appear more blurry, while a negative bias sharpens the texture. However, a lower value also has a negative impact on performance.

**Note**: Requires mipmaps in textures.

This property only appears when you select **Temporal Anti-aliasing (TAA)** from the **Anti-aliasing** drop-down and enable **Show Additional Properties** in the Inspector. | |         *Variance Clamp Scale* | Set the size of the color volume Unity uses to find nearby pixels when the color history is incorrect or unavailable. To do this, the clamp limits how much a pixel's color can vary from the color of the pixels that surround it.

Lower values can reduce ghosting, but produce more flickering. Higher values reduce flickering, but are prone to blur and ghosting.

This property only appears when you select **Temporal Anti-aliasing (TAA)** from the **Anti-aliasing** drop-down and enable **Show Additional Properties** in the Inspector. | -| **Stop NaNs** | Enable the checkbox to make this camera replace values that are Not a Number (NaN) with a black pixel. This stops certain effects from breaking, but is a resource-intensive process. Only enable this feature if you experience NaN issues that you can not fix.

This property is only visible when **Render Type** is set to **Base**. | +| **Stop NaNs** | Enable the checkbox to make this camera replace values that are Not a Number (NaN) with a black pixel. This stops certain effects from breaking, but is a resource-intensive process. Only enable this feature if you experience NaN issues that you can not fix.

This property is only visible when **Render Type** is set to **Base**.
The Stop NaNs pass executes at the start of the post-processing passes. You must enable **Post Processing** for the camera to use **Stop NaNs**. | | **Dithering** | Enable the checkbox to apply 8-bit dithering to the final render. This can help reduce banding on wide gradients and low light areas.

This property is only visible when **Render Type** is set to **Base**. | | **Clear Depth** | Enable to clear depth from previous camera on rendering.

This property is only visible when **Render Type** is set to **Overlay**. | | **Render Shadows** | Enable shadow rendering. | From f127e3f4451b1e1eb01a6993c9b0955d9b41d341 Mon Sep 17 00:00:00 2001 From: Sebastien Lagarde Date: Wed, 8 May 2024 07:32:12 +0000 Subject: [PATCH 35/67] [HDRP] Fix format issue in HDRP documentation The hdrp documentation is badly formatted: https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@17.0/manual/Authoring-LUTs.html however we can see this error from .html file only, when looking with .md we can't spot the error. This PR attempt to fix this format issue. --- .../Documentation~/Authoring-LUTs.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Authoring-LUTs.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Authoring-LUTs.md index 6b5580cd230..3b15f49935b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Authoring-LUTs.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Authoring-LUTs.md @@ -1,6 +1,7 @@ # Lookup textures You can use lookup textures (LUTs) in the High Definition Render Pipeline (HDRP) . To create a LUT, use external software. + |Page|Description| |-|-| |[Understand LUTs](rendering-luts-understand.md)|Learn about LUTs in HDRP.| From b107b46cd7e5cde61093193f9480d0f098091d39 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Wed, 8 May 2024 09:28:28 +0000 Subject: [PATCH 36/67] [SRP] Upgrade Burst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update Burst Package to retrieve this specific fix 🔽 ![image](https://media.github.cds.internal.unity3d.com/user/42/files/8583fc0b-14db-49d7-875c-06c71d90be35) - 🎁 Upgrade mathematic package & remove reference from srp package (this is already a dependency in core package) - 🧹 Clean up duplicated dependencies in HDRP - 📦 Move burst dependency to srp core (since this [PR](https://github.cds.internal.unity3d.com/unity/unity/pull/35168), collection is included in core, thus, it brings burst) --- Packages/com.unity.render-pipelines.core/package.json | 7 ++++--- .../package.json | 4 ---- Packages/com.unity.render-pipelines.universal/package.json | 2 -- .../Tests/Editor/VFXAdditionalPackageTest.cs | 7 +------ 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/package.json b/Packages/com.unity.render-pipelines.core/package.json index 1b4512afa3c..4a0754b5288 100644 --- a/Packages/com.unity.render-pipelines.core/package.json +++ b/Packages/com.unity.render-pipelines.core/package.json @@ -5,12 +5,13 @@ "unity": "6000.0", "displayName": "Core RP Library", "dependencies": { - "com.unity.mathematics": "1.2.6", + "com.unity.burst": "1.8.14", + "com.unity.mathematics": "1.3.2", "com.unity.ugui": "2.0.0", - "com.unity.collections": "2.2.0", + "com.unity.collections": "2.4.1", "com.unity.modules.physics": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.rendering.light-transport": "1.0.0" } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.high-definition/package.json b/Packages/com.unity.render-pipelines.high-definition/package.json index 10290581596..2a98203a6f6 100644 --- a/Packages/com.unity.render-pipelines.high-definition/package.json +++ b/Packages/com.unity.render-pipelines.high-definition/package.json @@ -5,13 +5,9 @@ "unity": "6000.0", "displayName": "High Definition RP", "dependencies": { - "com.unity.mathematics": "1.2.4", - "com.unity.collections": "2.2.0", - "com.unity.burst": "1.8.9", "com.unity.modules.video": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.terrain": "1.0.0", "com.unity.render-pipelines.core": "17.0.3", "com.unity.shadergraph": "17.0.3", "com.unity.visualeffectgraph": "17.0.3", diff --git a/Packages/com.unity.render-pipelines.universal/package.json b/Packages/com.unity.render-pipelines.universal/package.json index e395d8a1712..8ca0a24e8c1 100644 --- a/Packages/com.unity.render-pipelines.universal/package.json +++ b/Packages/com.unity.render-pipelines.universal/package.json @@ -5,8 +5,6 @@ "unity": "6000.0", "displayName": "Universal RP", "dependencies": { - "com.unity.mathematics": "1.2.1", - "com.unity.burst": "1.8.9", "com.unity.render-pipelines.core": "17.0.3", "com.unity.shadergraph": "17.0.3", "com.unity.render-pipelines.universal-config": "17.0.3" diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs index 341d6c77398..6fa1358d4d8 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs @@ -14,12 +14,7 @@ namespace UnityEditor.VFX.Test [TestFixture] public class VFXAdditionalPackageTest { - public static string[] kAdditionalSampleMatches = new [] {"Additions", "Helpers" -//See UUM-66783 -#if !VFX_TESTS_HAS_HDRP - , "Learning" -#endif -}; + public static string[] kAdditionalSampleMatches = new [] {"Additions", "Helpers", "Learning"}; private static readonly string kSampleExpectedPath = "Assets/Samples"; From 0d6f973743b96b6915bf28c6bf71c6ca9340b97e Mon Sep 17 00:00:00 2001 From: Pema Malling Date: Wed, 8 May 2024 22:59:34 +0000 Subject: [PATCH 37/67] Fix meta for terrains in HDRP https://jira.unity3d.com/browse/UUM-71171 The meta pass of the default HDRP terrain shader (TerrainLit.shader) is currently broken. It always outputs black albedo, resulting in no bounced lighting whatsoever. This was a regression introduced in this PR https://github.cds.internal.unity3d.com/unity/unity/pull/20840, which moved around some shader includes, but neglected to update the Terrain shader according. The bug is essentially that the meta pass is incorrectly using camera-relative rendering. This fix is to restore the missing include in the terrain shader. --- .../Material/TerrainLit/TerrainLitTemplate.hlsl | 4 ++++ .../Tests/LightBaker/InputExtractionMaterials.cs | 9 ++++----- .../Scenes/BakedLightingTerrainAlbedo-editor.unity | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLitTemplate.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLitTemplate.hlsl index 8b5fcd493f1..ee3374bc52a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLitTemplate.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLitTemplate.hlsl @@ -27,6 +27,10 @@ #endif #ifdef SCENESELECTIONPASS #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl" +#elif SHADERPASS == SHADERPASS_LIGHT_TRANSPORT + // Use Unity's built-in matrices for meta pass rendering + #define SCENEPICKINGPASS + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl" #endif #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl" diff --git a/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/InputExtractionMaterials.cs b/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/InputExtractionMaterials.cs index e465abd0eea..a90392c5ece 100644 --- a/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/InputExtractionMaterials.cs +++ b/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/InputExtractionMaterials.cs @@ -19,13 +19,12 @@ public class MetaPassSceneTest public string ObjectName { get; set; } // Object for which to test the metaPass data public MetaPassType MetaPassType { get; set; } = MetaPassType.Albedo; public int TextureCount { get; set; } + public float RMSEThreshold { get; set; } = 0.0001f; public override string ToString() { return $"{SceneName}-{ObjectName}-{MetaPassType}"; } }; internal class InputExtractionMaterials { - private static readonly float metaPassRMSETolerance = 0.0001f; - Texture2D ConvertVector4ImageToRGBAHalfTexture(uint width, uint height, Vector4[] textureData) { Texture2D texture = new((int)width, (int)height, TextureFormat.RGBAHalf, false); @@ -53,8 +52,8 @@ Texture2D ConvertVector4ImageToRGBAHalfTexture(uint width, uint height, Vector4[ new() { SceneName = "Metapass_BasicMaterials", ObjectName = "albedoTexTiling23", MetaPassType = MetaPassType.Albedo , TextureCount = 13 }, new() { SceneName = "Metapass_BasicMaterials", ObjectName = "emissiveTexOffset_p5p3", MetaPassType = MetaPassType.Emission , TextureCount = 13 }, new() { SceneName = "Metapass_BasicMaterials", ObjectName = "albedoTexOffset_p5p3", MetaPassType = MetaPassType.Albedo , TextureCount = 13 }, - new() { SceneName = "BakedLightingTerrainAlbedo-editor", ObjectName = "Terrain", MetaPassType = MetaPassType.Albedo , TextureCount = 3 }, - new() { SceneName = "BakedLightingTerrainAlbedo-editor", ObjectName = "TerrainOffset", MetaPassType = MetaPassType.Albedo , TextureCount = 3 } + new() { SceneName = "BakedLightingTerrainAlbedo-editor", ObjectName = "Terrain", MetaPassType = MetaPassType.Albedo , TextureCount = 3, RMSEThreshold = 0.03f }, + new() { SceneName = "BakedLightingTerrainAlbedo-editor", ObjectName = "TerrainOffset", MetaPassType = MetaPassType.Albedo , TextureCount = 3, RMSEThreshold = 0.03f } }; [Test, Category("Graphics")] @@ -108,7 +107,7 @@ public void MetaPassTemplateTests([ValueSource(nameof(metaPassTests))]MetaPassSc ActivePixelTests = ImageComparisonSettings.PixelTests.None, ActiveImageTests = ImageComparisonSettings.ImageTests.RMSE, IncorrectPixelsThreshold = 1.0f / (actualTexture2D.width * actualTexture2D.height), - RMSEThreshold = metaPassRMSETolerance + RMSEThreshold = metaPassTest.RMSEThreshold, }; try diff --git a/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Scenes/BakedLightingTerrainAlbedo-editor.unity b/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Scenes/BakedLightingTerrainAlbedo-editor.unity index a502455b399..18de3ee0cbf 100644 --- a/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Scenes/BakedLightingTerrainAlbedo-editor.unity +++ b/Tests/SRPTests/Projects/HDRP_Tests/Assets/Tests/LightBaker/Scenes/BakedLightingTerrainAlbedo-editor.unity @@ -191,7 +191,7 @@ Terrain: m_PreserveTreePrototypeLayers: 0 m_DeringLightProbesForTrees: 1 m_ReceiveGI: 1 - m_ScaleInLightmap: 0.0512 + m_ScaleInLightmap: 1 m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0} m_GroupingID: 0 m_RenderingLayerMask: 1 @@ -556,8 +556,12 @@ Light: m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!114 &700898409 MonoBehaviour: m_ObjectHideFlags: 0 @@ -788,7 +792,7 @@ Terrain: m_PreserveTreePrototypeLayers: 0 m_DeringLightProbesForTrees: 1 m_ReceiveGI: 1 - m_ScaleInLightmap: 0.0512 + m_ScaleInLightmap: 1 m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0} m_GroupingID: 0 m_RenderingLayerMask: 1 @@ -864,6 +868,7 @@ MeshRenderer: m_RayTraceProcedural: 0 m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1174,6 +1179,7 @@ MeshRenderer: m_RayTraceProcedural: 0 m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1321,8 +1327,12 @@ Light: m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!114 &1665680526 MonoBehaviour: m_ObjectHideFlags: 0 From efb7f70c1477a2172a65077f9fc0fb82e1b1565c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Wed, 8 May 2024 23:27:33 +0000 Subject: [PATCH 38/67] [URP] SingleCameraRequest : Add missing RenderPipelineManager Begin/End Camera and Context callbacks SingleCameraRequest on URP are rendering a single camera, it's purpose is rendering a camera without the full list of stack cameras. This avoid some overhead. As we are rendering 1 single camera, we are missing: ``` RenderPipelineManager.beginContextRendering RenderPipelineManager.endContextRendering RenderPipelineManager.beginCameraRendering RenderPipelineManager.endCameraRendering ``` Jira Issue: https://jira.unity3d.com/browse/UUM-69268 I've added a new docs page in URP with an exaple of how to use SubmitRenderRequest and how to subscribe to RenderPipelineManager callbacks in each case. --- .../Documentation~/User-Render-Requests.md | 4 + .../Documentation~/TableOfContents.md | 1 + .../Documentation~/User-Render-Requests.md | 88 +++++ .../Runtime/UniversalRenderPipeline.cs | 300 ++++++++++-------- .../SingleCameraRequestCallbacksTest.cs | 126 ++++++++ .../SingleCameraRequestCallbacksTest.cs.meta | 2 + 6 files changed, 383 insertions(+), 138 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/User-Render-Requests.md create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Documentation~/User-Render-Requests.md b/Packages/com.unity.render-pipelines.core/Documentation~/User-Render-Requests.md index e08eb877552..734afdb0abc 100644 --- a/Packages/com.unity.render-pipelines.core/Documentation~/User-Render-Requests.md +++ b/Packages/com.unity.render-pipelines.core/Documentation~/User-Render-Requests.md @@ -89,3 +89,7 @@ public class StandardRenderRequest : MonoBehaviour } ``` +## Other useful information + +- On [Universal Render Pipeline (URP)](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/User-Render-Requests.html). + diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md b/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md index e68aff29627..a1dcc7970c3 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md @@ -100,6 +100,7 @@ * [Render a camera's output to a Render Texture](rendering-to-a-render-texture.md) * [Customize a camera](universal-additional-camera-data.md) * [Camera component properties](camera-component-reference.md) + * [Render Requests](User-Render-Requests.md) * [Post-processing](integration-with-post-processing.md) * [How to configure](integration-with-post-processing.md#post-proc-how-to) * [HDR Output](post-processing/hdr-output.md) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/User-Render-Requests.md b/Packages/com.unity.render-pipelines.universal/Documentation~/User-Render-Requests.md new file mode 100644 index 00000000000..401fe8a13bd --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/User-Render-Requests.md @@ -0,0 +1,88 @@ +# Render Requests + +For a general documentation see the [Core Package](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/User-Render-Requests.html) about Render Requests. + +## Use UniversalRenderPipeline.SingleCameraRequest + +`UniversalRenderPipeline.SingleCameraRequest` renders a single camera, without taking into account the full stack of cameras. + +You can still hook into callbacks from [RenderPipelineManager](https://docs.unity3d.com/ScriptReference/Rendering.RenderPipelineManager.html). + +The following code sample shows that you can hook into [RenderPipelineManager.endContextRendering](https://docs.unity3d.com/ScriptReference/Rendering.RenderPipelineManager-endContextRendering.html) `UniversalRenderPipeline.SingleCameraRequest` + +To try out this example: + +- Attach the script to a **GameObject** in the **Scene**. +- Configure the **cams** and **rts**. +- Set **useSingleCameraRequestValues** to true or false depending on which type of render request you want to use. +- Select **Enter Play Mode**. +- See the **Console** Log. + +``` +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +public class SingleCameraRenderRequestExample : MonoBehaviour +{ + public Camera[] cams; + public RenderTexture[] rts; + + void Start() + { + if (cams == null || cams.Length == 0 || rts == null || cams.Length != rts.Length) + { + Debug.LogError("Invalid setup"); + return; + } + + StartCoroutine(RenderSingleRequestNextFrame()); + RenderPipelineManager.endContextRendering += OnEndContextRendering; + } + + void OnEndContextRendering(ScriptableRenderContext context, List cameras) + { + var stb = new StringBuilder($"Cameras Count from EndContextRendering: {cameras.Count}."); + foreach (var cam in cameras) + { + stb.AppendLine($"- {cam.name}"); + } + Debug.Log(stb.ToString()); + } + + void OnDestroy() + { + RenderPipelineManager.endContextRendering -= OnEndContextRendering; + } + + IEnumerator RenderSingleRequestNextFrame() + { + yield return new WaitForEndOfFrame(); + + SendSingleRenderRequests(); + + yield return new WaitForEndOfFrame(); + + StartCoroutine(RenderSingleRequestNextFrame()); + } + + void SendSingleRenderRequests() + { + for (int i = 0; i < cams.Length; i++) + { + UniversalRenderPipeline.SingleCameraRequest request = + new UniversalRenderPipeline.SingleCameraRequest(); + + // Check if the request is supported by the active render pipeline + if (RenderPipeline.SupportsRenderRequest(cams[i], request)) + { + request.destination = rts[i]; + RenderPipeline.SubmitRenderRequest(cams[i], request); + } + } + } +} +``` diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs index a3ce26eb4f2..ce3a014790b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs @@ -64,17 +64,6 @@ internal static class Profiling { public static class Pipeline { - // TODO: Would be better to add Profiling name hooks into RenderPipeline.cs, requires changes outside of Universal. -#if UNITY_2021_1_OR_NEWER - public static readonly ProfilingSampler beginContextRendering = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(BeginContextRendering)}"); - public static readonly ProfilingSampler endContextRendering = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(EndContextRendering)}"); -#else - public static readonly ProfilingSampler beginFrameRendering = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(BeginFrameRendering)}"); - public static readonly ProfilingSampler endFrameRendering = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(EndFrameRendering)}"); -#endif - public static readonly ProfilingSampler beginCameraRendering = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(BeginCameraRendering)}"); - public static readonly ProfilingSampler endCameraRendering = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(EndCameraRendering)}"); - const string k_Name = nameof(UniversalRenderPipeline); public static readonly ProfilingSampler initializeCameraData = new ProfilingSampler($"{k_Name}.{nameof(CreateCameraData)}"); public static readonly ProfilingSampler initializeStackedCameraData = new ProfilingSampler($"{k_Name}.{nameof(InitializeStackedCameraData)}"); @@ -347,6 +336,62 @@ private void DisposeAdditionalCameraData() } } + readonly struct CameraRenderingScope : IDisposable + { + static readonly ProfilingSampler beginCameraRenderingSampler = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(BeginCameraRendering)}"); + static readonly ProfilingSampler endCameraRenderingSampler = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(EndCameraRendering)}"); + + private readonly ScriptableRenderContext m_Context; + private readonly Camera m_Camera; + + public CameraRenderingScope(ScriptableRenderContext context, Camera camera) + { + using (new ProfilingScope(beginCameraRenderingSampler)) + { + m_Context = context; + m_Camera = camera; + + BeginCameraRendering(context, camera); + } + } + + public void Dispose() + { + using (new ProfilingScope(endCameraRenderingSampler)) + { + EndCameraRendering(m_Context, m_Camera); + } + } + } + + readonly struct ContextRenderingScope : IDisposable + { + static readonly ProfilingSampler beginContextRenderingSampler = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(BeginContextRendering)}"); + static readonly ProfilingSampler endContextRenderingSampler = new ProfilingSampler($"{nameof(RenderPipeline)}.{nameof(EndContextRendering)}"); + + private readonly ScriptableRenderContext m_Context; + private readonly List m_Cameras; + + public ContextRenderingScope(ScriptableRenderContext context, List cameras) + { + m_Context = context; + m_Cameras = cameras; + + using (new ProfilingScope(beginContextRenderingSampler)) + { + BeginContextRendering(m_Context, m_Cameras); + } + } + + public void Dispose() + { + using (new ProfilingScope(endContextRenderingSampler)) + { + EndContextRendering(m_Context, m_Cameras); + } + } + } + #if UNITY_2021_1_OR_NEWER /// protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras) @@ -380,86 +425,59 @@ protected override void Render(ScriptableRenderContext renderContext, Camera[] c // C#8 feature, only in >= 2020.2 using var profScope = new ProfilingScope(ProfilingSampler.Get(URPProfileId.UniversalRenderTotal)); -#if UNITY_2021_1_OR_NEWER - using (new ProfilingScope(Profiling.Pipeline.beginContextRendering)) - { - BeginContextRendering(renderContext, cameras); - } -#else - using (new ProfilingScope(Profiling.Pipeline.beginFrameRendering)) + using (new ContextRenderingScope(renderContext, cameras)) { - BeginFrameRendering(renderContext, cameras); - } -#endif - - GraphicsSettings.lightsUseLinearIntensity = (QualitySettings.activeColorSpace == ColorSpace.Linear); - GraphicsSettings.lightsUseColorTemperature = true; - SetupPerFrameShaderConstants(); - XRSystem.SetDisplayMSAASamples((MSAASamples)asset.msaaSampleCount); + GraphicsSettings.lightsUseLinearIntensity = (QualitySettings.activeColorSpace == ColorSpace.Linear); + GraphicsSettings.lightsUseColorTemperature = true; + SetupPerFrameShaderConstants(); + XRSystem.SetDisplayMSAASamples((MSAASamples)asset.msaaSampleCount); #if DEVELOPMENT_BUILD || UNITY_EDITOR - if (DebugManager.instance.isAnyDebugUIActive) - UniversalRenderPipelineDebugDisplaySettings.Instance.UpdateDisplayStats(); + if (DebugManager.instance.isAnyDebugUIActive) + UniversalRenderPipelineDebugDisplaySettings.Instance.UpdateDisplayStats(); - // This is for texture streaming - UniversalRenderPipelineDebugDisplaySettings.Instance.UpdateMaterials(); + // This is for texture streaming + UniversalRenderPipelineDebugDisplaySettings.Instance.UpdateMaterials(); #endif - // URP uses the camera's allowDynamicResolution flag to decide if useDynamicScale should be enabled for camera render targets. - // However, the RTHandle system has an additional setting that controls if useDynamicScale will be set for render targets allocated via RTHandles. - // In order to avoid issues at runtime, we must make the RTHandle system setting consistent with URP's logic. URP already synchronizes the setting - // during initialization, but unfortunately it's possible for external code to overwrite the setting due to RTHandle state being global. - // The best we can do to avoid errors in this situation is to ensure the state is set to the correct value every time we perform rendering. - RTHandles.SetHardwareDynamicResolutionState(true); + // URP uses the camera's allowDynamicResolution flag to decide if useDynamicScale should be enabled for camera render targets. + // However, the RTHandle system has an additional setting that controls if useDynamicScale will be set for render targets allocated via RTHandles. + // In order to avoid issues at runtime, we must make the RTHandle system setting consistent with URP's logic. URP already synchronizes the setting + // during initialization, but unfortunately it's possible for external code to overwrite the setting due to RTHandle state being global. + // The best we can do to avoid errors in this situation is to ensure the state is set to the correct value every time we perform rendering. + RTHandles.SetHardwareDynamicResolutionState(true); - SortCameras(cameras); + SortCameras(cameras); #if UNITY_2021_1_OR_NEWER - for (int i = 0; i < cameras.Count; ++i) + for (int i = 0; i < cameras.Count; ++i) #else - for (int i = 0; i < cameras.Length; ++i) + for (int i = 0; i < cameras.Length; ++i) #endif - { - var camera = cameras[i]; - if (IsGameCamera(camera)) { - RenderCameraStack(renderContext, camera); - } - else - { - using (new ProfilingScope(Profiling.Pipeline.beginCameraRendering)) + var camera = cameras[i]; + if (IsGameCamera(camera)) { - BeginCameraRendering(renderContext, camera); + RenderCameraStack(renderContext, camera); } + else + { + using (new CameraRenderingScope(renderContext, camera)) + { #if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER - //It should be called before culling to prepare material. When there isn't any VisualEffect component, this method has no effect. - //N.B.: We aren't expecting an XR camera at this stage - VFX.VFXManager.PrepareCamera(camera); + //It should be called before culling to prepare material. When there isn't any VisualEffect component, this method has no effect. + //N.B.: We aren't expecting an XR camera at this stage + VFX.VFXManager.PrepareCamera(camera); #endif - UpdateVolumeFramework(camera, null); + UpdateVolumeFramework(camera, null); - RenderSingleCameraInternal(renderContext, camera); - - using (new ProfilingScope(Profiling.Pipeline.endCameraRendering)) - { - EndCameraRendering(renderContext, camera); + RenderSingleCameraInternal(renderContext, camera); + } } } - } - - s_RenderGraph.EndFrame(); - s_RTHandlePool.PurgeUnusedResources(Time.frameCount); -#if UNITY_2021_1_OR_NEWER - using (new ProfilingScope(Profiling.Pipeline.endContextRendering)) - { - EndContextRendering(renderContext, cameras); - } -#else - using (new ProfilingScope(Profiling.Pipeline.endFrameRendering)) - { - EndFrameRendering(renderContext, cameras); + s_RenderGraph.EndFrame(); + s_RTHandlePool.PurgeUnusedResources(Time.frameCount); } -#endif #if ENABLE_SHADER_DEBUG_PRINT ShaderDebugPrintManager.instance.EndFrame(); @@ -543,8 +561,17 @@ protected override void ProcessRenderRequests(ScriptableRenderConte } else { - camera.gameObject.TryGetComponent(out var additionalCameraData); - RenderSingleCameraInternal(context, camera, ref additionalCameraData); + using (ListPool.Get(out var tmp)) + { + tmp.Add(camera); + + using (new ContextRenderingScope(context, tmp)) + using (new CameraRenderingScope(context, camera)) + { + camera.gameObject.TryGetComponent(out var additionalCameraData); + RenderSingleCameraInternal(context, camera, ref additionalCameraData); + } + } } if(temporaryRT) @@ -963,70 +990,73 @@ static void RenderCameraStack(ScriptableRenderContext context, Camera baseCamera UpdateCameraStereoMatrices(baseCamera, xrPass); } - using (new ProfilingScope(Profiling.Pipeline.beginCameraRendering)) + bool finalOutputHDR = false; +#if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER + VFX.VFXCameraXRSettings cameraXRSettings; +#endif + using (new CameraRenderingScope(context, baseCamera)) { - BeginCameraRendering(context, baseCamera); - } - - // Update volumeframework before initializing additional camera data - UpdateVolumeFramework(baseCamera, baseCameraAdditionalData); + // Update volumeframework before initializing additional camera data + UpdateVolumeFramework(baseCamera, baseCameraAdditionalData); - ContextContainer frameData = renderer.frameData; - UniversalCameraData baseCameraData = CreateCameraData(frameData, baseCamera, baseCameraAdditionalData, !isStackedRendering); + ContextContainer frameData = renderer.frameData; + UniversalCameraData baseCameraData = CreateCameraData(frameData, baseCamera, + baseCameraAdditionalData, !isStackedRendering); #if ENABLE_VR && ENABLE_XR_MODULE - if (xrPass.enabled) - { - baseCameraData.xr = xrPass; + if (xrPass.enabled) + { + baseCameraData.xr = xrPass; - // Helper function for updating cameraData with xrPass Data - // Need to update XRSystem using baseCameraData to handle the case where camera position is modified in BeginCameraRendering - UpdateCameraData(baseCameraData, xrPass); + // Helper function for updating cameraData with xrPass Data + // Need to update XRSystem using baseCameraData to handle the case where camera position is modified in BeginCameraRendering + UpdateCameraData(baseCameraData, xrPass); - // Handle the case where camera position is modified in BeginCameraRendering - xrLayout.ReconfigurePass(xrPass, baseCamera); - XRSystemUniversal.BeginLateLatching(baseCamera, xrPassUniversal); - } + // Handle the case where camera position is modified in BeginCameraRendering + xrLayout.ReconfigurePass(xrPass, baseCamera); + XRSystemUniversal.BeginLateLatching(baseCamera, xrPassUniversal); + } #endif - // InitializeAdditionalCameraData needs to be initialized after the cameraTargetDescriptor is set because it needs to know the - // msaa level of cameraTargetDescriptor and XR modifications. - InitializeAdditionalCameraData(baseCamera, baseCameraAdditionalData, !isStackedRendering, baseCameraData); + // InitializeAdditionalCameraData needs to be initialized after the cameraTargetDescriptor is set because it needs to know the + // msaa level of cameraTargetDescriptor and XR modifications. + InitializeAdditionalCameraData(baseCamera, baseCameraAdditionalData, !isStackedRendering, + baseCameraData); #if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER - //It should be called before culling to prepare material. When there isn't any VisualEffect component, this method has no effect. - VFX.VFXCameraXRSettings cameraXRSettings; - cameraXRSettings.viewTotal = baseCameraData.xr.enabled ? 2u : 1u; - cameraXRSettings.viewCount = baseCameraData.xr.enabled ? (uint)baseCameraData.xr.viewCount : 1u; - cameraXRSettings.viewOffset = (uint)baseCameraData.xr.multipassId; - VFX.VFXManager.PrepareCamera(baseCamera, cameraXRSettings); + //It should be called before culling to prepare material. When there isn't any VisualEffect component, this method has no effect. + cameraXRSettings.viewTotal = baseCameraData.xr.enabled ? 2u : 1u; + cameraXRSettings.viewCount = baseCameraData.xr.enabled ? (uint)baseCameraData.xr.viewCount : 1u; + cameraXRSettings.viewOffset = (uint)baseCameraData.xr.multipassId; + VFX.VFXManager.PrepareCamera(baseCamera, cameraXRSettings); #endif #if ADAPTIVE_PERFORMANCE_2_0_0_OR_NEWER - if (asset.useAdaptivePerformance) - ApplyAdaptivePerformance(baseCameraData); + if (asset.useAdaptivePerformance) + ApplyAdaptivePerformance(baseCameraData); #endif - // update the base camera flag so that the scene depth is stored if needed by overlay cameras later in the frame - baseCameraData.postProcessingRequiresDepthTexture |= cameraStackRequiresDepthForPostprocessing; + // update the base camera flag so that the scene depth is stored if needed by overlay cameras later in the frame + baseCameraData.postProcessingRequiresDepthTexture |= cameraStackRequiresDepthForPostprocessing; - // Check whether the camera stack final output is HDR - // This is equivalent of UniversalCameraData.isHDROutputActive but without necessiting the base camera to be the last camera in the stack. - bool hdrDisplayOutputActive = mainHdrDisplayOutputActive; + // Check whether the camera stack final output is HDR + // This is equivalent of UniversalCameraData.isHDROutputActive but without necessiting the base camera to be the last camera in the stack. + bool hdrDisplayOutputActive = mainHdrDisplayOutputActive; #if ENABLE_VR && ENABLE_XR_MODULE - // If we are rendering to xr then we need to look at the XR Display rather than the main non-xr display. - if (xrPass.enabled) - hdrDisplayOutputActive = xrPass.isHDRDisplayOutputActive; + // If we are rendering to xr then we need to look at the XR Display rather than the main non-xr display. + if (xrPass.enabled) + hdrDisplayOutputActive = xrPass.isHDRDisplayOutputActive; #endif - bool finalOutputHDR = asset.supportsHDR && hdrDisplayOutputActive // Check whether any HDR display is active and the render pipeline asset allows HDR rendering - && baseCamera.targetTexture == null && (baseCamera.cameraType == CameraType.Game || baseCamera.cameraType == CameraType.VR) // Check whether the stack outputs to a screen - && baseCameraData.allowHDROutput; // Check whether the base camera allows HDR output - - // Update stack-related parameters - baseCameraData.stackAnyPostProcessingEnabled = anyPostProcessingEnabled; - baseCameraData.stackLastCameraOutputToHDR = finalOutputHDR; - - RenderSingleCamera(context, baseCameraData); - using (new ProfilingScope(Profiling.Pipeline.endCameraRendering)) - { - EndCameraRendering(context, baseCamera); + finalOutputHDR = + asset.supportsHDR && + hdrDisplayOutputActive // Check whether any HDR display is active and the render pipeline asset allows HDR rendering + && baseCamera.targetTexture == null && + (baseCamera.cameraType == CameraType.Game || + baseCamera.cameraType == CameraType.VR) // Check whether the stack outputs to a screen + && baseCameraData.allowHDROutput; // Check whether the base camera allows HDR output + + // Update stack-related parameters + baseCameraData.stackAnyPostProcessingEnabled = anyPostProcessingEnabled; + baseCameraData.stackLastCameraOutputToHDR = finalOutputHDR; + + RenderSingleCamera(context, baseCameraData); } // Late latching is not supported after this point @@ -1061,29 +1091,23 @@ static void RenderCameraStack(ScriptableRenderContext context, Camera baseCamera UpdateCameraStereoMatrices(overlayAdditionalCameraData.camera, xrPass); - using (new ProfilingScope(Profiling.Pipeline.beginCameraRendering)) + using (new CameraRenderingScope(context, overlayCamera)) { - BeginCameraRendering(context, overlayCamera); - } #if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER - //It should be called before culling to prepare material. When there isn't any VisualEffect component, this method has no effect. - VFX.VFXManager.PrepareCamera(overlayCamera, cameraXRSettings); + //It should be called before culling to prepare material. When there isn't any VisualEffect component, this method has no effect. + VFX.VFXManager.PrepareCamera(overlayCamera, cameraXRSettings); #endif - UpdateVolumeFramework(overlayCamera, overlayAdditionalCameraData); + UpdateVolumeFramework(overlayCamera, overlayAdditionalCameraData); - bool lastCamera = i == lastActiveOverlayCameraIndex; - InitializeAdditionalCameraData(overlayCamera, overlayAdditionalCameraData, lastCamera, overlayCameraData); + bool lastCamera = i == lastActiveOverlayCameraIndex; + InitializeAdditionalCameraData(overlayCamera, overlayAdditionalCameraData, lastCamera, overlayCameraData); - overlayCameraData.stackAnyPostProcessingEnabled = anyPostProcessingEnabled; - overlayCameraData.stackLastCameraOutputToHDR = finalOutputHDR; + overlayCameraData.stackAnyPostProcessingEnabled = anyPostProcessingEnabled; + overlayCameraData.stackLastCameraOutputToHDR = finalOutputHDR; - xrLayout.ReconfigurePass(overlayCameraData.xr, overlayCamera); + xrLayout.ReconfigurePass(overlayCameraData.xr, overlayCamera); - RenderSingleCamera(context, overlayCameraData); - - using (new ProfilingScope(Profiling.Pipeline.endCameraRendering)) - { - EndCameraRendering(context, overlayCamera); + RenderSingleCamera(context, overlayCameraData); } } } diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs new file mode 100644 index 00000000000..1db73ebd047 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs @@ -0,0 +1,126 @@ +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; +using UnityEngine.TestTools; +using Object = UnityEngine.Object; + +class SingleCameraRequestCallbacksTests +{ + private Camera m_Camera; + private Camera m_SingleRenderRequestCamera; + + private RenderTexture m_RT; + + [SetUp] + public void Setup() + { + if (GraphicsSettings.currentRenderPipeline is not UniversalRenderPipelineAsset) + Assert.Ignore("URP Only test"); + + var go = new GameObject($"{nameof(SingleCameraRequestCallbacksTests)}_Main"); + m_Camera = go.AddComponent(); + + go = new GameObject($"{nameof(SingleCameraRequestCallbacksTests)}_SingleRenderRequest"); + m_SingleRenderRequestCamera = go.AddComponent(); + + // Avoid that the camera renders outside the submit render request + m_Camera.enabled = false; + m_SingleRenderRequestCamera.enabled = false; + + m_RT = new RenderTexture(256, 256, 16, RenderTextureFormat.ARGB32); + m_RT.Create(); + } + + [TearDown] + public void TearDown() + { + if (GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset) + { + Assert.IsTrue(m_CallbackTriggered); + + Object.DestroyImmediate(m_Camera.gameObject); + Object.DestroyImmediate(m_SingleRenderRequestCamera.gameObject); + + m_RT.Release(); + + m_CallbackTriggered = false; + } + } + + void SendRequest() + { + UniversalRenderPipeline.SingleCameraRequest request = new UniversalRenderPipeline.SingleCameraRequest(); + + if (RenderPipeline.SupportsRenderRequest(m_SingleRenderRequestCamera, request)) + { + request.destination = m_RT; + RenderPipeline.SubmitRenderRequest(m_SingleRenderRequestCamera, request); + } + } + + private bool m_CallbackTriggered = false; + + private void ActionRendering(ScriptableRenderContext context, Camera camera) + { + if (camera == m_SingleRenderRequestCamera) + m_CallbackTriggered = true; + } + + private void ActionContext(ScriptableRenderContext context, List cameras) + { + if (cameras.Contains(m_SingleRenderRequestCamera)) + m_CallbackTriggered = true; + } + + [UnityTest] + public IEnumerator BeginCameraRenderingIsTriggered() + { + RenderPipelineManager.beginCameraRendering += ActionRendering; + + SendRequest(); + + yield return new WaitForEndOfFrame(); + + RenderPipelineManager.beginCameraRendering -= ActionRendering; + } + + [UnityTest] + public IEnumerator EndCameraRenderingIsTriggered() + { + RenderPipelineManager.endCameraRendering += ActionRendering; + + SendRequest(); + + yield return new WaitForEndOfFrame(); + + RenderPipelineManager.endCameraRendering -= ActionRendering; + } + + [UnityTest] + public IEnumerator BeginContextRenderingIsTriggered() + { + RenderPipelineManager.beginContextRendering += ActionContext; + + SendRequest(); + + yield return new WaitForEndOfFrame(); + + RenderPipelineManager.beginContextRendering -= ActionContext; + } + + [UnityTest] + public IEnumerator EndContextRenderingIsTriggered() + { + RenderPipelineManager.endContextRendering += ActionContext; + + SendRequest(); + + yield return new WaitForEndOfFrame(); + + RenderPipelineManager.endContextRendering -= ActionContext; + } +} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs.meta new file mode 100644 index 00000000000..73143835b8a --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/SingleCameraRequestCallbacksTest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d7d1bb31488a2634696d7655e1b26969 \ No newline at end of file From acd40a9db1d717b8f8d248d1e671cda7830208d9 Mon Sep 17 00:00:00 2001 From: Oleksandr Kokoshyn Date: Thu, 9 May 2024 04:10:25 +0000 Subject: [PATCH 39/67] Moved the existing blit page to the Compatibility section Moved the existing blit page to the Compatibility section, reworded it a bit and added a reference to 2022 docs. --- .../Documentation~/TableOfContents.md | 2 +- .../Documentation~/compatibility-mode.md | 6 ++++-- .../Documentation~/customize/blit-overview.md | 2 +- .../create-custom-renderer-feature-compatibility-mode.md | 4 ++-- .../renderer-features/how-to-fullscreen-blit.md | 8 +++++++- .../scriptable-render-pass-reference.md | 4 ++-- .../renderer-features/write-a-scriptable-render-pass.md | 4 +--- .../Documentation~/snippets/note-compatibility-mode.md | 2 ++ 8 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.universal/Documentation~/snippets/note-compatibility-mode.md diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md b/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md index a1dcc7970c3..0c82a659d1b 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md @@ -180,7 +180,6 @@ * [Access a texture in a custom render pass](render-graph-read-write-texture.md) * [Transfer a texture between render passes](render-graph-pass-textures-between-passes.md) * [URP blit best practices](customize/blit-overview.md) - * [Perform a full screen blit in URP](renderer-features/how-to-fullscreen-blit.md) * [Draw objects in a render pass](render-graph-draw-objects-in-a-pass.md) * [Use frame data](accessing-frame-data.md) * [Analyze a render graph](render-graph-view.md) @@ -199,6 +198,7 @@ * [Write a Scriptable Render Pass in Compatibility Mode](renderer-features/write-a-scriptable-render-pass.md) * [Example of a complete Scriptable Renderer Feature in Compatibility Mode](renderer-features/create-custom-renderer-feature-compatibility-mode.md) * [Scriptable Render Pass Compatibility Mode API reference](renderer-features/scriptable-renderer-features/scriptable-render-pass-reference.md) + * [Perform a full screen blit in URP in Compatibility mode](renderer-features/how-to-fullscreen-blit.md) * [Optimization](urp-optimization.md) * [Rendering Debugger](features/rendering-debugger.md) * [Add controls to the Rendering Debugger](features/rendering-debugger-add-controls.md) diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/compatibility-mode.md b/Packages/com.unity.render-pipelines.universal/Documentation~/compatibility-mode.md index 60d142cb6db..b92886bc0eb 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/compatibility-mode.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/compatibility-mode.md @@ -1,11 +1,13 @@ ## Compatibility Mode -If you enable **Compatibility Mode (Render Graph Disabled)** in [URP graphics settings](urp-global-settings.md), you can write a Scriptable Render Pass without using the [render graph API](render-graph.md). +If you enable **Compatibility Mode (Render Graph Disabled)** in URP graphics settings, you can write a Scriptable Render Pass without using the [render graph API](render-graph.md). The setting is in **Project Settings** > **Graphics** > **Pipeline Specific Settings** > **URP** > **Render Graph**. -> **Note**: Unity no longer develops or improves the rendering path that doesn't use the render graph API. Use the render graph API instead when developing new graphics features. +> [!NOTE] +> Unity no longer develops or improves the rendering path that doesn't use the [render graph API](render-graph.md). Use the render graph API instead when developing new graphics features. |Page|Description| |-|-| |[Write a Scriptable Render Pass in Compatibility Mode](renderer-features/write-a-scriptable-render-pass.md)|An example of creating a Scriptable Render Pass in Compatibility Mode.| |[Example of a complete Scriptable Renderer Feature in Compatibility Mode](renderer-features/create-custom-renderer-feature-compatibility-mode.md)|An example of a complete Scriptable Renderer Feature in Compatibility Mode.| |[Scriptable Render Pass API reference](renderer-features/scriptable-renderer-features/scriptable-render-pass-reference.md)|Reference for the Scriptable Render Pass API.| +|[Perform a full screen blit in URP in Compatibility mode](renderer-features/how-to-fullscreen-blit.md)|An example that describes how to create a custom Renderer Feature that performs a full screen blit.| diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/customize/blit-overview.md b/Packages/com.unity.render-pipelines.universal/Documentation~/customize/blit-overview.md index 11614be5ded..a2936afc821 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/customize/blit-overview.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/customize/blit-overview.md @@ -22,4 +22,4 @@ Use the [Blitter API](https://docs.unity3d.com/Packages/com.unity.render-pipelin ## Custom full-screen blit example -The [How to perform a full screen blit in URP](../renderer-features/how-to-fullscreen-blit.md) example shows how to create a custom Renderer Feature that performs a full screen blit. The example works in XR and is compatible with SRP APIs. +The [How to perform a full screen blit in URP in Compatibility Mode](../renderer-features/how-to-fullscreen-blit.md) example shows how to create a custom Renderer Feature that performs a full screen blit. The example works in XR and is compatible with SRP APIs. diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/create-custom-renderer-feature-compatibility-mode.md b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/create-custom-renderer-feature-compatibility-mode.md index bee21bf3e57..02b03222635 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/create-custom-renderer-feature-compatibility-mode.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/create-custom-renderer-feature-compatibility-mode.md @@ -1,8 +1,8 @@ # Example of a complete Scriptable Renderer Feature in Compatibility Mode -This section describes how to create a complete [Scriptable Renderer Feature](./scriptable-renderer-features/intro-to-scriptable-renderer-features.md) for a URP Renderer, if you enable **Compatibility Mode (Render Graph Disabled)** in [URP graphics settings](../urp-global-settings.md). +This section describes how to create a complete [Scriptable Renderer Feature](./scriptable-renderer-features/intro-to-scriptable-renderer-features.md) for a URP Renderer. -> **Note**: Unity no longer develops or improves the rendering path that doesn't use the render graph API. Use the render graph API instead when developing new graphics features. +[!include[](../snippets/note-compatibility-mode.md)] This walkthrough contains the following sections: diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/how-to-fullscreen-blit.md b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/how-to-fullscreen-blit.md index 24f2e449a22..4b86d06538d 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/how-to-fullscreen-blit.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/how-to-fullscreen-blit.md @@ -1,7 +1,9 @@ -# Perform a full screen blit in URP +# Perform a full screen blit in URP in Compatibility Mode The example on this page describes how to create a custom Renderer Feature that performs a full screen blit. +[!include[](../snippets/note-compatibility-mode.md)] + ## Example overview This example implements the following solution: @@ -195,3 +197,7 @@ Follow these steps to create a [custom Renderer Feature](https://docs.unity3d.co > **Note**: To visualize the example in XR, configure the project to use XR SDK. [Add the MockHMD XR Plugin to the project](https://docs.unity3d.com/Packages/com.unity.xr.mock-hmd@latest/index.html). Set the **Render Mode** property to **Single Pass Instanced**. The example is complete. + +## Additional resources + +For more information on performing the blit operation in Compatibility Mode, refer to the [Using textures section in the URP 14 (Unity 2022) documentation](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@14.0/manual/working-with-textures.html). \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/scriptable-renderer-features/scriptable-render-pass-reference.md b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/scriptable-renderer-features/scriptable-render-pass-reference.md index 9ccb2ed5374..1a53cbd2614 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/scriptable-renderer-features/scriptable-render-pass-reference.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/scriptable-renderer-features/scriptable-render-pass-reference.md @@ -1,8 +1,8 @@ ## Scriptable Render Pass Compatibility Mode API reference -You can use the following methods within a Scriptable Render Pass to handle its core functions, if you enable **Compatibility Mode (Render Graph Disabled)** in [URP graphics settings](../../urp-global-settings.md). +You can use the following methods within a Scriptable Render Pass to handle its core functions. -> **Note**: Unity no longer develops or improves the rendering path that doesn't use the render graph API. Use the render graph API instead when developing new graphics features. +[!include[](../../snippets/note-compatibility-mode.md)] | **Method** | **Description** | | ---------- | --------------- | diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/write-a-scriptable-render-pass.md b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/write-a-scriptable-render-pass.md index 5eba4ac4f5d..0e842c3bac3 100644 --- a/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/write-a-scriptable-render-pass.md +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/renderer-features/write-a-scriptable-render-pass.md @@ -1,8 +1,6 @@ # Write a Scriptable Render Pass in Compatibility Mode -If you enable **Compatibility Mode (Render Graph Disabled)** in [URP graphics settings](../urp-global-settings.md), you can write a Scriptable Render Pass without using the [render graph API](../render-graph.md). - -> **Note**: Unity no longer develops or improves the rendering path that doesn't use the render graph API. Use the render graph API instead when developing new graphics features. +[!include[](../snippets/note-compatibility-mode.md)] The following example is a `ScriptableRenderPass` instance that performs the following steps: diff --git a/Packages/com.unity.render-pipelines.universal/Documentation~/snippets/note-compatibility-mode.md b/Packages/com.unity.render-pipelines.universal/Documentation~/snippets/note-compatibility-mode.md new file mode 100644 index 00000000000..98c2814d6d7 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Documentation~/snippets/note-compatibility-mode.md @@ -0,0 +1,2 @@ +> [!NOTE] +> Unity no longer develops or improves the rendering path that doesn't use the [render graph API](render-graph.md). Use the render graph API instead when developing new graphics features. To use the instructions on this page, enable **Compatibility Mode (Render Graph Disabled)** in URP graphics settings (**Project Settings** > **Graphics**). \ No newline at end of file From d6d1d1d61a7ce02e72d502b69ec87c86a650cde7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elvar=20=C3=96rn=20Unn=C3=BE=C3=B3rsson?= Date: Thu, 9 May 2024 20:54:37 +0000 Subject: [PATCH 40/67] [Unity6][URP] Make sure we only allocate shadow textures when needed (UUM-70142) Fixes UUM-70142. The issue is that the constructor was allocating shadow maps, which caused memory leakage when switching between graphics quality. This PR changes it so the textures are only allocated when needed and with a check for if it has already been created. --- .../AdditionalLightsShadowCasterPass.cs | 10 ++++---- .../Passes/MainLightShadowCasterPass.cs | 23 ++++++++----------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs index ce42c03fd93..6663c10fc0b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs @@ -39,7 +39,8 @@ private static class AdditionalShadowsConstantBuffer private bool m_EmptyShadowmapNeedsClear = false; private RTHandle m_EmptyAdditionalLightShadowmapTexture; private const int k_EmptyShadowMapDimensions = 1; - private const string k_EmptyShadowMapName = "_EmptyAdditionalLightShadowmapTexture"; + private const string k_AdditionalLightShadowMapTextureName = "_AdditionalLightsShadowmapTexture"; + private const string k_EmptyAdditionalLightShadowMapTextureName = "_EmptyAdditionalLightShadowmapTexture"; internal static Vector4[] s_EmptyAdditionalLightIndexToShadowParams = null; float m_MaxShadowDistanceSq; @@ -78,7 +79,7 @@ public AdditionalLightsShadowCasterPass(RenderPassEvent evt) AdditionalShadowsConstantBuffer._AdditionalShadowOffset1 = Shader.PropertyToID("_AdditionalShadowOffset1"); AdditionalShadowsConstantBuffer._AdditionalShadowFadeParams = Shader.PropertyToID("_AdditionalShadowFadeParams"); AdditionalShadowsConstantBuffer._AdditionalShadowmapSize = Shader.PropertyToID("_AdditionalShadowmapSize"); - m_AdditionalLightsShadowmapID = Shader.PropertyToID("_AdditionalLightsShadowmapTexture"); + m_AdditionalLightsShadowmapID = Shader.PropertyToID(k_AdditionalLightShadowMapTextureName); m_AdditionalLightsWorldToShadow_SSBO = Shader.PropertyToID("_AdditionalLightsWorldToShadow_SSBO"); m_AdditionalShadowParams_SSBO = Shader.PropertyToID("_AdditionalShadowParams_SSBO"); @@ -108,7 +109,6 @@ public AdditionalLightsShadowCasterPass(RenderPassEvent evt) m_AdditionalLightShadowSliceIndexTo_WorldShadowMatrix = new Matrix4x4[maxVisibleAdditionalLights]; } - m_EmptyAdditionalLightShadowmapTexture = ShadowUtils.AllocShadowRT(k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, 1, 0, name: k_EmptyShadowMapName); m_EmptyShadowmapNeedsClear = true; } @@ -576,7 +576,7 @@ public bool Setup(UniversalRenderingData renderingData, UniversalCameraData came m_AdditionalLightShadowSliceIndexTo_WorldShadowMatrix[globalShadowSliceIndex] = sliceTransform * m_AdditionalLightShadowSliceIndexTo_WorldShadowMatrix[globalShadowSliceIndex]; } - ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_AdditionalLightsShadowmapHandle, renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits, name: "_AdditionalLightsShadowmapTexture"); + ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_AdditionalLightsShadowmapHandle, renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits, name: k_AdditionalLightShadowMapTextureName); m_MaxShadowDistanceSq = cameraData.maxShadowDistance * cameraData.maxShadowDistance; m_CascadeBorder = shadowData.mainLightShadowCascadeBorder; @@ -596,7 +596,7 @@ bool SetupForEmptyRendering(bool stripShadowsOffVariants, UniversalShadowData sh useNativeRenderPass = false; // Required for scene view camera(URP renderer not initialized) - if (ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_EmptyAdditionalLightShadowmapTexture, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, name: k_EmptyShadowMapName)) + if (ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_EmptyAdditionalLightShadowmapTexture, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, name: k_EmptyAdditionalLightShadowMapTextureName)) m_EmptyShadowmapNeedsClear = true; // initialize _AdditionalShadowParams diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs index 9aa391ce7ad..63892e61ee2 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs @@ -32,9 +32,10 @@ private static class MainLightShadowConstantBuffer int m_MainLightShadowmapID; internal RTHandle m_MainLightShadowmapTexture; - private RTHandle m_EmptyLightShadowmapTexture; + private RTHandle m_EmptyMainLightShadowmapTexture; private const int k_EmptyShadowMapDimensions = 1; - private const string k_EmptyShadowMapName = "_EmptyLightShadowmapTexture"; + private const string k_MainLightShadowMapTextureName = "_MainLightShadowmapTexture"; + private const string k_EmptyMainLightShadowMapTextureName = "_EmptyMainLightShadowmapTexture"; private static readonly Vector4 s_EmptyShadowParams = new Vector4(1, 0, 1, 0); private static readonly Vector4 s_EmptyShadowmapSize = s_EmptyShadowmapSize = new Vector4(k_EmptyShadowMapDimensions, 1f / k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions); @@ -76,9 +77,7 @@ public MainLightShadowCasterPass(RenderPassEvent evt) MainLightShadowConstantBuffer._ShadowOffset1 = Shader.PropertyToID("_MainLightShadowOffset1"); MainLightShadowConstantBuffer._ShadowmapSize = Shader.PropertyToID("_MainLightShadowmapSize"); - m_MainLightShadowmapID = Shader.PropertyToID("_MainLightShadowmapTexture"); - - m_EmptyLightShadowmapTexture = ShadowUtils.AllocShadowRT(k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, 1, 0, name: k_EmptyShadowMapName); + m_MainLightShadowmapID = Shader.PropertyToID(k_MainLightShadowMapTextureName); m_EmptyShadowmapNeedsClear = true; } @@ -88,7 +87,7 @@ public MainLightShadowCasterPass(RenderPassEvent evt) public void Dispose() { m_MainLightShadowmapTexture?.Release(); - m_EmptyLightShadowmapTexture?.Release(); + m_EmptyMainLightShadowmapTexture?.Release(); } /// @@ -141,8 +140,7 @@ public bool Setup(UniversalRenderingData renderingData, UniversalCameraData came Debug.LogWarning("Only directional lights are supported as main light."); } - Bounds bounds; - if (!renderingData.cullResults.GetShadowCasterBounds(shadowLightIndex, out bounds)) + if (!renderingData.cullResults.GetShadowCasterBounds(shadowLightIndex, out Bounds _)) return SetupForEmptyRendering(cameraData.renderer.stripShadowsOffVariants); m_ShadowCasterCascadesCount = shadowData.mainLightShadowCascadesCount; @@ -161,7 +159,7 @@ public bool Setup(UniversalRenderingData renderingData, UniversalCameraData came return SetupForEmptyRendering(cameraData.renderer.stripShadowsOffVariants); } - ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_MainLightShadowmapTexture, renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits, name: "_MainLightShadowmapTexture"); + ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_MainLightShadowmapTexture, renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits, name: k_MainLightShadowMapTextureName); m_MaxShadowDistanceSq = cameraData.maxShadowDistance * cameraData.maxShadowDistance; m_CascadeBorder = shadowData.mainLightShadowCascadeBorder; @@ -180,7 +178,7 @@ bool SetupForEmptyRendering(bool stripShadowsOffVariants) useNativeRenderPass = false; // Required for scene view camera(URP renderer not initialized) - if(ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_EmptyLightShadowmapTexture, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, name: k_EmptyShadowMapName)) + if(ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_EmptyMainLightShadowmapTexture, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, name: k_EmptyMainLightShadowMapTextureName)) m_EmptyShadowmapNeedsClear = true; return true; @@ -197,7 +195,7 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera #pragma warning disable CS0618 if (m_CreateEmptyShadowmap) { - ConfigureTarget(m_EmptyLightShadowmapTexture); + ConfigureTarget(m_EmptyMainLightShadowmapTexture); m_EmptyShadowmapNeedsClear = false; } else @@ -220,8 +218,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData if (m_CreateEmptyShadowmap) { SetEmptyMainLightCascadeShadowmap(CommandBufferHelpers.GetRasterCommandBuffer(universalRenderingData.commandBuffer)); - universalRenderingData.commandBuffer.SetGlobalTexture(m_MainLightShadowmapID, m_EmptyLightShadowmapTexture.nameID); - + universalRenderingData.commandBuffer.SetGlobalTexture(m_MainLightShadowmapID, m_EmptyMainLightShadowmapTexture.nameID); return; } From 554cd08176b01e03552d91bda30b4d100257f441 Mon Sep 17 00:00:00 2001 From: Gregory Mitrano Date: Thu, 9 May 2024 20:54:41 +0000 Subject: [PATCH 41/67] Add Missing Fallback Setting for FSR EASU Shader This change updates the FSR EASU shader to declare that no fallback shader is provided. The C# code explicitly handles this situation already and will never draw anything with the shader when it's unsupported. --- .../Shaders/PostProcessing/EdgeAdaptiveSpatialUpsampling.shader | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/EdgeAdaptiveSpatialUpsampling.shader b/Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/EdgeAdaptiveSpatialUpsampling.shader index e09d259d9ae..025a51e0704 100644 --- a/Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/EdgeAdaptiveSpatialUpsampling.shader +++ b/Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/EdgeAdaptiveSpatialUpsampling.shader @@ -62,4 +62,6 @@ Shader "Hidden/Universal Render Pipeline/Edge Adaptive Spatial Upsampling" ENDHLSL } } + + Fallback Off } From ba49d6105699b148047844c915bf455c583fd8ef Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Fri, 10 May 2024 01:53:04 +0000 Subject: [PATCH 42/67] Graphics/SRP/RPF - [UUM-70492 bis] Calling Render Graph Viewer before resources deallocation This is a follow-up PR of #48436 which was a temporary fix of [UUM-70492](https://jira.unity3d.com/browse/UUM-70492): - Safety test is re-enabled in RenderGraphResourceRegistry - Debug data function is called only in Editor mode as Render Graph Viewer is only visible within it. - Debug data filling Render Graph Viewer is generated before Render Graph execution pass where we deallocate resources, potentially corrupting debug data. --- .../Runtime/RenderGraph/RenderGraph.cs | 9 ++++++--- .../Runtime/RenderGraph/RenderGraphResourceRegistry.cs | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index a6e162180a7..2af5663e39a 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -1224,6 +1224,11 @@ internal void Execute() m_Resources.BeginExecute(m_CurrentFrameIndex); +#if UNITY_EDITOR + // Feeding Render Graph Viewer before resource deallocation at pass execution + GenerateDebugData(); +#endif + if (nativeRenderPassesEnabled) ExecuteNativeRenderGraph(); else @@ -1249,8 +1254,6 @@ internal void Execute() } finally { - GenerateDebugData(); - if (m_DebugParameters.immediateMode) ReleaseImmediateModeResources(); @@ -2547,7 +2550,7 @@ void CleanupDebugData() m_DebugData.Clear(); } -#endregion + #endregion Dictionary registeredGlobals = new Dictionary(); diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs index 8dae1d4ccdf..a7260ba8ac9 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs @@ -778,7 +778,7 @@ internal void GetRenderTargetInfo(in ResourceHandle res, out RenderTargetInfo ou else { // Managed by rendergraph, it might not be created yet so we look at the desc to find out - var desc = GetTextureResourceDesc(res, true); // TODO: remove true, we should throw on invalid desc here + var desc = GetTextureResourceDesc(res); var dim = desc.CalculateFinalDimensions(); outInfo = new RenderTargetInfo(); outInfo.width = dim.x; From da4cda22cbdfc3906f80fdb855c0b0f55af26ca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Fri, 10 May 2024 20:01:31 +0000 Subject: [PATCH 43/67] [SRPF][Graphics Tools] Render Pipeline Converter - Search Request was wrongly handled and disposed before it was completed. As the Search request is executed asyncronously. if we dispose the context. The RP converter for Buit in materials can not finish properly. Disposing the context, when is finished. --- .../Converter/ReadonlyMaterialConverter.cs | 58 ++++++++++--------- .../RenderPipelineConvertersEditor.cs | 25 ++++---- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Converter/ReadonlyMaterialConverter.cs b/Packages/com.unity.render-pipelines.universal/Editor/Converter/ReadonlyMaterialConverter.cs index fe099eb907a..6711b944ac1 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Converter/ReadonlyMaterialConverter.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Converter/ReadonlyMaterialConverter.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using UnityEditor.SceneManagement; +using UnityEditor.Search; using UnityEngine; using UnityEngine.SceneManagement; using Object = UnityEngine.Object; @@ -46,40 +47,43 @@ internal class ReadonlyMaterialConverter : RenderPipelineConverter public override void OnInitialize(InitializeConverterContext ctx, Action callback) { - var context = Search.SearchService.CreateContext("asset", "urp=convert-readonly a=URPConverterIndex"); - - Search.SearchService.Request(context, (c, items) => - { - // we're going to do this step twice in order to get them ordered, but it should be fast - var orderedRequest = items.OrderBy(req => + Search.SearchService.Request + ( + Search.SearchService.CreateContext("asset", "urp=convert-readonly a=URPConverterIndex"), + (searchContext, items) => { - GlobalObjectId.TryParse(req.id, out var gid); - return gid.assetGUID; - }); + // we're going to do this step twice in order to get them ordered, but it should be fast + var orderedRequest = items.OrderBy(req => + { + GlobalObjectId.TryParse(req.id, out var gid); + return gid.assetGUID; + }); - foreach (var r in orderedRequest) - { - if (r == null || !GlobalObjectId.TryParse(r.id, out var gid)) + foreach (var r in orderedRequest) { - continue; - } + if (string.IsNullOrEmpty(r?.id) || + !GlobalObjectId.TryParse(r.id, out var gid)) + { + continue; + } - var label = r.provider.fetchLabel(r, r.context); - var description = r.provider.fetchDescription(r, r.context); + var label = r.provider.fetchLabel(r, r.context); + var description = r.provider.fetchDescription(r, r.context); - var item = new ConverterItemDescriptor() - { - name = description.Split('/').Last().Split('.').First(), - info = $"{label}", - }; - guids.Add(gid.ToString()); + var item = new ConverterItemDescriptor() + { + name = description.Split('/').Last().Split('.').First(), + info = $"{label}", + }; + guids.Add(gid.ToString()); - ctx.AddAssetToConvert(item); - } + ctx.AddAssetToConvert(item); + } - callback.Invoke(); - }); - context?.Dispose(); + callback.Invoke(); + searchContext?.Dispose(); + } + ); } public override void OnRun(ref RunItemContext ctx) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConvertersEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConvertersEditor.cs index f405014db47..e1e450f785c 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConvertersEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConvertersEditor.cs @@ -355,6 +355,15 @@ void HideConverterLayout(VisualElement element) } void ToggleAllNone(ClickEvent evt, int index, bool value, VisualElement item) { + void ToggleSelection(Label labelSelected, Label labelNotSelected) + { + labelSelected.AddToClassList("selected"); + labelSelected.RemoveFromClassList("not_selected"); + + labelNotSelected.AddToClassList("not_selected"); + labelNotSelected.RemoveFromClassList("selected"); + } + var conv = m_ConverterStates[index]; if (conv.items.Count > 0) { @@ -363,22 +372,18 @@ void ToggleAllNone(ClickEvent evt, int index, bool value, VisualElement item) convItem.isActive = value; } UpdateSelectedConverterItems(index, item); + + var allLabel = item.Q