// Copyright Epic Games, Inc. All Rights Reserved. /*============================================================================= GeometryCollection.cpp: FGeometryCollection methods. =============================================================================*/ #include "GeometryCollection/Facades/CollectionMeshFacade.h" #include "GeometryCollection/GeometryCollection.h" #include "GeometryCollection/TransformCollection.h" namespace GeometryCollection::Facades { FCollectionMeshFacade::FCollectionMeshFacade(FManagedArrayCollection& InCollection) : FCollectionUVFacade(InCollection) , TransformToGeometryIndexAttribute(InCollection, "TransformToGeometryIndex", FGeometryCollection::TransformGroup) , TransformIndexAttribute(InCollection, "TransformIndex", FGeometryCollection::GeometryGroup) , VertexAttribute(InCollection, "Vertex", FGeometryCollection::VerticesGroup) , TangentUAttribute(InCollection, "TangentU", FGeometryCollection::VerticesGroup) , TangentVAttribute(InCollection, "TangentV", FGeometryCollection::VerticesGroup) , NormalAttribute(InCollection, "Normal", FGeometryCollection::VerticesGroup) , ColorAttribute(InCollection, "Color", FGeometryCollection::VerticesGroup) , BoneMapAttribute(InCollection, "BoneMap", FGeometryCollection::VerticesGroup) , VertexStartAttribute(InCollection, "VertexStart", FGeometryCollection::GeometryGroup) , VertexCountAttribute(InCollection, "VertexCount", FGeometryCollection::GeometryGroup) , IndicesAttribute(InCollection, "Indices", FGeometryCollection::FacesGroup) , VisibleAttribute(InCollection, "Visible", FGeometryCollection::FacesGroup) , MaterialIndexAttribute(InCollection, "MaterialIndex", FGeometryCollection::FacesGroup) , MaterialIDAttribute(InCollection, "MaterialID", FGeometryCollection::FacesGroup) , InternalAttribute(InCollection, "Internal", FGeometryCollection::FacesGroup) , FaceStartAttribute(InCollection, "FaceStart", FGeometryCollection::GeometryGroup) , FaceCountAttribute(InCollection, "FaceCount", FGeometryCollection::GeometryGroup) { } FCollectionMeshFacade::FCollectionMeshFacade(const FManagedArrayCollection& InCollection) : FCollectionUVFacade(InCollection) , TransformToGeometryIndexAttribute(InCollection, "TransformToGeometryIndex", FGeometryCollection::TransformGroup) , TransformIndexAttribute(InCollection, "TransformIndex", FGeometryCollection::GeometryGroup) , VertexAttribute(InCollection, "Vertex", FGeometryCollection::VerticesGroup) , TangentUAttribute(InCollection, "TangentU", FGeometryCollection::VerticesGroup) , TangentVAttribute(InCollection, "TangentV", FGeometryCollection::VerticesGroup) , NormalAttribute(InCollection, "Normal", FGeometryCollection::VerticesGroup) , ColorAttribute(InCollection, "Color", FGeometryCollection::VerticesGroup) , BoneMapAttribute(InCollection, "BoneMap", FGeometryCollection::VerticesGroup) , VertexStartAttribute(InCollection, "VertexStart", FGeometryCollection::GeometryGroup) , VertexCountAttribute(InCollection, "VertexCount", FGeometryCollection::GeometryGroup) , IndicesAttribute(InCollection, "Indices", FGeometryCollection::FacesGroup) , VisibleAttribute(InCollection, "Visible", FGeometryCollection::FacesGroup) , MaterialIndexAttribute(InCollection, "MaterialIndex", FGeometryCollection::FacesGroup) , MaterialIDAttribute(InCollection, "MaterialID", FGeometryCollection::FacesGroup) , InternalAttribute(InCollection, "Internal", FGeometryCollection::FacesGroup) , FaceStartAttribute(InCollection, "FaceStart", FGeometryCollection::GeometryGroup) , FaceCountAttribute(InCollection, "FaceCount", FGeometryCollection::GeometryGroup) { } bool FCollectionMeshFacade::IsValid() const { return FCollectionUVFacade::IsValid() && TransformToGeometryIndexAttribute.IsValid() && TransformIndexAttribute.IsValid() && VertexAttribute.IsValid() && TangentUAttribute.IsValid() && TangentVAttribute.IsValid() && NormalAttribute.IsValid() && ColorAttribute.IsValid() && BoneMapAttribute.IsValid() && VertexStartAttribute.IsValid() && VertexCountAttribute.IsValid() && IndicesAttribute.IsValid() && VisibleAttribute.IsValid() && MaterialIndexAttribute.IsValid() && MaterialIDAttribute.IsValid() && InternalAttribute.IsValid() && FaceStartAttribute.IsValid() && FaceCountAttribute.IsValid() ; } void FCollectionMeshFacade::DefineSchema() { FCollectionUVFacade::DefineSchema(); TransformToGeometryIndexAttribute.Add(); TransformIndexAttribute.Add(); VertexAttribute.Add(); TangentUAttribute.Add(); TangentVAttribute.Add(); NormalAttribute.Add(); ColorAttribute.Add(); BoneMapAttribute.Add(); VertexStartAttribute.Add(); VertexCountAttribute.Add(); IndicesAttribute.Add(); VisibleAttribute.Add(); MaterialIndexAttribute.Add(); MaterialIDAttribute.Add(); InternalAttribute.Add(); FaceStartAttribute.Add(); FaceCountAttribute.Add(); } const TArray FCollectionMeshFacade::GetVertexIndices(int32 BoneIdx) const { const TManagedArray& TransformToGeometryIndicies = TransformToGeometryIndexAttribute.Get(); const TManagedArray& VertexStarts = VertexStartAttribute.Get(); const TManagedArray& VertexCounts = VertexCountAttribute.Get(); TArray VertexIndices; const int32 VertexIndexStart = VertexStarts[TransformToGeometryIndicies[BoneIdx]]; for (int32 Offset = 0; Offset < VertexCounts[TransformToGeometryIndicies[BoneIdx]]; ++Offset) { VertexIndices.Add(VertexIndexStart + Offset); } return VertexIndices; } const TArrayView FCollectionMeshFacade::GetVertexPositions(int32 BoneIdx) const { const TManagedArray& TransformToGeometryIndicies = TransformToGeometryIndexAttribute.Get(); const TManagedArray& VertexStarts = VertexStartAttribute.Get(); const TManagedArray& VertexCounts = VertexCountAttribute.Get(); const TManagedArray& Vertices = VertexAttribute.Get(); return TArrayView(Vertices.GetData() + VertexStarts[TransformToGeometryIndicies[BoneIdx]], VertexCounts[TransformToGeometryIndicies[BoneIdx]] + 1); } const TArray FCollectionMeshFacade::GetFaceIndices(int32 BoneIdx) const { const TManagedArray& TransformToGeometryIndicies = TransformToGeometryIndexAttribute.Get(); const TManagedArray& FaceStarts = FaceStartAttribute.Get(); const TManagedArray& FaceCounts = FaceCountAttribute.Get(); TArray FaceIndicies; const int32 FaceIndexStart = FaceStarts[TransformToGeometryIndicies[BoneIdx]]; for (int32 Offset = 0; Offset < FaceCounts[TransformToGeometryIndicies[BoneIdx]]; ++Offset) { FaceIndicies.Add(FaceIndexStart + Offset); } return FaceIndicies; } void FCollectionMeshFacade::BakeTransform(int32 TransformIdx, const FTransform& InTransform) { const TManagedArray& TransformToGeometryIndices = TransformToGeometryIndexAttribute.Get(); TManagedArray& Vertices = VertexAttribute.Modify(); const TManagedArray& VertexStarts = VertexStartAttribute.Get(); const TManagedArray& VertexCounts = VertexCountAttribute.Get(); TManagedArray& Normals = NormalAttribute.Modify(); TManagedArray& TangentUs = TangentUAttribute.Modify(); TManagedArray& TangentVs = TangentVAttribute.Modify(); const int32 VertexIndexStart = VertexStarts[TransformToGeometryIndices[TransformIdx]]; for (int32 Offset = 0; Offset < VertexCounts[TransformToGeometryIndices[TransformIdx]]; ++Offset) { const int32 VertexIdx = VertexIndexStart + Offset; Vertices[VertexIdx] = (FVector3f)InTransform.TransformPosition((FVector)Vertices[VertexIdx]); Normals[VertexIdx] = (FVector3f)InTransform.TransformVector((FVector)Normals[VertexIdx]); TangentUs[VertexIdx] = (FVector3f)InTransform.TransformVector((FVector)TangentUs[VertexIdx]); TangentVs[VertexIdx] = (FVector3f)InTransform.TransformVector((FVector)TangentVs[VertexIdx]); } } const TArray FCollectionMeshFacade::GetGeometryGroupIndexArray() const { TArray GroupIndexArray; const TManagedArray& Vertices = VertexAttribute.Get(); const TManagedArray& VertexStarts = VertexStartAttribute.Get(); const TManagedArray& VertexCounts = VertexCountAttribute.Get(); GroupIndexArray.Init(INDEX_NONE, Vertices.Num()); for (int32 GroupIdx = 0; GroupIdx < VertexStarts.Num(); ++GroupIdx) { for (int32 LocalIdx = 0; LocalIdx < VertexCounts[GroupIdx]; ++LocalIdx) { GroupIndexArray[VertexStarts[GroupIdx] + LocalIdx] = GroupIdx; } } return GroupIndexArray; } };