Files
XCEngine/managed/XCEngine.ScriptCore/ForwardRenderer.cs

148 lines
5.3 KiB
C#

namespace XCEngine
{
internal sealed class ForwardSceneInjectionPass : ScriptableRenderPass
{
private readonly SceneRenderInjectionPoint m_injectionPoint;
public ForwardSceneInjectionPass(
RenderPassEvent passEvent,
SceneRenderInjectionPoint injectionPoint)
{
renderPassEvent = passEvent;
m_injectionPoint = injectionPoint;
}
protected override bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
return context != null &&
renderingData != null &&
renderingData.isMainSceneStage &&
context.RecordSceneInjectionPoint(m_injectionPoint);
}
}
internal sealed class ForwardScenePhasePass : ScriptableRenderPass
{
private readonly ScenePhase m_scenePhase;
public ForwardScenePhasePass(
RenderPassEvent passEvent,
ScenePhase scenePhase)
{
renderPassEvent = passEvent;
m_scenePhase = scenePhase;
}
protected override bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
return context != null &&
renderingData != null &&
renderingData.isMainSceneStage &&
context.RecordScenePhase(m_scenePhase);
}
}
internal sealed class ForwardSceneFeature : ScriptableRendererFeature
{
private readonly ForwardRendererData m_rendererData;
private readonly ForwardSceneInjectionPass m_beforeOpaquePass =
new ForwardSceneInjectionPass(
RenderPassEvent.BeforeRenderingOpaques,
SceneRenderInjectionPoint.BeforeOpaque);
private readonly ForwardScenePhasePass m_opaquePass =
new ForwardScenePhasePass(
RenderPassEvent.RenderOpaques,
ScenePhase.Opaque);
private readonly ForwardSceneInjectionPass m_afterOpaquePass =
new ForwardSceneInjectionPass(
RenderPassEvent.AfterRenderingOpaques,
SceneRenderInjectionPoint.AfterOpaque);
private readonly ForwardSceneInjectionPass m_beforeSkyboxPass =
new ForwardSceneInjectionPass(
RenderPassEvent.BeforeRenderingSkybox,
SceneRenderInjectionPoint.BeforeSkybox);
private readonly ForwardScenePhasePass m_skyboxPass =
new ForwardScenePhasePass(
RenderPassEvent.RenderSkybox,
ScenePhase.Skybox);
private readonly ForwardSceneInjectionPass m_afterSkyboxPass =
new ForwardSceneInjectionPass(
RenderPassEvent.AfterRenderingSkybox,
SceneRenderInjectionPoint.AfterSkybox);
private readonly ForwardSceneInjectionPass m_beforeTransparentPass =
new ForwardSceneInjectionPass(
RenderPassEvent.BeforeRenderingTransparents,
SceneRenderInjectionPoint.BeforeTransparent);
private readonly ForwardScenePhasePass m_transparentPass =
new ForwardScenePhasePass(
RenderPassEvent.RenderTransparents,
ScenePhase.Transparent);
private readonly ForwardSceneInjectionPass m_afterTransparentPass =
new ForwardSceneInjectionPass(
RenderPassEvent.AfterRenderingTransparents,
SceneRenderInjectionPoint.AfterTransparent);
public ForwardSceneFeature(
ForwardRendererData rendererData)
{
m_rendererData = rendererData;
}
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
if (renderer == null ||
renderingData == null ||
!renderingData.isMainSceneStage ||
m_rendererData == null)
{
return;
}
if (m_rendererData.renderOpaque)
{
renderer.EnqueuePass(m_beforeOpaquePass);
renderer.EnqueuePass(m_opaquePass);
renderer.EnqueuePass(m_afterOpaquePass);
}
if (m_rendererData.renderSkybox)
{
renderer.EnqueuePass(m_beforeSkyboxPass);
renderer.EnqueuePass(m_skyboxPass);
renderer.EnqueuePass(m_afterSkyboxPass);
}
if (m_rendererData.renderTransparent)
{
renderer.EnqueuePass(m_beforeTransparentPass);
renderer.EnqueuePass(m_transparentPass);
renderer.EnqueuePass(m_afterTransparentPass);
}
}
}
public sealed class ForwardRenderer : ScriptableRenderer
{
public ForwardRenderer(
ForwardRendererData rendererData)
{
ForwardRendererData resolvedData =
rendererData ?? new ForwardRendererData();
AddFeature(new ForwardSceneFeature(resolvedData));
ScriptableRendererFeature[] rendererFeatures =
resolvedData.CreateRendererFeaturesInstance();
for (int i = 0; i < rendererFeatures.Length; ++i)
{
AddFeature(rendererFeatures[i]);
}
}
}
}