// Copyright Epic Games, Inc. All Rights Reserved. #include "FractureEngineEdit.h" #include "GeometryCollection/GeometryCollectionClusteringUtility.h" #include "GeometryCollection/Facades/CollectionTransformSelectionFacade.h" #include "PlanarCut.h" void FFractureEngineEdit::DeleteBranch(FGeometryCollection& GeometryCollection, const TArray& InBoneSelection) { const FManagedArrayCollection& InCollection = (const FManagedArrayCollection&)GeometryCollection; GeometryCollection::Facades::FCollectionTransformSelectionFacade TransformSelectionFacade(InCollection); TArray BoneIndicies = InBoneSelection; TransformSelectionFacade.RemoveRootNodes(BoneIndicies); TransformSelectionFacade.Sanitize(BoneIndicies); TArray NodesForDeletion; const TManagedArray>& Children = InCollection.GetAttribute>("Children", FGeometryCollection::TransformGroup); for (int32 BoneIdx : BoneIndicies) { FGeometryCollectionClusteringUtility::RecursiveAddAllChildren(Children, BoneIdx, NodesForDeletion); } NodesForDeletion.Sort(); GeometryCollection.RemoveElements(FGeometryCollection::TransformGroup, NodesForDeletion); FGeometryCollectionClusteringUtility::RemoveDanglingClusters(&GeometryCollection); // Proximity is invalidated if (GeometryCollection.HasAttribute("Proximity", FGeometryCollection::GeometryGroup)) { GeometryCollection.RemoveAttribute("Proximity", FGeometryCollection::GeometryGroup); } } void FFractureEngineEdit::SetVisibilityInCollectionFromTransformSelection(FManagedArrayCollection& InCollection, const TArray& InTransformSelection, bool bVisible) { GeometryCollection::Facades::FCollectionTransformSelectionFacade TransformSelectionFacade(InCollection); const TManagedArray& TransformToGeometryIndex = InCollection.GetAttribute("TransformToGeometryIndex", FGeometryCollection::TransformGroup); const TManagedArray& FaceStart = InCollection.GetAttribute("FaceStart", FGeometryCollection::GeometryGroup); const TManagedArray& FaceCount = InCollection.GetAttribute("FaceCount", FGeometryCollection::GeometryGroup); TManagedArray& Visible = InCollection.ModifyAttribute("Visible", FGeometryCollection::FacesGroup); TArray TransformIndicies = InTransformSelection; TransformSelectionFacade.ConvertSelectionToRigidNodes(TransformIndicies); for (int32 Index : TransformIndicies) { // Iterate the faces in the geometry of this rigid node and set invisible. if (TransformToGeometryIndex[Index] > INDEX_NONE) { int32 CurrFace = FaceStart[TransformToGeometryIndex[Index]]; for (int32 FaceOffset = 0; FaceOffset < FaceCount[TransformToGeometryIndex[Index]]; ++FaceOffset) { Visible[CurrFace + FaceOffset] = bVisible; } } } } void FFractureEngineEdit::SetVisibilityInCollectionFromFaceSelection(FManagedArrayCollection& InCollection, const TArray& InFaceSelection, bool bVisible) { TManagedArray& Visible = InCollection.ModifyAttribute("Visible", FGeometryCollection::FacesGroup); int32 NumFaces = InCollection.NumElements(FGeometryCollection::FacesGroup); for (int32 FaceIdx : InFaceSelection) { Visible[FaceIdx] = bVisible; } } void FFractureEngineEdit::Merge(FGeometryCollection& GeometryCollection, const TArray& InBoneSelection) { const FManagedArrayCollection& InCollection = (const FManagedArrayCollection&)GeometryCollection; GeometryCollection::Facades::FCollectionTransformSelectionFacade TransformSelectionFacade(InCollection); TArray BoneIndicies = InBoneSelection; TransformSelectionFacade.Sanitize(BoneIndicies); const TArray& NodesForMerge = InBoneSelection; constexpr bool bBooleanUnion = false; MergeAllSelectedBones(GeometryCollection, NodesForMerge, bBooleanUnion); // Proximity is invalidated if (GeometryCollection.HasAttribute("Proximity", FGeometryCollection::GeometryGroup)) { GeometryCollection.RemoveAttribute("Proximity", FGeometryCollection::GeometryGroup); } }