#include "Rendering/Internal/RenderPipelineFactory.h" #include #include #include "Rendering/Execution/DirectionalShadowExecutionState.h" #include "Rendering/Pipelines/BuiltinForwardPipeline.h" #include "Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h" #include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include "Rendering/Pipelines/ScriptableRenderPipelineHost.h" namespace XCEngine { namespace Rendering { namespace Internal { namespace { class DefaultNativeSceneDrawBackendAsset final : public RenderPipelineAsset { public: std::unique_ptr CreatePipeline() const override { return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend(); } FinalColorSettings GetDefaultFinalColorSettings() const override { return {}; } }; std::shared_ptr CreateDefaultNativeSceneDrawBackendAsset() { static const std::shared_ptr s_defaultNativeSceneDrawBackendAsset = std::make_shared(); return s_defaultNativeSceneDrawBackendAsset; } std::shared_ptr CreateDefaultNativePipelineBackendAsset() { static const std::shared_ptr s_defaultNativePipelineBackendAsset = std::make_shared(); return s_defaultNativePipelineBackendAsset; } std::unique_ptr TryCreateRenderPipelineFromAsset( const std::shared_ptr& asset) { if (asset == nullptr) { return nullptr; } return asset->CreatePipeline(); } std::unique_ptr TryCreatePipelineBackendFromAsset( const std::shared_ptr& asset) { if (asset == nullptr) { return nullptr; } return asset->CreatePipeline(); } std::unique_ptr TryCreateSceneDrawBackendFromAsset( const std::shared_ptr& asset) { std::unique_ptr pipelineBackend = TryCreatePipelineBackendFromAsset(asset); if (pipelineBackend == nullptr) { return nullptr; } SceneDrawBackend* const sceneDrawBackend = dynamic_cast(pipelineBackend.get()); if (sceneDrawBackend == nullptr) { return nullptr; } (void)pipelineBackend.release(); return std::unique_ptr(sceneDrawBackend); } } // namespace std::shared_ptr CreateConfiguredRenderPipelineAsset() { return Pipelines::CreateConfiguredManagedRenderPipelineAsset(); } std::shared_ptr CreateFallbackRenderPipelineAsset() { return CreateDefaultPipelineBackendAsset(); } std::shared_ptr CreateDefaultSceneDrawBackendAsset() { static const std::shared_ptr s_defaultAsset = CreateDefaultNativeSceneDrawBackendAsset(); return s_defaultAsset; } std::shared_ptr CreateDefaultPipelineBackendAsset() { static const std::shared_ptr s_defaultAsset = CreateDefaultNativePipelineBackendAsset(); 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 CreateDefaultPipelineBackendAsset(); } std::unique_ptr CreateRenderPipelineOrDefault( const std::shared_ptr& preferredAsset, std::shared_ptr* outResolvedAsset) { const std::shared_ptr resolvedAsset = ResolveRenderPipelineAssetOrDefault(preferredAsset); if (std::unique_ptr pipeline = TryCreateRenderPipelineFromAsset(resolvedAsset)) { if (outResolvedAsset != nullptr) { *outResolvedAsset = resolvedAsset; } return pipeline; } const std::shared_ptr fallbackAsset = CreateFallbackRenderPipelineAsset(); if (fallbackAsset != nullptr && fallbackAsset != resolvedAsset) { if (std::unique_ptr pipeline = TryCreateRenderPipelineFromAsset(fallbackAsset)) { if (outResolvedAsset != nullptr) { *outResolvedAsset = fallbackAsset; } return pipeline; } } if (outResolvedAsset != nullptr) { *outResolvedAsset = fallbackAsset != nullptr ? fallbackAsset : resolvedAsset; } return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline(); } std::unique_ptr CreatePipelineBackendFromAsset( const std::shared_ptr& preferredAsset, std::shared_ptr* outResolvedAsset) { if (std::unique_ptr pipelineBackend = TryCreatePipelineBackendFromAsset(preferredAsset)) { if (outResolvedAsset != nullptr) { *outResolvedAsset = preferredAsset; } return pipelineBackend; } const std::shared_ptr defaultAsset = CreateDefaultPipelineBackendAsset(); if (defaultAsset != nullptr && defaultAsset != preferredAsset) { if (std::unique_ptr pipelineBackend = TryCreatePipelineBackendFromAsset(defaultAsset)) { if (outResolvedAsset != nullptr) { *outResolvedAsset = defaultAsset; } return pipelineBackend; } } if (outResolvedAsset != nullptr) { *outResolvedAsset = defaultAsset != nullptr ? defaultAsset : preferredAsset; } return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline(); } 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 Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend(); } } // namespace Internal } // namespace Rendering } // namespace XCEngine