bool IsAnySurfaceSelected( UWorld* InWorld ) { UWorld* World = InWorld; if (!World) { World = GWorld; // Fallback to GWorld } if (World) { const int32 NumLevels = World->GetNumLevels(); for (int32 LevelIndex = 0; LevelIndex < NumLevels; LevelIndex++) { ULevel* Level = World->GetLevel(LevelIndex); UModel* Model = Level->Model; check(Model); const int32 NumSurfaces = Model->Surfs.Num(); // Count the number of selected surfaces for (int32 Surface = 0; Surface < NumSurfaces; ++Surface) { FBspSurf *Poly = &Model->Surfs[Surface]; if (Poly->PolyFlags & PF_Selected) { return true; } } } } return false; }
/** Generates a sub-level Blueprints sub-menu */ static void MakeSubLevelsMenu(FMenuBuilder& InMenuBuilder, TWeakPtr< SLevelEditor > InLvlEditor) { FSlateIcon EditBP(FEditorStyle::Get().GetStyleSetName(), TEXT("LevelEditor.OpenLevelBlueprint")); InMenuBuilder.BeginSection(NAME_None, LOCTEXT("SubLevelsHeading", "Sub-Level Blueprints")); { UWorld* World = InLvlEditor.Pin()->GetWorld(); for (int32 iLevel = 0; iLevel < World->GetNumLevels(); iLevel++) { ULevel* Level = World->GetLevel(iLevel); if (Level != NULL && Level->GetOutermost() != NULL) { if (!Level->IsPersistentLevel()) { FUIAction UIAction ( FExecuteAction::CreateStatic(&FLevelEditorToolBar::OnOpenSubLevelBlueprint, Level) ); FText DisplayName = FText::Format(LOCTEXT("SubLevelBlueprintItem", "Edit {LevelName}"), FText::FromString(FPaths::GetCleanFilename(Level->GetOutermost()->GetName()))); InMenuBuilder.AddMenuEntry(DisplayName, FText::GetEmpty(), EditBP, UIAction); } } } } InMenuBuilder.EndSection(); }
/** Restores systems that need references to classes in the renderer module. */ void RestoreReferencesToRendererModuleClasses( const TMap<UWorld*, bool>& WorldsToUpdate, const TMap<FMaterialShaderMap*, TScopedPointer<TArray<uint8> > >& ShaderMapToSerializedShaderData, const TScopedPointer<TArray<uint8> >& GlobalShaderData, const TMap<FShaderType*, FString>& ShaderTypeNames, const TMap<FVertexFactoryType*, FString>& VertexFactoryTypeNames) { FlushShaderFileCache(); // Initialize cached shader type data InitializeShaderTypes(); IRendererModule& RendererModule = GetRendererModule(); FSceneViewStateReference::AllocateAll(); // Recreate all renderer scenes for (TMap<UWorld*, bool>::TConstIterator It(WorldsToUpdate); It; ++It) { UWorld* World = It.Key(); RendererModule.AllocateScene(World, World->RequiresHitProxies(), It.Value(), World->FeatureLevel); for (int32 LevelIndex = 0; LevelIndex < World->GetNumLevels(); LevelIndex++) { ULevel* Level = World->GetLevel(LevelIndex); Level->InitializeRenderingResources(); } } // Restore FShaders from the serialized memory blobs // Shader maps may still not be complete after this due to code changes picked up in the recompile RestoreGlobalShaderMap(GRHIShaderPlatform_DEPRECATED, *GlobalShaderData); UMaterial::RestoreMaterialShadersFromMemory(GRHIShaderPlatform_DEPRECATED, ShaderMapToSerializedShaderData); FMaterialShaderMap::FixupShaderTypes(GRHIShaderPlatform_DEPRECATED, ShaderTypeNames, VertexFactoryTypeNames); TArray<FShaderType*> OutdatedShaderTypes; TArray<const FVertexFactoryType*> OutdatedFactoryTypes; FShaderType::GetOutdatedTypes(OutdatedShaderTypes, OutdatedFactoryTypes); // Recompile any missing shaders UMaterialInterface::IterateOverActiveFeatureLevels([&](ERHIFeatureLevel::Type FeatureLevel) { auto ShaderPlatform = GShaderPlatformForFeatureLevel[FeatureLevel]; BeginRecompileGlobalShaders(OutdatedShaderTypes, ShaderPlatform); UMaterial::UpdateMaterialShaders(OutdatedShaderTypes, OutdatedFactoryTypes, ShaderPlatform); }); // Block on global shader jobs FinishRecompileGlobalShaders(); }
/** Clears and optionally backs up all references to renderer module classes in other modules, particularly engine. */ void ClearReferencesToRendererModuleClasses( TMap<UWorld*, bool>& WorldsToUpdate, TMap<FMaterialShaderMap*, TScopedPointer<TArray<uint8> > >& ShaderMapToSerializedShaderData, TScopedPointer<TArray<uint8> >& GlobalShaderData, TMap<FShaderType*, FString>& ShaderTypeNames, TMap<FVertexFactoryType*, FString>& VertexFactoryTypeNames) { // Destroy all renderer scenes for (TObjectIterator<UWorld> WorldIt; WorldIt; ++WorldIt) { UWorld* World = *WorldIt; if (World->Scene) { WorldsToUpdate.Add(World, World->FXSystem != NULL); for (int32 LevelIndex = 0; LevelIndex < World->GetNumLevels(); LevelIndex++) { ULevel* Level = World->GetLevel(LevelIndex); Level->ReleaseRenderingResources(); } if (World->FXSystem != NULL) { FFXSystemInterface::Destroy(World->FXSystem); World->FXSystem = NULL; } World->Scene->Release(); World->Scene = NULL; } } // Save off shaders by serializing them into memory, and remove all shader map references to FShaders GlobalShaderData = TScopedPointer<TArray<uint8> >(BackupGlobalShaderMap(GRHIShaderPlatform_DEPRECATED)); UMaterial::BackupMaterialShadersToMemory(ShaderMapToSerializedShaderData); // Verify no FShaders still in memory for(TLinkedList<FShaderType*>::TIterator It(FShaderType::GetTypeList()); It; It.Next()) { FShaderType* ShaderType = *It; check(ShaderType->GetNumShaders() == 0); ShaderTypeNames.Add(ShaderType, ShaderType->GetName()); } for(TLinkedList<FVertexFactoryType*>::TIterator It(FVertexFactoryType::GetTypeList()); It; It.Next()) { FVertexFactoryType* VertexFactoryType = *It; VertexFactoryTypeNames.Add(VertexFactoryType, VertexFactoryType->GetName()); } // Destroy misc renderer module classes and remove references FSceneViewStateReference::DestroyAll(); FSlateApplication::Get().InvalidateAllViewports(); // Invalidate cached shader type data UninitializeShaderTypes(); // Delete pending cleanup objects to remove those references, which are potentially renderer module classes FPendingCleanupObjects* PendingCleanupObjects = GetPendingCleanupObjects(); delete PendingCleanupObjects; GEngine->EngineLoop->ClearPendingCleanupObjects(); ResetCachedRendererModule(); }