157 lines
5.0 KiB
C#
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";
|
|
}
|
|
}
|
|
}
|
|
}
|