using System; using XCEngine; using XCEngine.Rendering; using XCEngine.Rendering.Universal; namespace Gameplay { internal static class BuiltinShaderPaths { public const string ColorScalePostProcess = "builtin://shaders/color-scale-post-process"; } internal static class ProbeFinalColorSettingsFactory { public static FinalColorSettings Create() { FinalColorSettings settings = FinalColorSettings.CreateDefault(); settings.outputTransferMode = FinalColorOutputTransferMode.LinearToSRGB; settings.exposureMode = FinalColorExposureMode.Fixed; settings.exposureValue = 1.75f; settings.toneMappingMode = FinalColorToneMappingMode.ACES; settings.finalColorScale = new Vector4(0.90f, 1.10f, 1.20f, 1.0f); return settings; } } internal enum SceneInjectionKind { BeforeOpaque, AfterOpaque, BeforeSkybox, AfterSkybox, BeforeTransparent, AfterTransparent } internal enum ScenePhaseKind { Opaque, Skybox, Transparent } internal enum FullscreenPassKind { ColorScale, ShaderVector } internal sealed class SceneInjectionPass : ScriptableRenderPass { private readonly SceneInjectionKind m_injectionKind; public SceneInjectionPass( RenderPassEvent passEvent, SceneInjectionKind injectionKind) { renderPassEvent = passEvent; m_injectionKind = injectionKind; } protected override bool RecordRenderGraph( ScriptableRenderContext context, RenderingData renderingData) { return context != null && renderingData != null && renderingData.isMainSceneStage && RecordInjection(context); } private bool RecordInjection( ScriptableRenderContext context) { switch (m_injectionKind) { case SceneInjectionKind.BeforeOpaque: return RecordBeforeOpaqueInjection(context); case SceneInjectionKind.AfterOpaque: return RecordAfterOpaqueInjection(context); case SceneInjectionKind.BeforeSkybox: return RecordBeforeSkyboxInjection(context); case SceneInjectionKind.AfterSkybox: return RecordAfterSkyboxInjection(context); case SceneInjectionKind.BeforeTransparent: return RecordBeforeTransparentInjection(context); case SceneInjectionKind.AfterTransparent: return RecordAfterTransparentInjection(context); default: return false; } } } internal sealed class ScenePhasePass : ScriptableRenderPass { private readonly ScenePhaseKind m_phaseKind; private readonly Action m_onRecorded; public ScenePhasePass( RenderPassEvent passEvent, ScenePhaseKind phaseKind, Action onRecorded = null) { renderPassEvent = passEvent; m_phaseKind = phaseKind; m_onRecorded = onRecorded; } protected override bool RecordRenderGraph( ScriptableRenderContext context, RenderingData renderingData) { bool recorded = context != null && renderingData != null && renderingData.isMainSceneStage && RecordPhase(context); if (recorded && m_onRecorded != null) { m_onRecorded(); } return recorded; } private bool RecordPhase( ScriptableRenderContext context) { switch (m_phaseKind) { case ScenePhaseKind.Opaque: return RecordOpaqueScenePhase(context); case ScenePhaseKind.Skybox: return RecordSkyboxScenePhase(context); case ScenePhaseKind.Transparent: return RecordTransparentScenePhase(context); default: return false; } } } internal sealed class FullscreenPass : ScriptableRenderPass { private readonly FullscreenPassKind m_passKind; private readonly Vector4 m_vectorPayload; private readonly string m_shaderPath; private readonly string m_passName; public FullscreenPass( RenderPassEvent passEvent, Vector4 colorScale) { renderPassEvent = passEvent; m_passKind = FullscreenPassKind.ColorScale; m_vectorPayload = colorScale; m_shaderPath = string.Empty; m_passName = string.Empty; } public FullscreenPass( RenderPassEvent passEvent, string shaderPath, Vector4 vectorPayload, string passName = null) { renderPassEvent = passEvent; m_passKind = FullscreenPassKind.ShaderVector; m_vectorPayload = vectorPayload; m_shaderPath = shaderPath ?? string.Empty; m_passName = passName ?? string.Empty; } protected override bool RecordRenderGraph( ScriptableRenderContext context, RenderingData renderingData) { return context != null && renderingData != null && RecordFullscreen(context); } private bool RecordFullscreen( ScriptableRenderContext context) { switch (m_passKind) { case FullscreenPassKind.ColorScale: return RecordColorScaleFullscreenPass( context, m_vectorPayload); case FullscreenPassKind.ShaderVector: return RecordShaderVectorFullscreenPass( context, m_shaderPath, m_vectorPayload, m_passName); default: return false; } } } internal sealed class DefaultSceneFeature : ScriptableRendererFeature { private readonly SceneInjectionPass m_beforeOpaquePass; private readonly ScenePhasePass m_opaquePass; private readonly SceneInjectionPass m_afterOpaquePass; private readonly SceneInjectionPass m_beforeSkyboxPass; private readonly ScenePhasePass m_skyboxPass; private readonly SceneInjectionPass m_afterSkyboxPass; private readonly SceneInjectionPass m_beforeTransparentPass; private readonly ScenePhasePass m_transparentPass; private readonly SceneInjectionPass m_afterTransparentPass; public DefaultSceneFeature( Action onOpaqueRecorded = null) { m_beforeOpaquePass = new SceneInjectionPass( RenderPassEvent.BeforeRenderingOpaques, SceneInjectionKind.BeforeOpaque); m_opaquePass = new ScenePhasePass( RenderPassEvent.RenderOpaques, ScenePhaseKind.Opaque, onOpaqueRecorded); m_afterOpaquePass = new SceneInjectionPass( RenderPassEvent.AfterRenderingOpaques, SceneInjectionKind.AfterOpaque); m_beforeSkyboxPass = new SceneInjectionPass( RenderPassEvent.BeforeRenderingSkybox, SceneInjectionKind.BeforeSkybox); m_skyboxPass = new ScenePhasePass( RenderPassEvent.RenderSkybox, ScenePhaseKind.Skybox); m_afterSkyboxPass = new SceneInjectionPass( RenderPassEvent.AfterRenderingSkybox, SceneInjectionKind.AfterSkybox); m_beforeTransparentPass = new SceneInjectionPass( RenderPassEvent.BeforeRenderingTransparents, SceneInjectionKind.BeforeTransparent); m_transparentPass = new ScenePhasePass( RenderPassEvent.RenderTransparents, ScenePhaseKind.Transparent); m_afterTransparentPass = new SceneInjectionPass( RenderPassEvent.AfterRenderingTransparents, SceneInjectionKind.AfterTransparent); } public override void AddRenderPasses( ScriptableRenderer renderer, RenderingData renderingData) { if (renderer == null || renderingData == null || !renderingData.isMainSceneStage) { return; } renderer.EnqueuePass(m_beforeOpaquePass); renderer.EnqueuePass(m_opaquePass); renderer.EnqueuePass(m_afterOpaquePass); renderer.EnqueuePass(m_beforeSkyboxPass); renderer.EnqueuePass(m_skyboxPass); renderer.EnqueuePass(m_afterSkyboxPass); renderer.EnqueuePass(m_beforeTransparentPass); renderer.EnqueuePass(m_transparentPass); renderer.EnqueuePass(m_afterTransparentPass); } } internal sealed class FullscreenFeature : ScriptableRendererFeature { private readonly ScriptableRenderPass[] m_passes; public FullscreenFeature( params ScriptableRenderPass[] passes) { m_passes = passes ?? Array.Empty(); } public override void AddRenderPasses( ScriptableRenderer renderer, RenderingData renderingData) { if (renderer == null || renderingData == null) { return; } for (int i = 0; i < m_passes.Length; ++i) { ScriptableRenderPass renderPass = m_passes[i]; if (renderPass == null || !renderPass.SupportsStage(renderingData.stage)) { continue; } renderer.EnqueuePass(renderPass); } } } internal class ProbeSceneRenderer : ScriptableRenderer { public ProbeSceneRenderer( Action onOpaqueRecorded = null) { AddFeature(new DefaultSceneFeature(onOpaqueRecorded)); } } internal class ProbePostProcessRenderer : ScriptableRenderer { public ProbePostProcessRenderer( Vector4 firstVectorPayload, Vector4 secondVectorPayload) { AddFeature( new FullscreenFeature( new FullscreenPass( RenderPassEvent.BeforeRenderingPostProcessing, BuiltinShaderPaths.ColorScalePostProcess, firstVectorPayload, "ColorScale"), new FullscreenPass( RenderPassEvent.AfterRenderingPostProcessing, BuiltinShaderPaths.ColorScalePostProcess, secondVectorPayload, "ColorScale"))); } } internal class ProbeUniversalRenderer : ScriptableRenderer { public ProbeUniversalRenderer( Vector4 postProcessScale, Action onOpaqueRecorded) { AddFeature(new DefaultSceneFeature(onOpaqueRecorded)); AddFeature( new FullscreenFeature( new FullscreenPass( RenderPassEvent.BeforeRenderingPostProcessing, postProcessScale))); } } internal class ProbePlannedFullscreenRenderer : ScriptableRenderer { public ProbePlannedFullscreenRenderer() { AddFeature( new FullscreenFeature( new FullscreenPass( RenderPassEvent.BeforeRenderingPostProcessing, new Vector4(1.05f, 1.0f, 0.95f, 1.0f)), new FullscreenPass( RenderPassEvent.BeforeRenderingFinalOutput, new Vector4(1.05f, 1.0f, 0.95f, 1.0f)))); } } internal sealed class CameraDataObservationPass : ScriptableRenderPass { public static Vector4 ObservedViewRow0; public static Vector4 ObservedViewRow1; public static Vector4 ObservedViewRow2; public static Vector4 ObservedViewRow3; public static Vector4 ObservedProjectionRow0; public static Vector4 ObservedProjectionRow1; public static Vector4 ObservedProjectionRow2; public static Vector4 ObservedProjectionRow3; public static Vector4 ObservedViewProjectionRow0; public static Vector4 ObservedViewProjectionRow1; public static Vector4 ObservedViewProjectionRow2; public static Vector4 ObservedViewProjectionRow3; public static Vector3 ObservedWorldPosition; public static Vector4 ObservedClearColor; public static int ObservedClearFlags; public static bool ObservedPerspectiveProjection; public static float ObservedVerticalFovRadians; public static float ObservedOrthographicSize; public static float ObservedAspectRatio; public static float ObservedNearClipPlane; public static float ObservedFarClipPlane; public static int ObservedViewportWidth; public static int ObservedViewportHeight; public static bool ObservedMainDirectionalLightEnabled; public static bool ObservedMainDirectionalLightCastsShadows; public static Vector3 ObservedMainDirectionalLightDirection; public static Vector4 ObservedMainDirectionalLightColor; public static float ObservedMainDirectionalLightIntensity; public static bool ObservedHasMainDirectionalShadow; public static int ObservedAdditionalLightCount; public static bool ObservedShadowEnabled; public static Vector4 ObservedShadowViewProjectionRow0; public static Vector4 ObservedShadowViewProjectionRow1; public static Vector4 ObservedShadowViewProjectionRow2; public static Vector4 ObservedShadowViewProjectionRow3; public static float ObservedShadowOrthographicHalfExtent; public static float ObservedShadowNearClipPlane; public static float ObservedShadowFarClipPlane; public static int ObservedShadowMapWidth; public static int ObservedShadowMapHeight; public static float ObservedShadowWorldTexelSize; public static float ObservedShadowReceiverDepthBias; public static float ObservedShadowNormalBiasScale; public static float ObservedShadowStrength; public static float ObservedShadowDepthBiasFactor; public static int ObservedShadowDepthBiasUnits; public static int ObservedEnvironmentMode; public static Vector4 ObservedSkyboxTopColor; public static Vector4 ObservedSkyboxHorizonColor; public static Vector4 ObservedSkyboxBottomColor; public static int ObservedFinalColorOutputTransferMode; public static int ObservedFinalColorExposureMode; public static float ObservedFinalColorExposureValue; public static int ObservedFinalColorToneMappingMode; public static Vector4 ObservedFinalColorScale; public static bool ObservedFinalColorHasPipelineDefaults; public static bool ObservedFinalColorHasCameraOverrides; public static bool ObservedFinalColorRequiresProcessing; public static int RecordCallCount; public CameraDataObservationPass() { renderPassEvent = RenderPassEvent.RenderOpaques; } public static void Reset() { ObservedViewRow0 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewRow1 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewRow2 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewRow3 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedProjectionRow0 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedProjectionRow1 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedProjectionRow2 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedProjectionRow3 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewProjectionRow0 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewProjectionRow1 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewProjectionRow2 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedViewProjectionRow3 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedWorldPosition = new Vector3(0.0f, 0.0f, 0.0f); ObservedClearColor = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedClearFlags = 0; ObservedPerspectiveProjection = true; ObservedVerticalFovRadians = 0.0f; ObservedOrthographicSize = 0.0f; ObservedAspectRatio = 0.0f; ObservedNearClipPlane = 0.0f; ObservedFarClipPlane = 0.0f; ObservedViewportWidth = 0; ObservedViewportHeight = 0; ObservedMainDirectionalLightEnabled = false; ObservedMainDirectionalLightCastsShadows = false; ObservedMainDirectionalLightDirection = new Vector3(0.0f, 0.0f, 0.0f); ObservedMainDirectionalLightColor = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedMainDirectionalLightIntensity = 0.0f; ObservedHasMainDirectionalShadow = false; ObservedAdditionalLightCount = 0; ObservedShadowEnabled = false; ObservedShadowViewProjectionRow0 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedShadowViewProjectionRow1 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedShadowViewProjectionRow2 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedShadowViewProjectionRow3 = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedShadowOrthographicHalfExtent = 0.0f; ObservedShadowNearClipPlane = 0.0f; ObservedShadowFarClipPlane = 0.0f; ObservedShadowMapWidth = 0; ObservedShadowMapHeight = 0; ObservedShadowWorldTexelSize = 0.0f; ObservedShadowReceiverDepthBias = 0.0f; ObservedShadowNormalBiasScale = 0.0f; ObservedShadowStrength = 0.0f; ObservedShadowDepthBiasFactor = 0.0f; ObservedShadowDepthBiasUnits = 0; ObservedEnvironmentMode = 0; ObservedSkyboxTopColor = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedSkyboxHorizonColor = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedSkyboxBottomColor = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedFinalColorOutputTransferMode = 0; ObservedFinalColorExposureMode = 0; ObservedFinalColorExposureValue = 0.0f; ObservedFinalColorToneMappingMode = 0; ObservedFinalColorScale = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); ObservedFinalColorHasPipelineDefaults = false; ObservedFinalColorHasCameraOverrides = false; ObservedFinalColorRequiresProcessing = false; RecordCallCount = 0; } protected override bool RecordRenderGraph( ScriptableRenderContext context, RenderingData renderingData) { if (context == null || renderingData == null || !renderingData.isMainSceneStage) { return false; } CameraData cameraData = renderingData.cameraData; LightingData lightingData = renderingData.lightingData; ShadowData shadowData = renderingData.shadowData; EnvironmentData environmentData = renderingData.environmentData; FinalColorData finalColorData = renderingData.finalColorData; if (cameraData == null) { return false; } ObservedViewRow0 = cameraData.view.GetRow(0); ObservedViewRow1 = cameraData.view.GetRow(1); ObservedViewRow2 = cameraData.view.GetRow(2); ObservedViewRow3 = cameraData.view.GetRow(3); ObservedProjectionRow0 = cameraData.projection.GetRow(0); ObservedProjectionRow1 = cameraData.projection.GetRow(1); ObservedProjectionRow2 = cameraData.projection.GetRow(2); ObservedProjectionRow3 = cameraData.projection.GetRow(3); ObservedViewProjectionRow0 = cameraData.viewProjection.GetRow(0); ObservedViewProjectionRow1 = cameraData.viewProjection.GetRow(1); ObservedViewProjectionRow2 = cameraData.viewProjection.GetRow(2); ObservedViewProjectionRow3 = cameraData.viewProjection.GetRow(3); ObservedWorldPosition = cameraData.worldPosition; ObservedClearColor = new Vector4( cameraData.clearColor.r, cameraData.clearColor.g, cameraData.clearColor.b, cameraData.clearColor.a); ObservedClearFlags = (int)cameraData.clearFlags; ObservedPerspectiveProjection = cameraData.perspectiveProjection; ObservedVerticalFovRadians = cameraData.verticalFovRadians; ObservedOrthographicSize = cameraData.orthographicSize; ObservedAspectRatio = cameraData.aspectRatio; ObservedNearClipPlane = cameraData.nearClipPlane; ObservedFarClipPlane = cameraData.farClipPlane; ObservedViewportWidth = cameraData.viewportWidth; ObservedViewportHeight = cameraData.viewportHeight; if (lightingData != null && lightingData.mainDirectionalLight != null) { ObservedMainDirectionalLightEnabled = lightingData.mainDirectionalLight.enabled; ObservedMainDirectionalLightCastsShadows = lightingData.mainDirectionalLight.castsShadows; ObservedMainDirectionalLightDirection = lightingData.mainDirectionalLight.direction; ObservedMainDirectionalLightColor = new Vector4( lightingData.mainDirectionalLight.color.r, lightingData.mainDirectionalLight.color.g, lightingData.mainDirectionalLight.color.b, lightingData.mainDirectionalLight.color.a); ObservedMainDirectionalLightIntensity = lightingData.mainDirectionalLight.intensity; ObservedHasMainDirectionalShadow = lightingData.hasMainDirectionalShadow; ObservedAdditionalLightCount = lightingData.additionalLightCount; } if (shadowData != null && shadowData.mainDirectionalShadow != null) { DirectionalShadowData mainDirectionalShadow = shadowData.mainDirectionalShadow; ObservedShadowEnabled = mainDirectionalShadow.enabled; ObservedShadowViewProjectionRow0 = mainDirectionalShadow.viewProjection.GetRow(0); ObservedShadowViewProjectionRow1 = mainDirectionalShadow.viewProjection.GetRow(1); ObservedShadowViewProjectionRow2 = mainDirectionalShadow.viewProjection.GetRow(2); ObservedShadowViewProjectionRow3 = mainDirectionalShadow.viewProjection.GetRow(3); ObservedShadowOrthographicHalfExtent = mainDirectionalShadow.orthographicHalfExtent; ObservedShadowNearClipPlane = mainDirectionalShadow.nearClipPlane; ObservedShadowFarClipPlane = mainDirectionalShadow.farClipPlane; ObservedShadowMapWidth = mainDirectionalShadow.mapWidth; ObservedShadowMapHeight = mainDirectionalShadow.mapHeight; ObservedShadowWorldTexelSize = mainDirectionalShadow.worldTexelSize; ObservedShadowReceiverDepthBias = mainDirectionalShadow.receiverDepthBias; ObservedShadowNormalBiasScale = mainDirectionalShadow.normalBiasScale; ObservedShadowStrength = mainDirectionalShadow.shadowStrength; ObservedShadowDepthBiasFactor = mainDirectionalShadow.depthBiasFactor; ObservedShadowDepthBiasUnits = mainDirectionalShadow.depthBiasUnits; } if (environmentData != null) { ObservedEnvironmentMode = (int)environmentData.mode; ObservedSkyboxTopColor = new Vector4( environmentData.skyboxTopColor.r, environmentData.skyboxTopColor.g, environmentData.skyboxTopColor.b, environmentData.skyboxTopColor.a); ObservedSkyboxHorizonColor = new Vector4( environmentData.skyboxHorizonColor.r, environmentData.skyboxHorizonColor.g, environmentData.skyboxHorizonColor.b, environmentData.skyboxHorizonColor.a); ObservedSkyboxBottomColor = new Vector4( environmentData.skyboxBottomColor.r, environmentData.skyboxBottomColor.g, environmentData.skyboxBottomColor.b, environmentData.skyboxBottomColor.a); } if (finalColorData != null) { ObservedFinalColorOutputTransferMode = (int)finalColorData.settings.outputTransferMode; ObservedFinalColorExposureMode = (int)finalColorData.settings.exposureMode; ObservedFinalColorExposureValue = finalColorData.settings.exposureValue; ObservedFinalColorToneMappingMode = (int)finalColorData.settings.toneMappingMode; ObservedFinalColorScale = finalColorData.settings.finalColorScale; ObservedFinalColorHasPipelineDefaults = finalColorData.hasPipelineDefaults; ObservedFinalColorHasCameraOverrides = finalColorData.hasCameraOverrides; ObservedFinalColorRequiresProcessing = finalColorData.requiresProcessing; } RecordCallCount++; return RecordScene(context); } } internal sealed class CameraDataObservationFeature : ScriptableRendererFeature { private readonly CameraDataObservationPass m_pass = new CameraDataObservationPass(); public override void AddRenderPasses( ScriptableRenderer renderer, RenderingData renderingData) { if (renderer == null || renderingData == null || !renderingData.isMainSceneStage) { return; } renderer.EnqueuePass(m_pass); } } internal class CameraDataObservationRenderer : ScriptableRenderer { public CameraDataObservationRenderer() { AddFeature(new CameraDataObservationFeature()); } } internal sealed class StageColorObservationPass : ScriptableRenderPass { public static int ObservedMainSceneSource; public static bool ObservedMainSceneUsesGraphManagedOutputColor; public static int ObservedPostProcessSource; public static bool ObservedPostProcessUsesGraphManagedOutputColor; public static int ObservedFinalOutputSource; public static bool ObservedFinalOutputUsesGraphManagedOutputColor; public static int MainSceneRecordCallCount; public static int PostProcessRecordCallCount; public static int FinalOutputRecordCallCount; public StageColorObservationPass( RenderPassEvent passEvent) { renderPassEvent = passEvent; } public static void Reset() { ObservedMainSceneSource = 0; ObservedMainSceneUsesGraphManagedOutputColor = false; ObservedPostProcessSource = 0; ObservedPostProcessUsesGraphManagedOutputColor = false; ObservedFinalOutputSource = 0; ObservedFinalOutputUsesGraphManagedOutputColor = false; MainSceneRecordCallCount = 0; PostProcessRecordCallCount = 0; FinalOutputRecordCallCount = 0; } protected override bool RecordRenderGraph( ScriptableRenderContext context, RenderingData renderingData) { if (context == null || renderingData == null) { return false; } StageColorData stageColorData = renderingData.stageColorData; if (stageColorData == null) { return false; } if (renderingData.isMainSceneStage) { ObservedMainSceneSource = (int)stageColorData.source; ObservedMainSceneUsesGraphManagedOutputColor = stageColorData.usesGraphManagedOutputColor; MainSceneRecordCallCount++; return true; } if (renderingData.isPostProcessStage) { ObservedPostProcessSource = (int)stageColorData.source; ObservedPostProcessUsesGraphManagedOutputColor = stageColorData.usesGraphManagedOutputColor; PostProcessRecordCallCount++; return true; } if (renderingData.isFinalOutputStage) { ObservedFinalOutputSource = (int)stageColorData.source; ObservedFinalOutputUsesGraphManagedOutputColor = stageColorData.usesGraphManagedOutputColor; FinalOutputRecordCallCount++; return true; } return false; } } internal class StageColorObservationRenderer : ScriptableRenderer { public StageColorObservationRenderer() { AddFeature( new FullscreenFeature( new StageColorObservationPass( RenderPassEvent.RenderOpaques), new StageColorObservationPass( RenderPassEvent.BeforeRenderingPostProcessing), new StageColorObservationPass( RenderPassEvent.BeforeRenderingFinalOutput))); } } internal abstract class ProbeRendererData : UniversalRendererData { protected sealed override ScriptableRenderer CreateRenderer() { return CreateProbeRenderer(); } protected abstract ScriptableRenderer CreateProbeRenderer(); } internal sealed class ManagedRenderPipelineProbeRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedRenderPipelineProbe(); } } internal sealed class ManagedPostProcessRenderPipelineProbeRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedPostProcessRenderPipelineProbe(); } } internal sealed class ManagedUniversalRenderPipelineProbeRendererData : ProbeRendererData { private readonly Vector4 m_postProcessScale; public ManagedUniversalRenderPipelineProbeRendererData( Vector4 postProcessScale) { m_postProcessScale = postProcessScale; } protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedUniversalRenderPipelineProbe( m_postProcessScale); } } internal sealed class ManagedUnknownBackendProbeRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedRenderPipelineProbe(); } protected override string GetPipelineRendererAssetKey() { return "MissingBackend"; } } internal sealed class ManagedRendererReuseProbeRendererData : ProbeRendererData { public static int CreateRendererCallCount; protected override ScriptableRenderer CreateProbeRenderer() { CreateRendererCallCount++; return new ManagedRenderPipelineProbe(); } } internal sealed class ManagedPlannedFullscreenRenderPipelineProbeRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedPlannedFullscreenRenderPipelineProbe(); } } internal sealed class ManagedFeaturePlannedPostProcessRendererFeature : ScriptableRendererFeature { public override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { if (context == null || context.IsStageRequested(CameraFrameStage.PostProcess)) { return; } context.RequestFullscreenStage( CameraFrameStage.PostProcess, CameraFrameColorSource.MainSceneColor); } } internal sealed class ManagedFeaturePlannedPostProcessRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ProbeSceneRenderer(); } protected override ScriptableRendererFeature[] CreateRendererFeatures() { return new ScriptableRendererFeature[] { new ManagedFeaturePlannedPostProcessRendererFeature() }; } } internal sealed class ManagedRenderContextCameraDataProbeRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedRenderContextCameraDataProbe(); } } internal sealed class ManagedRenderContextStageColorDataProbeRendererData : ProbeRendererData { protected override ScriptableRenderer CreateProbeRenderer() { return new ManagedRenderContextStageColorDataProbe(); } } internal static class ManagedLifecycleProbeState { public static int CreatePipelineCallCount; public static int CreateRendererCallCount; public static int CreateFeatureCallCount; public static int ReleaseRendererDataRuntimeResourcesCallCount; public static int DisposePipelineCallCount; public static int ReleaseAssetRuntimeResourcesCallCount; public static int DisposeRendererCallCount; public static int DisposeFeatureCallCount; public static void Reset() { CreatePipelineCallCount = 0; CreateRendererCallCount = 0; CreateFeatureCallCount = 0; ReleaseRendererDataRuntimeResourcesCallCount = 0; DisposePipelineCallCount = 0; ReleaseAssetRuntimeResourcesCallCount = 0; DisposeRendererCallCount = 0; DisposeFeatureCallCount = 0; } } internal sealed class ManagedLifecycleProbeRendererFeature : ScriptableRendererFeature { protected override void ReleaseRuntimeResources() { ManagedLifecycleProbeState.DisposeFeatureCallCount++; } } internal sealed class ManagedLifecycleProbeRenderer : ScriptableRenderer { public ManagedLifecycleProbeRenderer( ScriptableRendererFeature[] rendererFeatures) { ScriptableRendererFeature[] resolvedRendererFeatures = rendererFeatures ?? Array.Empty(); for (int i = 0; i < resolvedRendererFeatures.Length; ++i) { AddFeature(resolvedRendererFeatures[i]); } } protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { return stage == CameraFrameStage.MainScene; } protected override bool RecordStageRenderGraph( ScriptableRenderContext context) { return context != null; } protected override void ReleaseRuntimeResources() { ManagedLifecycleProbeState.DisposeRendererCallCount++; } } internal sealed class ManagedLifecycleProbeRendererData : ScriptableRendererData { protected override ScriptableRenderer CreateRenderer() { ManagedLifecycleProbeState.CreateRendererCallCount++; return new ManagedLifecycleProbeRenderer( CreateRendererFeatures()); } protected override ScriptableRendererFeature[] CreateRendererFeatures() { ManagedLifecycleProbeState.CreateFeatureCallCount++; return new ScriptableRendererFeature[] { new ManagedLifecycleProbeRendererFeature() }; } protected override string GetPipelineRendererAssetKey() { return "BuiltinForward"; } protected override void ReleaseRuntimeResources() { ManagedLifecycleProbeState.ReleaseRendererDataRuntimeResourcesCallCount++; } } internal sealed class ManagedPipelineDisposeProbe : ScriptableRenderPipeline { protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { return stage == CameraFrameStage.MainScene; } protected override bool RecordStageRenderGraph( ScriptableRenderContext context) { return context != null; } protected override void Dispose( bool disposing) { if (disposing) { ManagedLifecycleProbeState.DisposePipelineCallCount++; } } } public sealed class LegacyRenderPipelineApiProbeAsset : RenderPipelineAsset { } public sealed class RenderPipelineApiProbeAsset : ScriptableRenderPipelineAsset { } public sealed class ManagedPipelineDisposeProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { ManagedLifecycleProbeState.CreatePipelineCallCount++; return new ManagedPipelineDisposeProbe(); } } public sealed class ManagedUniversalLifecycleProbeAsset : UniversalRenderPipelineAsset { public ManagedUniversalLifecycleProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedLifecycleProbeRendererData() }; } protected override ScriptableRenderPipeline CreatePipeline() { ManagedLifecycleProbeState.CreatePipelineCallCount++; return base.CreatePipeline(); } protected override void ReleaseRuntimeResources() { ManagedLifecycleProbeState.ReleaseAssetRuntimeResourcesCallCount++; ReleaseRendererDataRuntimeResources(); } } public sealed class ManagedRenderPipelineProbeAsset : RendererBackedRenderPipelineAsset { public static int CreatePipelineCallCount; public ManagedRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedRenderPipelineProbeRendererData() }; } protected override ScriptableRenderPipeline CreatePipeline() { CreatePipelineCallCount++; return base.CreatePipeline(); } } public sealed class ManagedPostProcessRenderPipelineProbeAsset : RendererBackedRenderPipelineAsset { public ManagedPostProcessRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedPostProcessRenderPipelineProbeRendererData() }; } } public sealed class ManagedUnknownBackendRenderPipelineProbeAsset : RendererBackedRenderPipelineAsset { public ManagedUnknownBackendRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedUnknownBackendProbeRendererData() }; } } public sealed class ManagedUniversalRenderPipelineProbeAsset : UniversalRenderPipelineAsset { public static int CreatePipelineCallCount; public Vector4 postProcessScale = new Vector4(1.03f, 0.98f, 0.94f, 1.0f); public ManagedUniversalRenderPipelineProbeAsset() { rendererDataList = CreateRendererDataList(); } protected override ScriptableRenderPipeline CreatePipeline() { CreatePipelineCallCount++; rendererDataList = CreateRendererDataList(); return base.CreatePipeline(); } private ScriptableRendererData[] CreateRendererDataList() { return new ScriptableRendererData[] { new ManagedUniversalRenderPipelineProbeRendererData( postProcessScale) }; } } public sealed class ManagedDefaultRendererSelectionProbeAsset : RendererBackedRenderPipelineAsset { public ManagedDefaultRendererSelectionProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedUnknownBackendProbeRendererData(), new ManagedRenderPipelineProbeRendererData() }; defaultRendererIndex = 1; } } public sealed class ManagedInvalidDefaultRendererSelectionProbeAsset : RendererBackedRenderPipelineAsset { public ManagedInvalidDefaultRendererSelectionProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedRenderPipelineProbeRendererData(), new ManagedUnknownBackendProbeRendererData() }; defaultRendererIndex = 5; } } public sealed class ManagedRendererReuseProbeAsset : RendererBackedRenderPipelineAsset { public ManagedRendererReuseProbeAsset() { ManagedRendererReuseProbeRendererData.CreateRendererCallCount = 0; rendererDataList = new ScriptableRendererData[] { new ManagedRendererReuseProbeRendererData() }; } } public sealed class ManagedPlannedFullscreenRenderPipelineProbeAsset : UniversalRenderPipelineAsset { public ManagedPlannedFullscreenRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedPlannedFullscreenRenderPipelineProbeRendererData() }; } } public sealed class ManagedFeaturePlannedPostProcessProbeAsset : UniversalRenderPipelineAsset { public ManagedFeaturePlannedPostProcessProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedFeaturePlannedPostProcessRendererData() }; } } public sealed class ManagedClearedPostProcessRenderPipelineProbeAsset : UniversalRenderPipelineAsset { public ManagedClearedPostProcessRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedPlannedFullscreenRenderPipelineProbeRendererData() }; } protected override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { if (context == null) { return; } context.ClearFullscreenStage( CameraFrameStage.PostProcess); context.RequestFullscreenStage( CameraFrameStage.FinalOutput, CameraFrameColorSource.MainSceneColor); } protected override FinalColorSettings GetDefaultFinalColorSettings() { return ProbeFinalColorSettingsFactory.Create(); } } internal sealed class ManagedCameraRequestConfiguredRendererData : UniversalRendererData { protected override ScriptableRenderer CreateRenderer() { return new ProbeSceneRenderer(); } protected override void ConfigureCameraRenderRequest( CameraRenderRequestContext context) { if (HasDirectionalShadow(context)) { ClearDirectionalShadow(context); } } } public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset : UniversalRenderPipelineAsset { public ManagedCameraRequestConfiguredRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedCameraRequestConfiguredRendererData() }; } } public sealed class ManagedRenderContextCameraDataProbeAsset : UniversalRenderPipelineAsset { public ManagedRenderContextCameraDataProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedRenderContextCameraDataProbeRendererData() }; } } public sealed class ManagedFinalColorRenderPipelineProbeAsset : UniversalRenderPipelineAsset { public ManagedFinalColorRenderPipelineProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedRenderPipelineProbeRendererData() }; } protected override FinalColorSettings GetDefaultFinalColorSettings() { return ProbeFinalColorSettingsFactory.Create(); } } public sealed class ManagedRenderContextFinalColorDataProbeAsset : UniversalRenderPipelineAsset { public ManagedRenderContextFinalColorDataProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedRenderContextCameraDataProbeRendererData() }; } protected override FinalColorSettings GetDefaultFinalColorSettings() { return ProbeFinalColorSettingsFactory.Create(); } } public sealed class ManagedRenderContextStageColorDataProbeAsset : UniversalRenderPipelineAsset { public ManagedRenderContextStageColorDataProbeAsset() { rendererDataList = new ScriptableRendererData[] { new ManagedRenderContextStageColorDataProbeRendererData() }; } } internal sealed class ManagedRenderPipelineProbe : ProbeSceneRenderer { public static int SupportsStageCallCount; public static int RecordStageCallCount; protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { SupportsStageCallCount++; return base.SupportsStageRenderGraph(stage); } protected override bool RecordStageRenderGraph( ScriptableRenderContext context) { RecordStageCallCount++; return base.RecordStageRenderGraph(context); } } internal sealed class ManagedPostProcessRenderPipelineProbe : ProbePostProcessRenderer { public ManagedPostProcessRenderPipelineProbe() : base( new Vector4(1.10f, 0.95f, 0.90f, 1.0f), new Vector4(0.95f, 1.05f, 1.10f, 1.0f)) { } } internal sealed class ManagedUniversalRenderPipelineProbe : ProbeUniversalRenderer { public static int SupportsMainSceneCallCount; public static int SupportsPostProcessCallCount; public static int RecordMainSceneCallCount; public static int RecordSceneCallCount; public static int RecordPostProcessCallCount; public static Vector4 LastPostProcessScale; private readonly Vector4 m_postProcessScale; public ManagedUniversalRenderPipelineProbe( Vector4 postProcessScale) : base( postProcessScale, OnOpaqueRecorded) { m_postProcessScale = postProcessScale; } protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { if (stage == CameraFrameStage.MainScene) { SupportsMainSceneCallCount++; } else if (stage == CameraFrameStage.PostProcess) { SupportsPostProcessCallCount++; } return base.SupportsStageRenderGraph(stage); } protected override bool RecordStageRenderGraph( ScriptableRenderContext context) { if (context == null) { return false; } if (context.stage == CameraFrameStage.MainScene) { RecordMainSceneCallCount++; } else if (context.stage == CameraFrameStage.PostProcess) { RecordPostProcessCallCount++; LastPostProcessScale = m_postProcessScale; } return base.RecordStageRenderGraph(context); } private static void OnOpaqueRecorded() { RecordSceneCallCount++; } } internal sealed class ManagedPlannedFullscreenRenderPipelineProbe : ProbePlannedFullscreenRenderer { } internal sealed class ManagedRenderContextCameraDataProbe : CameraDataObservationRenderer { } internal sealed class ManagedRenderContextStageColorDataProbe : StageColorObservationRenderer { } public sealed class ManagedRendererReuseObservationProbe : MonoBehaviour { public int ObservedCreateRendererCallCount; public void Start() { ObservedCreateRendererCallCount = ManagedRendererReuseProbeRendererData .CreateRendererCallCount; } } public sealed class RenderPipelineApiProbe : MonoBehaviour { public bool InitialAssetWasNull; public bool SelectionRoundTripSucceeded; public bool SelectionReferencePreserved; public string SelectedPipelineAssetTypeName = string.Empty; public void Start() { InitialAssetWasNull = GraphicsSettings.renderPipelineAsset == null; RenderPipelineApiProbeAsset selectedAssetInstance = new RenderPipelineApiProbeAsset(); GraphicsSettings.renderPipelineAsset = selectedAssetInstance; ScriptableRenderPipelineAsset selectedAsset = GraphicsSettings.renderPipelineAsset; SelectionRoundTripSucceeded = selectedAsset is RenderPipelineApiProbeAsset; SelectionReferencePreserved = object.ReferenceEquals( selectedAsset, selectedAssetInstance); SelectedPipelineAssetTypeName = selectedAsset != null ? selectedAsset.GetType().FullName ?? string.Empty : string.Empty; } } public sealed class ManagedRenderPipelineRuntimeSelectionProbe : MonoBehaviour { public void Start() { ManagedRenderPipelineProbeAsset.CreatePipelineCallCount = 0; ManagedRenderPipelineProbe.SupportsStageCallCount = 0; ManagedRenderPipelineProbe.RecordStageCallCount = 0; GraphicsSettings.renderPipelineAsset = new ManagedRenderPipelineProbeAsset(); } } public sealed class ManagedRenderPipelineCreateCountObservationProbe : MonoBehaviour { public int ObservedCreatePipelineCallCount; public void Start() { ManagedRenderPipelineProbeAsset.CreatePipelineCallCount = 0; } public void Update() { ObservedCreatePipelineCallCount = ManagedRenderPipelineProbeAsset.CreatePipelineCallCount; } } public sealed class ManagedLifecycleObservationProbe : MonoBehaviour { public int ObservedCreatePipelineCallCount; public int ObservedCreateRendererCallCount; public int ObservedCreateFeatureCallCount; public int ObservedReleaseRendererDataRuntimeResourcesCallCount; public int ObservedDisposePipelineCallCount; public int ObservedReleaseAssetRuntimeResourcesCallCount; public int ObservedDisposeRendererCallCount; public int ObservedDisposeFeatureCallCount; public void Start() { ManagedLifecycleProbeState.Reset(); } public void Update() { ObservedCreatePipelineCallCount = ManagedLifecycleProbeState.CreatePipelineCallCount; ObservedCreateRendererCallCount = ManagedLifecycleProbeState.CreateRendererCallCount; ObservedCreateFeatureCallCount = ManagedLifecycleProbeState.CreateFeatureCallCount; ObservedReleaseRendererDataRuntimeResourcesCallCount = ManagedLifecycleProbeState .ReleaseRendererDataRuntimeResourcesCallCount; ObservedDisposePipelineCallCount = ManagedLifecycleProbeState.DisposePipelineCallCount; ObservedReleaseAssetRuntimeResourcesCallCount = ManagedLifecycleProbeState.ReleaseAssetRuntimeResourcesCallCount; ObservedDisposeRendererCallCount = ManagedLifecycleProbeState.DisposeRendererCallCount; ObservedDisposeFeatureCallCount = ManagedLifecycleProbeState.DisposeFeatureCallCount; } } public sealed class ManagedUniversalLifecycleRuntimeSelectionProbe : MonoBehaviour { public int ObservedCreatePipelineCallCount; public int ObservedCreateRendererCallCount; public int ObservedCreateFeatureCallCount; public int ObservedReleaseRendererDataRuntimeResourcesCallCount; public int ObservedDisposePipelineCallCount; public int ObservedReleaseAssetRuntimeResourcesCallCount; public int ObservedDisposeRendererCallCount; public int ObservedDisposeFeatureCallCount; public void Start() { ManagedLifecycleProbeState.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedUniversalLifecycleProbeAsset(); } public void Update() { ObservedCreatePipelineCallCount = ManagedLifecycleProbeState.CreatePipelineCallCount; ObservedCreateRendererCallCount = ManagedLifecycleProbeState.CreateRendererCallCount; ObservedCreateFeatureCallCount = ManagedLifecycleProbeState.CreateFeatureCallCount; ObservedReleaseRendererDataRuntimeResourcesCallCount = ManagedLifecycleProbeState .ReleaseRendererDataRuntimeResourcesCallCount; ObservedDisposePipelineCallCount = ManagedLifecycleProbeState.DisposePipelineCallCount; ObservedReleaseAssetRuntimeResourcesCallCount = ManagedLifecycleProbeState.ReleaseAssetRuntimeResourcesCallCount; ObservedDisposeRendererCallCount = ManagedLifecycleProbeState.DisposeRendererCallCount; ObservedDisposeFeatureCallCount = ManagedLifecycleProbeState.DisposeFeatureCallCount; } } public sealed class ScriptCoreUniversalRenderPipelineSelectionProbe : MonoBehaviour { public bool SelectionRoundTripSucceeded; public string SelectedPipelineAssetTypeName = string.Empty; public string SelectedRendererDataTypeName = string.Empty; public void Start() { UniversalRenderPipelineAsset asset = new UniversalRenderPipelineAsset { rendererDataList = new ScriptableRendererData[] { new UniversalRendererData() } }; GraphicsSettings.renderPipelineAsset = asset; UniversalRenderPipelineAsset selectedAsset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset; ScriptableRendererData selectedRendererData = null; if (selectedAsset != null && selectedAsset.rendererDataList != null && selectedAsset.rendererDataList.Length > 0) { int rendererIndex = selectedAsset.defaultRendererIndex; if (rendererIndex < 0 || rendererIndex >= selectedAsset.rendererDataList.Length) { rendererIndex = 0; } selectedRendererData = selectedAsset.rendererDataList[rendererIndex]; } SelectionRoundTripSucceeded = selectedAsset != null; SelectedPipelineAssetTypeName = selectedAsset != null ? selectedAsset.GetType().FullName ?? string.Empty : string.Empty; SelectedRendererDataTypeName = selectedRendererData != null ? selectedRendererData.GetType().FullName ?? string.Empty : string.Empty; } } public sealed class ScriptCoreUniversalRenderPipelineRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new UniversalRenderPipelineAsset { rendererDataList = new ScriptableRendererData[] { new UniversalRendererData() } }; } } public sealed class ScriptCoreConfiguredUniversalRenderPipelineRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new UniversalRenderPipelineAsset { rendererDataList = new ScriptableRendererData[] { new UniversalRendererData { renderOpaque = true, renderSkybox = false, renderTransparent = false } } }; } } public sealed class ScriptCoreUniversalPostProcessRendererFeatureRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new UniversalRenderPipelineAsset { rendererDataList = new ScriptableRendererData[] { new UniversalRendererData { rendererFeatures = new ScriptableRendererFeature[] { new ColorScalePostProcessRendererFeature { colorScale = new Vector4( 1.08f, 0.96f, 0.92f, 1.0f) } } } } }; } } public sealed class ScriptCoreUniversalShadowlessRendererFeatureRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new UniversalRenderPipelineAsset { rendererDataList = new ScriptableRendererData[] { new UniversalRendererData { rendererFeatures = new ScriptableRendererFeature[] { new DisableDirectionalShadowRendererFeature() } } } }; } } public sealed class ProjectConfiguredRenderPipelineGetterProbe : MonoBehaviour { public bool ObservedAssetWasNull = true; public string ObservedPipelineAssetTypeName = string.Empty; public void Start() { ScriptableRenderPipelineAsset asset = GraphicsSettings.renderPipelineAsset; ObservedAssetWasNull = asset == null; ObservedPipelineAssetTypeName = asset != null ? asset.GetType().FullName ?? string.Empty : string.Empty; } } public sealed class ManagedUniversalRenderPipelineRuntimeSelectionProbe : MonoBehaviour { public int ObservedCreatePipelineCallCount; public int ObservedSupportsMainSceneCallCount; public int ObservedSupportsPostProcessCallCount; public int ObservedRecordMainSceneCallCount; public int ObservedRecordSceneCallCount; public int ObservedRecordPostProcessCallCount; public Vector4 ObservedPostProcessScale; public void Start() { ManagedUniversalRenderPipelineProbeAsset.CreatePipelineCallCount = 0; ManagedUniversalRenderPipelineProbe.SupportsMainSceneCallCount = 0; ManagedUniversalRenderPipelineProbe.SupportsPostProcessCallCount = 0; ManagedUniversalRenderPipelineProbe.RecordMainSceneCallCount = 0; ManagedUniversalRenderPipelineProbe.RecordSceneCallCount = 0; ManagedUniversalRenderPipelineProbe.RecordPostProcessCallCount = 0; ManagedUniversalRenderPipelineProbe.LastPostProcessScale = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); GraphicsSettings.renderPipelineAsset = new ManagedUniversalRenderPipelineProbeAsset { postProcessScale = new Vector4(1.11f, 0.97f, 0.93f, 1.0f) }; } public void Update() { ObservedCreatePipelineCallCount = ManagedUniversalRenderPipelineProbeAsset.CreatePipelineCallCount; ObservedSupportsMainSceneCallCount = ManagedUniversalRenderPipelineProbe.SupportsMainSceneCallCount; ObservedSupportsPostProcessCallCount = ManagedUniversalRenderPipelineProbe.SupportsPostProcessCallCount; ObservedRecordMainSceneCallCount = ManagedUniversalRenderPipelineProbe.RecordMainSceneCallCount; ObservedRecordSceneCallCount = ManagedUniversalRenderPipelineProbe.RecordSceneCallCount; ObservedRecordPostProcessCallCount = ManagedUniversalRenderPipelineProbe.RecordPostProcessCallCount; ObservedPostProcessScale = ManagedUniversalRenderPipelineProbe.LastPostProcessScale; } } public sealed class ManagedRenderContextCameraDataRuntimeSelectionProbe : MonoBehaviour { public Vector4 ObservedViewRow0; public Vector4 ObservedViewRow1; public Vector4 ObservedViewRow2; public Vector4 ObservedViewRow3; public Vector4 ObservedProjectionRow0; public Vector4 ObservedProjectionRow1; public Vector4 ObservedProjectionRow2; public Vector4 ObservedProjectionRow3; public Vector4 ObservedViewProjectionRow0; public Vector4 ObservedViewProjectionRow1; public Vector4 ObservedViewProjectionRow2; public Vector4 ObservedViewProjectionRow3; public Vector3 ObservedWorldPosition; public Vector4 ObservedClearColor; public int ObservedClearFlags; public bool ObservedPerspectiveProjection; public float ObservedVerticalFovRadians; public float ObservedOrthographicSize; public float ObservedAspectRatio; public float ObservedNearClipPlane; public float ObservedFarClipPlane; public int ObservedViewportWidth; public int ObservedViewportHeight; public int ObservedRecordCallCount; public void Start() { CameraDataObservationPass.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedRenderContextCameraDataProbeAsset(); } public void Update() { ObservedViewRow0 = CameraDataObservationPass.ObservedViewRow0; ObservedViewRow1 = CameraDataObservationPass.ObservedViewRow1; ObservedViewRow2 = CameraDataObservationPass.ObservedViewRow2; ObservedViewRow3 = CameraDataObservationPass.ObservedViewRow3; ObservedProjectionRow0 = CameraDataObservationPass.ObservedProjectionRow0; ObservedProjectionRow1 = CameraDataObservationPass.ObservedProjectionRow1; ObservedProjectionRow2 = CameraDataObservationPass.ObservedProjectionRow2; ObservedProjectionRow3 = CameraDataObservationPass.ObservedProjectionRow3; ObservedViewProjectionRow0 = CameraDataObservationPass.ObservedViewProjectionRow0; ObservedViewProjectionRow1 = CameraDataObservationPass.ObservedViewProjectionRow1; ObservedViewProjectionRow2 = CameraDataObservationPass.ObservedViewProjectionRow2; ObservedViewProjectionRow3 = CameraDataObservationPass.ObservedViewProjectionRow3; ObservedWorldPosition = CameraDataObservationPass.ObservedWorldPosition; ObservedClearColor = CameraDataObservationPass.ObservedClearColor; ObservedClearFlags = CameraDataObservationPass.ObservedClearFlags; ObservedPerspectiveProjection = CameraDataObservationPass.ObservedPerspectiveProjection; ObservedVerticalFovRadians = CameraDataObservationPass.ObservedVerticalFovRadians; ObservedOrthographicSize = CameraDataObservationPass.ObservedOrthographicSize; ObservedAspectRatio = CameraDataObservationPass.ObservedAspectRatio; ObservedNearClipPlane = CameraDataObservationPass.ObservedNearClipPlane; ObservedFarClipPlane = CameraDataObservationPass.ObservedFarClipPlane; ObservedViewportWidth = CameraDataObservationPass.ObservedViewportWidth; ObservedViewportHeight = CameraDataObservationPass.ObservedViewportHeight; ObservedRecordCallCount = CameraDataObservationPass.RecordCallCount; } } public sealed class ManagedRenderContextLightingDataRuntimeSelectionProbe : MonoBehaviour { public bool ObservedMainDirectionalLightEnabled; public bool ObservedMainDirectionalLightCastsShadows; public Vector3 ObservedMainDirectionalLightDirection; public Vector4 ObservedMainDirectionalLightColor; public float ObservedMainDirectionalLightIntensity; public bool ObservedHasMainDirectionalShadow; public int ObservedAdditionalLightCount; public int ObservedRecordCallCount; public void Start() { CameraDataObservationPass.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedRenderContextCameraDataProbeAsset(); } public void Update() { ObservedMainDirectionalLightEnabled = CameraDataObservationPass .ObservedMainDirectionalLightEnabled; ObservedMainDirectionalLightCastsShadows = CameraDataObservationPass .ObservedMainDirectionalLightCastsShadows; ObservedMainDirectionalLightDirection = CameraDataObservationPass .ObservedMainDirectionalLightDirection; ObservedMainDirectionalLightColor = CameraDataObservationPass .ObservedMainDirectionalLightColor; ObservedMainDirectionalLightIntensity = CameraDataObservationPass .ObservedMainDirectionalLightIntensity; ObservedHasMainDirectionalShadow = CameraDataObservationPass .ObservedHasMainDirectionalShadow; ObservedAdditionalLightCount = CameraDataObservationPass .ObservedAdditionalLightCount; ObservedRecordCallCount = CameraDataObservationPass.RecordCallCount; } } public sealed class ManagedRenderContextEnvironmentDataRuntimeSelectionProbe : MonoBehaviour { public int ObservedEnvironmentMode; public Vector4 ObservedSkyboxTopColor; public Vector4 ObservedSkyboxHorizonColor; public Vector4 ObservedSkyboxBottomColor; public int ObservedRecordCallCount; public void Start() { CameraDataObservationPass.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedRenderContextCameraDataProbeAsset(); } public void Update() { ObservedEnvironmentMode = CameraDataObservationPass.ObservedEnvironmentMode; ObservedSkyboxTopColor = CameraDataObservationPass.ObservedSkyboxTopColor; ObservedSkyboxHorizonColor = CameraDataObservationPass.ObservedSkyboxHorizonColor; ObservedSkyboxBottomColor = CameraDataObservationPass.ObservedSkyboxBottomColor; ObservedRecordCallCount = CameraDataObservationPass.RecordCallCount; } } public sealed class ManagedRenderContextShadowDataRuntimeSelectionProbe : MonoBehaviour { public bool ObservedShadowEnabled; public Vector4 ObservedShadowViewProjectionRow0; public Vector4 ObservedShadowViewProjectionRow1; public Vector4 ObservedShadowViewProjectionRow2; public Vector4 ObservedShadowViewProjectionRow3; public float ObservedShadowOrthographicHalfExtent; public float ObservedShadowNearClipPlane; public float ObservedShadowFarClipPlane; public int ObservedShadowMapWidth; public int ObservedShadowMapHeight; public float ObservedShadowWorldTexelSize; public float ObservedShadowReceiverDepthBias; public float ObservedShadowNormalBiasScale; public float ObservedShadowStrength; public float ObservedShadowDepthBiasFactor; public int ObservedShadowDepthBiasUnits; public int ObservedRecordCallCount; public void Start() { CameraDataObservationPass.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedRenderContextCameraDataProbeAsset(); } public void Update() { ObservedShadowEnabled = CameraDataObservationPass.ObservedShadowEnabled; ObservedShadowViewProjectionRow0 = CameraDataObservationPass .ObservedShadowViewProjectionRow0; ObservedShadowViewProjectionRow1 = CameraDataObservationPass .ObservedShadowViewProjectionRow1; ObservedShadowViewProjectionRow2 = CameraDataObservationPass .ObservedShadowViewProjectionRow2; ObservedShadowViewProjectionRow3 = CameraDataObservationPass .ObservedShadowViewProjectionRow3; ObservedShadowOrthographicHalfExtent = CameraDataObservationPass .ObservedShadowOrthographicHalfExtent; ObservedShadowNearClipPlane = CameraDataObservationPass .ObservedShadowNearClipPlane; ObservedShadowFarClipPlane = CameraDataObservationPass .ObservedShadowFarClipPlane; ObservedShadowMapWidth = CameraDataObservationPass .ObservedShadowMapWidth; ObservedShadowMapHeight = CameraDataObservationPass .ObservedShadowMapHeight; ObservedShadowWorldTexelSize = CameraDataObservationPass .ObservedShadowWorldTexelSize; ObservedShadowReceiverDepthBias = CameraDataObservationPass .ObservedShadowReceiverDepthBias; ObservedShadowNormalBiasScale = CameraDataObservationPass .ObservedShadowNormalBiasScale; ObservedShadowStrength = CameraDataObservationPass .ObservedShadowStrength; ObservedShadowDepthBiasFactor = CameraDataObservationPass .ObservedShadowDepthBiasFactor; ObservedShadowDepthBiasUnits = CameraDataObservationPass .ObservedShadowDepthBiasUnits; ObservedRecordCallCount = CameraDataObservationPass.RecordCallCount; } } public sealed class ManagedRenderContextFinalColorDataRuntimeSelectionProbe : MonoBehaviour { public int ObservedFinalColorOutputTransferMode; public int ObservedFinalColorExposureMode; public float ObservedFinalColorExposureValue; public int ObservedFinalColorToneMappingMode; public Vector4 ObservedFinalColorScale; public bool ObservedFinalColorHasPipelineDefaults; public bool ObservedFinalColorHasCameraOverrides; public bool ObservedFinalColorRequiresProcessing; public int ObservedRecordCallCount; public void Start() { CameraDataObservationPass.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedRenderContextFinalColorDataProbeAsset(); } public void Update() { ObservedFinalColorOutputTransferMode = CameraDataObservationPass .ObservedFinalColorOutputTransferMode; ObservedFinalColorExposureMode = CameraDataObservationPass .ObservedFinalColorExposureMode; ObservedFinalColorExposureValue = CameraDataObservationPass .ObservedFinalColorExposureValue; ObservedFinalColorToneMappingMode = CameraDataObservationPass .ObservedFinalColorToneMappingMode; ObservedFinalColorScale = CameraDataObservationPass .ObservedFinalColorScale; ObservedFinalColorHasPipelineDefaults = CameraDataObservationPass .ObservedFinalColorHasPipelineDefaults; ObservedFinalColorHasCameraOverrides = CameraDataObservationPass .ObservedFinalColorHasCameraOverrides; ObservedFinalColorRequiresProcessing = CameraDataObservationPass .ObservedFinalColorRequiresProcessing; ObservedRecordCallCount = CameraDataObservationPass.RecordCallCount; } } public sealed class ManagedRenderContextStageColorDataRuntimeSelectionProbe : MonoBehaviour { public int ObservedMainSceneSource; public bool ObservedMainSceneUsesGraphManagedOutputColor; public int ObservedPostProcessSource; public bool ObservedPostProcessUsesGraphManagedOutputColor; public int ObservedFinalOutputSource; public bool ObservedFinalOutputUsesGraphManagedOutputColor; public int ObservedMainSceneRecordCallCount; public int ObservedPostProcessRecordCallCount; public int ObservedFinalOutputRecordCallCount; public void Start() { StageColorObservationPass.Reset(); GraphicsSettings.renderPipelineAsset = new ManagedRenderContextStageColorDataProbeAsset(); } public void Update() { ObservedMainSceneSource = StageColorObservationPass.ObservedMainSceneSource; ObservedMainSceneUsesGraphManagedOutputColor = StageColorObservationPass .ObservedMainSceneUsesGraphManagedOutputColor; ObservedPostProcessSource = StageColorObservationPass.ObservedPostProcessSource; ObservedPostProcessUsesGraphManagedOutputColor = StageColorObservationPass .ObservedPostProcessUsesGraphManagedOutputColor; ObservedFinalOutputSource = StageColorObservationPass.ObservedFinalOutputSource; ObservedFinalOutputUsesGraphManagedOutputColor = StageColorObservationPass .ObservedFinalOutputUsesGraphManagedOutputColor; ObservedMainSceneRecordCallCount = StageColorObservationPass.MainSceneRecordCallCount; ObservedPostProcessRecordCallCount = StageColorObservationPass.PostProcessRecordCallCount; ObservedFinalOutputRecordCallCount = StageColorObservationPass.FinalOutputRecordCallCount; } } }