12 class FPBDCollisionConstraint;
16 class FPBDCollisionSolver;
115 State.SolverBodies[0].Reset();
116 State.SolverBodies[1].Reset();
118 State.NumManifoldPoints = 0;
124 State.NumManifoldPoints = 0;
151 State.SoftPhi = SoftPhi;
162 return State.NumManifoldPoints;
167 return State.MaxManifoldPoints;
172 if (State.NumManifoldPoints < State.MaxManifoldPoints)
174 return State.NumManifoldPoints++;
181 check(State.ManifoldPoints !=
nullptr);
184 return State.ManifoldPoints[ManifoldPointIndex];
274 bool IsDynamic(
const int32 BodyIndex)
const
279 void CalculateContactPositionCorrectionNormal(
284 void CalculateContactPositionErrorTangential(
289 void CalculateContactVelocityError(
297 void CalculateContactVelocityErrorNormal(
301 bool ShouldSolveVelocity(
302 const FPBDCollisionSolverManifoldPoint&
ManifoldPoint)
const;
304 void CalculatePositionCorrectionNormal(
311 void CalculatePositionCorrectionTangent(
318 void ApplyFrictionCone(
328 void ApplyPositionCorrectionTangential(
337 void ApplyPositionCorrectionNormal(
342 void ApplySoftPositionCorrectionNormal(
348 void ApplyVelocityCorrection(
358 void ApplyVelocityCorrectionNormal(
382 VelocityFriction = 0;
384 SolverBodies[0].Reset();
385 SolverBodies[1].Reset();
386 ManifoldPoints =
nullptr;
387 NumManifoldPoints = 0;
388 MaxManifoldPoints = 0;
390 MinMaxFrictionPushout = 0;
418 FPBDCollisionSolverManifoldPoint* ManifoldPoints;
419 int32 NumManifoldPoints;
420 int32 MaxManifoldPoints;
524 CalculatePositionCorrectionTangent(
526 ContactDeltaTangentU,
531 CalculatePositionCorrectionTangent(
533 ContactDeltaTangentV,
556 Body0.ApplyPositionDelta(
DX0);
557 Body0.ApplyRotationDelta(
DR0);
564 Body1.ApplyPositionDelta(
DX1);
565 Body1.ApplyRotationDelta(
DR1);
576 CalculatePositionCorrectionNormal(
591 Body0.ApplyPositionDelta(
DX0);
592 Body0.ApplyRotationDelta(
DR0);
599 Body1.ApplyPositionDelta(
DX1);
600 Body1.ApplyRotationDelta(
DR1);
641 if ((DynamicFriction > 0) && (Dt > 0))
680 Body0.ApplyVelocityDelta(
DV0,
DW0);
687 Body1.ApplyVelocityDelta(
DV1,
DW1);
714 Body0.ApplyVelocityDelta(
DV0,
DW0);
721 Body1.ApplyVelocityDelta(
DV1,
DW1);
734 State.InvMs[0] =
InvM0;
735 State.InvMs[1] =
InvM1;
797 State.InvMs[0] =
InvM0;
798 State.InvMs[1] =
InvM1;
831 if (IsDynamic(0) && IsDynamic(1))
837 else if (IsDynamic(0))
842 else if (IsDynamic(1))
863 const FConstraintSolverBody& Body0 =
SolverBody0();
864 const FConstraintSolverBody& Body1 =
SolverBody1();
869 if (IsDynamic(0) && IsDynamic(1))
879 else if (IsDynamic(0))
887 else if (IsDynamic(1))
908 const FConstraintSolverBody& Body0 =
SolverBody0();
909 const FConstraintSolverBody& Body1 =
SolverBody1();
937 const FConstraintSolverBody& Body0 =
SolverBody0();
938 const FConstraintSolverBody& Body1 =
SolverBody1();
968 check(State.ManifoldPoints !=
nullptr);
1030 FSolverReal ContactDeltaTangentU, ContactDeltaTangentV;
1031 CalculateContactPositionErrorTangential(
SolverManifoldPoint, ContactDeltaTangentU, ContactDeltaTangentV);
1033 ApplyPositionCorrectionTangential(
1035 State.StaticFriction,
1036 State.DynamicFriction,
1038 ContactDeltaTangentU,
1039 ContactDeltaTangentV,
1064 ApplyPositionCorrectionNormal(
1090 SolveVelocityAverage(Dt);
1117 ApplyVelocityCorrection(
1132 ApplyVelocityCorrectionNormal(
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
Definition SolverBody.h:543
bool IsDynamic() const
Whether the body is dynamic (i.e., has a finite mass) after scaling is applied.
Definition SolverBody.h:622
const FSolverVec3 & DP() const
Definition SolverBody.h:641
FSolverReal InvM() const
The net scaled inverse mass.
Definition SolverBody.h:607
FSolverMatrix33 InvI() const
The net scaled inverse inertia.
Definition SolverBody.h:612
const FSolverVec3 & DQ() const
Definition SolverBody.h:642
Definition SolverBody.h:99
static constexpr FSolverReal ZeroMassThreshold()
Definition SolverBody.h:101
A single contact point in a FPBDCollisionSolver.
Definition PBDCollisionSolver.h:34
FSolverVec3 ContactRxTangentU1
Definition PBDCollisionSolver.h:53
FSolverReal ContactMassTangentV
Definition PBDCollisionSolver.h:65
FSolverVec3 ContactTangentU
Definition PBDCollisionSolver.h:40
FSolverReal NetImpulseNormal
Definition PBDCollisionSolver.h:70
FSolverVec3 ContactTangentUAngular1
Definition PBDCollisionSolver.h:60
FSolverVec3 ContactTangentVAngular0
Definition PBDCollisionSolver.h:58
FSolverVec3 ContactRxTangentV0
Definition PBDCollisionSolver.h:52
uint32 bApplyFriction
Definition PBDCollisionSolver.h:81
FSolverVec3 ContactNormalAngular1
Definition PBDCollisionSolver.h:59
FSolverReal NetSoftPushOutNormal
Definition PBDCollisionSolver.h:73
FSolverReal NetPushOutTangentU
Definition PBDCollisionSolver.h:68
FSolverVec3 ContactNormalAngular0
Definition PBDCollisionSolver.h:56
FSolverVec3 RelativeContactPoints[2]
Definition PBDCollisionSolver.h:37
FSolverReal ContactMassTangentU
Definition PBDCollisionSolver.h:64
FSolverReal NetImpulseTangentU
Definition PBDCollisionSolver.h:71
FSolverReal NetPushOutNormal
Definition PBDCollisionSolver.h:67
FSolverReal ContactMassNormal
Definition PBDCollisionSolver.h:63
FSolverVec3 ContactRxTangentU0
Definition PBDCollisionSolver.h:51
FSolverVec3 ContactTangentV
Definition PBDCollisionSolver.h:41
FSolverReal NetImpulseTangentV
Definition PBDCollisionSolver.h:72
FSolverReal StaticFrictionRatio
Definition PBDCollisionSolver.h:78
FSolverVec3 ContactRxNormal0
Definition PBDCollisionSolver.h:49
FSolverReal ContactDeltaNormal
Definition PBDCollisionSolver.h:43
FSolverReal ContactDeltaTangentV
Definition PBDCollisionSolver.h:45
FSolverReal NetPushOutTangentV
Definition PBDCollisionSolver.h:69
FSolverVec3 ContactNormal
Definition PBDCollisionSolver.h:39
FSolverVec3 ContactTangentVAngular1
Definition PBDCollisionSolver.h:61
FSolverVec3 ContactRxTangentV1
Definition PBDCollisionSolver.h:54
FSolverVec3 ContactRxNormal1
Definition PBDCollisionSolver.h:50
FSolverReal ContactDeltaTangentU
Definition PBDCollisionSolver.h:44
FSolverVec3 ContactTangentUAngular0
Definition PBDCollisionSolver.h:57
FSolverReal ContactTargetVelocityNormal
Definition PBDCollisionSolver.h:47
Definition PBDCollisionSolver.h:91
FSolverReal GetVelocityFriction() const
Definition PBDCollisionSolver.h:129
void SolveVelocity(const FSolverReal Dt, const bool bApplyDynamicFriction)
Calculate and apply the velocity correction for this iteration.
Definition PBDCollisionSolver.h:1080
static const int32 MaxConstrainedBodies
Definition PBDCollisionSolver.h:93
static FPBDCollisionSolver MakeUninitialized()
Definition PBDCollisionSolver.h:104
const FPBDCollisionSolverManifoldPoint & GetManifoldPoint(const int32 ManifoldPointIndex) const
Definition PBDCollisionSolver.h:179
void SetStiffness(const FSolverReal InStiffness)
Definition PBDCollisionSolver.h:139
void SolvePositionNoFriction(const FSolverReal Dt, const FSolverReal MaxPushOut)
Calculate and apply the position correction for this iteration.
Definition PBDCollisionSolver.h:1046
const FConstraintSolverBody & SolverBody1() const
Definition PBDCollisionSolver.h:221
void UpdateMassNormal()
Definition PBDCollisionSolver.h:788
void FinalizeManifold()
Definition PBDCollisionSolver.h:999
void SetSoftContact(const FSolverReal SoftPhi)
Definition PBDCollisionSolver.h:149
void ResetManifold()
Definition PBDCollisionSolver.h:122
void InitManifoldPoint(const int32 PointIndex, const FSolverReal Dt, const FSolverVec3 &InRelativeContactPosition0, const FSolverVec3 &InRelativeContactPosition1, const FSolverVec3 &InWorldContactNormal, const FSolverVec3 &InWorldContactTangentU, const FSolverVec3 &InWorldContactTangentV, const FSolverReal InWorldContactDeltaNormal, const FSolverReal InWorldContactDeltaTangentU, const FSolverReal InWorldContactDeltaTangentV, const FSolverReal InWorldContactVelocityTargetNormal)
Definition PBDCollisionSolver.h:955
FSolverReal GetStaticFriction() const
Definition PBDCollisionSolver.h:127
void UpdateMass()
Definition PBDCollisionSolver.h:725
FConstraintSolverBody & SolverBody0()
Get the first solver body NOTE: This will not include any shock propagation mass scaling.
Definition PBDCollisionSolver.h:212
void SetSolverBodies(FSolverBody &SolverBody0, FSolverBody &SolverBody1)
Definition PBDCollisionSolver.h:154
int32 AddManifoldPoint()
Definition PBDCollisionSolver.h:170
void SetHardContact()
Definition PBDCollisionSolver.h:144
FSolverReal GetDynamicFriction() const
Definition PBDCollisionSolver.h:128
int32 NumManifoldPoints() const
Definition PBDCollisionSolver.h:160
const FConstraintSolverBody & SolverBody0() const
Definition PBDCollisionSolver.h:213
void SetFriction(const FSolverReal InStaticFriction, const FSolverReal InDynamicFriction, const FSolverReal InVelocityFriction, const FSolverReal InMinMaxFrictionPushOut)
Definition PBDCollisionSolver.h:131
FPBDCollisionSolver()
Definition PBDCollisionSolver.h:110
void Reset(FPBDCollisionSolverManifoldPoint *InManifoldPoints, const int32 InMaxManifoldPoints)
Definition PBDCollisionSolver.h:113
static FPBDCollisionSolver MakeInitialized()
Definition PBDCollisionSolver.h:96
int32 MaxManifoldPoints() const
Definition PBDCollisionSolver.h:165
void SolvePositionWithFriction(const FSolverReal Dt, const FSolverReal MaxPushOut)
Definition PBDCollisionSolver.h:1004
FConstraintSolverBody & SolverBody1()
Get the second solver body NOTE: This will not include any shock propagation mass scaling.
Definition PBDCollisionSolver.h:220
bool bChaos_PBDCollisionSolver_Velocity_FrictionEnabled
Definition PBDCollisionSolver.cpp:47
float Chaos_PBDCollisionSolver_Position_StaticFrictionStiffness
Definition PBDCollisionSolver.cpp:34
bool bChaos_PBDCollisionSolver_Velocity_AveragePointEnabled
Definition PBDCollisionSolver.cpp:49
float Chaos_PBDCollisionSolver_Velocity_StaticFrictionStiffness
Definition PBDCollisionSolver.cpp:48
Definition SkeletalMeshComponent.h:307
TVec3< FSolverReal > FSolverVec3
Definition SolverBody.h:44
FRealSingle FSolverReal
Definition SolverBody.h:38
TVector< FReal, 3 > FVec3
Definition Core.h:17
void Init()
Definition LaunchIOS.cpp:473
Definition OverriddenPropertySet.cpp:45
FAutoConsoleVariableRef CVars[]
Definition MassProcessingPhaseManager.cpp:29
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578