47 if (
sizeof(T) <=
sizeof(
float))
227 bValid =
OutEntries[0].Initialize(
VertsA.GetData(),
VertsB.GetData(), 1, 2, 3, { 3,1,2 }, { 1,1,1 });
228 bValid &=
OutEntries[1].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 3, 2, { 2,0,3 }, { 2,1,0 });
229 bValid &=
OutEntries[2].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 1, 3, { 3,0,1 }, { 2,2,0 });
230 bValid &=
OutEntries[3].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 2, 1, { 1,0,2 }, { 2,0,0 });
249 bValid =
OutEntries[3].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 2, 1, { 1,0,2 }, { 2,0,0 });
256 bValid =
OutEntries[0].Initialize(
VertsA.GetData(),
VertsB.GetData(), 1, 2, 3, { 3,1,2 }, { 1,1,1 });
257 bValid &=
OutEntries[1].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 3, 2, { 2,0,3 }, { 2,1,0 });
258 bValid &=
OutEntries[2].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 1, 3, { 3,0,1 }, { 2,2,0 });
270 bValid =
OutEntries[0].Initialize(
VertsA.GetData(),
VertsB.GetData(), 1, 2, 3, { 3,1,2 }, { 1,1,1 });
271 bValid &=
OutEntries[1].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 3, 2, { 2,0,3 }, { 2,1,0 });
272 bValid &=
OutEntries[2].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 1, 3, { 3,0,1 }, { 2,2,0 });
273 bValid &=
OutEntries[3].Initialize(
VertsA.GetData(),
VertsB.GetData(), 0, 2, 1, { 1,0,2 }, { 2,0,0 });
318template <
typename T,
typename SupportALambda,
typename SupportBLambda >
338 for (
int i = 0; i < 3; ++i)
415 OutA += As[i] * Barycentric[i];
416 OutB += Bs[i] * Barycentric[i];
442template <
typename T,
typename TSupportA,
typename TSupportB>
461 return (*Entries)[Idx] > (*Entries)[
Other.Idx];
480 for (
int32 Idx = 0; Idx < 4; ++Idx)
487 for(
int32 Idx = 0; Idx < Entries.
Num(); ++Idx)
514 std::sort(Queue.
GetData(), Queue.
GetData() + Queue.
Num(), [&Entries](
const int32 L,
const int32 R) { return Entries[L] > Entries[R]; });
561 if (UpperBound < LowerBound)
#define check(expr)
Definition AssertionMacros.h:314
#define CHAOS_ENSURE(Condition)
Definition ChaosCheck.h:22
#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
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
T * New(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:259
UE_REWRITE constexpr bool operator>(const LhsType &Lhs, const RhsType &Rhs)
Definition UEOps.h:90
static FORCEINLINE TVector< T, 3 > AxisVector(const int32 Axis)
Definition Vector.h:1061
FORCEINLINE T SizeSquared() const
Definition Vector.h:1067
UE_FORCEINLINE_HINT SizeType AddUninitialized()
Definition Array.h:1664
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
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 AssetRegistryState.h:50
Definition SkeletalMeshComponent.h:307
void ComputeEPAResults(const TVec3< T > *VertsA, const TVec3< T > *VertsB, const TEPAEntry< T > &Entry, T &OutPenetration, TVec3< T > &OutDir, TVec3< T > &OutA, TVec3< T > &OutB)
Definition EPA.h:378
constexpr int32 ArraySizeEPA
Definition EPA.h:15
@ X
Definition SimulationModuleBase.h:152
FRealDouble FReal
Definition Real.h:22
const bool IsEPASuccess(EEPAResult EPAResult)
Definition EPA.h:430
void EPAComputeVisibilityBorder(TEPAWorkingArray< TEPAEntry< T > > &Entries, int32 EntryIdx, const TVec3< T > &W, TEPAWorkingArray< FEPAFloodEntry > &OutBorderEdges, TEPAWorkingArray< FEPAFloodEntry > &ToVisitStack)
Definition EPA.h:334
bool InitializeEPA(TArray< TVec3< T > > &VertsA, TArray< TVec3< T > > &VertsB, TFunctionRef< TVector< T, 3 >(const TVec3< T > &V)> SupportA, TFunctionRef< TVector< T, 3 >(const TVec3< T > &V)> SupportB, TEPAWorkingArray< TEPAEntry< T > > &OutEntries, TVec3< T > &OutTouchNormal)
Definition EPA.h:155
EEPAResult
Definition EPA.h:421
FORCEINLINE const TVec3< T > MinkowskiVert(const TVec3< T > *VertsABuffer, const TVec3< T > *VertsBBuffer, const int32 Idx)
Definition EPA.h:24
EEPAResult EPA(TArray< TVec3< T > > &VertsABuffer, TArray< TVec3< T > > &VertsBBuffer, const TSupportA &SupportA, const TSupportB &SupportB, T &OutPenetration, TVec3< T > &OutDir, TVec3< T > &WitnessA, TVec3< T > &WitnessB, const FReal Eps=1.e-2f)
Definition EPA.h:443
TVec3< T > SimplexFindClosestToOrigin(TVec3< T > *Simplex, FSimplex &Idxs, T *OutBarycentric, TVec3< T > *A=nullptr, TVec3< T > *B=nullptr)
Definition Simplex.h:587
int32 EdgeIdx
Definition EPA.h:330
int32 EntryIdx
Definition EPA.h:329
void SwapWinding(TEPAEntry *Entries)
Definition EPA.h:89
bool IsOriginProjectedInside(const TVec3< T > *VertsABuffer, const TVec3< T > *VertsBBuffer, const T Epsilon) const
Definition EPA.h:124
int32 IdxBuffer[3]
Definition EPA.h:32
bool bObsolete
Definition EPA.h:38
FORCEINLINE_DEBUGGABLE T DistanceToPlane(const TVec3< T > &X) const
Definition EPA.h:119
TVector< int32, 3 > AdjFaces
Definition EPA.h:36
TVec3< T > PlaneNormal
Definition EPA.h:34
FORCEINLINE_DEBUGGABLE bool Initialize(const TVec3< T > *VerticesA, const TVec3< T > *VerticesB, int32 InIdx0, int32 InIdx1, int32 InIdx2, const TVector< int32, 3 > &InAdjFaces, const TVector< int32, 3 > &InAdjEdges)
Definition EPA.h:57
T Distance
Definition EPA.h:35
FORCEINLINE bool operator>(const TEPAEntry< T > &Other) const
Definition EPA.h:40
TVector< int32, 3 > AdjEdges
Definition EPA.h:37
static constexpr T SelectEpsilon(float FloatEpsilon, double DoubleEpsilon)
Definition EPA.h:45
Definition NumericLimits.h:41