SQWORD USetupGroup::SpaceRequired() { guard(USetupGroup::SpaceRequired); SQWORD Count=0; if( Selected ) { for( TArray<USetupGroup*>::TIterator ItG(Subgroups); ItG; ++ItG ) { Count += (*ItG)->SpaceRequired(); } for( TArray<FString>::TIterator ItF(File); ItF; ++ItF ) { FFileInfo Info(*ItF); if( Info.Lang==TEXT("") || Info.Lang==UObject::GetLanguage() ) { FString Filename = Manager->DestPath * (Info.Dest==TEXT("") ? Info.Src : Info.Dest); INT ExistingSize = GFileManager->FileSize(*Filename); Count += (ExistingSize<0) ? (Info.Size + PER_FILE_OVERHEAD) : Max<SQWORD>(0,Info.Size-ExistingSize); } } } return Count; unguard; }
void UEditorEngine::csgRebuild( UWorld* InWorld ) { GWarn->BeginSlowTask( NSLOCTEXT("UnrealEd", "RebuildingGeometry", "Rebuilding geometry"), false ); FBSPOps::GFastRebuild = 1; FinishAllSnaps(); // Empty the model out. InWorld->GetModel()->Modify(); InWorld->GetModel()->EmptyModel(1, 1); // Count brushes. int32 BrushTotal=0, BrushCount=0; for( FStaticBrushIterator It(InWorld); It; ++It ) { ABrush* Brush = CastChecked<ABrush>(*It); if( !FActorEditorUtils::IsABuilderBrush(Brush) ) { BrushTotal++; } } // Check for the giant cube brush that is created for subtractive levels. // If it's found, apply the RemoveSurfaceMaterial to its polygons so they aren't lit or drawn. for(FStaticBrushIterator GiantCubeBrushIt(InWorld);GiantCubeBrushIt;++GiantCubeBrushIt) { ABrush* GiantCubeBrush = CastChecked<ABrush>(*GiantCubeBrushIt); if(GiantCubeBrush->Brush && GiantCubeBrush->Brush->Bounds.SphereRadius > HALF_WORLD_MAX) { check(GiantCubeBrush->Brush->Polys); for(int32 PolyIndex = 0;PolyIndex < GiantCubeBrush->Brush->Polys->Element.Num();PolyIndex++) { FPoly& Polygon = GiantCubeBrush->Brush->Polys->Element[PolyIndex]; const float PolygonArea = Polygon.Area(); if(PolygonArea > WORLD_MAX * WORLD_MAX * 0.99f && PolygonArea < WORLD_MAX * WORLD_MAX * 1.01f) { Polygon.Material = GEngine->RemoveSurfaceMaterial; } } } } // Compose all structural brushes and portals. for( FStaticBrushIterator It(InWorld); It; ++It ) { ABrush* Brush = CastChecked<ABrush>(*It); if( !FActorEditorUtils::IsABuilderBrush(Brush) ) { if ( !(Brush->PolyFlags&PF_Semisolid) || (Brush->BrushType!=Brush_Add) || (Brush->PolyFlags&PF_Portal) ) { // Treat portals as solids for cutting. if( Brush->PolyFlags & PF_Portal ) { Brush->PolyFlags = (Brush->PolyFlags & ~PF_Semisolid) | PF_NotSolid; } BrushCount++; FFormatNamedArguments Args; Args.Add( TEXT("BrushCount"), BrushCount ); Args.Add( TEXT("BrushTotal"), BrushTotal ); GWarn->StatusUpdate( BrushCount, BrushTotal, FText::Format( NSLOCTEXT("UnrealEd", "ApplyingStructuralBrushF", "Applying structural brush {BrushCount} of {BrushTotal}"), Args ) ); Brush->Modify(); bspBrushCSG( Brush, InWorld->GetModel(), Brush->PolyFlags, (EBrushType)Brush->BrushType, CSG_None, false, true, false ); } } } // Repartition the structural BSP. { GWarn->StatusUpdate( 0, 4, NSLOCTEXT("UnrealEd", "RebuildBSPBuildingPolygons", "Rebuild BSP: Building polygons") ); bspBuildFPolys( InWorld->GetModel(), 1, 0 ); GWarn->StatusUpdate( 1, 4, NSLOCTEXT("UnrealEd", "RebuildBSPMergingPlanars", "Rebuild BSP: Merging planars") ); bspMergeCoplanars( InWorld->GetModel(), 0, 0 ); GWarn->StatusUpdate( 2, 4, NSLOCTEXT("UnrealEd", "RebuildBSPPartitioning", "Rebuild BSP: Partitioning") ); FBSPOps::bspBuild( InWorld->GetModel(), FBSPOps::BSP_Optimal, 15, 70, 0, 0 ); GWarn->UpdateProgress( 4, 4 ); } // Remember leaves. TArray<int32> iFronts, iBacks; if( InWorld->GetModel()->Nodes.Num() ) { EnlistLeaves( InWorld->GetModel(), iFronts, iBacks, 0 ); } // Compose all detail brushes. for( FStaticBrushIterator It(InWorld); It; ++It ) { ABrush* Brush = CastChecked<ABrush>(*It); if ( !FActorEditorUtils::IsABuilderBrush(Brush) && (Brush->PolyFlags&PF_Semisolid) && !(Brush->PolyFlags&PF_Portal) && Brush->BrushType==Brush_Add ) { BrushCount++; FFormatNamedArguments Args; Args.Add( TEXT("BrushCount"), BrushCount ); Args.Add( TEXT("BrushTotal"), BrushTotal ); GWarn->StatusUpdate( BrushCount, BrushTotal, FText::Format( NSLOCTEXT("UnrealEd", "ApplyingDetailBrushF", "Applying detail brush {BrushCount} of {BrushTotal}"), Args ) ); Brush->Modify(); bspBrushCSG( Brush, InWorld->GetModel(), Brush->PolyFlags, (EBrushType)Brush->BrushType, CSG_None, false, true, false ); } } // Optimize the sub-bsp's. GWarn->StatusUpdate( 0, 4, NSLOCTEXT("UnrealEd", "RebuildCSGOptimizingSubBSPs", "Rebuild CSG: Optimizing Sub-BSPs") ); int32 iNode; for( TArray<int32>::TIterator ItF(iFronts); ItF; ++ItF ) { if( (iNode=InWorld->GetModel()->Nodes[*ItF].iFront)!=INDEX_NONE ) { bspRepartition( InWorld, iNode ); } } for( TArray<int32>::TIterator ItB(iBacks); ItB; ++ItB ) { if( (iNode=InWorld->GetModel()->Nodes[*ItB].iBack)!=INDEX_NONE ) { bspRepartition( InWorld, iNode ); } } GWarn->StatusUpdate( 1, 4, NSLOCTEXT("UnrealEd", "RebuildBSPOptimizingGeometry", "Rebuild BSP: Optimizing geometry") ); bspOptGeom( InWorld->GetModel() ); // Build bounding volumes. GWarn->StatusUpdate( 2, 4, NSLOCTEXT("UnrealEd", "RebuildCSGBuildingBoundingVolumes", "Rebuild CSG: Building Bounding Volumes") ); FBSPOps::bspBuildBounds( InWorld->GetModel() ); // Rebuild dynamic brush BSP's. GWarn->StatusUpdate( 3, 4, NSLOCTEXT("UnrealEd", "RebuildCSGRebuildingDynamicBrushBSPs", "Rebuild CSG: Rebuilding Dynamic Brush BSPs") ); TArray<ABrush*> DynamicBrushes; DynamicBrushes.Empty(); for( TActorIterator<ABrush> It(InWorld); It; ++It ) { ABrush* B=*It; if ( B->Brush && !B->IsStaticBrush() ) { DynamicBrushes.Add(B); } } { FScopedSlowTask SlowTask(DynamicBrushes.Num(), NSLOCTEXT("UnrealEd", "RebuildCSGRebuildingDynamicBrushBSPs", "Rebuild CSG: Rebuilding Dynamic Brush BSPs") ); for ( int32 BrushIndex = 0; BrushIndex < DynamicBrushes.Num(); BrushIndex++ ) { SlowTask.EnterProgressFrame(); ABrush* B = DynamicBrushes[BrushIndex]; FBSPOps::csgPrepMovingBrush(B); if ( GEngine->GetMapBuildCancelled() ) { break; } } } GWarn->UpdateProgress( 4, 4 ); // update static navigable geometry in current level RebuildStaticNavigableGeometry(InWorld->GetCurrentLevel()); // Empty EdPolys. InWorld->GetModel()->Polys->Element.Empty(); // Done. FBSPOps::GFastRebuild = 0; InWorld->GetCurrentLevel()->MarkPackageDirty(); GWarn->EndSlowTask(); }