using XCEngine; using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { public sealed class UniversalRenderer : ScriptableRenderer { private readonly UniversalRendererData m_rendererData; private readonly UniversalShadowCasterBlock m_shadowCasterBlock = new UniversalShadowCasterBlock(); private readonly UniversalDepthPrepassBlock m_depthPrepassBlock = new UniversalDepthPrepassBlock(); private readonly UniversalMainSceneBlock m_mainSceneBlock = new UniversalMainSceneBlock(); private readonly UniversalPostProcessBlock m_postProcessBlock = new UniversalPostProcessBlock(); private readonly UniversalFinalOutputBlock m_finalOutputBlock = new UniversalFinalOutputBlock(); public UniversalRenderer( UniversalRendererData rendererData) { m_rendererData = rendererData ?? ScriptableObject .CreateInstance() ?? new UniversalRendererData(); } protected override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { if (context == null) { return; } m_shadowCasterBlock.ConfigureCameraFramePlan( context, m_rendererData.GetShadowCasterBlockInstance()); m_depthPrepassBlock.ConfigureCameraFramePlan( context, m_rendererData.GetDepthPrepassBlockInstance()); } protected override void FinalizeCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { if (context == null) { return; } base.FinalizeCameraFramePlan(context); m_finalOutputBlock.FinalizeCameraFramePlan( context, m_postProcessBlock); } protected override void ConfigureRenderSceneSetup( RenderSceneSetupContext context) { if (context == null) { return; } m_mainSceneBlock.ConfigureRenderSceneSetup( context); } protected override void ConfigureDirectionalShadowExecutionState( DirectionalShadowExecutionContext context) { if (context == null) { return; } m_shadowCasterBlock .ConfigureDirectionalShadowExecutionState( context, m_rendererData.GetShadowCasterBlockInstance()); } protected override void AddRenderPasses( RenderingData renderingData) { if (renderingData == null) { return; } switch (renderingData.stage) { case CameraFrameStage.ShadowCaster: m_shadowCasterBlock.EnqueueRenderPasses( this, m_rendererData.GetShadowCasterBlockInstance()); break; case CameraFrameStage.DepthOnly: m_depthPrepassBlock.EnqueueRenderPasses( this, m_rendererData.GetDepthPrepassBlockInstance()); break; case CameraFrameStage.MainScene: m_mainSceneBlock.EnqueueRenderPasses( this, m_rendererData.GetMainSceneInstance()); break; case CameraFrameStage.PostProcess: m_postProcessBlock.EnqueueRenderPasses( this, renderingData); break; case CameraFrameStage.FinalOutput: m_finalOutputBlock.EnqueueRenderPasses( this, renderingData); break; } } } }