bool FLayers::UpdateActorVisibility( const TWeakObjectPtr< AActor >& Actor, bool& bOutSelectionChanged, bool& bOutActorModified, bool bNotifySelectionChange, bool bRedrawViewports ) { bOutActorModified = false; bOutSelectionChanged = false; if( !IsActorValidForLayer( Actor ) ) { return false; } // If the actor doesn't belong to any layers if( Actor->Layers.Num() == 0) { // If the actor is also hidden if( Actor->bHiddenEdLayer ) { Actor->Modify(); // Actors that don't belong to any layer shouldn't be hidden Actor->bHiddenEdLayer = false; Actor->MarkComponentsRenderStateDirty(); bOutActorModified = true; } return bOutActorModified; } bool bActorBelongsToVisibleLayer = false; for( int32 LayerIndex = 0 ; LayerIndex < GetWorld()->Layers.Num() ; ++LayerIndex ) { const TWeakObjectPtr< ULayer > Layer = GetWorld()->Layers[ LayerIndex ]; if( !Layer->bIsVisible ) { continue; } if( Actor->Layers.Contains( Layer->LayerName ) ) { if ( Actor->bHiddenEdLayer ) { Actor->Modify(); Actor->bHiddenEdLayer = false; Actor->MarkComponentsRenderStateDirty(); bOutActorModified = true; } // Stop, because we found at least one visible layer the actor belongs to bActorBelongsToVisibleLayer = true; break; } } // If the actor isn't part of a visible layer, hide and de-select it. if( !bActorBelongsToVisibleLayer ) { if ( !Actor->bHiddenEdLayer ) { Actor->Modify(); Actor->bHiddenEdLayer = true; Actor->MarkComponentsRenderStateDirty(); bOutActorModified = true; } //if the actor was selected, mark it as unselected if ( Actor->IsSelected() ) { bool bSelect = false; bool bNotify = false; bool bIncludeHidden = true; Editor->SelectActor( Actor.Get(), bSelect, bNotify, bIncludeHidden ); bOutSelectionChanged = true; bOutActorModified = true; } } if ( bNotifySelectionChange && bOutSelectionChanged ) { Editor->NoteSelectionChange(); } if( bRedrawViewports ) { Editor->RedrawLevelEditingViewports(); } return bOutActorModified || bOutSelectionChanged; }