diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index 2eb8ed34..89eb851e 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -197,9 +197,6 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/LightingData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderClearFlags.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderEnvironmentMode.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipeline.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipelineAsset.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RendererDrivenRenderPipeline.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderPassEvent.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderingData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/RenderingDataResolver.cs @@ -211,6 +208,7 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/ScriptableRendererFeature.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/CameraRenderRequestContextExtensions.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/StageColorData.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipeline.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderer.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRendererData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs diff --git a/managed/GameScripts/RenderPipelineApiProbe.cs b/managed/GameScripts/RenderPipelineApiProbe.cs index ddd0a25a..8687ceee 100644 --- a/managed/GameScripts/RenderPipelineApiProbe.cs +++ b/managed/GameScripts/RenderPipelineApiProbe.cs @@ -725,6 +725,40 @@ namespace Gameplay } } + public abstract class ProbeRendererPipeline + : ScriptableRenderPipeline + { + private ScriptableRenderer m_renderer; + + protected abstract ScriptableRenderer CreateRenderer(); + + protected override bool SupportsStageRenderGraph( + CameraFrameStage stage) + { + ScriptableRenderer renderer = GetOrCreateRenderer(); + return renderer != null && + renderer.SupportsStageRenderGraph(stage); + } + + protected override bool RecordStageRenderGraph( + ScriptableRenderContext context) + { + ScriptableRenderer renderer = GetOrCreateRenderer(); + return renderer != null && + renderer.RecordStageRenderGraph(context); + } + + private ScriptableRenderer GetOrCreateRenderer() + { + if (m_renderer == null) + { + m_renderer = CreateRenderer(); + } + + return m_renderer; + } + } + public sealed class LegacyRenderPipelineApiProbeAsset : RenderPipelineAsset { } @@ -796,16 +830,35 @@ namespace Gameplay } } + internal sealed class ManagedCameraRequestConfiguredRenderPipelineProbe + : ProbeRendererPipeline + { + protected override ScriptableRenderer CreateRenderer() + { + return new ProbeSceneRenderer(); + } + } + public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset - : RendererBackedRenderPipelineAsset + : ScriptableRenderPipelineAsset { private readonly ManagedCameraRequestConfiguredRendererData m_rendererData = new ManagedCameraRequestConfiguredRendererData(); - protected override ScriptableRendererData GetRendererData() + protected override ScriptableRenderPipeline CreatePipeline() { - return m_rendererData; + return new ManagedCameraRequestConfiguredRenderPipelineProbe(); + } + + protected override void ConfigureCameraRenderRequest( + CameraRenderRequestContext context) + { + if (context != null && + context.HasDirectionalShadow()) + { + context.ClearDirectionalShadow(); + } } } @@ -857,7 +910,7 @@ namespace Gameplay } public sealed class ManagedRenderPipelineProbe - : RendererBackedRenderPipeline + : ProbeRendererPipeline { public static int SupportsStageCallCount; public static int RecordStageCallCount; @@ -883,7 +936,7 @@ namespace Gameplay } public sealed class ManagedPostProcessRenderPipelineProbe - : RendererBackedRenderPipeline + : ProbeRendererPipeline { protected override ScriptableRenderer CreateRenderer() { @@ -894,7 +947,7 @@ namespace Gameplay } public sealed class ManagedUniversalRenderPipelineProbe - : RendererBackedRenderPipeline + : ProbeRendererPipeline { public static int SupportsMainSceneCallCount; public static int SupportsPostProcessCallCount; @@ -961,7 +1014,7 @@ namespace Gameplay } public sealed class ManagedPlannedFullscreenRenderPipelineProbe - : RendererBackedRenderPipeline + : ProbeRendererPipeline { protected override ScriptableRenderer CreateRenderer() { @@ -970,7 +1023,7 @@ namespace Gameplay } public sealed class ManagedRenderContextCameraDataProbe - : RendererBackedRenderPipeline + : ProbeRendererPipeline { protected override ScriptableRenderer CreateRenderer() { @@ -979,7 +1032,7 @@ namespace Gameplay } public sealed class ManagedRenderContextStageColorDataProbe - : RendererBackedRenderPipeline + : ProbeRendererPipeline { protected override ScriptableRenderer CreateRenderer() { diff --git a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs index 8ebe7b7e..a769601d 100644 --- a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs +++ b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs @@ -31,6 +31,9 @@ namespace Gameplay public bool HasRendererFeatureConfigureCameraFramePlan; public bool HasRendererRecordingContextType; public bool HasRendererCameraRequestContextType; + public bool HasRendererBackedRenderPipelineAssetType; + public bool HasRendererBackedRenderPipelineType; + public bool HasRendererDrivenRenderPipelineType; public void Start() { @@ -154,6 +157,15 @@ namespace Gameplay HasRendererCameraRequestContextType = System.Type.GetType( "XCEngine.Rendering.Universal.RendererCameraRequestContext, XCEngine.RenderPipelines.Universal") != null; + HasRendererBackedRenderPipelineAssetType = + System.Type.GetType( + "XCEngine.Rendering.Universal.RendererBackedRenderPipelineAsset, XCEngine.RenderPipelines.Universal") != null; + HasRendererBackedRenderPipelineType = + System.Type.GetType( + "XCEngine.Rendering.Universal.RendererBackedRenderPipeline, XCEngine.RenderPipelines.Universal") != null; + HasRendererDrivenRenderPipelineType = + System.Type.GetType( + "XCEngine.Rendering.Universal.RendererDrivenRenderPipeline, XCEngine.RenderPipelines.Universal") != null; } } } diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipelineAsset.cs deleted file mode 100644 index c969f663..00000000 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipelineAsset.cs +++ /dev/null @@ -1,42 +0,0 @@ -using XCEngine; -using XCEngine.Rendering; - -namespace XCEngine.Rendering.Universal -{ - public abstract class RendererBackedRenderPipelineAsset - : ScriptableRenderPipelineAsset - { - protected RendererBackedRenderPipelineAsset() - { - } - - protected override ScriptableRenderPipeline CreatePipeline() - { - ScriptableRendererData rendererData = - ResolveRendererData(); - return rendererData != null - ? new RendererDrivenRenderPipeline(rendererData) - : null; - } - - protected override void ConfigureCameraRenderRequest( - CameraRenderRequestContext context) - { - ScriptableRendererData rendererData = - ResolveRendererData(); - if (rendererData != null) - { - rendererData.ConfigureCameraRenderRequestInstance( - context); - } - } - - protected abstract ScriptableRendererData GetRendererData(); - - private ScriptableRendererData ResolveRendererData() - { - return GetRendererData(); - } - } -} - diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/RendererDrivenRenderPipeline.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/RendererDrivenRenderPipeline.cs deleted file mode 100644 index ae97b0a6..00000000 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/RendererDrivenRenderPipeline.cs +++ /dev/null @@ -1,25 +0,0 @@ -using XCEngine; -using XCEngine.Rendering; - -namespace XCEngine.Rendering.Universal -{ - public class RendererDrivenRenderPipeline - : RendererBackedRenderPipeline - { - private readonly ScriptableRendererData m_rendererData; - - public RendererDrivenRenderPipeline( - ScriptableRendererData rendererData) - { - m_rendererData = rendererData; - } - - protected internal override ScriptableRenderer CreateRenderer() - { - return m_rendererData != null - ? m_rendererData.CreateRendererInstance() - : null; - } - } -} - diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs index 9b087f9b..5e6b9824 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs @@ -53,7 +53,7 @@ namespace XCEngine.Rendering.Universal { } - internal bool SupportsStageRenderGraph( + public bool SupportsStageRenderGraph( CameraFrameStage stage) { RenderingData renderingData = new RenderingData(stage); @@ -71,7 +71,7 @@ namespace XCEngine.Rendering.Universal return false; } - internal bool RecordStageRenderGraph( + public bool RecordStageRenderGraph( ScriptableRenderContext context) { if (context == null) diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipeline.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipeline.cs similarity index 68% rename from managed/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipeline.cs rename to managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipeline.cs index 3cce32fc..2a53fd5b 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/RendererBackedRenderPipeline.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipeline.cs @@ -3,18 +3,16 @@ using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { - public abstract class RendererBackedRenderPipeline + internal sealed class UniversalRenderPipeline : ScriptableRenderPipeline { + private readonly ScriptableRendererData m_rendererData; private ScriptableRenderer m_renderer; - protected RendererBackedRenderPipeline() + public UniversalRenderPipeline( + ScriptableRendererData rendererData) { - } - - protected internal virtual ScriptableRenderer CreateRenderer() - { - return null; + m_rendererData = rendererData; } protected override bool SupportsStageRenderGraph( @@ -33,18 +31,16 @@ namespace XCEngine.Rendering.Universal renderer.RecordStageRenderGraph(context); } - protected ScriptableRenderer renderer => - GetOrCreateRenderer(); - private ScriptableRenderer GetOrCreateRenderer() { - if (m_renderer == null) + if (m_renderer == null && + m_rendererData != null) { - m_renderer = CreateRenderer(); + m_renderer = + m_rendererData.CreateRendererInstance(); } return m_renderer; } } } - diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs index 22f66297..409b4c03 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs @@ -4,12 +4,33 @@ using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { public class UniversalRenderPipelineAsset - : RendererBackedRenderPipelineAsset + : ScriptableRenderPipelineAsset { public UniversalRendererData rendererData = new UniversalRendererData(); - protected override ScriptableRendererData GetRendererData() + protected override ScriptableRenderPipeline CreatePipeline() + { + ScriptableRendererData resolvedRendererData = + ResolveRendererData(); + return resolvedRendererData != null + ? new UniversalRenderPipeline(resolvedRendererData) + : null; + } + + protected override void ConfigureCameraRenderRequest( + CameraRenderRequestContext context) + { + ScriptableRendererData resolvedRendererData = + ResolveRendererData(); + if (resolvedRendererData != null) + { + resolvedRendererData.ConfigureCameraRenderRequestInstance( + context); + } + } + + private ScriptableRendererData ResolveRendererData() { if (rendererData == null) { diff --git a/tests/scripting/test_mono_script_runtime.cpp b/tests/scripting/test_mono_script_runtime.cpp index 79060312..4eeb658e 100644 --- a/tests/scripting/test_mono_script_runtime.cpp +++ b/tests/scripting/test_mono_script_runtime.cpp @@ -1174,6 +1174,9 @@ TEST_F( bool hasRendererFeatureConfigureCameraFramePlan = false; bool hasRendererRecordingContextType = false; bool hasRendererCameraRequestContextType = false; + bool hasRendererBackedRenderPipelineAssetType = false; + bool hasRendererBackedRenderPipelineType = false; + bool hasRendererDrivenRenderPipelineType = false; EXPECT_TRUE(runtime->TryGetFieldValue( selectionScript, @@ -1267,6 +1270,18 @@ TEST_F( selectionScript, "HasRendererCameraRequestContextType", hasRendererCameraRequestContextType)); + EXPECT_TRUE(runtime->TryGetFieldValue( + selectionScript, + "HasRendererBackedRenderPipelineAssetType", + hasRendererBackedRenderPipelineAssetType)); + EXPECT_TRUE(runtime->TryGetFieldValue( + selectionScript, + "HasRendererBackedRenderPipelineType", + hasRendererBackedRenderPipelineType)); + EXPECT_TRUE(runtime->TryGetFieldValue( + selectionScript, + "HasRendererDrivenRenderPipelineType", + hasRendererDrivenRenderPipelineType)); EXPECT_FALSE(hasPublicContextRecordScene); EXPECT_FALSE(hasPublicContextRecordOpaqueScenePhase); @@ -1291,6 +1306,9 @@ TEST_F( EXPECT_FALSE(hasRendererFeatureConfigureCameraFramePlan); EXPECT_FALSE(hasRendererRecordingContextType); EXPECT_FALSE(hasRendererCameraRequestContextType); + EXPECT_FALSE(hasRendererBackedRenderPipelineAssetType); + EXPECT_FALSE(hasRendererBackedRenderPipelineType); + EXPECT_FALSE(hasRendererDrivenRenderPipelineType); } TEST_F(