// Copyright Epic Games, Inc. All Rights Reserved. #include "GeometryCollection/Facades/PointsCollectionFacade.h" #include "GeometryCollection/GeometryCollection.h" namespace GeometryCollection::Facades { FPointsCollectionFacade::FPointsCollectionFacade(FManagedArrayCollection& InCollection) : ConstCollection(InCollection) , Collection(&InCollection) {} FPointsCollectionFacade::FPointsCollectionFacade(const FManagedArrayCollection& InCollection) : ConstCollection(InCollection) , Collection(nullptr) {} // // Add points // void FPointsCollectionFacade::AddPoints(const TArray& InPoints) { const int32 NumPoints = InPoints.Num(); const int32 NumTransforms = Collection->NumElements(FGeometryCollection::TransformGroup); const int32 NumGeometry = Collection->NumElements(FGeometryCollection::GeometryGroup); const int32 NumVertices = Collection->NumElements(FGeometryCollection::VerticesGroup); Collection->AddElements(1, FGeometryCollection::TransformGroup); Collection->AddElements(1, FGeometryCollection::GeometryGroup); Collection->AddElements(NumPoints, FGeometryCollection::VerticesGroup); TManagedArray& Transform = Collection->AddAttribute("Transform", FGeometryCollection::TransformGroup); TManagedArray& BoneName = Collection->AddAttribute("BoneName", FGeometryCollection::TransformGroup); TManagedArray& BoneColor = Collection->AddAttribute("BoneColor", FGeometryCollection::TransformGroup); TManagedArray& Parent = Collection->AddAttribute("Parent", FGeometryCollection::TransformGroup); TManagedArray>& Children = Collection->AddAttribute>("Children", FGeometryCollection::TransformGroup); TManagedArray& TransformToGeometryIndex = Collection->AddAttribute("TransformToGoemetryIndex", FGeometryCollection::TransformGroup); TManagedArray& BoneMap = Collection->AddAttribute("BoneMap", FGeometryCollection::VerticesGroup); TManagedArray& TransformIndex = Collection->AddAttribute("TransformIndex", FGeometryCollection::GeometryGroup); TManagedArray& VertexStart = Collection->AddAttribute("VertexStart", FGeometryCollection::GeometryGroup); TManagedArray& VertexCount = Collection->AddAttribute("VertexCount", FGeometryCollection::GeometryGroup); TManagedArray& Vertex = Collection->AddAttribute("Vertex", FGeometryCollection::VerticesGroup); Transform[NumTransforms] = FTransform::Identity; BoneName[NumTransforms] = FString(TEXT("Points")); BoneColor[NumTransforms] = FLinearColor(0.02f, 0.01f, 0.1f, 1.0f); Parent[NumTransforms] = -1; Children[NumTransforms] = TSet(); TransformToGeometryIndex[NumTransforms] = NumGeometry; TransformIndex[NumGeometry] = NumTransforms; VertexStart[NumGeometry] = NumVertices; VertexCount[NumGeometry] = NumPoints; } void FPointsCollectionFacade::AddPointsWithFloatAttribute(const TArray& InPoints, const FName InAttributeName, const TArray& InValues) { const int32 NumPoints = InPoints.Num(); const int32 NumVertices = Collection->NumElements(FGeometryCollection::VerticesGroup); AddPoints(InPoints); TManagedArray& BoneMap = Collection->AddAttribute("BoneMap", FGeometryCollection::VerticesGroup); TManagedArray& Vertex = Collection->AddAttribute("Vertex", FGeometryCollection::VerticesGroup); TManagedArray& AttrArr = Collection->AddAttribute(InAttributeName, FGeometryCollection::VerticesGroup); for (int32 Idx = 0; Idx < NumPoints; ++Idx) { const int32 NewIdx = NumVertices + Idx; BoneMap[NewIdx] = 0; Vertex[NewIdx] = (FVector3f)InPoints[Idx]; AttrArr[NewIdx] = InValues[Idx]; } } void FPointsCollectionFacade::AddPointsWithIntAttribute(const TArray& InPoints, const FName InAttributeName, const TArray& InValues) { const int32 NumPoints = InPoints.Num(); const int32 NumVertices = Collection->NumElements(FGeometryCollection::VerticesGroup); AddPoints(InPoints); TManagedArray& BoneMap = Collection->AddAttribute("BoneMap", FGeometryCollection::VerticesGroup); TManagedArray& Vertex = Collection->AddAttribute("Vertex", FGeometryCollection::VerticesGroup); TManagedArray& AttrArr = Collection->AddAttribute(InAttributeName, FGeometryCollection::VerticesGroup); for (int32 Idx = 0; Idx < NumPoints; ++Idx) { const int32 NewIdx = NumVertices + Idx; BoneMap[NewIdx] = 0; Vertex[NewIdx] = (FVector3f)InPoints[Idx]; AttrArr[NewIdx] = InValues[Idx]; } } void FPointsCollectionFacade::AddPointsWithVectorAttribute(const TArray& InPoints, const FName InAttributeName, const TArray& InValues) { const int32 NumPoints = InPoints.Num(); const int32 NumVertices = Collection->NumElements(FGeometryCollection::VerticesGroup); AddPoints(InPoints); TManagedArray& BoneMap = Collection->AddAttribute("BoneMap", FGeometryCollection::VerticesGroup); TManagedArray& Vertex = Collection->AddAttribute("Vertex", FGeometryCollection::VerticesGroup); TManagedArray& AttrArr = Collection->AddAttribute(InAttributeName, FGeometryCollection::VerticesGroup); for (int32 Idx = 0; Idx < NumPoints; ++Idx) { const int32 NewIdx = NumVertices + Idx; BoneMap[NewIdx] = 0; Vertex[NewIdx] = (FVector3f)InPoints[Idx]; AttrArr[NewIdx] = InValues[Idx]; } } void FPointsCollectionFacade::GetPointsWithFloatAttribute(TArray& OutPoints, const FName InAttributeName, TArray& OutValues, const int32 InTransformIndex) { TManagedArray& TransformToGeometryIndex = Collection->AddAttribute("TransformToGoemetryIndex", FGeometryCollection::TransformGroup); TManagedArray& VertexStartArr = Collection->AddAttribute("VertexStart", FGeometryCollection::GeometryGroup); TManagedArray& VertexCount = Collection->AddAttribute("VertexCount", FGeometryCollection::GeometryGroup); TManagedArray& Vertex = Collection->AddAttribute("Vertex", FGeometryCollection::VerticesGroup); TManagedArray& AttrArr = Collection->AddAttribute(InAttributeName, FGeometryCollection::VerticesGroup); const int32 GeometryIndex = TransformToGeometryIndex[InTransformIndex]; const int32 VertexStart = VertexStartArr[GeometryIndex]; const int32 NumPoints = VertexCount[GeometryIndex]; OutPoints.Empty(); OutPoints.AddUninitialized(NumPoints); OutValues.Empty(); OutValues.AddUninitialized(NumPoints); for (int32 Idx = 0; Idx < NumPoints; ++Idx) { const int32 NewIdx = VertexStart + Idx; OutPoints[Idx] = (FVector)Vertex[NewIdx]; OutValues[Idx] = AttrArr[NewIdx]; } } };