using System.Collections.Generic; using XCEngine; using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { public abstract class ScriptableRenderer { private readonly List m_features = new List(); private readonly List m_activePassQueue = new List(); protected ScriptableRenderer() { } public void EnqueuePass( ScriptableRenderPass renderPass) { if (renderPass == null) { return; } int insertIndex = m_activePassQueue.Count; while (insertIndex > 0 && m_activePassQueue[insertIndex - 1].renderPassEvent > renderPass.renderPassEvent) { insertIndex--; } m_activePassQueue.Insert( insertIndex, renderPass); } protected void AddFeature( ScriptableRendererFeature feature) { if (feature == null) { return; } m_features.Add(feature); feature.Create(); } protected virtual void AddRenderPasses( RenderingData renderingData) { } internal bool SupportsStageRenderGraph( CameraFrameStage stage) { RenderingData renderingData = new RenderingData(stage); BuildPassQueue(renderingData); for (int i = 0; i < m_activePassQueue.Count; ++i) { ScriptableRenderPass renderPass = m_activePassQueue[i]; if (renderPass != null && renderPass.SupportsStage(stage)) { return true; } } return false; } internal bool RecordStageRenderGraph( ScriptableRenderContext context) { if (context == null) { return false; } RenderingData renderingData = new RenderingData(context); BuildPassQueue(renderingData); bool recordedAnyPass = false; for (int i = 0; i < m_activePassQueue.Count; ++i) { ScriptableRenderPass renderPass = m_activePassQueue[i]; if (renderPass == null || !renderPass.SupportsStage(renderingData.stage)) { continue; } if (!renderPass.Record( context, renderingData)) { return false; } recordedAnyPass = true; } return recordedAnyPass; } private void BuildPassQueue( RenderingData renderingData) { m_activePassQueue.Clear(); for (int i = 0; i < m_features.Count; ++i) { ScriptableRendererFeature feature = m_features[i]; if (feature == null || !feature.isActive) { continue; } feature.AddRenderPasses( this, renderingData); } AddRenderPasses(renderingData); } } }