Files
XCEngine/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs

120 lines
3.8 KiB
C#

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<UniversalRendererData>() ??
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.FinalOutput:
m_finalOutputBlock.EnqueueRenderPasses(
this,
renderingData);
break;
}
}
}
}