#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include "Rendering/GraphicsSettingsState.h" #include namespace XCEngine { namespace Rendering { namespace Pipelines { ManagedScriptableRenderPipelineAsset::ManagedScriptableRenderPipelineAsset( ManagedRenderPipelineAssetDescriptor descriptor) : m_descriptor(std::move(descriptor)) { } std::shared_ptr ManagedScriptableRenderPipelineAsset::ResolveManagedAssetRuntime() const { const GraphicsSettingsState& graphicsSettings = GetGraphicsSettingsState(); const size_t bridgeGeneration = graphicsSettings.GetManagedRenderPipelineBridgeGeneration(); if (m_managedAssetRuntime != nullptr && m_managedAssetRuntimeBridgeGeneration == bridgeGeneration) { return m_managedAssetRuntime; } m_managedAssetRuntime.reset(); m_managedAssetRuntimeBridgeGeneration = bridgeGeneration; const std::shared_ptr bridge = graphicsSettings.GetManagedRenderPipelineBridge(); 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_executionHostAsset.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 { if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { FinalColorSettings settings = {}; if (runtime->TryGetDefaultFinalColorSettings(settings)) { return settings; } } return m_executionHostAsset.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) { GetGraphicsSettingsState().SetManagedRenderPipelineBridge( std::move(bridge)); } void ClearManagedRenderPipelineBridge() { GetGraphicsSettingsState().ClearManagedRenderPipelineBridge(); } std::shared_ptr GetManagedRenderPipelineBridge() { return GetGraphicsSettingsState().GetManagedRenderPipelineBridge(); } size_t GetManagedRenderPipelineEnvironmentGeneration() { return GetGraphicsSettingsState().GetEnvironmentGeneration(); } void SetConfiguredManagedRenderPipelineAssetDescriptor( const ManagedRenderPipelineAssetDescriptor& descriptor) { GetGraphicsSettingsState().SetConfiguredRenderPipelineAssetDescriptor( descriptor); } void ClearConfiguredManagedRenderPipelineAssetDescriptor() { GetGraphicsSettingsState().ClearConfiguredRenderPipelineAssetDescriptor(); } ManagedRenderPipelineAssetDescriptor GetConfiguredManagedRenderPipelineAssetDescriptor() { return GetGraphicsSettingsState() .GetConfiguredRenderPipelineAssetDescriptor(); } std::shared_ptr CreateConfiguredManagedRenderPipelineAsset() { const ManagedRenderPipelineAssetDescriptor descriptor = GetGraphicsSettingsState().GetConfiguredRenderPipelineAssetDescriptor(); if (descriptor.IsValid()) { return std::make_shared(descriptor); } return nullptr; } } // namespace Pipelines } // namespace Rendering } // namespace XCEngine