void FEdModeLevel::SetLevel( ULevelStreaming* LevelStream ) { if( SelectedLevel != NULL && SelectedLevel != LevelStream ) { // Changed level need to apply PostEditMove to the actors we moved in the last level ApplyPostEditMove(); } SelectedLevel = LevelStream; bIsDirty = false; if( SelectedLevel ) { LevelTransform = SelectedLevel->LevelTransform; ULevel* Level = SelectedLevel->GetLoadedLevel(); // Calculate the Level bounds box LevelBounds = FBox(0); if( Level ) { for( int32 ActorIndex=0; ActorIndex< Level->Actors.Num(); ActorIndex++ ) { AActor* Actor = Level->Actors[ActorIndex]; // Don't include the builder brush or the world settings as they can artificially make the level bounds bigger if( Actor && FActorEditorUtils::IsABuilderBrush(Actor) == false && Level->GetWorldSettings() != Actor ) { LevelBounds += Actor->GetComponentsBoundingBox(); } } } } GEditor->RedrawAllViewports(); }
void FLevelUtils::ApplyLevelTransform( ULevel* Level, const FTransform& LevelTransform, bool bDoPostEditMove ) { bool bTransformActors = !LevelTransform.Equals(FTransform::Identity); if (bTransformActors) { if (!LevelTransform.GetRotation().IsIdentity()) { // If there is a rotation applied, then the relative precomputed bounds become invalid. Level->bTextureStreamingRotationChanged = true; } // Iterate over all actors in the level and transform them for( int32 ActorIndex=0; ActorIndex<Level->Actors.Num(); ActorIndex++ ) { AActor* Actor = Level->Actors[ActorIndex]; // Don't want to transform children they should stay relative to there parents. if( Actor && Actor->GetAttachParentActor() == NULL ) { // Has to modify root component directly as GetActorPosition is incorrect this early USceneComponent *RootComponent = Actor->GetRootComponent(); if (RootComponent) { RootComponent->SetRelativeLocationAndRotation( LevelTransform.TransformPosition(RootComponent->RelativeLocation), (FTransform(RootComponent->RelativeRotation) * LevelTransform).Rotator()); } } } #if WITH_EDITOR if( bDoPostEditMove ) { ApplyPostEditMove( Level ); } #endif // WITH_EDITOR Level->OnApplyLevelTransform.Broadcast(LevelTransform); } }
void FEdModeLevel::Exit() { ApplyPostEditMove(); SelectedLevel = NULL; FEdMode::Exit(); }