#include "Rendering/Pipelines/ScriptableRenderPipelineHost.h" #include "Rendering/Passes/BuiltinDepthOnlyPass.h" #include "Rendering/Passes/BuiltinObjectIdPass.h" #include "Rendering/Passes/BuiltinShadowCasterPass.h" #include "Rendering/Pipelines/BuiltinForwardPipeline.h" namespace XCEngine { namespace Rendering { namespace Pipelines { namespace { std::shared_ptr CreateDefaultPipelineRendererAsset() { static const std::shared_ptr s_defaultRendererAsset = std::make_shared(); return s_defaultRendererAsset; } std::unique_ptr CreatePipelineRendererFromAsset( const std::shared_ptr& pipelineRendererAsset) { const std::shared_ptr resolvedAsset = pipelineRendererAsset != nullptr ? pipelineRendererAsset : CreateDefaultPipelineRendererAsset(); if (resolvedAsset != nullptr) { if (std::unique_ptr pipeline = resolvedAsset->CreatePipeline()) { return pipeline; } } return std::make_unique(); } void InstallDefaultStandaloneStagePasses(RenderPipeline& pipeline) { pipeline.SetCameraFrameStandalonePass( CameraFrameStage::ObjectId, std::make_unique()); pipeline.SetCameraFrameStandalonePass( CameraFrameStage::DepthOnly, std::make_unique()); pipeline.SetCameraFrameStandalonePass( CameraFrameStage::ShadowCaster, std::make_unique()); } } // namespace ScriptableRenderPipelineHost::ScriptableRenderPipelineHost() : ScriptableRenderPipelineHost(CreateDefaultPipelineRendererAsset()) { } ScriptableRenderPipelineHost::ScriptableRenderPipelineHost( std::unique_ptr pipelineRenderer) { InstallDefaultStandaloneStagePasses(*this); ResetPipelineRenderer(std::move(pipelineRenderer)); } ScriptableRenderPipelineHost::ScriptableRenderPipelineHost( std::shared_ptr pipelineRendererAsset) : m_pipelineRendererAsset( pipelineRendererAsset != nullptr ? std::move(pipelineRendererAsset) : CreateDefaultPipelineRendererAsset()) { InstallDefaultStandaloneStagePasses(*this); ResetPipelineRenderer( CreatePipelineRendererFromAsset(m_pipelineRendererAsset)); } ScriptableRenderPipelineHost::~ScriptableRenderPipelineHost() { Shutdown(); } void ScriptableRenderPipelineHost::SetPipelineRenderer( std::unique_ptr pipelineRenderer) { m_pipelineRendererAsset.reset(); ResetPipelineRenderer(std::move(pipelineRenderer)); } void ScriptableRenderPipelineHost::SetPipelineRendererAsset( std::shared_ptr pipelineRendererAsset) { m_pipelineRendererAsset = pipelineRendererAsset != nullptr ? std::move(pipelineRendererAsset) : CreateDefaultPipelineRendererAsset(); ResetPipelineRenderer( CreatePipelineRendererFromAsset(m_pipelineRendererAsset)); } bool ScriptableRenderPipelineHost::Initialize(const RenderContext& context) { return m_pipelineRenderer != nullptr && m_pipelineRenderer->Initialize(context); } void ScriptableRenderPipelineHost::Shutdown() { if (m_pipelineRenderer != nullptr) { m_pipelineRenderer->Shutdown(); } ShutdownCameraFrameStandalonePasses(); } bool ScriptableRenderPipelineHost::SupportsStageRenderGraph( CameraFrameStage stage) const { return m_pipelineRenderer != nullptr && m_pipelineRenderer->SupportsStageRenderGraph(stage); } bool ScriptableRenderPipelineHost::RecordStageRenderGraph( const RenderPipelineStageRenderGraphContext& context) { return m_pipelineRenderer != nullptr && m_pipelineRenderer->RecordStageRenderGraph(context); } bool ScriptableRenderPipelineHost::Render( const FrameExecutionContext& executionContext) { return m_pipelineRenderer != nullptr && m_pipelineRenderer->Render(executionContext); } bool ScriptableRenderPipelineHost::Render( const RenderContext& context, const RenderSurface& surface, const RenderSceneData& sceneData) { return m_pipelineRenderer != nullptr && m_pipelineRenderer->Render(context, surface, sceneData); } void ScriptableRenderPipelineHost::ResetPipelineRenderer( std::unique_ptr pipelineRenderer) { if (m_pipelineRenderer != nullptr) { m_pipelineRenderer->Shutdown(); } m_pipelineRenderer = std::move(pipelineRenderer); if (m_pipelineRenderer == nullptr) { if (m_pipelineRendererAsset == nullptr) { m_pipelineRendererAsset = CreateDefaultPipelineRendererAsset(); } m_pipelineRenderer = CreatePipelineRendererFromAsset(m_pipelineRendererAsset); } } ScriptableRenderPipelineHostAsset::ScriptableRenderPipelineHostAsset() : ScriptableRenderPipelineHostAsset(CreateDefaultPipelineRendererAsset()) { } ScriptableRenderPipelineHostAsset::ScriptableRenderPipelineHostAsset( std::shared_ptr pipelineRendererAsset) : m_pipelineRendererAsset( pipelineRendererAsset != nullptr ? std::move(pipelineRendererAsset) : CreateDefaultPipelineRendererAsset()) { } std::unique_ptr ScriptableRenderPipelineHostAsset::CreatePipeline() const { return std::make_unique( m_pipelineRendererAsset); } FinalColorSettings ScriptableRenderPipelineHostAsset::GetDefaultFinalColorSettings() const { return m_pipelineRendererAsset != nullptr ? m_pipelineRendererAsset->GetDefaultFinalColorSettings() : FinalColorSettings{}; } } // namespace Pipelines } // namespace Rendering } // namespace XCEngine