diff --git a/engine/include/XCEngine/Rendering/Execution/DrawSettings.h b/engine/include/XCEngine/Rendering/Execution/DrawSettings.h index de169b2c..43db05e7 100644 --- a/engine/include/XCEngine/Rendering/Execution/DrawSettings.h +++ b/engine/include/XCEngine/Rendering/Execution/DrawSettings.h @@ -8,7 +8,7 @@ namespace Rendering { struct DrawSettings { ScenePhase scenePhase = ScenePhase::Opaque; - RendererListType rendererListType = RendererListType::AllVisible; + RendererListDesc rendererListDesc = {}; }; } // namespace Rendering diff --git a/engine/include/XCEngine/Rendering/FrameData/CullingResults.h b/engine/include/XCEngine/Rendering/FrameData/CullingResults.h index 5b44c910..9db423f0 100644 --- a/engine/include/XCEngine/Rendering/FrameData/CullingResults.h +++ b/engine/include/XCEngine/Rendering/FrameData/CullingResults.h @@ -28,16 +28,33 @@ struct FilteringSettings { Core::int32 renderQueueMax = std::numeric_limits::max(); bool requireShadowCasting = false; bool requireRenderObjectId = false; + + bool operator==(const FilteringSettings& other) const { + return renderQueueMin == other.renderQueueMin && + renderQueueMax == other.renderQueueMax && + requireShadowCasting == other.requireShadowCasting && + requireRenderObjectId == other.requireRenderObjectId; + } }; struct SortingSettings { RendererSortMode sortMode = RendererSortMode::None; + + bool operator==(const SortingSettings& other) const { + return sortMode == other.sortMode; + } }; struct RendererListDesc { RendererListType type = RendererListType::AllVisible; FilteringSettings filtering = {}; SortingSettings sorting = {}; + + bool operator==(const RendererListDesc& other) const { + return type == other.type && + filtering == other.filtering && + sorting == other.sorting; + } }; struct RendererList { diff --git a/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h b/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h index ea7140e7..a0c6305a 100644 --- a/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h +++ b/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h @@ -4,7 +4,9 @@ #include #include +#include #include +#include namespace XCEngine { namespace Rendering { @@ -141,5 +143,70 @@ inline void VisitRendererListVisibleItems( } } +template +inline void VisitRendererListVisibleItems( + const RenderSceneData& sceneData, + const RendererListDesc& rendererListDesc, + Visitor&& visitor) { + const RendererListDesc defaultDesc = + BuildDefaultRendererListDesc( + rendererListDesc.type); + if (rendererListDesc == defaultDesc) { + VisitRendererListVisibleItems( + sceneData, + rendererListDesc.type, + std::forward(visitor)); + return; + } + + std::vector matchedItems; + matchedItems.reserve(sceneData.visibleItems.size()); + for (const VisibleRenderItem& visibleItem : sceneData.visibleItems) { + if (!MatchesRendererListDesc( + visibleItem, + rendererListDesc)) { + continue; + } + + matchedItems.push_back(&visibleItem); + } + + switch (rendererListDesc.sorting.sortMode) { + case RendererSortMode::FrontToBack: + std::stable_sort( + matchedItems.begin(), + matchedItems.end(), + [](const VisibleRenderItem* lhs, const VisibleRenderItem* rhs) { + return lhs != nullptr && + rhs != nullptr && + lhs->cameraDistanceSq < + rhs->cameraDistanceSq; + }); + break; + case RendererSortMode::BackToFront: + std::stable_sort( + matchedItems.begin(), + matchedItems.end(), + [](const VisibleRenderItem* lhs, const VisibleRenderItem* rhs) { + return lhs != nullptr && + rhs != nullptr && + lhs->cameraDistanceSq > + rhs->cameraDistanceSq; + }); + break; + case RendererSortMode::None: + default: + break; + } + + for (const VisibleRenderItem* visibleItem : matchedItems) { + if (visibleItem == nullptr) { + continue; + } + + visitor(*visibleItem); + } +} + } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineScenePhases.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineScenePhases.cpp index cc156ca3..dfb5b2d6 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineScenePhases.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineScenePhases.cpp @@ -1,6 +1,7 @@ #include "Rendering/Pipelines/BuiltinForwardPipeline.h" #include "Debug/Logger.h" +#include "Rendering/FrameData/RendererListUtils.h" #include "Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h" namespace XCEngine { @@ -21,13 +22,19 @@ DrawSettings BuiltinForwardPipeline::BuildDrawSettings(ScenePhase scenePhase) co drawSettings.scenePhase = scenePhase; switch (scenePhase) { case ScenePhase::Opaque: - drawSettings.rendererListType = RendererListType::Opaque; + drawSettings.rendererListDesc = + BuildDefaultRendererListDesc( + RendererListType::Opaque); break; case ScenePhase::Transparent: - drawSettings.rendererListType = RendererListType::Transparent; + drawSettings.rendererListDesc = + BuildDefaultRendererListDesc( + RendererListType::Transparent); break; default: - drawSettings.rendererListType = RendererListType::AllVisible; + drawSettings.rendererListDesc = + BuildDefaultRendererListDesc( + RendererListType::AllVisible); break; } diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineSurface.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineSurface.cpp index 32e0c297..837a5a27 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineSurface.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineSurface.cpp @@ -606,7 +606,10 @@ bool BuiltinForwardPipeline::DrawVisibleItems( } }; - VisitRendererListVisibleItems(sceneData, drawSettings.rendererListType, drawVisibleItem); + VisitRendererListVisibleItems( + sceneData, + drawSettings.rendererListDesc, + drawVisibleItem); return !drawFailed; } diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index d825a65e..93f063a6 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -929,6 +929,39 @@ static_assert( sizeof(Rendering::RenderGraphTextureDesc), "Managed render graph texture desc bridge layout must match native RenderGraphTextureDesc."); +struct ManagedFilteringSettingsData { + int32_t renderQueueMin = std::numeric_limits::lowest(); + int32_t renderQueueMax = std::numeric_limits::max(); + uint8_t requireShadowCasting = 0u; + uint8_t requireRenderObjectId = 0u; + uint8_t padding[2] = {}; +}; + +static_assert( + sizeof(ManagedFilteringSettingsData) == + sizeof(Rendering::FilteringSettings), + "Managed filtering settings bridge layout must match native FilteringSettings."); + +struct ManagedSortingSettingsData { + uint32_t sortMode = 0u; +}; + +static_assert( + sizeof(ManagedSortingSettingsData) == + sizeof(Rendering::SortingSettings), + "Managed sorting settings bridge layout must match native SortingSettings."); + +struct ManagedRendererListDescData { + uint32_t type = 0u; + ManagedFilteringSettingsData filtering = {}; + ManagedSortingSettingsData sorting = {}; +}; + +static_assert( + sizeof(ManagedRendererListDescData) == + sizeof(Rendering::RendererListDesc), + "Managed renderer list desc bridge layout must match native RendererListDesc."); + Rendering::FinalColorOutputTransferMode ResolveManagedFinalColorOutputTransferMode( uint8_t value) { switch (value) { @@ -4554,24 +4587,26 @@ InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint( } mono_bool -InternalCall_Rendering_ScriptableRenderContext_DrawRenderers( +InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc( uint64_t nativeHandle, int32_t scenePhase, - int32_t rendererListType) { + ManagedRendererListDescData* rendererListDescData) { ManagedScriptableRenderContextState* const state = FindManagedScriptableRenderContextState(nativeHandle); if (state == nullptr || state->graphContext == nullptr || state->sceneRecorder == nullptr || - state->stage != Rendering::CameraFrameStage::MainScene) { + state->stage != Rendering::CameraFrameStage::MainScene || + rendererListDescData == nullptr) { return 0; } Rendering::DrawSettings drawSettings = {}; drawSettings.scenePhase = static_cast(scenePhase); - drawSettings.rendererListType = - static_cast(rendererListType); + drawSettings.rendererListDesc = + *reinterpret_cast( + rendererListDescData); return state->sceneRecorder->RecordSceneDrawSettings( drawSettings) ? 1 @@ -4923,7 +4958,7 @@ void RegisterInternalCalls() { mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScenePhase", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase)); - mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderers", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderers)); + mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderersByDesc", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordSceneInjectionPoint", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource)); diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index 3e5b751c..49e6ee22 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -177,15 +177,19 @@ set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FinalColorOutputTransferMode.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FinalColorSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FinalColorToneMappingMode.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/GraphicsSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderPipelineAsset.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RendererListDesc.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RendererListType.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RendererSortMode.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/SceneRenderInjectionPoint.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/SceneRenderPhase.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipeline.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineAsset.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelinePlanningContext.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/SortingSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/CameraRenderRequestContext.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Graph/RenderGraphRasterPassBuilder.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Graph/RenderGraphTextureDesc.cs @@ -199,12 +203,14 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DirectionalLightData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DirectionalShadowData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DisableDirectionalShadowRendererFeature.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DrawObjectsPass.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/EnvironmentData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/FinalColorData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/LightingData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderClearFlags.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderEnvironmentMode.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderPassEvent.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipeline.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererCameraRequestContext.cs diff --git a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs index 37b4a05d..e153711e 100644 --- a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs +++ b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs @@ -11,7 +11,8 @@ namespace Gameplay public bool HasPublicContextRecordScene; public bool HasPublicContextRecordScenePhase; public bool HasPublicContextRecordSceneInjectionPoint; - public bool HasPublicContextDrawRenderers; + public bool HasPublicContextDrawRenderersByType; + public bool HasPublicContextDrawRenderersByDesc; public bool HasPublicContextDrawOpaqueRenderers; public bool HasPublicContextDrawTransparentRenderers; public bool HasPublicContextRecordOpaqueScenePhase; @@ -65,6 +66,10 @@ namespace Gameplay public bool HasSceneRenderPhaseType; public bool HasSceneRenderInjectionPointType; public bool HasRendererListType; + public bool HasRendererSortModeType; + public bool HasFilteringSettingsType; + public bool HasSortingSettingsType; + public bool HasRendererListDescType; public void Start() { @@ -107,10 +112,28 @@ namespace Gameplay contextType.GetMethod( "RecordSceneInjectionPoint", PublicInstanceMethodFlags) != null; - HasPublicContextDrawRenderers = + HasPublicContextDrawRenderersByType = contextType.GetMethod( "DrawRenderers", - PublicInstanceMethodFlags) != null; + PublicInstanceMethodFlags, + null, + new System.Type[] + { + typeof(SceneRenderPhase), + typeof(RendererListType) + }, + null) != null; + HasPublicContextDrawRenderersByDesc = + contextType.GetMethod( + "DrawRenderers", + PublicInstanceMethodFlags, + null, + new System.Type[] + { + typeof(SceneRenderPhase), + typeof(RendererListDesc) + }, + null) != null; HasPublicContextDrawOpaqueRenderers = contextType.GetMethod( "DrawOpaqueRenderers", @@ -329,6 +352,18 @@ namespace Gameplay HasRendererListType = contextType.Assembly.GetType( "XCEngine.Rendering.RendererListType") != null; + HasRendererSortModeType = + contextType.Assembly.GetType( + "XCEngine.Rendering.RendererSortMode") != null; + HasFilteringSettingsType = + contextType.Assembly.GetType( + "XCEngine.Rendering.FilteringSettings") != null; + HasSortingSettingsType = + contextType.Assembly.GetType( + "XCEngine.Rendering.SortingSettings") != null; + HasRendererListDescType = + contextType.Assembly.GetType( + "XCEngine.Rendering.RendererListDesc") != null; } } } diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/DrawObjectsPass.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/DrawObjectsPass.cs new file mode 100644 index 00000000..44d45090 --- /dev/null +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/DrawObjectsPass.cs @@ -0,0 +1,47 @@ +using XCEngine; +using XCEngine.Rendering; + +namespace XCEngine.Rendering.Universal +{ + public sealed class DrawObjectsPass : ScriptableRenderPass + { + private SceneRenderPhase m_scenePhase = + SceneRenderPhase.Opaque; + private RendererListDesc m_rendererListDesc = + RendererListDesc.CreateDefault( + RendererListType.Opaque); + + public DrawObjectsPass( + RenderPassEvent passEvent, + SceneRenderPhase scenePhase, + RendererListDesc rendererListDesc) + { + Configure( + passEvent, + scenePhase, + rendererListDesc); + } + + public void Configure( + RenderPassEvent passEvent, + SceneRenderPhase scenePhase, + RendererListDesc rendererListDesc) + { + renderPassEvent = passEvent; + m_scenePhase = scenePhase; + m_rendererListDesc = rendererListDesc; + } + + protected override bool RecordRenderGraph( + ScriptableRenderContext context, + RenderingData renderingData) + { + return context != null && + renderingData != null && + renderingData.isMainSceneStage && + context.DrawRenderers( + m_scenePhase, + m_rendererListDesc); + } + } +} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs new file mode 100644 index 00000000..4208683a --- /dev/null +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs @@ -0,0 +1,85 @@ +using XCEngine; +using XCEngine.Rendering; + +namespace XCEngine.Rendering.Universal +{ + public sealed class RenderObjectsRendererFeature + : ScriptableRendererFeature + { + private DrawObjectsPass m_pass; + + public RenderPassEvent passEvent = + RenderPassEvent.AfterRenderingOpaques; + public SceneRenderPhase scenePhase = + SceneRenderPhase.Opaque; + public RendererListType rendererListType = + RendererListType.Opaque; + public bool overrideFilteringSettings; + public FilteringSettings filteringSettings; + public bool overrideSortingSettings; + public SortingSettings sortingSettings; + + public override void Create() + { + RendererListDesc rendererListDesc = + BuildRendererListDesc(); + if (m_pass == null) + { + m_pass = + new DrawObjectsPass( + passEvent, + scenePhase, + rendererListDesc); + return; + } + + m_pass.Configure( + passEvent, + scenePhase, + rendererListDesc); + } + + public override void AddRenderPasses( + ScriptableRenderer renderer, + RenderingData renderingData) + { + if (renderer == null || + renderingData == null || + !renderingData.isMainSceneStage) + { + return; + } + + if (m_pass == null) + { + Create(); + } + + m_pass.Configure( + passEvent, + scenePhase, + BuildRendererListDesc()); + renderer.EnqueuePass(m_pass); + } + + private RendererListDesc BuildRendererListDesc() + { + RendererListDesc rendererListDesc = + RendererListDesc.CreateDefault( + rendererListType); + if (overrideFilteringSettings) + { + rendererListDesc.filtering = + filteringSettings; + } + + if (overrideSortingSettings) + { + rendererListDesc.sorting = + sortingSettings; + } + + return rendererListDesc; + } + } +} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs index 612b0a57..e49a9374 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs @@ -27,34 +27,6 @@ namespace XCEngine.Rendering.Universal } } - internal sealed class UniversalDrawObjectsPass : ScriptableRenderPass - { - private readonly SceneRenderPhase m_scenePhase; - private readonly RendererListType m_rendererListType; - - public UniversalDrawObjectsPass( - RenderPassEvent passEvent, - SceneRenderPhase scenePhase, - RendererListType rendererListType) - { - renderPassEvent = passEvent; - m_scenePhase = scenePhase; - m_rendererListType = rendererListType; - } - - protected override bool RecordRenderGraph( - ScriptableRenderContext context, - RenderingData renderingData) - { - return context != null && - renderingData != null && - renderingData.isMainSceneStage && - context.DrawRenderers( - m_scenePhase, - m_rendererListType); - } - } - internal sealed class UniversalDrawSkyboxPass : ScriptableRenderPass { public UniversalDrawSkyboxPass() @@ -81,11 +53,12 @@ namespace XCEngine.Rendering.Universal new UniversalSceneInjectionPass( RenderPassEvent.BeforeRenderingOpaques, SceneRenderInjectionPoint.BeforeOpaque); - private readonly UniversalDrawObjectsPass m_drawOpaqueObjectsPass = - new UniversalDrawObjectsPass( + private readonly DrawObjectsPass m_drawOpaqueObjectsPass = + new DrawObjectsPass( RenderPassEvent.RenderOpaques, SceneRenderPhase.Opaque, - RendererListType.Opaque); + RendererListDesc.CreateDefault( + RendererListType.Opaque)); private readonly UniversalSceneInjectionPass m_afterOpaquePass = new UniversalSceneInjectionPass( RenderPassEvent.AfterRenderingOpaques, @@ -104,11 +77,12 @@ namespace XCEngine.Rendering.Universal new UniversalSceneInjectionPass( RenderPassEvent.BeforeRenderingTransparents, SceneRenderInjectionPoint.BeforeTransparent); - private readonly UniversalDrawObjectsPass m_drawTransparentObjectsPass = - new UniversalDrawObjectsPass( + private readonly DrawObjectsPass m_drawTransparentObjectsPass = + new DrawObjectsPass( RenderPassEvent.RenderTransparents, SceneRenderPhase.Transparent, - RendererListType.Transparent); + RendererListDesc.CreateDefault( + RendererListType.Transparent)); private readonly UniversalSceneInjectionPass m_afterTransparentPass = new UniversalSceneInjectionPass( RenderPassEvent.AfterRenderingTransparents, diff --git a/managed/XCEngine.ScriptCore/InternalCalls.cs b/managed/XCEngine.ScriptCore/InternalCalls.cs index 60714d02..fad81ffa 100644 --- a/managed/XCEngine.ScriptCore/InternalCalls.cs +++ b/managed/XCEngine.ScriptCore/InternalCalls.cs @@ -778,10 +778,10 @@ namespace XCEngine [MethodImpl(MethodImplOptions.InternalCall)] internal static extern bool - Rendering_ScriptableRenderContext_DrawRenderers( + Rendering_ScriptableRenderContext_DrawRenderersByDesc( ulong nativeHandle, int scenePhase, - int rendererListType); + ref Rendering.RendererListDesc rendererListDesc); [MethodImpl(MethodImplOptions.InternalCall)] internal static extern bool diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs b/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs new file mode 100644 index 00000000..5714c071 --- /dev/null +++ b/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs @@ -0,0 +1,49 @@ +using System.Runtime.InteropServices; + +namespace XCEngine.Rendering +{ + [StructLayout(LayoutKind.Sequential)] + public struct FilteringSettings + { + private const int kTransparentRenderQueue = 3000; + + public int renderQueueMin; + public int renderQueueMax; + + [MarshalAs(UnmanagedType.I1)] + public bool requireShadowCasting; + + [MarshalAs(UnmanagedType.I1)] + public bool requireRenderObjectId; + + public static FilteringSettings CreateDefault( + RendererListType rendererListType) + { + FilteringSettings filteringSettings = + new FilteringSettings + { + renderQueueMin = int.MinValue, + renderQueueMax = int.MaxValue + }; + switch (rendererListType) + { + case RendererListType.Opaque: + filteringSettings.renderQueueMax = + kTransparentRenderQueue - 1; + break; + case RendererListType.Transparent: + filteringSettings.renderQueueMin = + kTransparentRenderQueue; + break; + case RendererListType.ShadowCaster: + filteringSettings.requireShadowCasting = true; + break; + case RendererListType.ObjectId: + filteringSettings.requireRenderObjectId = true; + break; + } + + return filteringSettings; + } + } +} diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/RendererListDesc.cs b/managed/XCEngine.ScriptCore/Rendering/Core/RendererListDesc.cs new file mode 100644 index 00000000..0f53f340 --- /dev/null +++ b/managed/XCEngine.ScriptCore/Rendering/Core/RendererListDesc.cs @@ -0,0 +1,27 @@ +using System.Runtime.InteropServices; + +namespace XCEngine.Rendering +{ + [StructLayout(LayoutKind.Sequential)] + public struct RendererListDesc + { + public RendererListType type; + public FilteringSettings filtering; + public SortingSettings sorting; + + public static RendererListDesc CreateDefault( + RendererListType rendererListType) + { + return new RendererListDesc + { + type = rendererListType, + filtering = + FilteringSettings.CreateDefault( + rendererListType), + sorting = + SortingSettings.CreateDefault( + rendererListType) + }; + } + } +} diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/RendererSortMode.cs b/managed/XCEngine.ScriptCore/Rendering/Core/RendererSortMode.cs new file mode 100644 index 00000000..f8679f3a --- /dev/null +++ b/managed/XCEngine.ScriptCore/Rendering/Core/RendererSortMode.cs @@ -0,0 +1,9 @@ +namespace XCEngine.Rendering +{ + public enum RendererSortMode + { + None = 0, + FrontToBack = 1, + BackToFront = 2 + } +} diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs index 6a3c7a9a..c795b865 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs @@ -67,12 +67,22 @@ namespace XCEngine.Rendering public bool DrawRenderers( SceneRenderPhase scenePhase, RendererListType rendererListType) + { + return DrawRenderers( + scenePhase, + RendererListDesc.CreateDefault( + rendererListType)); + } + + public bool DrawRenderers( + SceneRenderPhase scenePhase, + RendererListDesc rendererListDesc) { return InternalCalls - .Rendering_ScriptableRenderContext_DrawRenderers( + .Rendering_ScriptableRenderContext_DrawRenderersByDesc( m_nativeHandle, (int)scenePhase, - (int)rendererListType); + ref rendererListDesc); } public bool RecordOpaqueScenePhase() @@ -133,14 +143,16 @@ namespace XCEngine.Rendering { return DrawRenderers( SceneRenderPhase.Opaque, - RendererListType.Opaque); + RendererListDesc.CreateDefault( + RendererListType.Opaque)); } public bool DrawTransparentRenderers() { return DrawRenderers( SceneRenderPhase.Transparent, - RendererListType.Transparent); + RendererListDesc.CreateDefault( + RendererListType.Transparent)); } public RenderGraphTextureHandle CreateTransientTexture( diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/SortingSettings.cs b/managed/XCEngine.ScriptCore/Rendering/Core/SortingSettings.cs new file mode 100644 index 00000000..28da0ff8 --- /dev/null +++ b/managed/XCEngine.ScriptCore/Rendering/Core/SortingSettings.cs @@ -0,0 +1,36 @@ +using System.Runtime.InteropServices; + +namespace XCEngine.Rendering +{ + [StructLayout(LayoutKind.Sequential)] + public struct SortingSettings + { + public RendererSortMode sortMode; + + public static SortingSettings CreateDefault( + RendererListType rendererListType) + { + SortingSettings sortingSettings = + new SortingSettings(); + switch (rendererListType) + { + case RendererListType.Opaque: + case RendererListType.ShadowCaster: + case RendererListType.ObjectId: + sortingSettings.sortMode = + RendererSortMode.FrontToBack; + break; + case RendererListType.Transparent: + sortingSettings.sortMode = + RendererSortMode.BackToFront; + break; + default: + sortingSettings.sortMode = + RendererSortMode.None; + break; + } + + return sortingSettings; + } + } +} diff --git a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs index 56997a7c..267a3f48 100644 --- a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs +++ b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs @@ -119,33 +119,44 @@ namespace ProjectScripts } } - public sealed class ProjectCustomOpaquePass - : ScriptableRenderPass + public sealed class ProjectRenderObjectsFeaturePipelineAsset + : UniversalRenderPipelineAsset { - public ProjectCustomOpaquePass() + public ProjectRenderObjectsFeaturePipelineAsset() { - renderPassEvent = - RenderPassEvent.RenderOpaques; - } - - protected override bool RecordRenderGraph( - ScriptableRenderContext context, - RenderingData renderingData) - { - return context != null && - renderingData != null && - renderingData.isMainSceneStage && - context.DrawRenderers( - SceneRenderPhase.Opaque, - RendererListType.Opaque); + rendererDataList = new ScriptableRendererData[] + { + new UniversalRendererData + { + renderOpaque = false, + renderSkybox = false, + renderTransparent = false, + rendererFeatures = new ScriptableRendererFeature[] + { + new RenderObjectsRendererFeature + { + passEvent = + RenderPassEvent.RenderOpaques, + scenePhase = + SceneRenderPhase.Opaque, + rendererListType = + RendererListType.Opaque + } + } + } + }; } } public sealed class ProjectCustomRenderer : ScriptableRenderer { - private readonly ProjectCustomOpaquePass m_opaquePass = - new ProjectCustomOpaquePass(); + private readonly DrawObjectsPass m_opaquePass = + new DrawObjectsPass( + RenderPassEvent.RenderOpaques, + SceneRenderPhase.Opaque, + RendererListDesc.CreateDefault( + RendererListType.Opaque)); protected override void AddRenderPasses( RenderingData renderingData)