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

157 lines
5.0 KiB
C#

using XCEngine;
using XCEngine.Rendering;
using XCEngine.Rendering.RenderGraphModule;
namespace XCEngine.Rendering.Universal
{
public sealed class DrawObjectsPass : ScriptableRenderPass
{
private RendererListDesc m_rendererListDesc =
RendererListDesc.CreateDefault(
RendererListType.Opaque);
private DrawingSettings m_drawingSettings =
DrawingSettings.CreateDefault();
public DrawObjectsPass(
RenderPassEvent passEvent,
RendererListDesc rendererListDesc)
: this(
passEvent,
rendererListDesc,
DrawingSettings.CreateDefault())
{
}
public DrawObjectsPass(
RenderPassEvent passEvent,
RendererListDesc rendererListDesc,
DrawingSettings drawingSettings)
{
Configure(
passEvent,
rendererListDesc,
drawingSettings);
}
public void Configure(
RenderPassEvent passEvent,
RendererListDesc rendererListDesc)
{
Configure(
passEvent,
rendererListDesc,
DrawingSettings.CreateDefault());
}
public void Configure(
RenderPassEvent passEvent,
RendererListDesc rendererListDesc,
DrawingSettings drawingSettings)
{
renderPassEvent = passEvent;
m_rendererListDesc = rendererListDesc;
m_drawingSettings = drawingSettings;
}
public override void RecordRenderGraph(
RenderGraph renderGraph,
ContextContainer frameData)
{
if (renderGraph == null ||
frameData == null)
{
return;
}
RenderingData renderingData =
frameData.Get<RenderingData>();
if (renderingData == null ||
!renderingData.isSceneDrawStage)
{
return;
}
RendererListHandle rendererList =
renderGraph.CreateRendererList(
m_rendererListDesc,
m_drawingSettings);
if (!rendererList.isValid)
{
return;
}
RenderGraphTextureHandle primaryColorTarget =
renderGraph.primaryColorTarget;
RenderGraphTextureHandle depthTarget =
renderGraph.depthTarget;
if (!primaryColorTarget.isValid &&
!depthTarget.isValid)
{
return;
}
RenderGraphRasterPassBuilder passBuilder =
renderGraph.AddRasterPass(
ResolvePassName());
if (primaryColorTarget.isValid)
{
passBuilder.SetColorAttachment(
primaryColorTarget);
}
if (depthTarget.isValid)
{
passBuilder.SetDepthAttachment(
depthTarget);
}
passBuilder
.UseRendererList(rendererList)
.SetRenderFunc(
rasterContext =>
{
rasterContext.cmd.DrawRendererList(
rendererList);
})
.Commit();
}
protected override bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
return context != null &&
renderingData != null &&
renderingData.isSceneDrawStage &&
context.DrawRenderers(
m_rendererListDesc,
m_drawingSettings);
}
private string ResolvePassName()
{
switch (renderPassEvent)
{
case RenderPassEvent.BeforeRenderingShadows:
case RenderPassEvent.AfterRenderingShadows:
return "Universal.DrawShadowCasterObjects";
case RenderPassEvent.BeforeRenderingPrePasses:
case RenderPassEvent.AfterRenderingPrePasses:
return "Universal.DrawDepthOnlyObjects";
case RenderPassEvent.BeforeRenderingTransparents:
case RenderPassEvent.RenderTransparents:
case RenderPassEvent.AfterRenderingTransparents:
return "Universal.DrawTransparentObjects";
case RenderPassEvent.BeforeRenderingOpaques:
case RenderPassEvent.RenderOpaques:
case RenderPassEvent.AfterRenderingOpaques:
default:
return m_rendererListDesc.type ==
RendererListType.Transparent
? "Universal.DrawTransparentObjects"
: "Universal.DrawOpaqueObjects";
}
}
}
}