13#define DEBUG_HULL_GENERATION 0
22#define DEBUG_HULL_GENERATION_HULLSTEPS_TO_OBJ 0
23#define DEBUG_HULL_GENERATION_BUILDHORIZON_TO_OBJ 0
31 static constexpr FRealSingle TriQuadPrismInflation() {
return 0.1f; }
32 static constexpr FRealSingle DefaultHorizonEpsilon() {
return 0.1f; }
66 return DefaultHorizonEpsilon();
98 OutNormal =
Cross.GetUnsafeNormal();
118 bool bResult =
false;
121 if (NumVertices <= 3)
165 ConflictList =
nullptr;
170 FConvexFace() =
default;
171 ~FConvexFace() =
default;
211 if(HalfEdgesFreeIndices.Num())
214 FHalfEdge* FreeHalfEdge = &HalfEdges[Idx];
216 ensure(FreeHalfEdge->PoolIdx == Idx);
222 return &HalfEdges[Idx];
228 if(FacesFreeIndices.Num())
231 FConvexFace*
FreeFace = &Faces[Idx];
238 int32 Idx = Faces.AddElement(FConvexFace(Faces.Num(),
FacePlane));
245 HalfEdgesFreeIndices.Add(
HalfEdge->PoolIdx);
248 void FreeConvexFace(FConvexFace*
Face)
250 FacesFreeIndices.Add(
Face->PoolIdx);
277 FConvexFace* Faces = BuildInitialHull(Pool,
InVertices);
283#if DEBUG_HULL_GENERATION
294 FConvexFace*
DummyFace = Pool.AllocConvexFace(Faces->Plane);
303#if DEBUG_HULL_GENERATION
304#if DEBUG_HULL_GENERATION_HULLSTEPS_TO_OBJ
305 UE_LOG(
LogChaos, VeryVerbose,
TEXT(
"# ======================================================"));
308 UE_LOG(
LogChaos, VeryVerbose,
TEXT(
"# ------------------------------------------------------"));
338 OutIndices.Add(
TVec3<int32>(Cur->FirstEdge->Vertex, Cur->FirstEdge->Next->Vertex, Cur->FirstEdge->Next->Next->Vertex));
339 FConvexFace*
Next = Cur->Next;
368 return FString::Printf(
TEXT(
"Planes %d, Vertices %d"), NumPlanes, NumVertices);
429 for (
int Idx = 0; Idx < Vertices.
Num(); Idx++)
447 if (Indices.
Num() < 4)
459 const FVec3Type Point1 = Vertices[Index1];
460 const FVec3Type Point2 = Vertices[Index2];
463 const FVec3Type Segment1(Point2 - Point1);
490 int32 PlaneIndex = 0;
554 for (
int32 VertexIndex1 = 0; VertexIndex1 <
Vertices1.Num(); ++VertexIndex1)
572#if DEBUG_HULL_GENERATION
624 VertexIndex0 = VertexIndex1;
687 int32 StartIndex = 0;
726 if (FVec3Type::DotProduct(
Cross,
Face.Normal()) >= 0)
743 if (Stack.Num() >= 3)
795 for (
int32 PlaneIndex = 0; PlaneIndex <
InPlanes.Num(); ++PlaneIndex)
797 for (
int32 VertexIndex = 0; VertexIndex < Vertices.
Num(); ++VertexIndex)
823 return FVec3Type::CrossProduct((
B -
A), (
C -
A));
860 for(
int32 Idx = 0; Idx < NumFaces; ++Idx)
886 }
while(
Edge != Faces[MaxIdx]->FirstEdge);
892 FHalfEdge*& ConflictList = Faces[MaxIdx]->ConflictList;
895 ConflictList->Prev = Cur;
897 Cur->Next = ConflictList;
906 Pool.FreeHalfEdge(Cur);
934 for (
int32 i = 0; i < NumVertices; ++i)
939 VHalf->Next =
nullptr;
963 A->Prev->Next =
A->Next;
966 A->Next->Prev =
A->Prev;
968 B->Prev->Next =
B->Next;
971 B->Next->Prev =
B->Prev;
994 C->Prev->Next =
C->Next;
997 C->Next->Prev =
C->Prev;
1033 D->Prev->Next =
D->Next;
1036 D->Next->Prev =
D->Prev;
1048 Edges[0] = Edges[1];
1052 FConvexFace* Faces[4];
1053 Faces[0] = CreateFace(Pool,
InVertices, Edges[0], Edges[1], Edges[2]);
1054 Faces[1] = CreateFace(Pool,
InVertices, Pool.AllocHalfEdge(Edges[1]->Vertex), Pool.AllocHalfEdge(Edges[0]->Vertex), Edges[3]);
1055 Faces[2] = CreateFace(Pool,
InVertices, Pool.AllocHalfEdge(Edges[0]->Vertex), Pool.AllocHalfEdge(Edges[2]->Vertex), Pool.AllocHalfEdge(Edges[3]->Vertex));
1056 Faces[3] = CreateFace(Pool,
InVertices, Pool.AllocHalfEdge(Edges[2]->Vertex), Pool.AllocHalfEdge(Edges[1]->Vertex), Pool.AllocHalfEdge(Edges[3]->Vertex));
1063 MakeTwins(Edges[0], Faces[1]->FirstEdge);
1064 MakeTwins(Edges[1], Faces[3]->FirstEdge);
1065 MakeTwins(Edges[2], Faces[2]->FirstEdge);
1070 Faces[0]->Prev =
nullptr;
1071 for(
int i = 1; i < 4; ++i)
1073 Faces[i - 1]->Next = Faces[i];
1074 Faces[i]->Prev = Faces[i - 1];
1076 Faces[3]->Next =
nullptr;
1132#if DEBUG_HULL_GENERATION
1149#if DEBUG_HULL_GENERATION
1160 Processed.Add(
Edge->Face);
1162 FConvexFace*
NextFace = Twin->Face;
1164#if DEBUG_HULL_GENERATION
1170#if DEBUG_HULL_GENERATION
1178#if DEBUG_HULL_GENERATION
1181 Queue.
Add(Twin->Prev);
1182 Queue.
Add(Twin->Next);
1187#if DEBUG_HULL_GENERATION
1198#if DEBUG_HULL_GENERATION
1199 UE_LOG(
LogChaos, VeryVerbose,
TEXT(
"\tNON VALID EDGE LOOP - internal horizon edge detected [%d - %d] - skipping "),
Edge->Vertex,
Edge->Next->Vertex);
1205#if DEBUG_HULL_GENERATION
1206#if DEBUG_HULL_GENERATION_BUILDHORIZON_TO_OBJ
1207 UE_LOG(
LogChaos, VeryVerbose,
TEXT(
"# ======================================================"));
1210 UE_LOG(
LogChaos, VeryVerbose,
TEXT(
"# ------------------------------------------------------"));
1211 for (TSet<FConvexFace*>::TConstIterator SetIt(Processed); SetIt; ++SetIt)
1213 const FConvexFace*
Face = *SetIt;
1285 NewFaces[0]->FirstEdge->Prev->Twin = PrevEdge;
1286 PrevEdge->Twin =
NewFaces[0]->FirstEdge->Prev;
1324#if DEBUG_HULL_GENERATION
1328 NewFaceString += FString::Printf(
TEXT(
"(%d %d %d) "),
Face->FirstEdge->Vertex,
Face->FirstEdge->Next->Vertex,
Face->FirstEdge->Prev->Vertex);
1346 Pool.FreeHalfEdge(
Next);
1357 Pool.FreeConvexFace(
Face);
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define DEBUG_HULL_GENERATION
Definition CollisionConvexMesh.h:13
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
#define FVector
Definition IOSSystemIncludes.h:8
#define UE_CLOG(Condition, CategoryName, Verbosity, Format,...)
Definition LogMacros.h:298
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
UE::Math::TMatrix< float > FMatrix44f
Definition MathFwd.h:77
TTuple< KeyType, ValueType > TPair
Definition Tuple.h:55
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition CollisionConvexMesh.h:52
Params()
Definition CollisionConvexMesh.h:54
FRealType HorizonEpsilon
Definition CollisionConvexMesh.h:58
Definition CollisionConvexMesh.h:35
static void FinalizeFaces(const FPlaneType &Face, TArray< int32 > &InOutFaceVertexIndices, const TArray< FVec3Type > &Vertices)
Definition CollisionConvexMesh.h:776
static void RemoveInvalidFaces(TArray< FPlaneType > &InOutPlanes, TArray< TArray< int32 > > &InOutFaceVertexIndices)
Definition CollisionConvexMesh.h:488
static bool IsPlanarShape(const TArray< FVec3Type > &InVertices, FVec3Type &OutNormal)
Definition CollisionConvexMesh.h:116
static void BuildPlaneVertexIndices(TArray< FPlaneType > &InPlanes, const TArray< FVec3Type > &Vertices, TArray< TArray< int32 > > &OutFaceVertexIndices, const FRealType DistanceTolerance=1.e-3f)
Definition CollisionConvexMesh.h:792
static void RemoveInsideFaceVertices(const FPlaneType &Face, TArray< int32 > &InOutFaceVertexIndices, const TArray< FVec3Type > &Vertices, const FVec3Type &Centroid)
Definition CollisionConvexMesh.h:679
static bool IsValidTriangle(const FVec3Type &A, const FVec3Type &B, const FVec3Type &C)
Definition CollisionConvexMesh.h:102
static bool IsFaceOutlineConvex(const FPlaneType &Plane, const TArray< int32 > &Indices, const TArray< FVec3Type > &Vertices)
Definition CollisionConvexMesh.h:442
static bool IsGeometryReductionEnabled()
Definition CollisionConvexMesh.h:361
static CHAOS_API int32 PerformGeometryCheck
Definition CollisionConvexMesh.h:812
FRealSingle FRealType
Definition CollisionConvexMesh.h:38
static CHAOS_API void BuildIndices(const TArray< FVec3Type > &InVertices, TArray< int32 > &OutResultIndexData, EBuildMethod BuildMethod=EBuildMethod::Default)
Definition CollisionConvexMesh.cpp:44
static FString PerformanceWarningString(int32 NumPlanes, int32 NumVertices)
Definition CollisionConvexMesh.h:366
EBuildMethod
Definition CollisionConvexMesh.h:44
@ Default
Definition CollisionConvexMesh.h:45
@ Original
Definition CollisionConvexMesh.h:46
@ ConvexHull3
Definition CollisionConvexMesh.h:47
@ ConvexHull3Simplified
Definition CollisionConvexMesh.h:48
static FTriangleMesh BuildConvexHullTriMesh(const TArray< FVec3Type > &InVertices)
Definition CollisionConvexMesh.h:344
static CHAOS_API int32 ComputeHorizonEpsilonFromMeshExtends
Definition CollisionConvexMesh.h:815
static CHAOS_API int32 PerformGeometryReduction
Definition CollisionConvexMesh.h:813
TPlaneConcrete< FRealType, 3 > FPlaneType
Definition CollisionConvexMesh.h:40
static bool UseConvexHull3Simplifier(EBuildMethod BuildMethod)
Definition CollisionConvexMesh.cpp:37
static void SortFaceVerticesCCW(const FPlaneType &Face, TArray< int32 > &InOutFaceVertexIndices, const TArray< FVec3Type > &Vertices, const FVec3Type &Centroid)
Definition CollisionConvexMesh.h:753
TVec3< FRealType > FVec3Type
Definition CollisionConvexMesh.h:39
static void BuildConvexHull(const TArray< FVec3Type > &InVertices, TArray< TVec3< int32 > > &OutIndices, const Params &InParams=Params())
Definition CollisionConvexMesh.h:271
TAABB< FRealType, 3 > FAABB3Type
Definition CollisionConvexMesh.h:41
static void Simplify(TArray< FPlaneType > &InOutPlanes, TArray< TArray< int32 > > &InOutFaces, TArray< FVec3Type > &InOutVertices, FAABB3Type &InOutLocalBounds)
Definition CollisionConvexMesh.h:371
static void MergeFaces(TArray< FPlaneType > &InOutPlanes, TArray< TArray< int32 > > &InOutFaceVertexIndices, const TArray< FVec3Type > &Vertices, FRealType DistanceThreshold)
Definition CollisionConvexMesh.h:506
static bool UseConvexHull3(EBuildMethod BuildMethod)
Definition CollisionConvexMesh.cpp:31
static bool IsValidTriangle(const FVec3Type &A, const FVec3Type &B, const FVec3Type &C, FVec3Type &OutNormal)
Definition CollisionConvexMesh.h:93
static CHAOS_API bool bUseSimplifierForTConvexHull3
Definition CollisionConvexMesh.h:817
static CHAOS_API bool bUseGeometryTConvexHull3
Definition CollisionConvexMesh.h:816
static bool IsValidQuad(const FVec3Type &A, const FVec3Type &B, const FVec3Type &C, const FVec3Type &D, FVec3Type &OutNormal)
Definition CollisionConvexMesh.h:108
static CHAOS_API int32 VerticesThreshold
Definition CollisionConvexMesh.h:814
static void MergeColinearEdges(TArray< FPlaneType > &InOutPlanes, TArray< TArray< int32 > > &InOutFaceVertexIndices, TArray< FVec3Type > &InOutVertices, FRealType AngleToleranceCos)
Definition CollisionConvexMesh.h:584
static FRealType SuggestEpsilon(const TArray< FVec3Type > &InVertices)
Definition CollisionConvexMesh.h:61
static bool IsPerformanceWarning(int32 NumPlanes, int32 NumVertices)
Definition CollisionConvexMesh.h:351
Definition TriangleMesh.h:24
Definition CorePlane.h:12
FORCEINLINE T Size() const
Definition Vector.h:1055
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT void Push(ElementType &&Item)
Definition Array.h:1224
void Reset(SizeType NewSize=0)
Definition Array.h:2246
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
Definition ChunkedArray.h:56
Definition SkeletalMeshComponent.h:307
@ X
Definition SimulationModuleBase.h:152
FRealDouble FReal
Definition Real.h:22
float FRealSingle
Definition Real.h:14
constexpr double Epsilon
Definition SlopeUtils.h:114
U16 Index
Definition radfft.cpp:71
Definition BlendSpaceHelpers.h:61
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
Definition NumericLimits.h:41
T Z
Definition Vector.h:68
T Y
Definition Vector.h:65
T X
Definition Vector.h:62