120 lines
3.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|