diff --git a/engine/include/XCEngine/Rendering/FrameData/CullingResults.h b/engine/include/XCEngine/Rendering/FrameData/CullingResults.h index 9db423f0..9d3fbf1d 100644 --- a/engine/include/XCEngine/Rendering/FrameData/CullingResults.h +++ b/engine/include/XCEngine/Rendering/FrameData/CullingResults.h @@ -26,12 +26,14 @@ enum class RendererSortMode : Core::uint32 { struct FilteringSettings { Core::int32 renderQueueMin = std::numeric_limits::lowest(); Core::int32 renderQueueMax = std::numeric_limits::max(); + Core::uint32 renderLayerMask = std::numeric_limits::max(); bool requireShadowCasting = false; bool requireRenderObjectId = false; bool operator==(const FilteringSettings& other) const { return renderQueueMin == other.renderQueueMin && renderQueueMax == other.renderQueueMax && + renderLayerMask == other.renderLayerMask && requireShadowCasting == other.requireShadowCasting && requireRenderObjectId == other.requireRenderObjectId; } diff --git a/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h b/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h index a0c6305a..464aab28 100644 --- a/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h +++ b/engine/include/XCEngine/Rendering/FrameData/RendererListUtils.h @@ -72,6 +72,12 @@ inline bool MatchesFilteringSettings( return false; } + if (visibleItem.renderLayer >= 32u || + ((filtering.renderLayerMask & + (1u << visibleItem.renderLayer)) == 0u)) { + return false; + } + if (filtering.requireShadowCasting && visibleItem.meshRenderer != nullptr && !visibleItem.meshRenderer->GetCastShadows()) { diff --git a/engine/include/XCEngine/Rendering/FrameData/VisibleRenderItem.h b/engine/include/XCEngine/Rendering/FrameData/VisibleRenderItem.h index 21abe9a0..7174443d 100644 --- a/engine/include/XCEngine/Rendering/FrameData/VisibleRenderItem.h +++ b/engine/include/XCEngine/Rendering/FrameData/VisibleRenderItem.h @@ -24,6 +24,7 @@ struct VisibleRenderItem { Core::uint32 materialIndex = 0; Core::uint32 sectionIndex = 0; bool hasSection = false; + Core::uint32 renderLayer = 0; Core::int32 renderQueue = 0; float cameraDistanceSq = 0.0f; Math::Matrix4x4 localToWorld = Math::Matrix4x4::Identity(); diff --git a/engine/src/Rendering/Extraction/RenderSceneUtility.cpp b/engine/src/Rendering/Extraction/RenderSceneUtility.cpp index 130c4dd4..ea468125 100644 --- a/engine/src/Rendering/Extraction/RenderSceneUtility.cpp +++ b/engine/src/Rendering/Extraction/RenderSceneUtility.cpp @@ -116,6 +116,7 @@ void AppendRenderItemsForGameObject( visibleItem.renderObjectId = renderObjectId; visibleItem.sectionIndex = static_cast(sectionIndex); visibleItem.hasSection = true; + visibleItem.renderLayer = meshRenderer->GetRenderLayer(); visibleItem.material = ResolveMaterial(meshRenderer, mesh, section.materialID); visibleItem.renderQueue = ResolveMaterialRenderQueue(visibleItem.material); visibleItem.cameraDistanceSq = cameraDistanceSq; @@ -134,6 +135,7 @@ void AppendRenderItemsForGameObject( visibleItem.materialIndex = 0; visibleItem.sectionIndex = 0; visibleItem.hasSection = false; + visibleItem.renderLayer = meshRenderer->GetRenderLayer(); visibleItem.material = ResolveMaterial(meshRenderer, mesh, 0); visibleItem.renderQueue = ResolveMaterialRenderQueue(visibleItem.material); visibleItem.cameraDistanceSq = cameraDistanceSq; diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index 93f063a6..7b625734 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -932,9 +932,9 @@ static_assert( struct ManagedFilteringSettingsData { int32_t renderQueueMin = std::numeric_limits::lowest(); int32_t renderQueueMax = std::numeric_limits::max(); + uint32_t renderLayerMask = std::numeric_limits::max(); uint8_t requireShadowCasting = 0u; uint8_t requireRenderObjectId = 0u; - uint8_t padding[2] = {}; }; static_assert( diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs index f4954f1c..d125c628 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs @@ -17,6 +17,8 @@ namespace XCEngine.Rendering.Universal public bool overrideRenderQueueRange; public RenderQueueRange renderQueueRange = RenderQueueRange.Opaque; + public bool overrideRenderLayerMask; + public uint renderLayerMask = uint.MaxValue; public bool overrideFilteringSettings; public FilteringSettings filteringSettings; public bool overrideSortingSettings; @@ -82,6 +84,12 @@ namespace XCEngine.Rendering.Universal renderQueueRange; } + if (overrideRenderLayerMask) + { + rendererListDesc.filtering.renderLayerMask = + renderLayerMask; + } + if (overrideSortingSettings) { rendererListDesc.sorting = diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs b/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs index 60f852a1..53828b31 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs @@ -7,6 +7,7 @@ namespace XCEngine.Rendering { public int renderQueueMin; public int renderQueueMax; + public uint renderLayerMask; [MarshalAs(UnmanagedType.I1)] public bool requireShadowCasting; @@ -34,7 +35,8 @@ namespace XCEngine.Rendering { return new FilteringSettings { - renderQueueRange = renderQueueRange + renderQueueRange = renderQueueRange, + renderLayerMask = uint.MaxValue }; } diff --git a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs index ffbae9ea..a5acf9a9 100644 --- a/project/Assets/Scripts/ProjectRenderPipelineProbe.cs +++ b/project/Assets/Scripts/ProjectRenderPipelineProbe.cs @@ -142,6 +142,8 @@ namespace ProjectScripts overrideRenderQueueRange = true, renderQueueRange = RenderQueueRange.Opaque, + overrideRenderLayerMask = true, + renderLayerMask = 1u << 0, rendererListType = RendererListType.Opaque }