Files
michael balzer a49c74b915 MeshModelingToolset: Move ModelingOperators and ModelingOperatorsEditorOnly modules out of experimental plugin
#jira UETOOL-3823
#rb lonnie.li
#preflight 617b1aea5794a500014f544a

#ROBOMERGE-AUTHOR: michael.balzer
#ROBOMERGE-SOURCE: CL 17972239 in //UE5/Release-5.0/... via CL 17972248
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v885-17909292)
#ROBOMERGE[STARSHIP]: UE5-Main

[CL 17972256 by michael balzer in ue5-release-engine-test branch]
2021-10-28 19:47:45 -04:00

127 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Changes/MeshPolygroupChange.h"
#include "DynamicMesh/DynamicMesh3.h"
#include "DynamicMesh/DynamicMeshAttributeSet.h"
using namespace UE::Geometry;
void FDynamicMeshGroupEdit::ApplyToMesh(FDynamicMesh3* Mesh, bool bRevert)
{
int32 NumTris = Triangles.Num();
if (GroupLayerIndex < 0)
{
if (ensure(Mesh->HasTriangleGroups()) == false) return;
for (int32 k = 0; k < NumTris; ++k)
{
int32 tid = Triangles[k];
if (Mesh->IsTriangle(tid))
{
int32 SetGroup = (bRevert) ? OldGroups[k] : NewGroups[k];
Mesh->SetTriangleGroup(tid, SetGroup);
}
}
}
else
{
if ( ensure(Mesh->HasAttributes()) == false ||
ensure(GroupLayerIndex <= Mesh->Attributes()->NumPolygroupLayers()) == false ) return;
FDynamicMeshPolygroupAttribute* PolygroupLayer = Mesh->Attributes()->GetPolygroupLayer(GroupLayerIndex);
if (ensure(PolygroupLayer))
{
for (int32 k = 0; k < NumTris; ++k)
{
int32 tid = Triangles[k];
if (Mesh->IsTriangle(tid))
{
int32 SetGroup = (bRevert) ? OldGroups[k] : NewGroups[k];
PolygroupLayer->SetValue(tid, SetGroup);
}
}
}
}
}
FDynamicMeshGroupEditBuilder::FDynamicMeshGroupEditBuilder(FDynamicMesh3* Mesh)
{
PolygroupSet = MakePimpl<UE::Geometry::FPolygroupSet>(Mesh);
Edit = MakeUnique<FDynamicMeshGroupEdit>();
}
FDynamicMeshGroupEditBuilder::FDynamicMeshGroupEditBuilder(FDynamicMesh3* Mesh, int32 GroupLayer)
{
PolygroupSet = MakePimpl<UE::Geometry::FPolygroupSet>(Mesh, GroupLayer);
Edit = MakeUnique<FDynamicMeshGroupEdit>();
if (ensure(PolygroupSet->GetPolygroupIndex() != -1))
{
Edit->GroupLayerIndex = PolygroupSet->GetPolygroupIndex();
}
}
FDynamicMeshGroupEditBuilder::FDynamicMeshGroupEditBuilder(UE::Geometry::FPolygroupSet* PolygroupSetIn)
{
PolygroupSet = MakePimpl<UE::Geometry::FPolygroupSet>(*PolygroupSetIn);
Edit = MakeUnique<FDynamicMeshGroupEdit>();
if (PolygroupSet->GetPolygroupIndex() != -1)
{
Edit->GroupLayerIndex = PolygroupSet->GetPolygroupIndex();
}
}
void FDynamicMeshGroupEditBuilder::SaveTriangle(int32 TriangleID)
{
int32 NewGroupID = PolygroupSet->GetGroup(TriangleID);
const int32* NewIndex = SavedIndexMap.Find(TriangleID);
if (NewIndex == nullptr)
{
int32 Index = Edit->Triangles.Num();
SavedIndexMap.Add(TriangleID, Index);
Edit->Triangles.Add(TriangleID);
Edit->OldGroups.Add(NewGroupID);
Edit->NewGroups.Add(NewGroupID);
}
else
{
Edit->NewGroups[*NewIndex] = PolygroupSet->GetGroup(TriangleID);
}
}
void FDynamicMeshGroupEditBuilder::SaveTriangle(int32 TriangleID, int32 OldGroup, int32 NewGroup)
{
const int32* NewIndex = SavedIndexMap.Find(TriangleID);
if (NewIndex == nullptr)
{
int32 Index = Edit->Triangles.Num();
SavedIndexMap.Add(TriangleID, Index);
Edit->Triangles.Add(TriangleID);
Edit->OldGroups.Add(OldGroup);
Edit->NewGroups.Add(NewGroup);
}
else
{
Edit->NewGroups[*NewIndex] = NewGroup;
}
}
FMeshPolygroupChange::FMeshPolygroupChange(TUniquePtr<FDynamicMeshGroupEdit>&& GroupEditIn)
{
GroupEdit = MoveTemp(GroupEditIn);
}
void FMeshPolygroupChange::ApplyChangeToMesh(FDynamicMesh3* Mesh, bool bRevert) const
{
GroupEdit->ApplyToMesh(Mesh, bRevert);
}