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);