#include "Rendering/Internal/RenderPipelineFactory.h" #include #include #include "Rendering/Execution/DirectionalShadowExecutionState.h" #include "Rendering/Pipelines/BuiltinForwardPipeline.h" #include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include "Rendering/Pipelines/ScriptableRenderPipelineHost.h" #include "Rendering/Passes/BuiltinDepthOnlyPass.h" #include "Rendering/Passes/BuiltinObjectIdPass.h" #include "Rendering/Passes/BuiltinShadowCasterPass.h" namespace XCEngine { namespace Rendering { namespace Internal { namespace { std::shared_ptr CreateBuiltinForwardPipelineRendererAsset() { static const std::shared_ptr s_builtinForwardPipelineAsset = std::make_shared(); return s_builtinForwardPipelineAsset; } std::unique_ptr CreateBuiltinDepthOnlyStandalonePass() { return std::make_unique(); } std::unique_ptr CreateBuiltinObjectIdStandalonePass() { return std::make_unique(); } std::unique_ptr CreateBuiltinShadowCasterStandalonePass() { return std::make_unique(); } std::unique_ptr TryCreateSceneDrawBackendFromAsset( const std::shared_ptr& asset) { if (asset == nullptr) { return nullptr; } std::unique_ptr pipeline = asset->CreatePipeline(); if (pipeline == nullptr) { return nullptr; } SceneDrawBackend* const sceneDrawBackend = dynamic_cast(pipeline.get()); if (sceneDrawBackend == nullptr) { return nullptr; } (void)pipeline.release(); return std::unique_ptr(sceneDrawBackend); } } // namespace std::shared_ptr CreateConfiguredRenderPipelineAsset() { return Pipelines::CreateConfiguredManagedRenderPipelineAsset(); } std::shared_ptr CreateFallbackRenderPipelineAsset() { return std::make_shared(); } std::shared_ptr CreateDefaultPipelineBackendAsset() { static const std::shared_ptr s_defaultAsset = CreateBuiltinForwardPipelineRendererAsset(); return s_defaultAsset; } std::shared_ptr ResolveRenderPipelineAssetOrDefault( std::shared_ptr preferredAsset) { if (preferredAsset != nullptr) { return std::move(preferredAsset); } if (std::shared_ptr configuredAsset = CreateConfiguredRenderPipelineAsset(); configuredAsset != nullptr) { return configuredAsset; } return CreateFallbackRenderPipelineAsset(); } std::unique_ptr CreateRenderPipelineOrDefault( const std::shared_ptr& preferredAsset, std::shared_ptr* outResolvedAsset) { const std::shared_ptr resolvedAsset = ResolveRenderPipelineAssetOrDefault(preferredAsset); if (resolvedAsset != nullptr) { if (std::unique_ptr pipeline = resolvedAsset->CreatePipeline()) { if (outResolvedAsset != nullptr) { *outResolvedAsset = resolvedAsset; } return pipeline; } } const std::shared_ptr defaultAsset = ResolveRenderPipelineAssetOrDefault(nullptr); if (defaultAsset != nullptr && defaultAsset != resolvedAsset) { if (std::unique_ptr pipeline = defaultAsset->CreatePipeline()) { if (outResolvedAsset != nullptr) { *outResolvedAsset = defaultAsset; } return pipeline; } } const std::shared_ptr fallbackAsset = CreateFallbackRenderPipelineAsset(); if (fallbackAsset != nullptr && fallbackAsset != resolvedAsset && fallbackAsset != defaultAsset) { if (std::unique_ptr pipeline = fallbackAsset->CreatePipeline()) { if (outResolvedAsset != nullptr) { *outResolvedAsset = fallbackAsset; } return pipeline; } } if (outResolvedAsset != nullptr) { *outResolvedAsset = fallbackAsset != nullptr ? fallbackAsset : (defaultAsset != nullptr ? defaultAsset : resolvedAsset); } return std::make_unique(); } std::unique_ptr CreateSceneDrawBackendFromAsset( const std::shared_ptr& preferredAsset, std::shared_ptr* outResolvedAsset) { if (std::unique_ptr sceneDrawBackend = TryCreateSceneDrawBackendFromAsset(preferredAsset)) { if (outResolvedAsset != nullptr) { *outResolvedAsset = preferredAsset; } return sceneDrawBackend; } if (outResolvedAsset != nullptr) { outResolvedAsset->reset(); } return CreateDefaultSceneDrawBackend(); } std::unique_ptr CreateDefaultSceneDrawBackend() { return std::make_unique(); } } // namespace Internal } // namespace Rendering } // namespace XCEngine