Files
UnrealEngineUWP/Engine/Plugins/Editor/MeshEditor/Source/PolygonModeling/TessellatePolygon.cpp
Mike Fricker c531cde1b7 Mesh Editor: Cleaned up handling of "valid" mesh elements
- We no longer have to (slowly) check for valid elements every frame while dragging
- Removed functions to deselect invalid mesh elements and to clear hover on invalid mesh elements
- Cleaned up some use of 'const' in the mesh editor API

#codereview richard.talbotwatkin
#rb none

[CL 3387062 by Mike Fricker in Dev-Geometry branch]
2017-04-10 16:45:27 -04:00

96 lines
3.2 KiB
C++

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#include "TessellatePolygon.h"
#include "IMeshEditorModeEditingContract.h"
#include "UICommandInfo.h"
#include "EditableMesh.h"
#include "MeshElement.h"
#define LOCTEXT_NAMESPACE "MeshEditorMode"
void UTessellatePolygonCommand::RegisterUICommand( FBindingContext* BindingContext )
{
UI_COMMAND_EXT( BindingContext, /* Out */ UICommandInfo, "TessellatePolygon", "Tessellate Polygon", "Tessellate selected polygons into smaller polygons.", EUserInterfaceActionType::Button, FInputChord() );
}
void UTessellatePolygonCommand::Execute( IMeshEditorModeEditingContract& MeshEditorMode )
{
if( MeshEditorMode.GetActiveAction() != NAME_None )
{
return;
}
static TMap<UEditableMesh*, TArray<FMeshElement>> SelectedMeshesAndPolygons;
MeshEditorMode.GetSelectedMeshesAndPolygons( SelectedMeshesAndPolygons );
if( SelectedMeshesAndPolygons.Num() == 0 )
{
return;
}
FScopedTransaction Transaction( LOCTEXT( "UndoTessellatePolygon", "Tessellate Polygon" ) );
MeshEditorMode.CommitSelectedMeshes();
// Refresh selection (committing may have created a new mesh instance)
MeshEditorMode.GetSelectedMeshesAndPolygons( SelectedMeshesAndPolygons );
// Deselect the mesh elements before we delete them. This will make sure they become selected again after undo.
MeshEditorMode.DeselectMeshElements( SelectedMeshesAndPolygons );
static TArray<FMeshElement> MeshElementsToSelect;
MeshElementsToSelect.Reset();
for( const auto& SelectedMeshAndPolygons : SelectedMeshesAndPolygons )
{
UEditableMesh* EditableMesh = SelectedMeshAndPolygons.Key;
const TArray<FMeshElement>& PolygonElements = SelectedMeshAndPolygons.Value;
static TArray<FPolygonRef> PolygonsToTessellate;
PolygonsToTessellate.Reset( PolygonElements.Num() );
for( const auto& PolygonElement : PolygonElements )
{
const FPolygonRef PolygonRef( PolygonElement.ElementAddress.SectionID, FPolygonID( PolygonElement.ElementAddress.ElementID ) );
PolygonsToTessellate.Add( PolygonRef );
}
EditableMesh->StartModification( EMeshModificationType::Final, EMeshTopologyChange::TopologyChange );
// @todo mesheditor: Expose as configurable parameter
const ETriangleTessellationMode TriangleTessellationMode = ETriangleTessellationMode::FourTriangles;
static TArray<FPolygonRef> NewPolygonRefs;
EditableMesh->TessellatePolygons( PolygonsToTessellate, TriangleTessellationMode, /* Out */ NewPolygonRefs );
// Select the new polygons
for( const FPolygonRef NewPolygonRef : NewPolygonRefs )
{
FMeshElement NewPolygonMeshElement;
{
NewPolygonMeshElement.Component = PolygonElements[0].Component;
NewPolygonMeshElement.ElementAddress = PolygonElements[0].ElementAddress;
NewPolygonMeshElement.ElementAddress.ElementType = EEditableMeshElementType::Polygon;
NewPolygonMeshElement.ElementAddress.SectionID = NewPolygonRef.SectionID;
NewPolygonMeshElement.ElementAddress.ElementID = NewPolygonRef.PolygonID;
}
MeshElementsToSelect.Add( NewPolygonMeshElement );
}
EditableMesh->EndModification();
MeshEditorMode.TrackUndo( EditableMesh, EditableMesh->MakeUndo() );
}
// Select the new smaller polygons
MeshEditorMode.SelectMeshElements( MeshElementsToSelect );
}
#undef LOCTEXT_NAMESPACE