140 lines
2.9 KiB
C++
140 lines
2.9 KiB
C++
#pragma once
|
||
|
||
#include <assert.h>
|
||
#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<FAdjacentVertex*>& 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<FAdjacentVertex*> 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<FAdjacentVertex*>& Vertices, const TArray<FAdjacentEdge*>& 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<FAdjacentVertex*> v;
|
||
|
||
TArray<FAdjacentEdge*> e;
|
||
|
||
int32 n;
|
||
|
||
FVector normal;
|
||
}; |