#pragma once #include #include "CoreMinimal.h" // 邻接顶点 class FAdjacentVertex { public: FAdjacentVertex(const FAdjacentVertex& Vertex) = default; FAdjacentVertex(uint32 index): index(index), inBorder(false), angle(0.0f) {} uint32 Index() const { return index; } FVector& Pos() { return pos; } bool& InBorder() { return inBorder; } FVector& Normal() { return normal; } FVector& SoftNormal() { return softNormal; } float& Angle() { return angle; } float Type() const { return type; } TArray& AdjVertice() { return adjVertice; } void CalculateType(); void CalculateSoftNormalByAdjVertice(); void ProjectSoftNormalOnNormalPlane(); private: // 此顶点索引 uint32 index; // 顶点位置 FVector pos; // 此顶点是否处于边界位置 bool inBorder; FVector normal; // 在边缘的话,软法线指向边界延伸方向 FVector softNormal; // 邻接三角形角度和 float angle; // 0表示非边界点(内部点),1表示普通边界点,2表示angle大于270°的分叉点,3表示angle小于90°的尖端点 float type; TArray adjVertice; }; bool operator==(const FAdjacentVertex& Left, const FAdjacentVertex& Right); FORCEINLINE uint32 GetTypeHash(FAdjacentVertex Vertex) { return GetTypeHash(Vertex.Index()); } // 邻接边 class FAdjacentEdge { public: FAdjacentEdge(const FAdjacentEdge& Edge) = default; FAdjacentEdge(FAdjacentVertex& V1, FAdjacentVertex& V2); FAdjacentVertex& V1() { return v1; } const FAdjacentVertex& V1() const { return v1; } FAdjacentVertex& V2() { return v2; } const FAdjacentVertex& V2() const { return v2; } float Length() { return length; } uint32& Count() { return count; } // 设置此边连接的两个顶点位于边界 void SetInBorder(); void AddVertexToEdge(); private: // 连接的两个顶点 FAdjacentVertex &v1, &v2; float length; uint32 count; }; bool operator==(const FAdjacentEdge& Left, const FAdjacentEdge& Right); // 顶点相同(顺序可以相反)的边,哈希值相同 FORCEINLINE uint32 GetTypeHash(FAdjacentEdge Edge) { return GetTypeHash(Edge.V1()) + GetTypeHash(Edge.V2()); } // 邻接多边形 class FAdjacentPolygon { public: FAdjacentPolygon(const FAdjacentPolygon& Triangle) = default; FAdjacentPolygon(const TArray& Vertices, const TArray& Edges, int32 n); FAdjacentVertex& V(uint32 i) { assert(0 <= i && i < n); return *v[i]; } FAdjacentEdge& E(uint32 i) { assert(0 <= i && i < n); return *e[i]; } // 计算三角形对每个顶点法线的贡献度 void CalculateVertexNormal(); private: TArray v; TArray e; int32 n; FVector normal; };