36 static constexpr unsigned D = 3;
42 , UnitMassInertiaTensor(1., 1., 1.)
53 , UnitMassInertiaTensor(
MoveTemp(
Other.UnitMassInertiaTensor))
63 UE_DEPRECATED(4.27,
"Use the constructor version with the face indices.")
69 for (
int32 ParticleIndex = 0; ParticleIndex < Vertices.Num(); ++ParticleIndex)
78 ComputeUnitMassInertiaTensorAndRotationOfMass(Volume);
86 for (
int32 ParticleIndex = 0; ParticleIndex < Vertices.Num(); ++ParticleIndex)
97 ComputeUnitMassInertiaTensorAndRotationOfMass(Volume);
137 const FRealType DistanceTolerance = 1.0f;
146 ComputeUnitMassInertiaTensorAndRotationOfMass(Volume);
163#if TRACK_CHAOS_GEOMETRY
173 UnitMassInertiaTensor =
MoveTemp(
Other.UnitMassInertiaTensor);
220 return FAABB3(LocalBoundingBox.
Min(), LocalBoundingBox.
Max());
225 return LocalBoundingBox;
231 return PhiWithNormalInternal(
X,
Normal);
255 const FReal Phi = Planes[Idx].SignedDistance(
X);
290 ClosestPoint =
Point;
294 const TVector<FReal, 3>
Difference =
X - ClosestPoint;
319 FVec3 PlaneNormal = (Planes[Idx].Normal() /
Scale).GetUnsafeNormal();
358 ClosestPoint =
Point;
389 auto PlaneIntersection = Planes[Idx].FindClosestIntersection(StartPoint, EndPoint, Thickness);
396 for (
const auto&
Elem : Intersections)
517 return (
int32)Vertices.Num();
541 return Vertices[VertexIndex];
579 const FRealType Dot = FVec3Type::DotProduct(Vertices[Idx], Direction);
609 const FReal D1 = FVec3::DotProduct(X1,
N1);
610 const FReal D2 = FVec3::DotProduct(X2,
N2);
611 const FReal D3 = FVec3::DotProduct(
X3,
N3);
636 if (NumVertexPlanes >= 3)
656 if (NumVertexPlanes == 2)
665 if (NumVertexPlanes == 1)
686 if (NumVertexPlanes >= 3)
712 if (NumVertexPlanes == 2)
721 if (NumVertexPlanes == 1)
793 if (Thickness != 0.0f)
795 return Vertices[
MaxVIdx] + Direction.GetUnsafeNormal() * Thickness;
805 if (Thickness > 0.0f)
827 S.Append(
TEXT(
"\n"));
831 S.Append(FString::Printf(
TEXT(
" Vertex %d: [%f, %f, %f]\n"), VertexIndex, Vert.X, Vert.Y, Vert.Z));
833 for (
int32 PlaneIndex = 0; PlaneIndex <
NumPlanes(); ++PlaneIndex)
836 S.Append(FString::Printf(
TEXT(
" Plane %d: Normal: [%f, %f, %f], Distance: %f, Verts: ["), PlaneIndex,
Plane.Normal().X,
Plane.Normal().Y,
Plane.Normal().Z, FVec3::DotProduct(
Plane.X(),
Plane.Normal())));
843 S.Append(FString::Printf(
TEXT(
", ")));
846 S.Append(FString::Printf(
TEXT(
"]\n")));
848 S.Append(FString::Printf(
TEXT(
" Edges: ")));
849 for (
int32 EdgeIndex = 0; EdgeIndex <
NumEdges(); ++EdgeIndex)
854 S.Append(FString::Printf(
TEXT(
", ")));
857 S.Append(FString::Printf(
TEXT(
"\n")));
884 return RotationOfMass;
926 for(
int32 Idx = 0; Idx < Planes.Num(); ++Idx)
928 Planes[Idx] =
TmpPlanes[Idx].PlaneConcrete();
973 if (FMath::IsNaN(Volume) && Ar.
IsLoading())
1002 Ar << StructureData;
1014 Ar << UnitMassInertiaTensor;
1015 Ar << RotationOfMass;
1019 ComputeUnitMassInertiaTensorAndRotationOfMass(Volume);
1036 return (Vertices.Num() > 0 && Planes.Num() > 0);
1050 PerformanceWarningString +=
", [Simplifying]";
1054 return PerformanceWarningString;
1063 const FRealType DistanceTolerance = 1.0f;
1064 const FRealType AngleTolerance = 1.e-6f;
1098 , Planes(
Other.Planes)
1099 , Vertices(
Other.Vertices)
1100 , LocalBoundingBox(
Other.LocalBoundingBox)
1101 , Volume(
Other.Volume)
1102 , CenterOfMass(
Other.CenterOfMass)
1103 , UnitMassInertiaTensor(
Other.UnitMassInertiaTensor)
1104 , RotationOfMass(
Other.RotationOfMass)
1114 FConvexStructureData StructureData;
1117 FVec3 UnitMassInertiaTensor;
#define check(expr)
Definition AssertionMacros.h:314
#define CHAOS_ENSURE(Condition)
Definition ChaosCheck.h:22
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
FORCEINLINE VectorRegister4Float MakeVectorRegister(uint32 X, uint32 Y, uint32 Z, uint32 W)
Definition UnrealMathFPU.h:195
FORCEINLINE VectorRegister4Float VectorZeroFloat(void)
Definition UnrealMathFPU.h:331
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
FORCEINLINE VectorRegister4Float MakeVectorRegisterFloatFromDouble(const VectorRegister4Double &Vec4d)
Definition UnrealMathFPU.h:262
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
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 ChaosArchive.h:364
Definition ChaosArchive.h:167
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 CHAOS_API void Build(const TArray< FVec3Type > &InVertices, TArray< FPlaneType > &OutPlanes, TArray< TArray< int32 > > &OutFaceIndices, TArray< FVec3Type > &OutVertices, FAABB3Type &OutLocalBounds, EBuildMethod BuildMethod=EBuildMethod::Default)
Definition CollisionConvexMesh.cpp:108
static bool IsGeometryReductionEnabled()
Definition CollisionConvexMesh.h:361
static FString PerformanceWarningString(int32 NumPlanes, int32 NumVertices)
Definition CollisionConvexMesh.h:366
EBuildMethod
Definition CollisionConvexMesh.h:44
@ Default
Definition CollisionConvexMesh.h:45
@ ConvexHull3Simplified
Definition CollisionConvexMesh.h:48
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 void MergeColinearEdges(TArray< FPlaneType > &InOutPlanes, TArray< TArray< int32 > > &InOutFaceVertexIndices, TArray< FVec3Type > &InOutVertices, FRealType AngleToleranceCos)
Definition CollisionConvexMesh.h:584
static bool IsPerformanceWarning(int32 NumPlanes, int32 NumVertices)
Definition CollisionConvexMesh.h:351
Definition ConvexStructureData.h:19
int32 GetEdgeVertex(int32 EdgeIndex, int32 EdgeVertexIndex) const
Definition ConvexStructureData.h:220
void GetHalfEdges(int32 EdgeIndex, int32 &OutEdgeIndex0, int32 &OutEdgeIndex1) const
Definition ConvexStructureData.h:250
void CopyFrom(const FConvexStructureData &Other)
Definition ConvexStructureData.h:131
int32 GetPlaneVertex(int32 PlaneIndex, int32 PlaneVertexIndex) const
Definition ConvexStructureData.h:197
int32 NumPlaneVertices(int32 PlaneIndex) const
Definition ConvexStructureData.h:189
int32 GetEdgePlane(int32 EdgeIndex, int32 EdgePlaneIndex) const
Definition ConvexStructureData.h:230
bool IsValid() const
Definition ConvexStructureData.h:157
int32 GetPlaneHalfEdge(int32 PlaneIndex, int32 FaceVertexIndex) const
Definition ConvexStructureData.h:240
int32 NumEdges() const
Definition ConvexStructureData.h:213
bool IntersectPlanes3(const FVec3 &X1, const FVec3 &N1, const FVec3 &X2, const FVec3 &N2, const FVec3 &X3, const FVec3 &N3, FVec3 &OutX, const FReal EpsilonSq=FReal(1.e-6)) const
Definition Convex.h:593
FORCEINLINE void SerializeImp(FArchive &Ar)
Definition Convex.h:911
CHAOS_API Chaos::FImplicitObjectPtr CopyGeometryWithScale(const FVec3 &Scale) const override
Definition Convex.cpp:17
FString ToStringSummary() const
Definition Convex.h:818
CHAOS_API Chaos::FImplicitObjectPtr DeepCopyGeometry() const override
Definition Convex.cpp:23
FRealSingle TType
Definition Convex.h:30
virtual const FAABB3 BoundingBox() const override
Definition Convex.h:217
TAABB< FRealType, 3 > FAABB3Type
Definition Convex.h:34
bool HasStructureData() const
Definition Convex.h:407
int32 GetEdgePlane(int32 EdgeIndex, int32 EdgePlaneIndex) const
Definition Convex.h:468
virtual CHAOS_API int32 FindMostOpposingFaceScaled(const FVec3 &Position, const FVec3 &UnitDir, int32 HintFaceIndex, FReal SearchDist, const FVec3 &Scale) const override
Definition Convex.cpp:130
virtual FString ToString() const override
Definition Convex.h:812
TVec3< FRealType > FVec3Type
Definition Convex.h:32
virtual void Serialize(FArchive &Ar) override
Definition Convex.h:1029
const FPlaneType & GetPlaneRaw(int32 FaceIndex) const
Definition Convex.h:533
FConvex::FAABB3Type GetLocalBoundingBox() const
Definition Convex.h:223
static constexpr unsigned D
Definition Convex.h:36
CHAOS_API void MovePlanesAndRebuild(FRealType InDelta)
Definition Convex.cpp:338
const FReal GetVolume() const
Definition Convex.h:871
Chaos::FConvex * RawCopyAsConvex() const
Definition Convex.h:179
FVec3 GetMarginAdjustedVertex(const int32 VertexIndex, const FReal InMargin, FReal *OutSupportDelta) const
Definition Convex.h:617
const TArray< FVec3Type > & GetVertices() const
Definition Convex.h:861
FConvex()
Definition Convex.h:38
CHAOS_API Chaos::FImplicitObjectPtr DeepCopyGeometryWithScale(const FVec3 &Scale) const override
Definition Convex.cpp:28
static constexpr EImplicitObjectType StaticType()
Definition Convex.h:202
int32 NumVertices() const
Definition Convex.h:515
const FVec3Type & GetVertex(int32 VertexIndex) const
Definition Convex.h:539
virtual uint32 GetTypeHash() const override
Definition Convex.h:892
CHAOS_API Chaos::FImplicitObjectPtr CopyGeometry() const override
Definition Convex.cpp:11
int32 GetPlaneVertex(int32 PlaneIndex, int32 PlaneVertexIndex) const
Definition Convex.h:448
FVec3 GetCenter() const
Definition Convex.h:1071
FConvex & operator=(const FConvex &Other)=delete
virtual Pair< FVec3, bool > FindClosestIntersectionImp(const FVec3 &StartPoint, const FVec3 &EndPoint, const FReal Thickness) const override
Definition Convex.h:382
FVec3 SupportCore(const FVec3 &Direction, const FReal InMargin, FReal *OutSupportDelta, int32 &VertexIndex) const
Definition Convex.h:734
virtual FReal GetRadius() const override
Definition Convex.h:212
CHAOS_API int32 FindVertexPlanes(int32 VertexIndex, int32 *OutVertexPlanes, int32 MaxVertexPlanes) const
Definition Convex.cpp:308
FString ToStringFull() const
Definition Convex.h:824
void GetHalfEdges(int32 EdgeIndex, int32 &OutHalfEdge0, int32 &OutHalfEdge1) const
Definition Convex.h:488
VectorRegister4Float SupportCoreSimd(const VectorRegister4Float &Direction, const FReal InMargin) const
Definition Convex.h:746
virtual FReal PhiWithNormal(const FVec3 &X, FVec3 &Normal) const override
Definition Convex.h:229
const FMatrix33 GetInertiaTensor(const FReal Mass) const
Definition Convex.h:876
FConvex(TArray< FPlaneType > &&InPlanes, TArray< TArray< int32 > > &&InFaceIndices, TArray< FVec3Type > &&InVertices)
Definition Convex.h:81
FORCEINLINE FVec3 SupportScaled(const FVec3 &Direction, const FReal Thickness, const FVec3 &Scale, int32 &VertexIndex) const
Definition Convex.h:802
virtual FName GetTypeName() const
Definition ImplicitObject.h:414
int32 GetEdgeVertex(int32 EdgeIndex, int32 EdgeVertexIndex) const
Definition Convex.h:458
const FConvexStructureData & GetStructureData() const
Definition Convex.h:410
TType FRealType
Definition Convex.h:31
virtual CHAOS_API int32 FindMostOpposingFace(const FVec3 &Position, const FVec3 &UnitDir, int32 HintFaceIndex, FReal SearchDist) const override
Definition Convex.cpp:104
CHAOS_API int32 GetVertexPlanes3(int32 VertexIndex, int32 &PlaneIndex0, int32 &PlaneIndex1, int32 &PlaneIndex2) const
Definition Convex.cpp:317
CHAOS_API bool GetClosestEdgeVertices(int32 PlaneIndex, const FVec3 &Position, int32 &OutVertexIndex0, int32 &OutVertexIndex1) const
Definition Convex.cpp:273
int32 NumPlaneVertices(int32 PlaneIndex) const
Definition Convex.h:438
FVec3 SupportCoreScaled(const FVec3 &Direction, FReal InMargin, const FVec3 &Scale, FReal *OutSupportDelta, int32 &VertexIndex) const
Definition Convex.h:762
CHAOS_API int32 GetMostOpposingPlaneScaled(const FVec3 &Normal, const FVec3 &Scale) const
Definition Convex.cpp:212
int32 NumPlanes() const
Definition Convex.h:501
FConvex(TArray< FPlaneType > &&InPlanes, TArray< TArray< int32 > > &&InFaceIndices, TArray< FVec3Type > &&InVertices, const FVec3Type &InMin, const FVec3Type &InMax, const FRealType InVolume, const FVec3Type InInertiaTensor, const FRotation3 &InRotationMatrix, const bool bRegularDatas)
Definition Convex.h:100
int32 NumEdges() const
Definition Convex.h:506
const TArray< FPlaneType > & GetFaces() const
Definition Convex.h:866
virtual FString PerformanceWarningAndSimplifaction() override
Definition Convex.h:1044
CHAOS_API bool RaycastFast(const FVec3 &StartPoint, const FVec3 &Dir, const FReal Length, const FReal Thickness, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex) const
Definition Convex.cpp:50
const TPlaneConcrete< FReal, 3 > GetPlane(int32 FaceIndex) const
Definition Convex.h:521
CHAOS_API int32 GetMostOpposingPlane(const FVec3 &Normal) const
Definition Convex.cpp:193
FReal GetWindingOrder() const
Definition Convex.h:565
virtual bool IsPerformanceWarning() const override
Definition Convex.h:1039
void GetPlaneNX(const int32 FaceIndex, FVec3 &OutN, FVec3 &OutX) const
Definition Convex.h:527
virtual FReal PhiWithNormalScaled(const FVec3 &X, const FVec3 &Scale, FVec3 &Normal) const override
Definition Convex.h:234
const FVec3 GetCenterOfMass() const
Definition Convex.h:887
TUniquePtr< FConvex > CopyAsConvex() const
Definition Convex.h:185
FConvex(FConvex &&Other)
Definition Convex.h:45
virtual FReal GetMargin() const override
Definition Convex.h:207
virtual bool IsValidGeometry() const override
Definition Convex.h:1034
FConvex & operator=(FConvex &&Other)
Definition Convex.h:153
FVec3 GetClosestEdgePosition(int32 PlaneIndex, const FVec3 &Position) const
Definition Convex.h:423
FVec3 FindGeometryOpposingNormal(const FVec3 &DenormDir, int32 FaceIndex, const FVec3 &OriginalNormal) const
Definition Convex.h:549
virtual void Serialize(FChaosArchive &Ar) override
Definition Convex.h:1023
virtual CHAOS_API int32 FindClosestFaceAndVertices(const FVec3 &Position, TArray< FVec3 > &FaceVertices, FReal SearchDist=0.01f) const override
Definition Convex.cpp:159
CHAOS_API FVec3 GetClosestEdge(int32 PlaneIndexHint, const FVec3 &Position, FVec3 &OutEdgePos0, FVec3 &OutEdgePos1) const
Definition Convex.cpp:233
int32 GetPlaneHalfEdge(int32 PlaneIndex, int32 PlaneEdgeIndex) const
Definition Convex.h:478
FORCEINLINE FVec3 Support(const FVec3 &Direction, const FReal Thickness, int32 &VertexIndex) const
Definition Convex.h:787
void SimplifyGeometry()
Definition Convex.h:1057
FVec3 GetMarginAdjustedVertexScaled(int32 VertexIndex, FReal InMargin, const FVec3 &Scale, FReal *OutSupportDelta) const
Definition Convex.h:676
FRotation3 GetRotationOfMass() const
Definition Convex.h:882
FConvex(const TArray< FVec3Type > &InVertices, const FReal InMargin, FConvexBuilder::EBuildMethod BuildMethod=FConvexBuilder::EBuildMethod::Default)
Definition Convex.h:116
Definition ImplicitObject.h:111
bool bHasBoundingBox
Definition ImplicitObject.h:574
CHAOS_API FReal SignedDistance(const FVec3 &x) const
Definition ImplicitObject.cpp:105
FRealSingle Margin
Definition ImplicitObject.h:571
bool HasBoundingBox() const
Definition ImplicitObject.h:275
EImplicitObjectType CollisionType
Definition ImplicitObject.h:586
bool bIsTracked
Definition ImplicitObject.h:577
EImplicitObjectType Type
Definition ImplicitObject.h:585
bool bDoCollide
Definition ImplicitObject.h:573
bool IsConvex() const
Definition ImplicitObject.h:277
CHAOS_API FImplicitObject(int32 Flags, EImplicitObjectType InType=ImplicitObjectType::Unknown)
Definition ImplicitObject.cpp:25
virtual FName GetTypeName() const
Definition ImplicitObject.h:414
CHAOS_API void SerializeImp(FArchive &Ar)
Definition ImplicitObject.cpp:337
void SetMargin(FReal InMargin)
Definition ImplicitObject.h:567
bool bIsConvex
Definition ImplicitObject.h:572
FORCEINLINE const TVector< T, d > & Max() const
Definition AABB.h:596
FORCEINLINE T GetVolume() const
Definition AABB.h:613
FORCEINLINE TVector< T, d > GetCenterOfMass() const
Definition AABB.h:452
FORCEINLINE void GrowToInclude(const TVector< T, d > &V)
Definition AABB.h:393
FORCEINLINE uint32 GetTypeHash() const
Definition AABB.h:665
FORCEINLINE const TVector< T, d > & Min() const
Definition AABB.h:595
static void SerializeAsAABB(FArchive &Ar, TAABB< T, d > &AABB)
Definition Box.h:467
Definition CorePlane.h:12
const TVec3< T > & Normal() const
Definition CorePlane.h:226
static FORCEINLINE TCorePlane< T > MakeFrom(const TCorePlane< U > &Plane)
Definition CorePlane.h:114
Definition Particles.h:32
Definition Archive.h:1208
virtual CORE_API void UsingCustomVersion(const struct FGuid &Guid)
Definition Archive.cpp:590
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG void Sort()
Definition Array.h:3418
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UniquePtr.h:107
friend UE_FORCEINLINE_HINT uint32 GetTypeHash(const UE_STRING_CLASS &S)
Definition UnrealString.h.inl:2176
@ Convex
Definition ImplicitObjectType.h:21
Definition SkeletalMeshComponent.h:307
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
@ X
Definition SimulationModuleBase.h:152
FRealDouble FReal
Definition Real.h:22
TRotation< FReal, 3 > FRotation3
Definition Core.h:19
TVector< T, d > FindClosestPointOnTriangle(const TVector< T, d > &ClosestPointOnPlane, const TVector< T, d > &P0, const TVector< T, d > &P1, const TVector< T, d > &P2, const TVector< T, d > &P)
Definition Plane.h:168
PMatrix< FReal, 3, 3 > FMatrix33
Definition Core.h:20
Pair< T1, T2 > MakePair(const T1 &First, const T2 &Second)
Definition Pair.h:45
float FRealSingle
Definition Real.h:14
void CalculateVolumeAndCenterOfMass(const FBox &BoundingBox, FVector::FReal &OutVolume, FVector &OutCenterOfMass)
Definition MassProperties.cpp:109
@ Raycast
Definition SimulationModuleBase.h:145
TVector< FReal, 3 > FVec3
Definition Core.h:17
TAABB< FReal, 3 > FAABB3
Definition ImplicitObject.h:34
U16 Index
Definition radfft.cpp:71
CORE_API static const FGuid GUID
Definition ExternalPhysicsCustomObjectVersion.h:144
@ AddConvexCenterOfMassAndVolume
Definition ExternalPhysicsCustomObjectVersion.h:73
@ ConvexUsesTPlaneConcrete
Definition ExternalPhysicsCustomObjectVersion.h:106
CORE_API static const FGuid GUID
Definition FortniteMainBranchObjectVersion.h:21
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578
@ ConvexUsesVerticesArray
Definition PhysicsObjectVersion.h:37
CORE_API static const FGuid GUID
Definition PhysicsObjectVersion.h:78
CORE_API static const FGuid GUID
Definition ReleaseObjectVersion.h:154
@ StructureDataAddedToConvex
Definition ReleaseObjectVersion.h:128
@ MarginAddedToConvexAndBox
Definition ReleaseObjectVersion.h:125
CORE_API static const FGuid GUID
Definition UE5MainStreamObjectVersion.h:22
CORE_API static const FGuid GUID
Definition UE5ReleaseStreamObjectVersion.h:22
Definition NumericLimits.h:41
Definition UnrealMathFPU.h:20