// Copyright Epic Games, Inc. All Rights Reserved. #include "ExtendEdge.h" #include "IMeshEditorModeEditingContract.h" #include "IMeshEditorModeUIContract.h" #include "Framework/Commands/UICommandInfo.h" #include "EditableMesh.h" #include "MeshElement.h" #include "Framework/MultiBox/MultiBoxBuilder.h" #include "Framework/Commands/UICommandList.h" #include "ViewportInteractor.h" #define LOCTEXT_NAMESPACE "MeshEditorMode" void UExtendEdgeCommand::RegisterUICommand( FBindingContext* BindingContext ) { UI_COMMAND_EXT( BindingContext, /* Out */ UICommandInfo, "ExtendEdge", "Extend", "Creates a new polygon from the selected edge by clicking and dragging outward from an edge.", EUserInterfaceActionType::RadioButton, FInputChord() ); } void UExtendEdgeCommand::ApplyDuringDrag( IMeshEditorModeEditingContract& MeshEditorMode, UViewportInteractor* ViewportInteractor ) { // Extend edge static TMap< UEditableMesh*, TArray > MeshesWithEdgesToExtend; MeshEditorMode.GetSelectedMeshesAndEdges( /* Out */ MeshesWithEdgesToExtend ); if( MeshesWithEdgesToExtend.Num() > 0 ) { MeshEditorMode.DeselectAllMeshElements(); static TArray MeshElementsToSelect; MeshElementsToSelect.Reset(); for( auto& MeshAndEdges : MeshesWithEdgesToExtend ) { UEditableMesh* EditableMesh = MeshAndEdges.Key; const TArray& EdgeElementsToExtend = MeshAndEdges.Value; static TArray EdgeIDsToExtend; EdgeIDsToExtend.Reset(); for( const FMeshElement& EdgeElementToExtend : EdgeElementsToExtend ) { const FEdgeID EdgeID( EdgeElementToExtend.ElementAddress.ElementID ); EdgeIDsToExtend.Add( EdgeID ); } verify( !EditableMesh->AnyChangesToUndo() ); { // Extend the edge const bool bWeldNeighbors = true; // @todo mesheditor urgent extrude: Make optional somehow static TArray NewExtendedEdgeIDs; NewExtendedEdgeIDs.Reset(); EditableMesh->ExtendEdges( EdgeIDsToExtend, bWeldNeighbors, /* Out */ NewExtendedEdgeIDs ); // Make sure the new edges are selected for( int32 NewEdgeNumber = 0; NewEdgeNumber < NewExtendedEdgeIDs.Num(); ++NewEdgeNumber ) { const FEdgeID NewExtendedEdgeID = NewExtendedEdgeIDs[ NewEdgeNumber ]; const FMeshElement& MeshElement = EdgeElementsToExtend[ NewEdgeNumber ]; FMeshElement NewExtendedEdgeMeshElement; { NewExtendedEdgeMeshElement.Component = MeshElement.Component; NewExtendedEdgeMeshElement.ElementAddress = MeshElement.ElementAddress; NewExtendedEdgeMeshElement.ElementAddress.ElementID = NewExtendedEdgeID; } // Queue selection of this new element. We don't want it to be part of the current action. MeshElementsToSelect.Add( NewExtendedEdgeMeshElement ); } } MeshEditorMode.TrackUndo( EditableMesh, EditableMesh->MakeUndo() ); } MeshEditorMode.SelectMeshElements( MeshElementsToSelect ); } } void UExtendEdgeCommand::AddToVRRadialMenuActionsMenu( IMeshEditorModeUIContract& MeshEditorMode, FMenuBuilder& MenuBuilder, TSharedPtr CommandList, const FName TEMPHACK_StyleSetName, class UVREditorMode* VRMode ) { if( MeshEditorMode.GetMeshElementSelectionMode() == EEditableMeshElementType::Edge ) { MenuBuilder.AddMenuEntry( LOCTEXT( "VRExtendEdge", "Extend" ), FText(), FSlateIcon( TEMPHACK_StyleSetName, "MeshEditorMode.EdgeExtend" ), MakeUIAction( MeshEditorMode ), NAME_None, EUserInterfaceActionType::ToggleButton ); } } #undef LOCTEXT_NAMESPACE