ShowFlag.SelectionOutline
ShowFlag.SelectionOutline
#Overview
name: ShowFlag.SelectionOutline
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
Allows to override a specific showflag (works in editor and game, \
It is referenced in 15
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of ShowFlag.SelectionOutline is to enable or disable the rendering of selection outlines in the Unreal Engine editor viewport. This setting variable is used primarily for the editor’s visualization system, specifically for highlighting selected objects in the scene.
Key points about ShowFlag.SelectionOutline:
-
Purpose: It controls the visibility of selection outlines around objects in the editor viewport.
-
Subsystem: This variable is part of the editor’s visualization and rendering system.
-
Usage: It’s typically used in post-processing passes, specifically in the SelectionOutline pass.
-
Value setting: The value is set based on several conditions:
- It’s only enabled in editor builds (GIsEditor is true)
- The Selection engine show flag must be enabled
- The SelectionOutline engine show flag must be enabled
- The Wireframe engine show flag must be disabled
- HDR visualization must not be active
-
Associated variables: It’s closely associated with EngineShowFlags.Selection and EngineShowFlags.SelectionOutline.
-
Implementation: The actual rendering of the selection outline is done in the AddSelectionOutlinePass function.
-
Performance consideration: This feature is editor-only and doesn’t affect shipping builds.
Best practices:
- Always check if you’re in an editor build before using this flag.
- Consider the performance impact of enabling this in complex scenes with many selected objects.
- Make sure to disable this flag when it’s not needed, especially during performance-critical operations.
- When implementing custom editor tools or visualizations, check this flag to ensure you’re not conflicting with the built-in selection outline rendering.
Special considerations:
- This flag is not available in shipping builds, so don’t rely on it for any gameplay or runtime functionality.
- The selection outline rendering might interact with other post-processing effects, so be aware of potential visual conflicts.
- In VR or other specialized rendering scenarios, the selection outline might need special handling.
In summary, ShowFlag.SelectionOutline is a crucial part of the Unreal Engine editor’s object selection visualization system. It’s used to control the visibility of selection outlines and is closely tied to the editor’s rendering pipeline, particularly in post-processing stages.
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl:137
Scope: file
Source code excerpt:
SHOWFLAG_ALWAYS_ACCESSIBLE(Specular, SFG_LightingComponents, NSLOCTEXT("UnrealEd", "SpecularSF", "Specular"))
/** Outline around selected objects in the editor */
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutline, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineSF", "Selection Outline"))
/** Outline custom colors in the editor */
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor0, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor0", "Selection Outline Color 0"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor1, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor1", "Selection Outline Color 1"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor2, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor2", "Selection Outline Color 2"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor3, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor3", "Selection Outline Color 3"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor4, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor4", "Selection Outline Color 4"))
#Associated Variable and Callsites
This variable is associated with another variable named SelectionOutline
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Plugins/Experimental/ActorPalette/Source/ActorPalette/Private/ActorPaletteViewportClient.cpp:34
Scope (from outer to inner):
file
function FActorPaletteViewportClient::FActorPaletteViewportClient
Source code excerpt:
EngineShowFlags.Selection = true;
EngineShowFlags.SelectionOutline = true;
EngineShowFlags.Grid = false;
}
bool FActorPaletteViewportClient::InputKey(const FInputKeyEventArgs& InEventArgs)
{
if (InEventArgs.Key == EKeys::LeftMouseButton)
#Loc: <Workspace>/Engine/Plugins/Runtime/nDisplay/Source/DisplayClusterLightCardEditorShaders/Private/DisplayClusterMeshProjectionRenderer.cpp:999
Scope (from outer to inner):
file
function void FDisplayClusterMeshProjectionRenderer::RenderColorOutput
Source code excerpt:
#if WITH_EDITOR
if (RenderSettings.EngineShowFlags.SelectionOutline)
{
const FRDGTextureDesc SelectionDepthDesc = FRDGTextureDesc::Create2D(OutputRenderTargetBinding.GetTexture()->Desc.Extent, PF_DepthStencil, FClearValueBinding::DepthFar, TexCreate_DepthStencilTargetable | TexCreate_ShaderResource);
FRDGTextureRef SelectionDepthTexture = GraphBuilder.CreateTexture(SelectionDepthDesc, TEXT("DisplayClusterMeshProjection.SelectionDepthTexture"));
FDepthStencilBinding SelectionDepthStencilBinding(SelectionDepthTexture, ERenderTargetLoadAction::EClear, ERenderTargetLoadAction::EClear, FExclusiveDepthStencil::DepthWrite_StencilWrite);
AddSelectionDepthRenderPass(GraphBuilder, View, RenderSettings, SelectionDepthStencilBinding);
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/SLevelViewport.cpp:2281
Scope (from outer to inner):
file
function void SLevelViewport::OnUseDefaultShowFlags
Source code excerpt:
// this trashes the current viewmode!
LevelViewportClient->EngineShowFlags = EditorShowFlags;
// Restore the state of SelectionOutline based on user settings
LevelViewportClient->EngineShowFlags.SetSelectionOutline(GetDefault<ULevelEditorViewportSettings>()->bUseSelectionOutline);
LevelViewportClient->LastEngineShowFlags = GameShowFlags;
// re-apply the cached viewmode, as it was trashed with FEngineShowFlags()
ApplyViewMode(CachedViewMode, LevelViewportClient->IsPerspective(), LevelViewportClient->EngineShowFlags);
ApplyViewMode(CachedViewMode, LevelViewportClient->IsPerspective(), LevelViewportClient->LastEngineShowFlags);
#Loc: <Workspace>/Engine/Source/Editor/LevelEditor/Private/SLevelViewport.cpp:3872
Scope (from outer to inner):
file
function void SLevelViewport::UpdateActorPreviewViewports
Source code excerpt:
CurActorPreview.LevelViewportClient->bDrawBaseInfo = LevelViewportClient->bDrawBaseInfo;
CurActorPreview.LevelViewportClient->bDrawVertices = LevelViewportClient->bDrawVertices;
CurActorPreview.LevelViewportClient->EngineShowFlags.SetSelectionOutline(LevelViewportClient->EngineShowFlags.SelectionOutline);
CurActorPreview.LevelViewportClient->EngineShowFlags.SetCompositeEditorPrimitives(LevelViewportClient->EngineShowFlags.CompositeEditorPrimitives);
}
}
}
void SLevelViewport::OnPreviewSelectedCamerasChange()
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl:137
Scope: file
Source code excerpt:
SHOWFLAG_ALWAYS_ACCESSIBLE(Specular, SFG_LightingComponents, NSLOCTEXT("UnrealEd", "SpecularSF", "Specular"))
/** Outline around selected objects in the editor */
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutline, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineSF", "Selection Outline"))
/** Outline custom colors in the editor */
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor0, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor0", "Selection Outline Color 0"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor1, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor1", "Selection Outline Color 1"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor2, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor2", "Selection Outline Color 2"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor3, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor3", "Selection Outline Color 3"))
SHOWFLAG_FIXED_IN_SHIPPING(0, SelectionOutlineColor4, SFG_Hidden, NSLOCTEXT("UnrealEd", "SelectionOutlineColor4", "Selection Outline Color 4"))
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:377
Scope (from outer to inner):
file
function void AddPostProcessingPasses
Source code excerpt:
VisualizeLightFunctionAtlas,
VisualizeLevelInstance,
SelectionOutline,
EditorPrimitive,
VisualizeShadingModels,
VisualizeGBufferHints,
VisualizeSubsurface,
VisualizeGBufferOverview,
VisualizeLumenSceneOverview,
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:473
Scope (from outer to inner):
file
function void AddPostProcessingPasses
Source code excerpt:
PassSequence.SetEnabled(EPass::VisualizeLightFunctionAtlas, Scene && Scene->LightFunctionAtlasSceneData.GetLightFunctionAtlasEnabled() && View.Family && View.Family->EngineShowFlags.VisualizeLightFunctionAtlas);
PassSequence.SetEnabled(EPass::VisualizeLevelInstance, GIsEditor && EngineShowFlags.EditingLevelInstance && EngineShowFlags.VisualizeLevelInstanceEditing && !bVisualizeHDR);
PassSequence.SetEnabled(EPass::SelectionOutline, GIsEditor && EngineShowFlags.Selection && EngineShowFlags.SelectionOutline && !EngineShowFlags.Wireframe && !bVisualizeHDR);
PassSequence.SetEnabled(EPass::EditorPrimitive, FSceneRenderer::ShouldCompositeEditorPrimitives(View));
#else
PassSequence.SetEnabled(EPass::VisualizeSkyAtmosphere, false);
PassSequence.SetEnabled(EPass::VisualizeSkyLightIlluminanceMeter, false);
PassSequence.SetEnabled(EPass::VisualizeLightFunctionAtlas, false);
PassSequence.SetEnabled(EPass::VisualizeLevelInstance, false);
PassSequence.SetEnabled(EPass::SelectionOutline, false);
PassSequence.SetEnabled(EPass::EditorPrimitive, false);
#endif
PassSequence.SetEnabled(EPass::VisualizeShadingModels, EngineShowFlags.VisualizeShadingModels);
PassSequence.SetEnabled(EPass::VisualizeGBufferHints, EngineShowFlags.GBufferHints);
PassSequence.SetEnabled(EPass::VisualizeSubsurface, EngineShowFlags.VisualizeSSS);
PassSequence.SetEnabled(EPass::VisualizeGBufferOverview, bVisualizeGBufferOverview || bVisualizeGBufferDumpToFile || bVisualizeGBufferDumpToPIpe);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:1486
Scope (from outer to inner):
file
function void AddPostProcessingPasses
Source code excerpt:
}
if (PassSequence.IsEnabled(EPass::SelectionOutline))
{
FSelectionOutlineInputs PassInputs;
PassSequence.AcceptOverrideIfLastPass(EPass::SelectionOutline, PassInputs.OverrideOutput);
PassInputs.SceneColor = SceneColor;
PassInputs.SceneDepth = SceneDepth;
PassInputs.SceneTextures.SceneTextures = Inputs.SceneTextures;
SceneColor = AddSelectionOutlinePass(GraphBuilder, View, SceneUniformBuffer, PassInputs, NaniteRasterResults, InstancedEditorDepthTexture);
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:1824
Scope (from outer to inner):
file
function void AddDebugViewPostProcessingPasses
Source code excerpt:
Visualize,
TonemapAfter,
SelectionOutline,
PrimaryUpscale,
SecondaryUpscale,
MAX
};
const TCHAR* PassNames[] =
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:1845
Scope (from outer to inner):
file
function void AddDebugViewPostProcessingPasses
Source code excerpt:
PassSequence.SetEnabled(EPass::Visualize, true);
PassSequence.SetEnabled(EPass::TonemapAfter, bTonemapAfter);
PassSequence.SetEnabled(EPass::SelectionOutline, GIsEditor);
PassSequence.SetEnabled(EPass::PrimaryUpscale, View.ViewRect.Size() != View.GetSecondaryViewRectSize() && View.PrimaryScreenPercentageMethod != EPrimaryScreenPercentageMethod::TemporalUpscale);
PassSequence.SetEnabled(EPass::SecondaryUpscale, View.RequiresSecondaryUpscale() || View.Family->GetSecondarySpatialUpscalerInterface() != nullptr);
PassSequence.Finalize();
const FEyeAdaptationParameters EyeAdaptationParameters = GetEyeAdaptationParameters(View);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:1958
Scope (from outer to inner):
file
function void AddDebugViewPostProcessingPasses
Source code excerpt:
#if WITH_EDITOR
if (PassSequence.IsEnabled(EPass::SelectionOutline))
{
FSelectionOutlineInputs PassInputs;
PassSequence.AcceptOverrideIfLastPass(EPass::SelectionOutline, PassInputs.OverrideOutput);
PassInputs.SceneColor = SceneColor;
PassInputs.SceneDepth = SceneDepth;
PassInputs.SceneTextures.SceneTextures = Inputs.SceneTextures;
FRDGTextureRef DummyStencilTexture = nullptr;
SceneColor = AddSelectionOutlinePass(GraphBuilder, View, SceneUniformBuffer, PassInputs, NaniteRasterResults, DummyStencilTexture);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:2138
Scope (from outer to inner):
file
function void AddMobilePostProcessingPasses
Source code excerpt:
FXAA,
HighResolutionScreenshotMask,
SelectionOutline,
EditorPrimitive,
#if UE_ENABLE_DEBUG_DRAWING
DebugPrimitive,
#endif
PrimaryUpscale,
SecondaryUpscale,
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:2217
Scope (from outer to inner):
file
function void AddMobilePostProcessingPasses
Source code excerpt:
PassSequence.SetEnabled(EPass::HighResolutionScreenshotMask, bUseHighResolutionScreenshotMask);
#if WITH_EDITOR
PassSequence.SetEnabled(EPass::SelectionOutline, GIsEditor && View.Family->EngineShowFlags.Selection && View.Family->EngineShowFlags.SelectionOutline && !View.Family->EngineShowFlags.Wireframe);
PassSequence.SetEnabled(EPass::EditorPrimitive, FSceneRenderer::ShouldCompositeEditorPrimitives(View));
#else
PassSequence.SetEnabled(EPass::SelectionOutline, false);
PassSequence.SetEnabled(EPass::EditorPrimitive, false);
#endif
#if UE_ENABLE_DEBUG_DRAWING
PassSequence.SetEnabled(EPass::DebugPrimitive, FSceneRenderer::ShouldCompositeDebugPrimitivesInPostProcess(View));
#endif
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessing.cpp:2774
Scope (from outer to inner):
file
function void AddMobilePostProcessingPasses
Source code excerpt:
// Show the selection outline if it is in the editor and we aren't in wireframe
// If the engine is in demo mode and game view is on we also do not show the selection outline
if (PassSequence.IsEnabled(EPass::SelectionOutline))
{
FSelectionOutlineInputs PassInputs;
PassSequence.AcceptOverrideIfLastPass(EPass::SelectionOutline, PassInputs.OverrideOutput);
PassInputs.SceneColor = SceneColor;
PassInputs.SceneDepth = SceneDepth;
PassInputs.SceneTextures = GetSceneTextureShaderParameters(Inputs.SceneTextures);
PassInputs.OverrideOutput.LoadAction = View.IsFirstInFamily() ? ERenderTargetLoadAction::EClear : ERenderTargetLoadAction::ELoad;
// TODO: Nanite - pipe through results