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(); 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"; } } } }