diff --git a/Source/Engine/Graphics/RenderView.h b/Source/Engine/Graphics/RenderView.h index 0b37e8b28..b44810648 100644 --- a/Source/Engine/Graphics/RenderView.h +++ b/Source/Engine/Graphics/RenderView.h @@ -127,6 +127,11 @@ public: /// API_FIELD() StaticFlags StaticFlagsMask = StaticFlags::None; + /// + /// The static flags mask comparision rhs. Allows to draw objects that don't pass the static flags mask. Objects are checked with the following formula: (ObjectStaticFlags and StaticFlagsMask) == StaticFlagsMaskCompare. + /// + API_FIELD() StaticFlags StaticFlagsCompare = StaticFlags::None; + /// /// The view flags. /// diff --git a/Source/Engine/Level/Scene/SceneRendering.cpp b/Source/Engine/Level/Scene/SceneRendering.cpp index 00084eef1..69d8edf4c 100644 --- a/Source/Engine/Level/Scene/SceneRendering.cpp +++ b/Source/Engine/Level/Scene/SceneRendering.cpp @@ -212,12 +212,12 @@ void SceneRendering::DrawActorsJob(int32) PROFILE_CPU(); auto& mainContext = _drawBatch->GetMainContext(); const auto& view = mainContext.View; - if (view.IsOfflinePass) + if (view.StaticFlagsMask != StaticFlags::None) { - // Offline pass with additional static flags culling + // Static-flags culling FOR_EACH_BATCH_ACTOR e.Bounds.Center -= view.Origin; - if (CHECK_ACTOR && (e.Actor->GetStaticFlags() & view.StaticFlagsMask) != StaticFlags::None) + if (CHECK_ACTOR && (e.Actor->GetStaticFlags() & view.StaticFlagsMask) == view.StaticFlagsCompare) { DRAW_ACTOR(*_drawBatch); } diff --git a/Source/Engine/Renderer/ProbesRenderer.cpp b/Source/Engine/Renderer/ProbesRenderer.cpp index f604f914e..dd88edc8c 100644 --- a/Source/Engine/Renderer/ProbesRenderer.cpp +++ b/Source/Engine/Renderer/ProbesRenderer.cpp @@ -273,7 +273,7 @@ bool ProbesRenderer::Init() view.Mode = ViewMode::NoPostFx; view.IsOfflinePass = true; view.IsSingleFrame = true; - view.StaticFlagsMask = StaticFlags::ReflectionProbe; + view.StaticFlagsMask = view.StaticFlagsCompare = StaticFlags::ReflectionProbe; view.MaxShadowsQuality = Quality::Low; task->IsCameraCut = true; task->Resize(probeResolution, probeResolution); diff --git a/Source/Engine/Renderer/RenderList.cpp b/Source/Engine/Renderer/RenderList.cpp index 4039c5565..a3a99a3ee 100644 --- a/Source/Engine/Renderer/RenderList.cpp +++ b/Source/Engine/Renderer/RenderList.cpp @@ -569,7 +569,9 @@ void RenderList::AddDrawCall(const RenderContextBatch& renderContextBatch, DrawP const RenderContext& renderContext = renderContextBatch.Contexts.Get()[i]; ASSERT_LOW_LAYER(renderContext.View.Pass == DrawPass::Depth); drawModes = modes & renderContext.View.Pass; - if (drawModes != DrawPass::None && renderContext.View.CullingFrustum.Intersects(bounds)) + if (drawModes != DrawPass::None && + (staticFlags & renderContext.View.StaticFlagsMask) == renderContext.View.StaticFlagsCompare && + renderContext.View.CullingFrustum.Intersects(bounds)) { renderContext.List->ShadowDepthDrawCallsList.Indices.Add(index); } diff --git a/Source/Engine/ShadowsOfMordor/Builder.cpp b/Source/Engine/ShadowsOfMordor/Builder.cpp index b9a9305c4..80c59e225 100644 --- a/Source/Engine/ShadowsOfMordor/Builder.cpp +++ b/Source/Engine/ShadowsOfMordor/Builder.cpp @@ -457,7 +457,7 @@ bool ShadowsOfMordor::Builder::initResources() view.IsOfflinePass = true; view.Near = HEMISPHERES_NEAR_PLANE; view.Far = HEMISPHERES_FAR_PLANE; - view.StaticFlagsMask = StaticFlags::Lightmap; + view.StaticFlagsMask = view.StaticFlagsCompare = StaticFlags::Lightmap; view.MaxShadowsQuality = Quality::Low; _task->Resize(HEMISPHERES_RESOLUTION, HEMISPHERES_RESOLUTION);