using XCEngine; using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { public abstract class ScriptableRenderPass { protected ScriptableRenderPass() { } public RenderPassEvent renderPassEvent { get; protected set; } = RenderPassEvent.BeforeRenderingOpaques; public virtual bool SupportsStage( CameraFrameStage stage) { CameraFrameStage resolvedStage; return TryResolveStage( renderPassEvent, out resolvedStage) && resolvedStage == stage; } internal bool Record( ScriptableRenderContext context, RenderingData renderingData) { return RecordRenderGraph( context, renderingData); } protected abstract bool RecordRenderGraph( ScriptableRenderContext context, RenderingData renderingData); internal static bool TryResolveStage( RenderPassEvent passEvent, out CameraFrameStage stage) { switch (passEvent) { case RenderPassEvent.BeforeRenderingOpaques: case RenderPassEvent.RenderOpaques: case RenderPassEvent.AfterRenderingOpaques: case RenderPassEvent.BeforeRenderingSkybox: case RenderPassEvent.RenderSkybox: case RenderPassEvent.AfterRenderingSkybox: case RenderPassEvent.BeforeRenderingTransparents: case RenderPassEvent.RenderTransparents: case RenderPassEvent.AfterRenderingTransparents: stage = CameraFrameStage.MainScene; return true; case RenderPassEvent.BeforeRenderingPostProcessing: case RenderPassEvent.AfterRenderingPostProcessing: stage = CameraFrameStage.PostProcess; return true; case RenderPassEvent.BeforeRenderingFinalOutput: case RenderPassEvent.AfterRenderingFinalOutput: stage = CameraFrameStage.FinalOutput; return true; default: stage = CameraFrameStage.MainScene; return false; } } } }