UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDCollisionConstraint.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Core.h"
5
12#include "Chaos/GJK.h"
15#include "Chaos/Vector.h"
16
18
19namespace Chaos
20{
21 namespace Private
22 {
23 class FCollisionConstraintAllocator;
24 class FCollisionContextAllocator;
25 }
26 class FConstGenericParticleHandle;
27 class FImplicitObject;
28 class FParticlePairMidPhase;
29 class FPBDCollisionConstraint;
30 class FPBDCollisionConstraints;
31 class FPerShapeData;
32 class FShapeInstance;
33 class FSingleShapePairCollisionDetector;
34 class FSolverBody;
35 class FSolverBodyContainer;
36
37 UE_DEPRECATED(4.27, "Use FPBDCollisionConstraint instead")
39
41
43
44 /*
45 * @brief Material properties for a collision constraint
46 */
48 {
49 public:
50
51 // NOTE: This pragma is needed until the deprecated properties are removed
55 , DynamicFriction(0)
56 , StaticFriction(0)
57 , Restitution(0)
58 , RestitutionThreshold(0)
59 , InvMassScale0(1)
60 , InvMassScale1(1)
61 , InvInertiaScale0(1)
62 , InvInertiaScale1(1)
63 , SoftSeparation(0)
64 , BaseFrictionImpulse(0)
65 { }
66
69 , DynamicFriction(Other.DynamicFriction)
70 , StaticFriction(Other.StaticFriction)
71 , Restitution(Other.Restitution)
72 , RestitutionThreshold(Other.RestitutionThreshold)
73 , InvMassScale0(Other.InvMassScale0)
74 , InvMassScale1(Other.InvMassScale1)
75 , InvInertiaScale0(Other.InvInertiaScale0)
76 , InvInertiaScale1(Other.InvInertiaScale1)
77 , SoftSeparation(Other.SoftSeparation)
78 , BaseFrictionImpulse(Other.BaseFrictionImpulse)
79 { }
80
82 {
84 DynamicFriction = Other.DynamicFriction;
85 StaticFriction = Other.StaticFriction;
86 Restitution = Other.Restitution;
87 RestitutionThreshold = Other.RestitutionThreshold;
88 InvMassScale0 = Other.InvMassScale0;
89 InvMassScale1 = Other.InvMassScale1;
90 InvInertiaScale0 = Other.InvInertiaScale0;
91 InvInertiaScale1 =Other.InvInertiaScale1;
92 SoftSeparation = Other.SoftSeparation;
93 BaseFrictionImpulse = Other.BaseFrictionImpulse;
94 return *this;
95 }
96
98
99 // The face index that the material was extracted from
101
102 // Final material properties (post modifier) used by the solver
103 // These get reset every frame to the material values (if modified)
112
113 UE_DEPRECATED(5.5, "Use DynamicFriction instead")
114 FRealSingle MaterialDynamicFriction;
115 UE_DEPRECATED(5.5, "Use StaticFriction instead")
116 FRealSingle MaterialStaticFriction;
117 UE_DEPRECATED(5.5, "Use Restitution instead")
118 FRealSingle MaterialRestitution;
119
120 // SoftSeparation is usually negative (0 for disabled), and indicates the depth at which the hard collision starts
121 FRealSingle SoftSeparation;
122
123 // BaseFrictionThickness is usually positive (0 for disabled) and is the distance away from the core shape
124 // at which the base friction impulse can be applied.
125 FRealSingle BaseFrictionImpulse;
126 };
127
128 // Renamed to FPBDCollisionConstraintMaterial
129 using FCollisionContact UE_DEPRECATED(5.1, "FCollisionContact was renamed to FPBDCollisionConstraintMaterial") = FPBDCollisionConstraintMaterial;
130
132 {
133
134 // Flags to specify what types of bounds tests should be run for a collision constraint
135 // NOTE: These are separate from the other constraint flags because the ShapePair MidPhase
136 // stores a copy for use in determining whether to create a constraint in the first place.
151
153 FGeometryParticleHandle* Particle0, const FImplicitObject* Implicit0, const FPerShapeData* Shape0,
154 FGeometryParticleHandle* Particle1, const FImplicitObject* Implicit1, const FPerShapeData* Shape1,
156 }
157
164 {
165 public:
175
187
188 // The constraint owner - set when the constraint is created
190
191 // The Epoch when then constraint was initially created
193
194 // The Epoch when the constraint was last used
196
197 // The index in the container - this changes every tick (is valid for all constraints, including CCD)
199
200 // Used by the MidPhase when a constraint is reactivated from a Resim cache
201 // If true, indicates that the constraint was created from the recursive collision detection
202 // path rather than the prefiltered shape-pair loop
204
205 // The CCD index in the container - this changes every tick (is INDEX_NONE for non-CCD constraints)
207 };
208
209
225 {
235
237
238 public:
240
241 static constexpr FRealSingle MaxTOI = std::numeric_limits<FRealSingle>::max();
242
248 static CHAOS_API void Make(
249 FGeometryParticleHandle* Particle0,
251 const FPerShapeData* Shape0,
254 FGeometryParticleHandle* Particle1,
256 const FPerShapeData* Shape1,
259 const FReal InCullDistance,
260 const bool bInUseManifold,
261 const EContactShapesType ShapesType,
263
269
275
282
285
290 bool GetCCDEnabled() const { return Flags.bCCDEnabled; }
291
295 void SetCCDEnabled(const bool bCCDEnabled)
296 {
297 Flags.bCCDEnabled = bCCDEnabled;
298 Flags.bCCDSweepEnabled = bCCDEnabled;
299
300 // Initialize the CCD thresholds (one time only)
301 if (bCCDEnabled && (CCDEnablePenetration == FReal(0)))
302 {
304 }
305 }
306
318 bool GetCCDSweepEnabled() const { return Flags.bCCDSweepEnabled; }
319
324 void SetCCDSweepEnabled(const bool bCCDSweepEnabled)
325 {
326 Flags.bCCDSweepEnabled = bCCDSweepEnabled;
327 }
328
333 {
334 return CCDEnablePenetration;
335 }
336
341 {
342 return CCDTargetPenetration;
343 }
344
345 //
346 // API
347 //
348
349 FGeometryParticleHandle* GetParticle0() const { return Particle[0]; }
350 FGeometryParticleHandle* GetParticle1() const { return Particle[1]; }
351 FGeometryParticleHandle* GetParticle(const int32 ParticleIndex) const { check((ParticleIndex >= 0) && (ParticleIndex < 2)); return Particle[ParticleIndex]; }
352
353 const FImplicitObject* GetImplicit0() const { return Implicit[0]; }
354 const FImplicitObject* GetImplicit1() const { return Implicit[1]; }
355 const FImplicitObject* GetImplicit(const int32 ParticleIndex) const { check((ParticleIndex >= 0) && (ParticleIndex < 2)); return Implicit[ParticleIndex]; }
356
357 const FShapeInstance* GetShape0() const { return Shape[0]; }
358 const FShapeInstance* GetShape1() const { return Shape[1]; }
359 const FShapeInstance* GetShape(const int32 ParticleIndex) const { check((ParticleIndex >= 0) && (ParticleIndex < 2)); return Shape[ParticleIndex]; }
360
361 const FBVHParticles* GetCollisionParticles0() const { return Simplicial[0]; }
362 const FBVHParticles* GetCollisionParticles1() const { return Simplicial[1]; }
363 const FBVHParticles* GetCollisionParticles(const int32 ParticleIndex) const { check((ParticleIndex >= 0) && (ParticleIndex < 2)); return Simplicial[ParticleIndex]; }
364
365 const FReal GetCollisionMargin0() const { return CollisionMargins[0]; }
366 const FReal GetCollisionMargin1() const { return CollisionMargins[1]; }
367
368 const bool IsQuadratic0() const { return Flags.bIsQuadratic0; }
369 const bool IsQuadratic1() const { return Flags.bIsQuadratic1; }
370 const bool HasQuadraticShape() const { return (Flags.bIsQuadratic0 || Flags.bIsQuadratic1); }
371 const FReal GetCollisionRadius0() const { return (Flags.bIsQuadratic0) ? CollisionMargins[0] : FReal(0); }
372 const FReal GetCollisionRadius1() const { return (Flags.bIsQuadratic1) ? CollisionMargins[1] : FReal(0); }
373
377 CHAOS_API void Activate();
378
379 UE_DEPRECATED(5.2, "Removed parameter")
380 void Activate(const FReal Dt) { Activate(); }
381
382 // When a particle is moved under user control, we need to update some cached state to prevent friction from undoing the move
384
385 // @todo(chaos): half of this API is wrong for the new multi-point manifold constraints. Remove it
386
387 void ResetPhi(FReal InPhi) { ClosestManifoldPointIndex = INDEX_NONE; }
388 FReal GetPhi() const { return (ClosestManifoldPointIndex != INDEX_NONE) ? ManifoldPoints[ClosestManifoldPointIndex].ContactPoint.Phi : TNumericLimits<FReal>::Max(); }
389
390 // A tick reset called on all constraints that were Activated last tick
392 {
393 Flags.bDisabled = true;
394 if (!IsSleeping())
395 {
396 Flags.bIsCurrent = false;
397 }
398 ContainerCookie.ConstraintIndex = INDEX_NONE;
399 ContainerCookie.CCDConstraintIndex = INDEX_NONE;
400 }
401
402 // Was this constraint activated this frame? It will be activated if the shapes are within CullDistance of each other.
403 // NOTE: All Awake Current constraints are in the ActiveConstraints list on the CollisionConstraintAllocator. This remains true
404 // even if disabled by the user (via SetDisabled()) in a callback. We usually only care about "not current" constraints
405 // for debug visualization/reporting. Normally you would only need to consider GetDisabled()
406 // NOTE: sleeping constraints are also considered Current, but are not in the ActiveConstraints list
407 bool IsCurrent() const { return Flags.bIsCurrent; }
408
409 // Allow the user to disable this constraint. @see GetActive().
410 void SetDisabled(bool bInDisabled) { Flags.bDisabled = bInDisabled; }
411
412 // Whether this constraint was disabled by the user (e.g., via a collision callback)
413 bool GetDisabled() const { return Flags.bDisabled; }
414
415 bool GetIsOneWayInteraction() const { return Flags.bIsOneWayInteraction; }
416
417 void SetIsProbe(bool bInProbe) { Flags.bIsProbe = bInProbe; }
418 bool GetIsProbe() const { return Flags.bIsProbe; }
419
420 // Is this considered an initial contact (i.e., contact was activated this tick, but not last)
421 void SetIsInitialContact(const bool bInIsInitialContact) { Flags.bInitialContact = bInIsInitialContact; }
422 bool IsInitialContact() const { return Flags.bInitialContact; }
423 FRealSingle GetMinInitialPhi() const { return MinInitialPhi; }
424 bool UsePerContactInitialPhi() const { return Flags.bUsePerContactInitialPhi; }
425
426 virtual bool SupportsSleeping() const override final { return true; }
427 virtual bool SupportsPartialIslandSleeping() const override final { return true; }
428 CHAOS_API virtual bool IsSleeping() const override final;
430
431 // The total impulse for a collision constraint is computed summing over the net impulse of all manifold points.
433
434 // Get the world-space normal of the closest manifold point
435 // @todo(chaos): remove (used by legacy RBAN collision solver)
437
438 // Get the world-space contact location of the closest manifold point
439 // @todo(chaos): remove (used by legacy RBAN collision solver)
441
442 // Called to force the contact to recollect its material properties (e.g., when materials are modified)
444 {
445 Flags.bMaterialSet = false;
446 }
447
448 // Find the material for this contact and collect the friction, restitution, etc. This data is cached in the
449 // contact, so ClearMaterialProperties must be called if the material changes to force a re-gather of the data.
451 {
452 if (!Flags.bMaterialSet)
453 {
455 Flags.bMaterialSet = true;
456 }
457 }
458
459 void SetModifierApplied() { Flags.bModifierApplied = true; }
460
461 UE_DEPRECATED(5.5, "Use specific material property getters instead")
463
465 FReal GetInvMassScale0() const { return Material.InvMassScale0; }
466
468 FReal GetInvMassScale1() const { return Material.InvMassScale1; }
469
471 FReal GetInvInertiaScale0() const { return Material.InvInertiaScale0; }
472
474 FReal GetInvInertiaScale1() const { return Material.InvInertiaScale1; }
475
477 FReal GetStiffness() const { return Stiffness; }
478
480 FReal GetRestitution() const { return Material.Restitution; }
481
483 FReal GetRestitutionThreshold() const { return Material.RestitutionThreshold; }
484
486 FReal GetStaticFriction() const { return FMath::Max(Material.StaticFriction, Material.DynamicFriction); }
487
489 FReal GetDynamicFriction() const { return Material.DynamicFriction; }
490
492 FReal GetMinFrictionPushOut() const { return Material.BaseFrictionImpulse; }
493
494 bool IsSoftContact() const { return (Material.SoftSeparation != 0); }
495
497 FRealSingle GetSoftSeparation() const { return Material.SoftSeparation; }
498
499 EContactShapesType GetShapesType() const { return ShapesType; }
500
501 CHAOS_API FString ToString() const;
502
503 FReal GetCullDistance() const { return CullDistance; }
504 FRealSingle GetCullDistancef() const { return CullDistance; }
506
507 FVec3f GetRelativeMovement() const { return RelativeMovement; }
508 void SetRelativeMovement(const FVec3f& InDelta) { RelativeMovement = InDelta; }
509
510 // Whether we are using manifolds (either one-shot or incremental)
511 bool GetUseManifold() const { return Flags.bUseManifold; }
512
513 // Whether we can use incremental manifolds (updated each iteration)
514 bool GetUseIncrementalManifold() const { return Flags.bUseIncrementalManifold; }
515
516 // Whether we run collision detection every iteration (true if we are not using one shot manifolds)
517 // NOTE: This is initially set based on whether are allowing incremental manifolds
518 bool GetUseIncrementalCollisionDetection() const { return !Flags.bUseManifold || Flags.bUseIncrementalManifold; }
519
520 // Initial overlap depenetration velocity from the maximum of the two bodies
521 FRealSingle GetInitialOverlapDepenetrationVelocity() const { return InitialOverlapDepenetrationVelocity; }
522
526 inline void ResetModifications()
527 {
528 if (Flags.bModifierApplied)
529 {
530 // Re-gather the material properties
533
534 // Reset other properties which may have changed in contact modification last frame
535 Flags.bIsProbe = BoundsTestFlags.bIsProbe;
536
537 Flags.bModifierApplied = false;
538 }
539 }
540
545
546 // @todo(chaos): remove array view and provide per-point accessor
549
550 int32 NumManifoldPoints() const { return ManifoldPoints.Num(); }
551 FManifoldPoint& GetManifoldPoint(const int32 PointIndex) { return ManifoldPoints[PointIndex]; }
552 const FManifoldPoint& GetManifoldPoint(const int32 PointIndex) const { return ManifoldPoints[PointIndex]; }
553 const FManifoldPoint* GetClosestManifoldPoint() const { return (ClosestManifoldPointIndex != INDEX_NONE) ? &ManifoldPoints[ClosestManifoldPointIndex] : nullptr; }
554 bool IsManifoldPointActive(const int32 PointIndex) const { return IsEnabled() && (PointIndex < NumManifoldPoints()) && !ManifoldPoints[PointIndex].Flags.bDisabled; }
555
557 {
558 // We may request manifold point results for points that are never simulated (e.g., they start asleep).
559 // We could handle this by adding zeroed results when we add manifold points, but that's unnecessary work for
560 // active constraints, and this is function currently only used for debug draw and stats. If that changes we
561 // may want to change this.
563 if (PointIndex >= ManifoldPointResults.Num())
564 {
566 return ZeroResult;
567 }
568 return ManifoldPointResults[PointIndex];
569 }
570
572 {
573 int32 NumEnabled = 0;
574 if (IsEnabled())
575 {
576 for (int32 ManifoldPointIndex = 0; ManifoldPointIndex < NumManifoldPoints(); ++ManifoldPointIndex)
577 {
578 if (!ManifoldPoints[ManifoldPointIndex].Flags.bDisabled)
579 {
580 ++NumEnabled;
581 }
582 }
583 }
584 return NumEnabled;
585 }
586
588 {
589 ManifoldPoints[DisabledManifoldPointIndex].Flags.bDisabled = true;
590 if (NumEnabledManifoldPoints() == 0)
591 {
592 SetDisabled(true);
593 }
594 }
595
596 CHAOS_API void AddIncrementalManifoldContact(const FContactPoint& ContactPoint);
597
598 // @todo(chaos): remove this and use SetOneShotManifoldContacts
599 inline void AddOneshotManifoldContact(const FContactPointf& ContactPoint)
600 {
601 if (ContactPoint.IsSet())
602 {
603 int32 ManifoldPointIndex = AddManifoldPoint(ContactPoint);
604 if (ManifoldPoints[ManifoldPointIndex].ContactPoint.Phi < GetPhi())
605 {
606 ClosestManifoldPointIndex = ManifoldPointIndex;
607 }
608 }
609 }
610
618 {
620
622
624
625 // If we have too many manifold points, clip the array. This is considered and error but
626 // is important for avoiding OOM or massive slowdowns when something goes wrong
627 const int32 MaxManifoldPoints = Chaos_Collision_MaxManifoldPoints;
628 if ((MaxManifoldPoints >= 0) && (NumContacts > MaxManifoldPoints))
629 {
630 NumContacts = MaxManifoldPoints;
631 LogOneShotManifoldError(MaxManifoldPoints, ContactPoints);
632 }
633
634 ManifoldPoints.Reserve(NumContacts);
635
636 for (int32 ContactIndex = 0; ContactIndex < NumContacts; ++ContactIndex)
637 {
638 const FContactPoint& ContactPoint = ContactPoints[ContactIndex];
639 if (ContactPoint.Phi < CullDistance)
640 {
641 int32 ManifoldPointIndex = AddManifoldPoint(ContactPoint);
642 if (ContactPoint.Phi < MinPhi)
643 {
644 ClosestManifoldPointIndex = ManifoldPointIndex;
645 MinPhi = ContactPoint.Phi;
646 }
647 }
648 }
649
650 // If we have a new face we may need to change the material
651 // @todo(chaos): support per-manifold point materials?
652 if (NumManifoldPoints() > 0)
653 {
654 if (ManifoldPoints[0].ContactPoint.FaceIndex != Material.FaceIndex)
655 {
656 Material.FaceIndex = ManifoldPoints[0].ContactPoint.FaceIndex;
657 Flags.bMaterialSet = false;
658 }
659 }
660
661 }
662
663 // Fix the contact points when we move the particle after collision detection so that
664 // the contact points on each body are aligned along the normal (required for static friction tracking)
666
668
669 // Particle-relative transform of each collision shape in the constraint
670 const FRigidTransform3& GetShapeRelativeTransform0() const { return ImplicitTransform[0]; }
671 const FRigidTransform3& GetShapeRelativeTransform1() const { return ImplicitTransform[1]; }
672 const FRigidTransform3& GetShapeRelativeTransform(const int32 ParticleIndex) const { check((ParticleIndex >= 0) && (ParticleIndex < 2)); return ImplicitTransform[ParticleIndex]; }
673
674 const FRigidTransform3& GetShapeWorldTransform0() const { return ShapeWorldTransforms[0]; }
675 const FRigidTransform3& GetShapeWorldTransform1() const { return ShapeWorldTransforms[1]; }
676 const FRigidTransform3& GetShapeWorldTransform(const int32 ParticleIndex) const { check((ParticleIndex >= 0) && (ParticleIndex < 2)); return ShapeWorldTransforms[ParticleIndex]; }
677
679 {
680 ShapeWorldTransforms[0] = InShapeWorldTransform0;
681 ShapeWorldTransforms[1] = InShapeWorldTransform1;
682 }
683
684 // Set the transforms when we last ran collision detection. This also sets the bCanRestoreManifold flag which
685 // allows the use of TryRestoreManifold on the next tick.
687 {
688 LastShapeWorldPositionDelta = InShapeWorldTransform0.GetTranslation() - InShapeWorldTransform1.GetTranslation();
689 LastShapeWorldRotationDelta = InShapeWorldTransform0.GetRotation().Inverse() * InShapeWorldTransform1.GetRotation();
690
691 // NOTE: BoundsTestFlags.bEnableManifoldUpdate is false if the shape pair does not support manifold reuse
692 Flags.bCanRestoreManifold = BoundsTestFlags.bEnableManifoldUpdate;
693 }
694
695 bool GetCanRestoreManifold() const { return Flags.bCanRestoreManifold; }
698 CHAOS_API bool TryAddManifoldContact(const FContactPoint& ContactPoint);
699 CHAOS_API bool TryInsertManifoldContact(const FContactPoint& ContactPoint);
700
701 // The GJK warm-start data. This is updated directly in the narrow phase
702 FGJKSimplexData& GetGJKWarmStartData() { return GJKWarmStartData; }
703
704 const FSolverBody* GetSolverBody0() const { return SolverBodies[0]; }
705 const FSolverBody* GetSolverBody1() const { return SolverBodies[1]; }
706
708 {
709 SolverBodies[0] = InSolverBody0;
710 SolverBodies[1] = InSolverBody1;
711 }
712
716 bool WasManifoldRestored() const { return Flags.bWasManifoldRestored; }
717
723
728 {
729 SavedManifoldPoints.Reset();
730 }
731
733 {
734 return SavedManifoldPoints.Num();
735 }
736
738 {
739 return SavedManifoldPoints[PointIndex];
740 }
741
745 FReal GetCCDTimeOfImpact() const { return CCDTimeOfImpact; }
746
750 void SetCCDTimeOfImpact(const FReal TOI) { check(TOI <= FReal(MaxTOI)); CCDTimeOfImpact = FRealSingle(TOI); }
751
755 void ResetCCDTimeOfImpact() { CCDTimeOfImpact = MaxTOI; }
756
764
766 {
767 // NOTE: does not initalize any manifold point data. All properties will be written to in SetSolverResults
768 //SavedManifoldPoints.SetNum(ManifoldPoints.Num());
769 SavedManifoldPoints.Reset(ManifoldPoints.Num());
770 ManifoldPointResults.SetNum(ManifoldPoints.Num());
771 MinInitialPhi = 0;
772 }
773
778 const int32 ManifoldPointIndex,
779 const FVec3f& NetPushOut,
780 const FVec3f& NetImpulse,
781 const FRealSingle StaticFrictionRatio,
782 const FRealSingle Dt)
783 {
784 const FManifoldPoint& ManifoldPoint = ManifoldPoints[ManifoldPointIndex];
785 FManifoldPointResult& ManifoldPointResult = ManifoldPointResults[ManifoldPointIndex];
786
787 // Save contact data for friction
788 bool bInsideStaticFrictionCone = false;
789 if (StaticFrictionRatio >= FRealSingle(1.0f - UE_KINDA_SMALL_NUMBER))
790 {
791 // StaticFrictionRatio ~= 1: Static friction held - we keep the same contacts points as-is for use next frame
792 SavedManifoldPoints.Emplace(
793 ManifoldPoint.ShapeAnchorPoints[0],
794 ManifoldPoint.ShapeAnchorPoints[1],
795 ManifoldPoint.InitialPhi
796 );
797 bInsideStaticFrictionCone = true;
798 }
799 else if (StaticFrictionRatio < FRealSingle(UE_KINDA_SMALL_NUMBER))
800 {
801 // StaticFrictionRatio ~= 0: No friction (or no contact/impulse) - discard the friction anchors
802 // If we have a lot of manifold points, we don't store the previous position for these contacts because we assume
803 // that there will be others that actually applied an impulse and will fall into the other two branches.
804 // This is an optimization when we have to match the new contacts with the saved ones (see AssignSavedManifoldPoints)
806 if (ManifoldPoints.Num() < SmallNumManifoldPoints)
807 {
808 SavedManifoldPoints.Emplace(
809 ManifoldPoint.ContactPoint.ShapeContactPoints[0],
810 ManifoldPoint.ContactPoint.ShapeContactPoints[1],
811 ManifoldPoint.InitialPhi
812 );
813 }
814 }
815 else
816 {
817 // 0 < StaticFrictionRatio < 1: We exceeded the friction cone. Slide the friction anchor
818 // toward the last-detected contact position so that it sits at the edge of the friction cone.
819 SavedManifoldPoints.Emplace(
820 FVec3f::Lerp(ManifoldPoint.ContactPoint.ShapeContactPoints[0], ManifoldPoint.ShapeAnchorPoints[0], StaticFrictionRatio),
821 FVec3f::Lerp(ManifoldPoint.ContactPoint.ShapeContactPoints[1], ManifoldPoint.ShapeAnchorPoints[1], StaticFrictionRatio),
822 ManifoldPoint.InitialPhi
823 );
824 }
825
826 AccumulatedImpulse += NetImpulse + (NetPushOut / Dt);
827
828 ManifoldPointResult.NetPushOut = NetPushOut;
829 ManifoldPointResult.NetImpulse = NetImpulse;
830 ManifoldPointResult.bIsValid = true;
831 ManifoldPointResult.bInsideStaticFrictionCone = bInsideStaticFrictionCone;
832
833 MinInitialPhi = FMath::Min(MinInitialPhi, ManifoldPoint.InitialPhi);
834 }
835
843
848 {
849 return CollisionSortKey;
850 }
851
856
858 {
859 return BoundsTestFlags;
860 }
861
862 public:
865
866
867 UE_DEPRECATED(5.3, "Use TryRestoreManifold")
869
870 protected:
871
873 FGeometryParticleHandle* Particle0,
875 const FPerShapeData* Shape0,
877 FGeometryParticleHandle* Particle1,
879 const FPerShapeData* Shape1,
881
882 // Set all the data not initialized in the constructor
883 CHAOS_API void Setup(
888 const FReal InCullDistance,
889 const bool bInUseManifold);
890
891 // Access to the data used by the container
892 const FPBDCollisionConstraintContainerCookie& GetContainerCookie() const { return ContainerCookie; }
894
896 CHAOS_API int32 FindManifoldPoint(const FContactPoint& ContactPoint) const;
897
898 int32 FindSimpleSavedManifoldPoint(const int32 ManifoldPointIndex) const;
901
902 inline void InitManifoldPoint(const int32 ManifoldPointIndex, const FContactPointf& ContactPoint)
903 {
904 FManifoldPoint& ManifoldPoint = ManifoldPoints[ManifoldPointIndex];
905 ManifoldPoint.ContactPoint = ContactPoint;
906 ManifoldPoint.ShapeAnchorPoints[0] = ContactPoint.ShapeContactPoints[0];
907 ManifoldPoint.ShapeAnchorPoints[1] = ContactPoint.ShapeContactPoints[1];
908 ManifoldPoint.InitialShapeContactPoints[0] = ContactPoint.ShapeContactPoints[0];
909 ManifoldPoint.InitialShapeContactPoints[1] = ContactPoint.ShapeContactPoints[1];
910 ManifoldPoint.TargetPhi = FRealSingle(0);
911 ManifoldPoint.InitialPhi = FRealSingle(0);
912 ManifoldPoint.Flags.Reset();
913 }
914
915 inline int32 AddManifoldPoint(const FContactPointf& ContactPoint)
916 {
917 int32 ManifoldPointIndex = ManifoldPoints.AddUninitialized(); // Note: no initialization (see InitManifoldPoint)
918 InitManifoldPoint(ManifoldPointIndex, ContactPoint);
919 return ManifoldPointIndex;
920 }
921
922 // Update the store Phi for the manifold point based on current world-space shape transforms
923 // @todo(chaos): Only intended for use by the legacy solvers - remove it
924 CHAOS_API void UpdateManifoldPointPhi(const int32 ManifoldPointIndex);
925
927
929
931
933
934 private:
935 CHAOS_API FRealSingle CalculateSavedManifoldPointDistanceSq(const FSavedManifoldPoint& SavedManifoldPoint, const FManifoldPoint& ManifoldPoint) const;
936
937 CHAOS_API void LogOneShotManifoldError(const int32 MaxManifoldPoints, const TArrayView<const FContactPoint>& ContactPoints);
938
939 union FFlags
940 {
941 FFlags() : Bits(0) {}
942 struct
943 {
944 uint16 bIsCurrent : 1; // Was this constraint activated this tick and therefore in the current tick's active list (note: it may subsequently be disabled for various reasons)
945 uint16 bDisabled : 1; // Is this contact disabled (by the user or because cull distance is exceeded)
946 uint16 bUseManifold : 1; // Should we use contact manifolds or single points (faster but poor behaviour)
947 uint16 bUseIncrementalManifold : 1; // Do we need to run incremental collision detection (only LavelSets now)
948 uint16 bCanRestoreManifold : 1; // Can we try to restore the manifold this frame (set folowing narrowphase, cleared when reset for some reason)
949 uint16 bWasManifoldRestored : 1; // Did we restore the manifold this frame
950 uint16 bIsQuadratic0 : 1; // Is the first shape a sphere or capsule
951 uint16 bIsQuadratic1 : 1; // Is the second shape a sphere or capsule
952 uint16 bIsProbe : 1; // Is this constraint currently a probe
953 uint16 bCCDEnabled : 1; // Is CCD enabled for the current tick
954 uint16 bCCDSweepEnabled: 1; // If this is a CCD constraint, do we want to enable the sweep/rewind phase?
955 uint16 bModifierApplied : 1; // Was a constraint modifier applied this tick
956 uint16 bMaterialSet : 1; // Has the material been set (or does it need to be reset)
957 uint16 bInitialContact : 1; // Is this contact considered an initial contact
958 uint16 bIsOneWayInteraction : 1; // Does one of the bodies have the one-way interaction bit set?
959 uint16 bUsePerContactInitialPhi : 1; // Whether we track initial overlap per-contact or shared across all contacts in the manifold
960 };
961 uint16 Bits;
962 };
963 static_assert(sizeof(FFlags) == 2, "Unexpected size for FPBDCollisionConstraint::FFLags");
964
965 // The margins to use during collision detection. We don't always use the margins on the shapes directly.
966 // E.g., we use the smallest non-zero margin for 2 convex shapes. See InitMarginsAndTolerances
967 FRealSingle CollisionMargins[2];
968
969 // Local-space transforms of the shape (relative to particle)
970 FRigidTransform3 ImplicitTransform[2];
971
972 FGeometryParticleHandle* Particle[2];
973 const FImplicitObject* Implicit[2];
974 const FShapeInstance* Shape[2];
975 const FBVHParticles* Simplicial[2];
976
977 public:
978 FVec3f AccumulatedImpulse; // @todo(chaos): we need to accumulate angular impulse separately
979
980 private:
981 // The separation distance at which we don't track contacts
982 FRealSingle CullDistance;
983
984 // Relative movement on the last tick: (V0 - V1).Dt.
985 FVec3f RelativeMovement;
986
988 Private::FCollisionSortKey CollisionSortKey;
989
990 // The collision tolerance is used to determine whether a new contact matches an old on. It is derived from the
991 // margins of the two shapes, as well as their types
992 FRealSingle CollisionTolerance;
993
994 // The index into ManifoldPoints of the point with the lowest Phi
995 int32 ClosestManifoldPointIndex;
996
997 // The shape transforms at the current particle transforms
998 FRigidTransform3 ShapeWorldTransforms[2];
999
1000 // Used by manifold point injection to see how many points were in the manifold before TryRestoreManifold
1001 int32 ExpectedNumManifoldPoints;
1002
1003 // Relative transform the last time we ran the narrow phase
1004 // Used to detect when the bodies have moved too far to reues the manifold
1005 FVec3f LastShapeWorldPositionDelta;
1006 FRotation3f LastShapeWorldRotationDelta;
1007
1008 // Simplex data from the last call to GJK, used to warm-start GJK
1009 FGJKSimplexData GJKWarmStartData;
1010
1012 FRealSingle Stiffness;
1013
1014 FFlags Flags;
1015 Private::FImplicitBoundsTestFlags BoundsTestFlags;
1016 EContactShapesType ShapesType;
1017
1018 template<typename T>
1020
1021 TManifoldPointArray<FSavedManifoldPoint> SavedManifoldPoints;
1023 TManifoldPointArray<FManifoldPointResult> ManifoldPointResults;
1024
1025 // The lowest InitialPhi value of all saved manifold points. This is used when we add new points to
1026 // the manifold but are still in the depenetrating phase to limit the initial overlap.
1027 // We don't want the new point to cause a pop but also don't want all new contacts to be initial overlaps
1028 // when we were already separated at some point in the past.
1029 FRealSingle MinInitialPhi;
1030
1031 // If we have initial overlap, the depenetration speed
1032 FRealSingle InitialOverlapDepenetrationVelocity;
1033
1034 // Value in range [0,1] used to interpolate P between [X,P] that we will rollback to when solving at time of impact.
1035 FRealSingle CCDTimeOfImpact;
1036
1037 // @todo(chaos): These are only needed here to support incremental collision detection for LevelSet. Fix this.
1038 const FSolverBody* SolverBodies[2];
1039
1040 // The penetration at which CCD contacts get processed following a CCD sweep test.
1041 // NOTE: also see GeometryParticle CCDAxisThreshold, which is used to determine when to enable sweeping during collision detection.
1042 // Calculated from particle pair properties when constraint is created.
1043 FRealSingle CCDEnablePenetration;
1044
1045 // The penetration we leave behind when rolling back to a CCD time of impact. Should be less than or equal to CCDEnablePenetration.
1046 // Calculated from particle pair properties when constraint is created.
1047 FRealSingle CCDTargetPenetration;
1048
1049 friend class ::FChaosVDDataWrapperUtils;
1050 };
1051
1052
1053 UE_DEPRECATED(4.27, "FCollisionConstraintBase has been removed and folded into FPBDCollisionConstraint. Use FPBDCollisionConstraint")
1055
1058}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define FORCEINLINE
Definition AndroidPlatform.h:140
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
const bool
Definition NetworkReplayStreaming.h:178
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BVHParticles.h:24
Definition ContactModification.h:30
Definition ParticlePairMidPhase.h:507
Definition ImplicitObject.h:111
Definition ContactPoint.h:183
A single point in a contact manifold. Each Collision Constraint will have up to 4 of these.
Definition ContactPoint.h:97
Information used by the constraint allocator This includes any information used for optimizations lik...
Definition PBDCollisionConstraint.h:164
int32 ConstraintIndex
Definition PBDCollisionConstraint.h:198
FPBDCollisionConstraintContainerCookie()
Definition PBDCollisionConstraint.h:166
FParticlePairMidPhase * MidPhase
Definition PBDCollisionConstraint.h:189
int32 LastUsedEpoch
Definition PBDCollisionConstraint.h:195
int32 CreationEpoch
Definition PBDCollisionConstraint.h:192
int32 CCDConstraintIndex
Definition PBDCollisionConstraint.h:206
uint32 bIsMultiShapePair
Definition PBDCollisionConstraint.h:203
void ClearContainerData()
Used to clear the container data when copying constraints out of the container (see resim cache) The ...
Definition PBDCollisionConstraint.h:181
A handle to a contact constraint.
Definition PBDCollisionConstraintHandle.h:49
virtual bool IsEnabled() const override final
Definition PBDCollisionConstraints.h:426
Definition PBDCollisionConstraint.h:48
FRealSingle DynamicFriction
Definition PBDCollisionConstraint.h:104
FRealSingle InvMassScale1
Definition PBDCollisionConstraint.h:109
PRAGMA_DISABLE_DEPRECATION_WARNINGS FPBDCollisionConstraintMaterial()
Definition PBDCollisionConstraint.h:53
FRealSingle RestitutionThreshold
Definition PBDCollisionConstraint.h:107
PRAGMA_ENABLE_DEPRECATION_WARNINGS int32 FaceIndex
Definition PBDCollisionConstraint.h:100
FRealSingle InvMassScale0
Definition PBDCollisionConstraint.h:108
FPBDCollisionConstraintMaterial & operator=(const FPBDCollisionConstraintMaterial &Other)
Definition PBDCollisionConstraint.h:81
FRealSingle Restitution
Definition PBDCollisionConstraint.h:106
FPBDCollisionConstraintMaterial(const FPBDCollisionConstraintMaterial &Other)
Definition PBDCollisionConstraint.h:67
FRealSingle StaticFriction
Definition PBDCollisionConstraint.h:105
FRealSingle InvInertiaScale1
Definition PBDCollisionConstraint.h:111
FRealSingle InvInertiaScale0
Definition PBDCollisionConstraint.h:110
A contact constraint.
Definition PBDCollisionConstraint.h:225
const FRigidTransform3 & GetShapeRelativeTransform1() const
Definition PBDCollisionConstraint.h:671
int32 AddManifoldPoint(const FContactPointf &ContactPoint)
Definition PBDCollisionConstraint.h:915
const FRigidTransform3 & GetShapeWorldTransform1() const
Definition PBDCollisionConstraint.h:675
FReal GetCullDistance() const
Definition PBDCollisionConstraint.h:503
void ResetModifications()
Definition PBDCollisionConstraint.h:526
virtual bool SupportsPartialIslandSleeping() const override final
Definition PBDCollisionConstraint.h:427
bool GetCCDSweepEnabled() const
Definition PBDCollisionConstraint.h:318
const FReal GetCollisionMargin1() const
Definition PBDCollisionConstraint.h:366
const FBVHParticles * GetCollisionParticles1() const
Definition PBDCollisionConstraint.h:362
FGeometryParticleHandle * GetParticle0() const
Definition PBDCollisionConstraint.h:349
void InitManifoldPoint(const int32 ManifoldPointIndex, const FContactPointf &ContactPoint)
Definition PBDCollisionConstraint.h:902
void SetShapeWorldTransforms(const FRigidTransform3 &InShapeWorldTransform0, const FRigidTransform3 &InShapeWorldTransform1)
Definition PBDCollisionConstraint.h:678
FReal GetStaticFriction() const
Definition PBDCollisionConstraint.h:486
FGeometryParticleHandle * GetParticle1() const
Definition PBDCollisionConstraint.h:350
FReal GetInvMassScale0() const
Definition PBDCollisionConstraint.h:465
CHAOS_API void CorrectManifoldPoints()
Definition PBDCollisionConstraint.cpp:682
FORCEINLINE void SetSolverResults(const int32 ManifoldPointIndex, const FVec3f &NetPushOut, const FVec3f &NetImpulse, const FRealSingle StaticFrictionRatio, const FRealSingle Dt)
Store the data from the solver that is retained between ticks for the specified manifold point or use...
Definition PBDCollisionConstraint.h:777
virtual CHAOS_API void SetIsSleeping(const bool bInIsSleeping) override final
Definition PBDCollisionConstraint.cpp:538
CHAOS_API void UpdateManifoldContacts()
Definition PBDCollisionConstraint.cpp:712
CHAOS_API void UpdateMassScales()
Definition PBDCollisionConstraint.cpp:495
FRealSingle GetCullDistancef() const
Definition PBDCollisionConstraint.h:504
FReal GetRestitution() const
Definition PBDCollisionConstraint.h:480
void ResetCCDTimeOfImpact()
Definition PBDCollisionConstraint.h:755
const FPBDCollisionConstraintMaterial & GetCollisionMaterial() const
Definition PBDCollisionConstraint.h:462
void SetInvInertiaScale1(const FReal InInvInertiaScale)
Definition PBDCollisionConstraint.h:473
const FManifoldPoint & GetManifoldPoint(const int32 PointIndex) const
Definition PBDCollisionConstraint.h:552
Private::FImplicitBoundsTestFlags GetBoundsTestFlags() const
Definition PBDCollisionConstraint.h:857
FGJKSimplexData & GetGJKWarmStartData()
Definition PBDCollisionConstraint.h:702
FReal GetDynamicFriction() const
Definition PBDCollisionConstraint.h:489
void UpdateMaterialProperties()
Definition PBDCollisionConstraint.h:450
CHAOS_API void InitCCDThreshold()
Definition PBDCollisionConstraint.cpp:451
bool IsInitialContact() const
Definition PBDCollisionConstraint.h:422
bool GetUseIncrementalCollisionDetection() const
Definition PBDCollisionConstraint.h:518
void ResetSavedManifoldPoints()
Clear the saved manifold points. This effectively resets friction anchors.
Definition PBDCollisionConstraint.h:727
FReal GetPhi() const
Definition PBDCollisionConstraint.h:388
const FManifoldPoint * GetClosestManifoldPoint() const
Definition PBDCollisionConstraint.h:553
FRealSingle GetInitialOverlapDepenetrationVelocity() const
Definition PBDCollisionConstraint.h:521
const bool HasQuadraticShape() const
Definition PBDCollisionConstraint.h:370
bool GetIsProbe() const
Definition PBDCollisionConstraint.h:418
const FManifoldPointResult & GetManifoldPointResult(const int32 PointIndex) const
Definition PBDCollisionConstraint.h:556
static constexpr FRealSingle MaxTOI
Definition PBDCollisionConstraint.h:241
CHAOS_API FString ToString() const
Definition PBDCollisionConstraint.cpp:103
const FImplicitObject * GetImplicit(const int32 ParticleIndex) const
Definition PBDCollisionConstraint.h:355
static CHAOS_API FPBDCollisionConstraint MakeCopy(const FPBDCollisionConstraint &Source)
Return a constraint copied from the Source constraint, for use in the Resim Cache or other system.
Definition PBDCollisionConstraint.cpp:172
CHAOS_API bool TryAddManifoldContact(const FContactPoint &ContactPoint)
Definition PBDCollisionConstraint.cpp:925
void SetStaticFriction(const FReal InStaticFriction)
Definition PBDCollisionConstraint.h:485
void SetStiffness(FReal InStiffness)
Definition PBDCollisionConstraint.h:476
EContactShapesType GetShapesType() const
Definition PBDCollisionConstraint.h:499
Private::FCollisionParticlePairKey GetParticlePairKey() const
Definition PBDCollisionConstraint.h:839
CHAOS_API FVec3 CalculateWorldContactNormal() const
Definition PBDCollisionConstraint.cpp:575
const FImplicitObject * GetImplicit1() const
Definition PBDCollisionConstraint.h:354
CHAOS_API int32 FindManifoldPoint(const FContactPoint &ContactPoint) const
Definition PBDCollisionConstraint.cpp:650
const FReal GetCollisionMargin0() const
Definition PBDCollisionConstraint.h:365
void SetDisabled(bool bInDisabled)
Definition PBDCollisionConstraint.h:410
FManifoldPoint & GetManifoldPoint(const int32 PointIndex)
Definition PBDCollisionConstraint.h:551
FORCEINLINE void ResetSolverResults()
Definition PBDCollisionConstraint.h:765
int32 NumManifoldPoints() const
Definition PBDCollisionConstraint.h:550
Private::FCollisionSortKey GetCollisionSortKey() const
Definition PBDCollisionConstraint.h:847
int32 FindSimpleSavedManifoldPoint(const int32 ManifoldPointIndex) const
Definition PBDCollisionConstraint.cpp:1156
bool IsManifoldPointActive(const int32 PointIndex) const
Definition PBDCollisionConstraint.h:554
const FRigidTransform3 & GetShapeWorldTransform0() const
Definition PBDCollisionConstraint.h:674
virtual bool SupportsSleeping() const override final
Definition PBDCollisionConstraint.h:426
const FReal GetCollisionRadius1() const
Definition PBDCollisionConstraint.h:372
void SetSoftSeparation(const FReal InSoftSeparation)
Definition PBDCollisionConstraint.h:496
bool GetUseManifold() const
Definition PBDCollisionConstraint.h:511
void Activate(const FReal Dt)
Definition PBDCollisionConstraint.h:380
const FSolverBody * GetSolverBody1() const
Definition PBDCollisionConstraint.h:705
void SetRestitution(const FReal InRestitution)
Definition PBDCollisionConstraint.h:479
bool GetUseIncrementalManifold() const
Definition PBDCollisionConstraint.h:514
void ClearMaterialProperties()
Definition PBDCollisionConstraint.h:443
void SetCCDSweepEnabled(const bool bCCDSweepEnabled)
Definition PBDCollisionConstraint.h:324
const FSolverBody * GetSolverBody0() const
Definition PBDCollisionConstraint.h:704
void SetSolverBodies(const FSolverBody *InSolverBody0, const FSolverBody *InSolverBody1)
Definition PBDCollisionConstraint.h:707
FPBDCollisionConstraintContainerCookie & GetContainerCookie()
Definition PBDCollisionConstraint.h:893
const FPBDCollisionConstraintHandle * GetConstraintHandle() const
Definition PBDCollisionConstraint.h:863
FReal GetInvInertiaScale1() const
Definition PBDCollisionConstraint.h:474
CHAOS_API bool TryInsertManifoldContact(const FContactPoint &ContactPoint)
Definition PBDCollisionConstraint.cpp:992
void SetDynamicFriction(const FReal InDynamicFriction)
Definition PBDCollisionConstraint.h:488
FReal GetRestitutionThreshold() const
Definition PBDCollisionConstraint.h:483
CHAOS_API void UpdateParticleTransform(FGeometryParticleHandle *InParticle)
Definition PBDCollisionConstraint.cpp:557
bool GetCCDEnabled() const
Definition PBDCollisionConstraint.h:290
CHAOS_API void UpdateMaterialPropertiesImpl()
Definition PBDCollisionConstraint.cpp:488
bool GetCanRestoreManifold() const
Definition PBDCollisionConstraint.h:695
CHAOS_API FVec3 CalculateWorldContactLocation() const
Definition PBDCollisionConstraint.cpp:564
void AddOneshotManifoldContact(const FContactPointf &ContactPoint)
Definition PBDCollisionConstraint.h:599
FReal GetMinFrictionPushOut() const
Definition PBDCollisionConstraint.h:492
const FShapeInstance * GetShape0() const
Definition PBDCollisionConstraint.h:357
FGeometryParticleHandle * GetParticle(const int32 ParticleIndex) const
Definition PBDCollisionConstraint.h:351
void SetIsInitialContact(const bool bInIsInitialContact)
Definition PBDCollisionConstraint.h:421
FReal GetCCDEnablePenetration() const
If CCD is enabled, contacts deeper than this will be handled by CCD.
Definition PBDCollisionConstraint.h:332
bool IsSoftContact() const
Definition PBDCollisionConstraint.h:494
CHAOS_API bool AreMatchingContactPoints(const FContactPoint &A, const FContactPoint &B, FReal &OutScore) const
Definition PBDCollisionConstraint.cpp:595
void SetRelativeMovement(const FVec3f &InDelta)
Definition PBDCollisionConstraint.h:508
virtual CHAOS_API bool IsSleeping() const override final
Definition PBDCollisionConstraint.cpp:529
FReal GetCCDTimeOfImpact() const
Time of impact from CCD sweep test if CCD is activate.Otherwise undefined.
Definition PBDCollisionConstraint.h:745
void SetInvInertiaScale0(const FReal InInvInertiaScale)
Definition PBDCollisionConstraint.h:470
bool WasManifoldRestored() const
Whether this constraint was fully restored from a previous tick, and the manifold should be reused as...
Definition PBDCollisionConstraint.h:716
FVec3f AccumulatedImpulse
Definition PBDCollisionConstraint.h:978
CHAOS_API void Setup(const ECollisionCCDType InCCDType, const EContactShapesType InShapesType, const FRigidTransform3 &InImplicitTransform0, const FRigidTransform3 &InImplicitTransform1, const FReal InCullDistance, const bool bInUseManifold)
Definition PBDCollisionConstraint.cpp:299
FRealSingle GetSoftSeparation() const
Definition PBDCollisionConstraint.h:497
const bool IsQuadratic1() const
Definition PBDCollisionConstraint.h:369
const FBVHParticles * GetCollisionParticles(const int32 ParticleIndex) const
Definition PBDCollisionConstraint.h:363
friend CHAOS_API bool ContactConstraintSortPredicate(const FPBDCollisionConstraint &L, const FPBDCollisionConstraint &R)
Definition PBDCollisionConstraint.cpp:108
void SetCCDTimeOfImpact(const FReal TOI)
Set the CCD TOI from the collision detection sweep.
Definition PBDCollisionConstraint.h:750
void SetOneShotManifoldContacts(const TArrayView< const FContactPoint > &ContactPoints)
Replace the current manifold points with the input. The input array should contain no more than MaxMa...
Definition PBDCollisionConstraint.h:617
FReal GetInvMassScale1() const
Definition PBDCollisionConstraint.h:468
void SetMinFrictionPushOut(const FReal InMinFrictionPushOut)
Definition PBDCollisionConstraint.h:491
FPBDCollisionConstraintHandle * GetConstraintHandle()
Definition PBDCollisionConstraint.h:864
static CHAOS_API FPBDCollisionConstraint MakeTriangle(const FImplicitObject *Implicit0)
For use by the tri mesh and heighfield collision detection as a temporary measure.
Definition PBDCollisionConstraint.cpp:164
CHAOS_API bool TryRestoreManifold()
Definition PBDCollisionConstraint.cpp:807
FRealSingle GetMinInitialPhi() const
Definition PBDCollisionConstraint.h:423
FPBDCollisionConstraint()
Definition PBDCollisionConstraint.cpp:205
const FImplicitObject * GetImplicit0() const
Definition PBDCollisionConstraint.h:353
virtual CHAOS_API FVec3f GetNetLinearImpulse() const override final
Definition PBDCollisionConstraint.cpp:547
bool GetIsOneWayInteraction() const
Definition PBDCollisionConstraint.h:415
bool IsCurrent() const
Definition PBDCollisionConstraint.h:407
CHAOS_API void UpdateManifoldPointPhi(const int32 ManifoldPointIndex)
Definition PBDCollisionConstraint.cpp:673
TArrayView< const FManifoldPoint > GetManifoldPoints() const
Definition PBDCollisionConstraint.h:548
void SetLastShapeWorldTransforms(const FRigidTransform3 &InShapeWorldTransform0, const FRigidTransform3 &InShapeWorldTransform1)
Definition PBDCollisionConstraint.h:686
const FShapeInstance * GetShape1() const
Definition PBDCollisionConstraint.h:358
bool GetDisabled() const
Definition PBDCollisionConstraint.h:413
CHAOS_API int32 FindSavedManifoldPoint(const int32 ManifoldPointIndex, int32 *InOutAllowedSavedPointIndices, int32 &InOutNumAllowedSavedPoints) const
Definition PBDCollisionConstraint.cpp:1198
const FSavedManifoldPoint & GetSavedManifoldPoint(const int32 PointIndex) const
Definition PBDCollisionConstraint.h:737
const FRigidTransform3 & GetShapeRelativeTransform0() const
Definition PBDCollisionConstraint.h:670
void SetCollisionSortKey(const Private::FCollisionSortKey &InCollisionSortKey)
Definition PBDCollisionConstraint.h:852
int32 NumSavedManifoldPoints() const
Definition PBDCollisionConstraint.h:732
CHAOS_API void ResetManifold()
Clear the current and previous manifolds.
Definition PBDCollisionConstraint.cpp:791
void SetCCDResults(const FVec3 &InNetImpulse)
Store the results of CCD contact resolution, if active.
Definition PBDCollisionConstraint.h:760
FReal GetCCDTargetPenetration() const
If CCD is enabled and processed the contact, CCD resolution leaves up to this much penetration.
Definition PBDCollisionConstraint.h:340
void DisableManifoldPoint(const int32 DisabledManifoldPointIndex)
Definition PBDCollisionConstraint.h:587
void SetCCDEnabled(const bool bCCDEnabled)
Definition PBDCollisionConstraint.h:295
FReal GetStiffness() const
Definition PBDCollisionConstraint.h:477
CHAOS_API void Activate()
Definition PBDCollisionConstraint.cpp:471
FVec3f GetRelativeMovement() const
Definition PBDCollisionConstraint.h:507
const FShapeInstance * GetShape(const int32 ParticleIndex) const
Definition PBDCollisionConstraint.h:359
void SetInvMassScale1(const FReal InInvMassScale)
Definition PBDCollisionConstraint.h:467
const bool IsQuadratic0() const
Definition PBDCollisionConstraint.h:368
CHAOS_API void AddIncrementalManifoldContact(const FContactPoint &ContactPoint)
Definition PBDCollisionConstraint.cpp:759
CHAOS_API void InitMarginsAndTolerances(const EImplicitObjectType ImplicitType0, const EImplicitObjectType ImplicitType1, const FRealSingle Margin0, const FRealSingle Margin1)
Definition PBDCollisionConstraint.cpp:369
static CHAOS_API void Make(FGeometryParticleHandle *Particle0, const FImplicitObject *Implicit0, const FPerShapeData *Shape0, const FBVHParticles *Simplicial0, const FRigidTransform3 &ImplicitLocalTransform0, FGeometryParticleHandle *Particle1, const FImplicitObject *Implicit1, const FPerShapeData *Shape1, const FBVHParticles *Simplicial1, const FRigidTransform3 &ImplicitLocalTransform1, const FReal InCullDistance, const bool bInUseManifold, const EContactShapesType ShapesType, FPBDCollisionConstraint &OutConstraint)
Create a contact constraint Initializes a constraint stored inline in an object. Only intended to be ...
Definition PBDCollisionConstraint.cpp:136
const FPBDCollisionConstraintContainerCookie & GetContainerCookie() const
Definition PBDCollisionConstraint.h:892
void SetRestitutionThreshold(const FReal InRestitutionThreshold)
Definition PBDCollisionConstraint.h:482
void BeginTick()
Definition PBDCollisionConstraint.h:391
void SetIsProbe(bool bInProbe)
Definition PBDCollisionConstraint.h:417
const FBVHParticles * GetCollisionParticles0() const
Definition PBDCollisionConstraint.h:361
CHAOS_API ECollisionConstraintDirection GetConstraintDirection(const FReal Dt) const
Definition PBDCollisionConstraint.cpp:1300
void SetCullDistance(FReal InCullDistance)
Definition PBDCollisionConstraint.h:505
const FRigidTransform3 & GetShapeWorldTransform(const int32 ParticleIndex) const
Definition PBDCollisionConstraint.h:676
int32 NumEnabledManifoldPoints() const
Definition PBDCollisionConstraint.h:571
void SetModifierApplied()
Definition PBDCollisionConstraint.h:459
const FReal GetCollisionRadius0() const
Definition PBDCollisionConstraint.h:371
CHAOS_API void ResetActiveManifoldContacts()
Definition PBDCollisionConstraint.cpp:797
void SetInvMassScale0(const FReal InInvMassScale)
Definition PBDCollisionConstraint.h:464
TArrayView< FManifoldPoint > GetManifoldPoints()
Definition PBDCollisionConstraint.h:547
CHAOS_API void AssignSavedManifoldPoints()
Definition PBDCollisionConstraint.cpp:1252
void ResetPhi(FReal InPhi)
Definition PBDCollisionConstraint.h:387
bool UsePerContactInitialPhi() const
Definition PBDCollisionConstraint.h:424
virtual CHAOS_API ~FPBDCollisionConstraint()
Definition PBDCollisionConstraint.cpp:291
const FRigidTransform3 & GetShapeRelativeTransform(const int32 ParticleIndex) const
Definition PBDCollisionConstraint.h:672
FReal GetInvInertiaScale0() const
Definition PBDCollisionConstraint.h:471
CHAOS_API void RestoreFrom(const FPBDCollisionConstraint &Source)
Definition PBDCollisionConstraint.cpp:188
bool UpdateAndTryRestoreManifold()
Definition PBDCollisionConstraint.h:868
Definition PBDCollisionConstraints.h:49
Produce collisions for a particle pair A FParticlePairMidPhase object is created for every particle p...
Definition ParticlePairMidPhase.h:192
Definition ShapeInstance.h:36
The friction data for a manifold point This is the information that needs to be stored between ticks ...
Definition ContactPoint.h:170
Definition ShapeInstance.h:554
Definition ParticlePairMidPhase.h:463
Handles collision detection for a pair of simple shapes (i.e., not compound shapes)
Definition ParticlePairMidPhase.h:50
Definition SolverBody.h:99
Definition ParticlePairMidPhase.h:596
An allocator and container of collision constraints that supports reuse of constraints from the previ...
Definition CollisionConstraintAllocator.h:234
Definition CollisionConstraintAllocator.h:28
Definition CollisionKeys.h:59
Definition CollisionKeys.h:261
Definition ContactPoint.h:42
bool IsSet() const
Definition ContactPoint.h:79
FRealType Phi
Definition ContactPoint.h:53
TVec3< FRealType > ShapeContactPoints[2]
Definition ContactPoint.h:47
Definition ParticleHandle.h:436
Definition Rotation.h:49
Definition Vector.h:407
static TVector< FRealSingle, 3 > Lerp(const TVector< FRealSingle, 3 > &V1, const TVector< FRealSingle, 3 > &V2, const FRealSingle F)
Definition Vector.h:444
Definition ChaosVDDataWrapperUtils.h:77
Definition ArrayView.h:139
FImplicitBoundsTestFlags CalculateImplicitBoundsTestFlags(FGeometryParticleHandle *Particle0, const FImplicitObject *Implicit0, const FPerShapeData *Shape0, FGeometryParticleHandle *Particle1, const FImplicitObject *Implicit1, const FPerShapeData *Shape1, FRealSingle &OutDistanceCheckSize)
Definition CollisionUtil.h:41
Definition SkeletalMeshComponent.h:307
int32 Chaos_Collision_MaxManifoldPoints
Definition PBDCollisionConstraint.cpp:71
TVector< FRealSingle, 3 > FVec3f
Definition Core.h:27
ECollisionCCDType
Whether we should run CCD (swept collision) or not.
Definition PBDCollisionConstraintHandle.h:20
TRigidTransform< FReal, 3 > FRigidTransform3
Definition Core.h:22
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
ECollisionConstraintDirection
The resting directionality of a contact constraint for use in constraint solver ordering.
Definition PBDCollisionConstraintHandle.h:32
bool ContactConstraintSortPredicate(const FPBDCollisionConstraint &L, const FPBDCollisionConstraint &R)
Definition PBDCollisionConstraint.cpp:108
FRealDouble FReal
Definition Real.h:22
float FRealSingle
Definition Real.h:14
EContactShapesType
Definition CollisionResolutionTypes.h:55
TGeometryParticleHandle< FReal, 3 > FGeometryParticleHandle
Definition ParticleHandleFwd.h:24
@ Bits
Definition PacketView.h:34
Definition OverriddenPropertySet.cpp:45
@ false
Definition radaudio_common.h:23
Definition NumericLimits.h:41
TQuat< T > Inverse() const
Definition Quat.h:1264
Definition PBDCollisionConstraint.h:138
uint8 bEnableDistanceCheck
Definition PBDCollisionConstraint.h:145
FImplicitBoundsTestFlags()
Definition PBDCollisionConstraint.h:139
uint8 bEnableOBBCheck1
Definition PBDCollisionConstraint.h:144
uint8 bEnableOBBCheck0
Definition PBDCollisionConstraint.h:143
uint8 bEnableAABBCheck
Definition PBDCollisionConstraint.h:142
uint8 bIsProbe
Definition PBDCollisionConstraint.h:147
uint8 Bits
Definition PBDCollisionConstraint.h:149
uint8 bEnableManifoldUpdate
Definition PBDCollisionConstraint.h:146