UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CCDUtilities.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"
8
9namespace Chaos
10{
11 class FPBDCollisionConstraint;
12 class FPBDRigidsEvolutionGBF;
13 struct FCCDConstraint;
14
15 // FCCDParticle holds data used for applying CCD constraints.
16 // We create a FCCDParticle for each dynamic particle involved in CCD constraints, but not for kinematic or static particles.
17 // The dynamic particle could be CCD-enabled, or not CCD-enabled but colliding with another CCD-enabled dynamic particle.
19 {
21 TArray<FCCDParticle*> OverlappingDynamicParticles; // Dynamic particles that have overlapping (CCD) bounding boxes with this particle's. This is only used for island assignment. This could be optimized by using linked list and putting linked list nodes of all particles into a contiguous array.
22 TArray<FCCDConstraint*> AttachedCCDConstraints; // CCDConstraints that refer to this particle. This is used for resweeping.
23 int32 Island; // This could be optimized by putting island into a separate contiguous array (SOA vs AOS).
25 bool Done; // If a particle is marked as Done == true, we will not apply impulse on it any more in the current frame, effectively treating it as static. This happens when attached CCD constraint reaches maxium process count.
26
28 : Particle(nullptr)
30 , TOI(1.f)
31 , Done(false)
32 {
34 AttachedCCDConstraints.Reserve(8);
35 }
36
46
48 void AddConstraint(FCCDConstraint* const Constraint);
49 };
50
51 // FCCDParticle holds data used for applying CCD constraints.
52 // We create a FCCDConstraint for each swept constraint.
54 {
58 int32 ProcessedCount; // The number of times this constraint is processed in the current frame.
61
63 : SweptConstraint(nullptr)
64 , Particle{ nullptr, nullptr }
68 , NetImpulse(0)
69 {}
70
79
80 int32 GetFastMovingKinematicIndex(const FPBDCollisionConstraint* Constraint, const FVec3 Displacements[]) const;
81 };
82
84 {
85 public:
87
88 // Apply the CCD solver to the set of constraints. Currently this just moves the particles so that they overlap by
89 // an amount that can be resolved by the standard collision solver.
91
92 // Fix up any remaining penetration following the main constraint solver phase. E.g., this prevents heavy objects
93 // pushing light CCD objects through the world.
95
96 UE_DEPRECATED(5.6, "No longer functioning. Use ApplyCCD")
98
99 UE_DEPRECATED(5.6, "No longer functioning. Use ProjectCCD")
101
102 private:
104 bool UpdateParticleSweptConstraints(FCCDParticle* CCDParticle, const FReal IslandTOI, const FReal Dt);
105 // This is called after ApplySweptConstraints. This function updates manifold data which will be used in normal solve.
106 void UpdateSweptConstraints(const FReal Dt);
107 void OverwriteXUsingV(const FReal Dt);
109 void AssignParticleIslandsAndGroupParticles();
110 void AssignConstraintIslandsAndRecordConstraintNum();
111 void GroupConstraintsWithIslands();
112 void ApplyIslandSweptConstraints(const int32 Island, const FReal Dt);
113 void ApplyIslandSweptConstraints2(const int32 Island, const FReal Dt);
114 void ResetIslandParticles(const int32 Island);
115 void ResetIslandConstraints(const int32 Island);
116 void AdvanceParticleXToTOI(FCCDParticle *CCDParticle, const FReal TOI, const FReal Dt) const;
117 void UpdateParticleP(FCCDParticle *CCDParticle, const FReal Dt) const;
118 void ClipParticleP(FCCDParticle *CCDParticle) const;
119 void ClipParticleP(FCCDParticle *CCDParticle, const FVec3 Offset) const;
120 void ApplyImpulse(FCCDConstraint *CCDConstraint);
121
122 TArray<FCCDParticle> CCDParticles;
123 TArray<FCCDParticle*> GroupedCCDParticles; // FCCDParticles are grouped based on their islands.
124 TMap<FPBDRigidParticleHandle*, FCCDParticle*> ParticleToCCDParticle; // This map only contains dynamic particles.
125 TArray<FCCDConstraint> CCDConstraints;
126 TArray<FCCDConstraint*> SortedCCDConstraints; // Constraints are first grouped into islands and then sorted based on TOI.
127
128 int32 IslandNum;
129 TArray<FCCDParticle*> IslandStack; // Used to assign islands
130 TArray<int32> IslandParticleStart, IslandParticleNum; // IslandParticleNum is the number of dynamic particles in an island.
131 TArray<int32> IslandConstraintStart, IslandConstraintNum, IslandConstraintEnd; // The duplication of information in IslandConstraintNum and IslandConstraintEnd is needed when we group constraints using islands.
132 };
133
135 {
136 static FRigidTransform3 GetParticleTransformAtTOI(const FGeometryParticleHandle* Particle, const FReal TOI, const FReal Dt);
137
138 // Return true if DeltaX indicates a movement beyond a set of threshold
139 // distances for each local axis.
140 static bool DeltaExceedsThreshold(const FVec3& AxisThreshold, const FVec3& DeltaX, const FQuat& R);
142
143 // Return true if a pair of DeltaXs potentially indicate closing
144 // motion between two bodies which would cause the crossing of a combined
145 // threshold on any local axis.
146 static bool DeltaExceedsThreshold(
147 const FVec3& AxisThreshold0, const FVec3& DeltaX0, const FQuat& R0,
148 const FVec3& AxisThreshold1, const FVec3& DeltaX1, const FQuat& R1);
149
150 // Variant of the two-particle of DeltaExceedsThreshold which chooses
151 // DeltaX: For rigid particles, use X-P. For non-rigids, use Vec3::ZeroVector.
152 // R: For rigid particles, use Q. For non-rigids, use R.
153 static bool DeltaExceedsThreshold(const FGeometryParticleHandle& Particle0, const FGeometryParticleHandle& Particle1);
154
155 // Variant of the two-particle of DeltaExceedsThreshold which chooses
156 // DeltaX: For rigid particles, use V*Dt. For non-rigids, use Vec3::ZeroVector.
157 // R: For rigid particles, use Q. For non-rigids, use R.
158 static bool DeltaExceedsThreshold(const FGeometryParticleHandle& Particle0, const FGeometryParticleHandle& Particle1, const FReal Dt);
159 };
160
161
162 using CCDHelpers UE_DEPRECATED(5.3, "Renamed to FCCDHelpers to meet naming conventions") = FCCDHelpers;
163}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
@ 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
void Init()
Definition LockFreeList.h:4
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition CCDUtilities.h:84
void ProjectCCD(const FReal Dt, TArrayView< FPBDCollisionConstraint *const > SweptConstraints)
Definition CCDUtilities.cpp:918
FCCDManager()
Definition CCDUtilities.h:86
void ApplyCorrections(const FReal Dt)
Definition CCDUtilities.h:100
void ApplyConstraintsPhaseCCD(const FReal Dt, Private::FCollisionConstraintAllocator *CollisionAllocator, const int32 NumDynamicParticles=TNumericLimits< int32 >::Max())
Definition CCDUtilities.h:97
void ApplyCCD(const FReal Dt, TArrayView< FPBDCollisionConstraint *const > SweptConstraints, const int32 NumDynamicParticles)
Definition CCDUtilities.cpp:100
A contact constraint.
Definition PBDCollisionConstraint.h:225
Definition ParticleHandle.h:436
Definition ParticleHandle.h:987
Definition ArrayView.h:139
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
Definition OverriddenPropertySet.cpp:45
@ false
Definition radaudio_common.h:23
Definition CCDUtilities.h:54
int32 FastMovingKinematicIndex
Definition CCDUtilities.h:59
FCCDParticle * Particle[2]
Definition CCDUtilities.h:56
int32 ProcessedCount
Definition CCDUtilities.h:58
FCCDConstraint()
Definition CCDUtilities.h:62
int32 Island
Definition CCDUtilities.h:57
int32 GetFastMovingKinematicIndex(const FPBDCollisionConstraint *Constraint, const FVec3 Displacements[]) const
Definition CCDUtilities.cpp:84
FCCDConstraint(FPBDCollisionConstraint *const InConstraint, FCCDParticle *InParticle[], const FVec3 Displacements[])
Definition CCDUtilities.h:71
FVec3 NetImpulse
Definition CCDUtilities.h:60
FPBDCollisionConstraint * SweptConstraint
Definition CCDUtilities.h:55
Definition CCDUtilities.h:135
static FRigidTransform3 GetParticleTransformAtTOI(const FGeometryParticleHandle *Particle, const FReal TOI, const FReal Dt)
Definition CCDUtilities.cpp:1094
static bool DeltaExceedsThreshold(const FVec3 &AxisThreshold, const FVec3 &DeltaX, const FQuat &R)
Definition CCDUtilities.cpp:1109
Definition CCDUtilities.h:19
void AddOverlappingDynamicParticle(FCCDParticle *const InParticle)
Definition CCDUtilities.cpp:74
FReal TOI
Definition CCDUtilities.h:24
int32 Island
Definition CCDUtilities.h:23
bool Done
Definition CCDUtilities.h:25
TArray< FCCDParticle * > OverlappingDynamicParticles
Definition CCDUtilities.h:21
FCCDParticle()
Definition CCDUtilities.h:27
TArray< FCCDConstraint * > AttachedCCDConstraints
Definition CCDUtilities.h:22
TPBDRigidParticleHandle< FReal, 3 > * Particle
Definition CCDUtilities.h:20
FCCDParticle(TPBDRigidParticleHandle< FReal, 3 > *InParticle)
Definition CCDUtilities.h:37
void AddConstraint(FCCDConstraint *const Constraint)
Definition CCDUtilities.cpp:79
Definition NumericLimits.h:41