using System; using XCEngine; using XCEngine.Rendering; using XCEngine.Rendering.Renderer; using XCEngine.Rendering.FirstParty; 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 sealed class SceneInjectionPass : ScriptableRenderPass { private readonly Func m_recordAction; public SceneInjectionPass( RenderPassEvent passEvent, Func recordAction) { renderPassEvent = passEvent; m_recordAction = recordAction; } protected override bool RecordRenderGraph( RendererRecordingContext context, RenderingData renderingData) { return context != null && renderingData != null && renderingData.isMainSceneStage && m_recordAction != null && m_recordAction(context); } } internal sealed class ScenePhasePass : ScriptableRenderPass { private readonly Func m_recordAction; private readonly Action m_onRecorded; public ScenePhasePass( RenderPassEvent passEvent, Func recordAction, Action onRecorded = null) { renderPassEvent = passEvent; m_recordAction = recordAction; m_onRecorded = onRecorded; } protected override bool RecordRenderGraph( RendererRecordingContext context, RenderingData renderingData) { bool recorded = context != null && renderingData != null && renderingData.isMainSceneStage && m_recordAction != null && m_recordAction(context); if (recorded && m_onRecorded != null) { m_onRecorded(); } return recorded; } } internal sealed class FullscreenPass : ScriptableRenderPass { private readonly Func m_recordAction; public FullscreenPass( RenderPassEvent passEvent, Func recordAction) { renderPassEvent = passEvent; m_recordAction = recordAction; } protected override bool RecordRenderGraph( RendererRecordingContext context, RenderingData renderingData) { return context != null && renderingData != null && m_recordAction != null && m_recordAction(context); } } 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, context => context.RecordBeforeOpaqueInjection()); m_opaquePass = new ScenePhasePass( RenderPassEvent.RenderOpaques, context => context.RecordOpaqueScenePhase(), onOpaqueRecorded); m_afterOpaquePass = new SceneInjectionPass( RenderPassEvent.AfterRenderingOpaques, context => context.RecordAfterOpaqueInjection()); m_beforeSkyboxPass = new SceneInjectionPass( RenderPassEvent.BeforeRenderingSkybox, context => context.RecordBeforeSkyboxInjection()); m_skyboxPass = new ScenePhasePass( RenderPassEvent.RenderSkybox, context => context.RecordSkyboxScenePhase()); m_afterSkyboxPass = new SceneInjectionPass( RenderPassEvent.AfterRenderingSkybox, context => context.RecordAfterSkyboxInjection()); m_beforeTransparentPass = new SceneInjectionPass( RenderPassEvent.BeforeRenderingTransparents, context => context.RecordBeforeTransparentInjection()); m_transparentPass = new ScenePhasePass( RenderPassEvent.RenderTransparents, context => context.RecordTransparentScenePhase()); m_afterTransparentPass = new SceneInjectionPass( RenderPassEvent.AfterRenderingTransparents, context => context.RecordAfterTransparentInjection()); } 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 sealed class ProbeSceneRenderer : ScriptableRenderer { public ProbeSceneRenderer( Action onOpaqueRecorded = null) { AddFeature(new DefaultSceneFeature(onOpaqueRecorded)); } } internal sealed class ProbePostProcessRenderer : ScriptableRenderer { public ProbePostProcessRenderer( Vector4 firstVectorPayload, Vector4 secondVectorPayload) { AddFeature( new FullscreenFeature( new FullscreenPass( RenderPassEvent.BeforeRenderingPostProcessing, context => context.RecordShaderVectorFullscreenPass( BuiltinShaderPaths.ColorScalePostProcess, firstVectorPayload, "ColorScale")), new FullscreenPass( RenderPassEvent.AfterRenderingPostProcessing, context => context.RecordShaderVectorFullscreenPass( BuiltinShaderPaths.ColorScalePostProcess, secondVectorPayload, "ColorScale")))); } } internal sealed class ProbeForwardRenderer : ScriptableRenderer { public ProbeForwardRenderer( Vector4 postProcessScale, Action onOpaqueRecorded) { AddFeature(new DefaultSceneFeature(onOpaqueRecorded)); AddFeature( new FullscreenFeature( new FullscreenPass( RenderPassEvent.BeforeRenderingPostProcessing, context => context.RecordColorScaleFullscreenPass( postProcessScale)))); } } internal sealed class ProbePlannedFullscreenRenderer : ScriptableRenderer { public ProbePlannedFullscreenRenderer() { AddFeature( new FullscreenFeature( new FullscreenPass( RenderPassEvent.BeforeRenderingPostProcessing, context => context.RecordColorScaleFullscreenPass( new Vector4(1.05f, 1.0f, 0.95f, 1.0f))), new FullscreenPass( RenderPassEvent.BeforeRenderingFinalOutput, context => context.RecordColorScaleFullscreenPass( 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( RendererRecordingContext 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 context.RecordScene(); } } 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 sealed 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( RendererRecordingContext 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 sealed class StageColorObservationRenderer : ScriptableRenderer { public StageColorObservationRenderer() { AddFeature( new FullscreenFeature( new StageColorObservationPass( RenderPassEvent.RenderOpaques), new StageColorObservationPass( RenderPassEvent.BeforeRenderingPostProcessing), new StageColorObservationPass( RenderPassEvent.BeforeRenderingFinalOutput))); } } public sealed class LegacyRenderPipelineApiProbeAsset : RenderPipelineAsset { } public sealed class RenderPipelineApiProbeAsset : ScriptableRenderPipelineAsset { } public sealed class ManagedRenderPipelineProbeAsset : ScriptableRenderPipelineAsset { public static int CreatePipelineCallCount; protected override ScriptableRenderPipeline CreatePipeline() { CreatePipelineCallCount++; return new ManagedRenderPipelineProbe(); } } public sealed class ManagedPostProcessRenderPipelineProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedPostProcessRenderPipelineProbe(); } } public sealed class ManagedForwardRenderPipelineProbeAsset : ScriptableRenderPipelineAsset { public static int CreatePipelineCallCount; public Vector4 postProcessScale = new Vector4(1.03f, 0.98f, 0.94f, 1.0f); protected override ScriptableRenderPipeline CreatePipeline() { CreatePipelineCallCount++; return new ManagedForwardRenderPipelineProbe( postProcessScale); } protected override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { context.ClearFullscreenStage(CameraFrameStage.PostProcess); context.RequestFullscreenStage( CameraFrameStage.PostProcess, CameraFrameColorSource.MainSceneColor, false); } } public sealed class ManagedPlannedFullscreenRenderPipelineProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedPlannedFullscreenRenderPipelineProbe(); } protected override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { context.ClearFullscreenStage(CameraFrameStage.PostProcess); context.ClearFullscreenStage(CameraFrameStage.FinalOutput); context.RequestFullscreenStage( CameraFrameStage.PostProcess, CameraFrameColorSource.MainSceneColor, true); context.RequestFullscreenStage( CameraFrameStage.FinalOutput, CameraFrameColorSource.PostProcessColor); } } public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedRenderPipelineProbe(); } protected override void ConfigureCameraRenderRequest( ScriptableRenderPipelineCameraRequestContext context) { if (context != null && context.hasDirectionalShadow) { context.ClearDirectionalShadow(); } } } public sealed class ManagedRenderContextCameraDataProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedRenderContextCameraDataProbe(); } } public sealed class ManagedFinalColorRenderPipelineProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedRenderPipelineProbe(); } protected override FinalColorSettings GetDefaultFinalColorSettings() { return ProbeFinalColorSettingsFactory.Create(); } } public sealed class ManagedRenderContextFinalColorDataProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedRenderContextCameraDataProbe(); } protected override FinalColorSettings GetDefaultFinalColorSettings() { return ProbeFinalColorSettingsFactory.Create(); } } public sealed class ManagedRenderContextStageColorDataProbeAsset : ScriptableRenderPipelineAsset { protected override ScriptableRenderPipeline CreatePipeline() { return new ManagedRenderContextStageColorDataProbe(); } protected override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { context.ClearFullscreenStage(CameraFrameStage.PostProcess); context.ClearFullscreenStage(CameraFrameStage.FinalOutput); context.RequestFullscreenStage( CameraFrameStage.PostProcess, CameraFrameColorSource.MainSceneColor, true); context.RequestFullscreenStage( CameraFrameStage.FinalOutput, CameraFrameColorSource.PostProcessColor); } } public sealed class ManagedRenderPipelineProbe : RendererBackedRenderPipeline { public static int SupportsStageCallCount; public static int RecordStageCallCount; protected override ScriptableRenderer CreateRenderer() { return new ProbeSceneRenderer(); } protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { SupportsStageCallCount++; return base.SupportsStageRenderGraph(stage); } protected override bool RecordStageRenderGraph( ScriptableRenderContext context) { RecordStageCallCount++; return base.RecordStageRenderGraph(context); } } public sealed class ManagedPostProcessRenderPipelineProbe : RendererBackedRenderPipeline { protected override ScriptableRenderer CreateRenderer() { return new ProbePostProcessRenderer( new Vector4(1.10f, 0.95f, 0.90f, 1.0f), new Vector4(0.95f, 1.05f, 1.10f, 1.0f)); } } public sealed class ManagedForwardRenderPipelineProbe : RendererBackedRenderPipeline { 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 ManagedForwardRenderPipelineProbe( Vector4 postProcessScale) { m_postProcessScale = postProcessScale; } protected override ScriptableRenderer CreateRenderer() { return new ProbeForwardRenderer( m_postProcessScale, OnOpaqueRecorded); } 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 void OnOpaqueRecorded() { RecordSceneCallCount++; } } public sealed class ManagedPlannedFullscreenRenderPipelineProbe : RendererBackedRenderPipeline { protected override ScriptableRenderer CreateRenderer() { return new ProbePlannedFullscreenRenderer(); } } public sealed class ManagedRenderContextCameraDataProbe : RendererBackedRenderPipeline { protected override ScriptableRenderer CreateRenderer() { return new CameraDataObservationRenderer(); } } public sealed class ManagedRenderContextStageColorDataProbe : RendererBackedRenderPipeline { protected override ScriptableRenderer CreateRenderer() { return new StageColorObservationRenderer(); } } 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 ScriptCoreForwardRenderPipelineSelectionProbe : MonoBehaviour { public bool SelectionRoundTripSucceeded; public string SelectedPipelineAssetTypeName = string.Empty; public string SelectedRendererDataTypeName = string.Empty; public void Start() { ForwardRenderPipelineAsset asset = new ForwardRenderPipelineAsset { rendererData = new ForwardRendererData() }; GraphicsSettings.renderPipelineAsset = asset; ForwardRenderPipelineAsset selectedAsset = GraphicsSettings.renderPipelineAsset as ForwardRenderPipelineAsset; SelectionRoundTripSucceeded = selectedAsset != null; SelectedPipelineAssetTypeName = selectedAsset != null ? selectedAsset.GetType().FullName ?? string.Empty : string.Empty; SelectedRendererDataTypeName = selectedAsset != null && selectedAsset.rendererData != null ? selectedAsset.rendererData.GetType().FullName ?? string.Empty : string.Empty; } } public sealed class ScriptCoreForwardRenderPipelineRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new ForwardRenderPipelineAsset { rendererData = new ForwardRendererData() }; } } public sealed class ScriptCoreConfiguredForwardRenderPipelineRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new ForwardRenderPipelineAsset { rendererData = new ForwardRendererData { renderOpaque = true, renderSkybox = false, renderTransparent = false } }; } } public sealed class ScriptCoreForwardPostProcessRendererFeatureRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new ForwardRenderPipelineAsset { rendererData = new ForwardRendererData { rendererFeatures = new ScriptableRendererFeature[] { new ColorScalePostProcessRendererFeature { colorScale = new Vector4( 1.08f, 0.96f, 0.92f, 1.0f) } } } }; } } public sealed class ScriptCoreForwardShadowlessRendererFeatureRuntimeSelectionProbe : MonoBehaviour { public void Start() { GraphicsSettings.renderPipelineAsset = new ForwardRenderPipelineAsset { rendererData = new ForwardRendererData { 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 ManagedForwardRenderPipelineRuntimeSelectionProbe : 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() { ManagedForwardRenderPipelineProbeAsset.CreatePipelineCallCount = 0; ManagedForwardRenderPipelineProbe.SupportsMainSceneCallCount = 0; ManagedForwardRenderPipelineProbe.SupportsPostProcessCallCount = 0; ManagedForwardRenderPipelineProbe.RecordMainSceneCallCount = 0; ManagedForwardRenderPipelineProbe.RecordSceneCallCount = 0; ManagedForwardRenderPipelineProbe.RecordPostProcessCallCount = 0; ManagedForwardRenderPipelineProbe.LastPostProcessScale = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); GraphicsSettings.renderPipelineAsset = new ManagedForwardRenderPipelineProbeAsset { postProcessScale = new Vector4(1.11f, 0.97f, 0.93f, 1.0f) }; } public void Update() { ObservedCreatePipelineCallCount = ManagedForwardRenderPipelineProbeAsset.CreatePipelineCallCount; ObservedSupportsMainSceneCallCount = ManagedForwardRenderPipelineProbe.SupportsMainSceneCallCount; ObservedSupportsPostProcessCallCount = ManagedForwardRenderPipelineProbe.SupportsPostProcessCallCount; ObservedRecordMainSceneCallCount = ManagedForwardRenderPipelineProbe.RecordMainSceneCallCount; ObservedRecordSceneCallCount = ManagedForwardRenderPipelineProbe.RecordSceneCallCount; ObservedRecordPostProcessCallCount = ManagedForwardRenderPipelineProbe.RecordPostProcessCallCount; ObservedPostProcessScale = ManagedForwardRenderPipelineProbe.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; } } }