#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include namespace XCEngine { namespace Rendering { namespace Pipelines { namespace { ManagedRenderPipelineAssetDescriptor& GetManagedRenderPipelineAssetDescriptorStorage() { static ManagedRenderPipelineAssetDescriptor s_descriptor = {}; return s_descriptor; } std::shared_ptr& GetManagedRenderPipelineBridgeStorage() { static std::shared_ptr s_bridge = nullptr; return s_bridge; } } // namespace ManagedScriptableRenderPipelineAsset::ManagedScriptableRenderPipelineAsset( ManagedRenderPipelineAssetDescriptor descriptor) : m_descriptor(std::move(descriptor)) { } std::shared_ptr ManagedScriptableRenderPipelineAsset::ResolveManagedAssetRuntime() const { if (m_managedAssetRuntime != nullptr) { return m_managedAssetRuntime; } const std::shared_ptr bridge = GetManagedRenderPipelineBridgeStorage(); if (bridge == nullptr) { return nullptr; } m_managedAssetRuntime = bridge->CreateAssetRuntime(m_descriptor); return m_managedAssetRuntime; } std::unique_ptr ManagedScriptableRenderPipelineAsset::CreatePipeline() const { std::unique_ptr pipeline = m_fallbackAsset.CreatePipeline(); auto* host = dynamic_cast(pipeline.get()); if (host == nullptr) { return pipeline; } if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { host->SetStageRecorder(runtime->CreateStageRecorder()); } return pipeline; } void ManagedScriptableRenderPipelineAsset::ConfigureCameraRenderRequest( CameraRenderRequest& request, size_t renderedBaseCameraCount, size_t renderedRequestCount, const DirectionalShadowPlanningSettings& directionalShadowSettings) const { RenderPipelineAsset::ConfigureCameraRenderRequest( request, renderedBaseCameraCount, renderedRequestCount, directionalShadowSettings); if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { runtime->ConfigureCameraRenderRequest( request, renderedBaseCameraCount, renderedRequestCount, directionalShadowSettings); } } FinalColorSettings ManagedScriptableRenderPipelineAsset::GetDefaultFinalColorSettings() const { return m_fallbackAsset.GetDefaultFinalColorSettings(); } void ManagedScriptableRenderPipelineAsset::ConfigureCameraFramePlan( CameraFramePlan& plan) const { RenderPipelineAsset::ConfigureCameraFramePlan(plan); if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { runtime->ConfigureCameraFramePlan(plan); } } void SetManagedRenderPipelineBridge( std::shared_ptr bridge) { GetManagedRenderPipelineBridgeStorage() = std::move(bridge); } void ClearManagedRenderPipelineBridge() { GetManagedRenderPipelineBridgeStorage().reset(); } std::shared_ptr GetManagedRenderPipelineBridge() { return GetManagedRenderPipelineBridgeStorage(); } void SetManagedRenderPipelineAssetDescriptor( const ManagedRenderPipelineAssetDescriptor& descriptor) { GetManagedRenderPipelineAssetDescriptorStorage() = descriptor; } void ClearManagedRenderPipelineAssetDescriptor() { GetManagedRenderPipelineAssetDescriptorStorage() = {}; } ManagedRenderPipelineAssetDescriptor GetManagedRenderPipelineAssetDescriptor() { return GetManagedRenderPipelineAssetDescriptorStorage(); } std::shared_ptr CreateManagedOrDefaultScriptableRenderPipelineAsset() { const ManagedRenderPipelineAssetDescriptor descriptor = GetManagedRenderPipelineAssetDescriptor(); if (descriptor.IsValid()) { return std::make_shared(descriptor); } return std::make_shared(); } } // namespace Pipelines } // namespace Rendering } // namespace XCEngine