#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::shared_ptr ManagedScriptableRenderPipelineAsset::ResolveSharedPipelineBackendAsset() const { if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { return runtime->GetSharedPipelineBackendAsset(); } return nullptr; } ScriptableRenderPipelineHostAsset ManagedScriptableRenderPipelineAsset::CreateExecutionHostAsset() const { const std::shared_ptr runtime = ResolveManagedAssetRuntime(); if (const std::shared_ptr pipelineBackendAsset = ResolveSharedPipelineBackendAsset(); pipelineBackendAsset != nullptr) { return ScriptableRenderPipelineHostAsset( pipelineBackendAsset, runtime); } return ScriptableRenderPipelineHostAsset( nullptr, runtime); } std::unique_ptr ManagedScriptableRenderPipelineAsset::CreatePipeline() const { const ScriptableRenderPipelineHostAsset executionHostAsset = CreateExecutionHostAsset(); std::unique_ptr pipeline = 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 { if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { runtime->ConfigureCameraRenderRequest( request, renderedBaseCameraCount, renderedRequestCount, directionalShadowSettings); return; } RenderPipelineAsset::ConfigureCameraRenderRequest( request, renderedBaseCameraCount, renderedRequestCount, directionalShadowSettings); } void ManagedScriptableRenderPipelineAsset::ConfigureCameraFramePlan( CameraFramePlan& plan) const { if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { runtime->ConfigureCameraFramePlan(plan); return; } RenderPipelineAsset::ConfigureCameraFramePlan(plan); } FinalColorSettings ManagedScriptableRenderPipelineAsset::GetDefaultFinalColorSettings() const { if (const std::shared_ptr runtime = ResolveManagedAssetRuntime(); runtime != nullptr) { FinalColorSettings settings = {}; if (runtime->TryGetDefaultFinalColorSettings(settings)) { return settings; } } const ScriptableRenderPipelineHostAsset executionHostAsset = CreateExecutionHostAsset(); return executionHostAsset.GetDefaultFinalColorSettings(); } 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