feat(rendering): add managed SRP renderer runtime
This commit is contained in:
147
managed/XCEngine.ScriptCore/ForwardRenderer.cs
Normal file
147
managed/XCEngine.ScriptCore/ForwardRenderer.cs
Normal file
@@ -0,0 +1,147 @@
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user