// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/ArrayView.h" #include "CoreMinimal.h" #include "Math/UnrealMathSSE.h" #include "Math/Vector2D.h" #include "MeshAttributeArray.h" #include "MeshDescription.h" #include "UObject/NameTypes.h" struct FEdgeID; struct FPolygonGroupID; struct FUVID; struct FVertexID; struct FVertexInstanceID; namespace MeshAttribute { namespace Vertex { extern MESHDESCRIPTION_API const FName Position; } namespace VertexInstance { extern MESHDESCRIPTION_API const FName VertexIndex; } namespace Edge { extern MESHDESCRIPTION_API const FName VertexIndex; } namespace Triangle { extern MESHDESCRIPTION_API const FName VertexInstanceIndex; extern MESHDESCRIPTION_API const FName PolygonIndex; extern MESHDESCRIPTION_API const FName EdgeIndex; extern MESHDESCRIPTION_API const FName VertexIndex; extern MESHDESCRIPTION_API const FName UVIndex; extern MESHDESCRIPTION_API const FName PolygonGroupIndex; } namespace UV { extern MESHDESCRIPTION_API const FName UVCoordinate; } namespace Polygon { extern MESHDESCRIPTION_API const FName PolygonGroupIndex; } } class FMeshAttributes { public: explicit FMeshAttributes(FMeshDescription& InMeshDescription) : MeshDescription(InMeshDescription) {} virtual ~FMeshAttributes() = default; MESHDESCRIPTION_API virtual void Register(bool bKeepExistingAttribute = false); static bool IsReservedAttributeName(const FName InAttributeName) { return InAttributeName == MeshAttribute::Vertex::Position || InAttributeName == MeshAttribute::VertexInstance::VertexIndex || InAttributeName == MeshAttribute::Edge::VertexIndex || InAttributeName == MeshAttribute::Triangle::VertexInstanceIndex || InAttributeName == MeshAttribute::Triangle::PolygonIndex || InAttributeName == MeshAttribute::Triangle::EdgeIndex || InAttributeName == MeshAttribute::Triangle::VertexIndex || InAttributeName == MeshAttribute::Triangle::UVIndex || InAttributeName == MeshAttribute::Triangle::PolygonGroupIndex || InAttributeName == MeshAttribute::UV::UVCoordinate || InAttributeName == MeshAttribute::Polygon::PolygonGroupIndex; } /** Accessors for cached vertex position array */ TVertexAttributesRef GetVertexPositions() { return MeshDescription.VertexAttributes().GetAttributesRef(MeshAttribute::Vertex::Position); } TVertexAttributesConstRef GetVertexPositions() const { return MeshDescription.VertexAttributes().GetAttributesRef(MeshAttribute::Vertex::Position); } /** Accessors for array of vertex IDs for vertex instances */ TVertexInstanceAttributesRef GetVertexInstanceVertexIndices() { return MeshDescription.VertexInstanceAttributes().GetAttributesRef(MeshAttribute::VertexInstance::VertexIndex); } TVertexInstanceAttributesConstRef GetVertexInstanceVertexIndices() const { return MeshDescription.VertexInstanceAttributes().GetAttributesRef(MeshAttribute::VertexInstance::VertexIndex); } /** Accessors for array of vertex IDs for edges */ TEdgeAttributesRef> GetEdgeVertexIndices() { return MeshDescription.EdgeAttributes().GetAttributesRef>(MeshAttribute::Edge::VertexIndex); } TEdgeAttributesConstRef> GetEdgeVertexIndices() const { return MeshDescription.EdgeAttributes().GetAttributesRef>(MeshAttribute::Edge::VertexIndex); } /** Accessors for array of vertex instance IDs for triangles */ TTriangleAttributesRef> GetTriangleVertexInstanceIndices() { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::VertexInstanceIndex); } TTriangleAttributesConstRef> GetTriangleVertexInstanceIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::VertexInstanceIndex); } /** Accessors for array of edge IDs for triangles */ TTriangleAttributesRef> GetTriangleEdgeIndices() { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::EdgeIndex); } TTriangleAttributesConstRef> GetTriangleEdgeIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::EdgeIndex); } /** Accessors for array of vertex IDs for triangles */ TTriangleAttributesRef> GetTriangleVertexIndices() { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::VertexIndex); } TTriangleAttributesConstRef> GetTriangleVertexIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::VertexIndex); } /** Accessors for array of UV IDs for triangles */ TTriangleAttributesRef> GetTriangleUVIndices() { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::UVIndex); } TTriangleAttributesConstRef> GetTriangleUVIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::UVIndex); } /** Accessors for UV coordinates */ TUVAttributesRef GetUVCoordinates(int32 UVChannel) { return MeshDescription.UVAttributes(UVChannel).GetAttributesRef(MeshAttribute::UV::UVCoordinate); } TUVAttributesConstRef GetUVCoordinates(int32 UVChannel) const { return MeshDescription.UVAttributes(UVChannel).GetAttributesRef(MeshAttribute::UV::UVCoordinate); } /** Accessors for array of polygon group IDs for triangles */ TTriangleAttributesRef GetTrianglePolygonGroupIndices() { return MeshDescription.TriangleAttributes().GetAttributesRef(MeshAttribute::Triangle::PolygonGroupIndex); } TTriangleAttributesConstRef GetTrianglePolygonGroupIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef(MeshAttribute::Triangle::PolygonGroupIndex); } /** Accessors for array of polygon group IDs for polygons */ TPolygonAttributesRef GetPolygonPolygonGroupIndices() { return MeshDescription.PolygonAttributes().GetAttributesRef(MeshAttribute::Polygon::PolygonGroupIndex); } TPolygonAttributesConstRef GetPolygonPolygonGroupIndices() const { return MeshDescription.PolygonAttributes().GetAttributesRef(MeshAttribute::Polygon::PolygonGroupIndex); } protected: FMeshDescription& MeshDescription; }; class FMeshConstAttributes { public: explicit FMeshConstAttributes(const FMeshDescription& InMeshDescription) : MeshDescription(InMeshDescription) {} /** Accessors for cached vertex position array */ TVertexAttributesConstRef GetVertexPositions() const { return MeshDescription.VertexAttributes().GetAttributesRef(MeshAttribute::Vertex::Position); } /** Accessors for array of vertex IDs for vertex instances */ TVertexInstanceAttributesConstRef GetVertexInstanceVertexIndices() const { return MeshDescription.VertexInstanceAttributes().GetAttributesRef(MeshAttribute::VertexInstance::VertexIndex); } /** Accessors for array of vertex IDs for edges */ TEdgeAttributesConstRef> GetEdgeVertexIndices() const { return MeshDescription.EdgeAttributes().GetAttributesRef>(MeshAttribute::Edge::VertexIndex); } /** Accessors for array of vertex instance IDs for triangles */ TTriangleAttributesConstRef> GetTriangleVertexInstanceIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::VertexInstanceIndex); } /** Accessors for array of edge IDs for triangles */ TTriangleAttributesConstRef> GetTriangleEdgeIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::EdgeIndex); } /** Accessors for array of vertex IDs for triangles */ TTriangleAttributesConstRef> GetTriangleVertexIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::VertexIndex); } /** Accessors for array of UV IDs for triangles */ TTriangleAttributesConstRef> GetTriangleUVIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef>(MeshAttribute::Triangle::UVIndex); } /** Accessors for UV coordinates */ TUVAttributesConstRef GetUVCoordinates(int32 UVChannel) const { return MeshDescription.UVAttributes(UVChannel).GetAttributesRef(MeshAttribute::UV::UVCoordinate); } /** Accessors for array of polygon group IDs for triangles */ TTriangleAttributesConstRef GetTrianglePolygonGroupIndices() const { return MeshDescription.TriangleAttributes().GetAttributesRef(MeshAttribute::Triangle::PolygonGroupIndex); } /** Accessors for array of polygon group IDs for polygons */ TPolygonAttributesConstRef GetPolygonPolygonGroupIndices() const { return MeshDescription.PolygonAttributes().GetAttributesRef(MeshAttribute::Polygon::PolygonGroupIndex); } protected: const FMeshDescription& MeshDescription; };