void DeselectAllSurfacesInLevel(ULevel* InLevel) { if(InLevel) { UModel* Model = InLevel->Model; for( int32 SurfaceIndex = 0 ; SurfaceIndex < Model->Surfs.Num() ; ++SurfaceIndex ) { FBspSurf& Surf = Model->Surfs[SurfaceIndex]; if( Surf.PolyFlags & PF_Selected ) { Model->ModifySurf( SurfaceIndex, false ); Surf.PolyFlags &= ~PF_Selected; } } } }
/** * Deselects all BSP surfaces in the specified level. * * @param Level The level for which to deselect all levels. * @return The number of surfaces that were deselected */ static uint32 DeselectAllSurfacesForLevel(ULevel* Level) { uint32 NumSurfacesDeselected = 0; if ( Level ) { UModel* Model = Level->Model; for( int32 SurfaceIndex = 0 ; SurfaceIndex < Model->Surfs.Num() ; ++SurfaceIndex ) { FBspSurf& Surf = Model->Surfs[SurfaceIndex]; if( Surf.PolyFlags & PF_Selected ) { Model->ModifySurf( SurfaceIndex, false ); Surf.PolyFlags &= ~PF_Selected; ++NumSurfacesDeselected; } } } return NumSurfacesDeselected; }
void FLevelModel::DeselectAllSurfaces() { ULevel* Level = GetLevelObject(); if (Level == NULL) { return; } UModel* Model = Level->Model; for (int32 SurfaceIndex = 0; SurfaceIndex < Model->Surfs.Num(); ++SurfaceIndex) { FBspSurf& Surf = Model->Surfs[SurfaceIndex]; if (Surf.PolyFlags & PF_Selected) { Model->ModifySurf(SurfaceIndex, false); Surf.PolyFlags&= ~PF_Selected; } } }
void UEditorEngine::polySelectMatchingResolution(UWorld* InWorld, bool bCurrentLevelOnly) { // true if at least one surface was selected. bool bSurfaceWasSelected = false; TArray<float> SelectedResolutions; if (bCurrentLevelOnly == true) { for (TSelectedSurfaceIterator<FCurrentLevelSurfaceLevelFilter> It(InWorld); It; ++It) { SelectedResolutions.AddUnique(It->LightMapScale); } if (SelectedResolutions.Num() > 0) { if (SelectedResolutions.Num() > 1) { FMessageDialog::Open( EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "BSPSelect_DifferentResolutionsSelected", "Different selected resolutions.\nCan only select matching for a single resolution.")); } else { // Select all surfaces with matching materials. for (TSurfaceIterator<FCurrentLevelSurfaceLevelFilter> It(InWorld); It; ++It) { if (SelectedResolutions.Contains(It->LightMapScale)) { UModel* Model = It.GetModel(); const int32 SurfaceIndex = It.GetSurfaceIndex(); Model->ModifySurf( SurfaceIndex, 0 ); GEditor->SelectBSPSurf( Model, SurfaceIndex, true, false ); bSurfaceWasSelected = true; } } } } } else { for (TSelectedSurfaceIterator<> It(InWorld); It; ++It) { SelectedResolutions.AddUnique(It->LightMapScale); } if (SelectedResolutions.Num() > 0) { if (SelectedResolutions.Num() > 1) { FMessageDialog::Open( EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "BSPSelect_DifferentResolutionsSelected", "Different selected resolutions.\nCan only select matching for a single resolution.")); } else { // Select all surfaces with matching materials. for (TSurfaceIterator<> It(InWorld); It; ++It) { if (SelectedResolutions.Contains(It->LightMapScale)) { UModel* Model = It.GetModel(); const int32 SurfaceIndex = It.GetSurfaceIndex(); Model->ModifySurf( SurfaceIndex, 0 ); GEditor->SelectBSPSurf( Model, SurfaceIndex, true, false ); bSurfaceWasSelected = true; } } } } } if ( bSurfaceWasSelected ) { NoteSelectionChange(); } }
void UEditorEngine::polySelectMatchingMaterial(UWorld* InWorld, bool bCurrentLevelOnly) { // true if at least one surface was selected. bool bSurfaceWasSelected = false; // true if default material representations have already been added to the materials list. bool bDefaultMaterialAdded = false; TArray<UMaterialInterface*> Materials; if ( bCurrentLevelOnly ) { // Get list of unique materials that are on selected faces. for ( TSelectedSurfaceIterator<FCurrentLevelSurfaceLevelFilter> It(InWorld) ; It ; ++It ) { if ( It->Material && It->Material != UMaterial::GetDefaultMaterial(MD_Surface) ) { Materials.AddUnique( It->Material ); } else if ( !bDefaultMaterialAdded ) { bDefaultMaterialAdded = true; // Add both representations of the default material. Materials.AddUnique( NULL ); Materials.AddUnique( UMaterial::GetDefaultMaterial(MD_Surface) ); } } // Select all surfaces with matching materials. for ( TSurfaceIterator<FCurrentLevelSurfaceLevelFilter> It(InWorld) ; It ; ++It ) { // Map the default material to NULL, so that NULL assignments match manual default material assignments. if( Materials.Contains( It->Material ) ) { UModel* Model = It.GetModel(); const int32 SurfaceIndex = It.GetSurfaceIndex(); Model->ModifySurf( SurfaceIndex, 0 ); GEditor->SelectBSPSurf( Model, SurfaceIndex, true, false ); bSurfaceWasSelected = true; } } } else { // Get list of unique materials that are on selected faces. for ( TSelectedSurfaceIterator<> It(InWorld) ; It ; ++It ) { if ( It->Material && It->Material != UMaterial::GetDefaultMaterial(MD_Surface) ) { Materials.AddUnique( It->Material ); } else if ( !bDefaultMaterialAdded ) { bDefaultMaterialAdded = true; // Add both representations of the default material. Materials.AddUnique( NULL ); Materials.AddUnique( UMaterial::GetDefaultMaterial(MD_Surface) ); } } // Select all surfaces with matching materials. for ( TSurfaceIterator<> It(InWorld) ; It ; ++It ) { // Map the default material to NULL, so that NULL assignments match manual default material assignments. if( Materials.Contains( It->Material ) ) { UModel* Model = It.GetModel(); const int32 SurfaceIndex = It.GetSurfaceIndex(); Model->ModifySurf( SurfaceIndex, 0 ); GEditor->SelectBSPSurf( Model, SurfaceIndex, true, false ); bSurfaceWasSelected = true; } } } if ( bSurfaceWasSelected ) { NoteSelectionChange(); } }
/** * Selects all adjacent polygons (only coplanars if Coplanars==1) * @return Number of polygons newly selected. */ static int32 TagAdjacentsType(UWorld* InWorld, EAdjacentsType AdjacentType) { // Allocate GFlags1 check( GFlags1.Num() == 0 ); for( FConstLevelIterator Iterator = InWorld->GetLevelIterator(); Iterator; ++Iterator ) { UModel* Model = (*Iterator)->Model; uint8* Ptr = new uint8[MAX_uint16+1]; FMemory::Memzero( Ptr, MAX_uint16+1 ); GFlags1.Add( Ptr ); } FVert *VertPool; FVector *Base,*Normal; uint8 b; int32 i; int Selected,Found; Selected = 0; // Find all points corresponding to selected vertices: int32 ModelIndex1 = 0; for( FConstLevelIterator Iterator = InWorld->GetLevelIterator(); Iterator; ++Iterator ) { UModel* Model = (*Iterator)->Model; uint8* Flags1 = GFlags1[ModelIndex1++]; for (i=0; i<Model->Nodes.Num(); i++) { FBspNode &Node = Model->Nodes[i]; FBspSurf &Poly = Model->Surfs[Node.iSurf]; if (Poly.PolyFlags & PF_Selected) { VertPool = &Model->Verts[Node.iVertPool]; for (b=0; b<Node.NumVertices; b++) { Flags1[(VertPool++)->pVertex] = 1; } } } } // Select all unselected nodes for which two or more vertices are selected: ModelIndex1 = 0; int32 ModelIndex2 = -1; for( FConstLevelIterator Iterator = InWorld->GetLevelIterator(); Iterator; ++Iterator ) { UModel* Model = (*Iterator)->Model; uint8* Flags1 = GFlags1[ModelIndex1]; ModelIndex1++; ModelIndex2++; for( i = 0 ; i < Model->Nodes.Num() ; i++ ) { FBspNode &Node = Model->Nodes[i]; FBspSurf &Poly = Model->Surfs[Node.iSurf]; if (!(Poly.PolyFlags & PF_Selected)) { Found = 0; VertPool = &Model->Verts[Node.iVertPool]; // Base = &Model->Points [Poly.pBase]; Normal = &Model->Vectors[Poly.vNormal]; // for (b=0; b<Node.NumVertices; b++) Found += Flags1[(VertPool++)->pVertex]; // if (AdjacentType == ADJACENT_COPLANARS) { if (!GFlags2[ModelIndex2][Node.iSurf]) Found=0; } else if (AdjacentType == ADJACENT_FLOORS) { if (FMath::Abs(Normal->Z) <= 0.85) Found = 0; } else if (AdjacentType == ADJACENT_WALLS) { if (FMath::Abs(Normal->Z) >= 0.10) Found = 0; } else if (AdjacentType == ADJACENT_SLANTS) { if (FMath::Abs(Normal->Z) > 0.85) Found = 0; if (FMath::Abs(Normal->Z) < 0.10) Found = 0; } if (Found > 0) { Model->ModifySurf( Node.iSurf, 0 ); GEditor->SelectBSPSurf( Model, Node.iSurf, true, false ); Selected++; } } } } // Free GFlags1. for ( i = 0 ; i < GFlags1.Num() ; ++i ) { delete[] GFlags1[i]; } GFlags1.Empty(); GEditor->NoteSelectionChange(); return Selected; }