UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDCollisionConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
13
14#include <memory>
15#include <queue>
16#include <sstream>
17#include "BoundingVolume.h"
18#include "AABBTree.h"
19
20namespace Chaos
21{
22class FImplicitObject;
23class FPBDCollisionConstraints;
24class FPBDRigidsSOAs;
25class FPBDCollisionConstraint;
26
30
31
32namespace Private
33{
34 // The type of solver to use for collisions
41}
42
49{
50public:
52
54
55 // Collision constraints have intrusive pointers. An array of constraint pointers can be uased as an array of handle pointers
58
59 // For use by dependent types
60 using FConstraintContainerHandle = FPBDCollisionConstraintHandle; // Used by constraint rules
61
65 const TArrayCollectionArray<TUniquePtr<FChaosPhysicsMaterial>>& PerParticlePhysicsMaterials,
66 const THandleArray<FChaosPhysicsMaterial>* const SimMaterials,
67 const int32 NumCollisionsPerBlock = 1000,
68 const FReal RestitutionThreshold = FReal(2000));
69
71
72 const FString& GetName() const { return DetectorSettings.GetName(); }
73 void SetName(const FSharedDebugName& InName) { DetectorSettings.EvolutionName = InName; }
74
78 bool GetHandlesEnabled() const { return bHandlesEnabled; }
79
84
90
95 bool GetIsDeterministic() const;
96
101 CHAOS_API void BeginFrame();
102
106 CHAOS_API void Reset();
107
108
113
118
123
127 UE_DEPRECATED(5.6, "Not supported. Use FPBDRigidsEvolutionGBF::ApplyMidPhaseModifier")
128 void ApplyMidPhaseModifier(const TArray<ISimCallbackObject*>& MidPhaseModifiers, FReal Dt) {}
129
133 CHAOS_API void ApplyCCDModifier(const TArray<ISimCallbackObject*>& CCDModifiers, FReal Dt);
134
135
141 CHAOS_API void ApplyCollisionModifier(const TArray<ISimCallbackObject*>& CollisionModifiers, FReal Dt);
142
143
148
152 CHAOS_API virtual void DisconnectConstraints(const TSet<FGeometryParticleHandle*>& ParticleHandles) override;
153
158
159 //
160 // FConstraintContainer Implementation
161 //
162 virtual int32 GetNumConstraints() const override final { return NumConstraints(); }
163 virtual void ResetConstraints() override final { Reset(); }
164 CHAOS_API virtual void AddConstraintsToGraph(Private::FPBDIslandManager& IslandManager) override final;
165 virtual void PrepareTick() override final {}
166 virtual void UnprepareTick() override final {}
167
169
171
172 // The type of solver we are creating
174 {
175 return CollisionSolverType;
176 }
177
178 // Set the solver type. NOTE: Any previously created solvers will not be recreated at this level. (See FPBDRigidsEvolutionGBF::UpdateCollisionSolverType)
180 {
181 CollisionSolverType = InSolverType;
182 }
183
184 //
185 // Member Access
186 //
187
189 {
190 bCanDisableContacts = bInCanDisableContacts;
191 }
192
194 {
195 return bCanDisableContacts;
196 }
197
199 {
200 RestitutionThreshold = InRestitutionThreshold;
201 }
202
204 {
205 return RestitutionThreshold;
206 }
207
209 {
210 bEnableCollisions = bInEnableCollisions;
211 }
212
214 {
215 return bEnableCollisions;
216 }
217
219 {
220 bEnableRestitution = bInEnableRestitution;
221 }
222
224 {
225 return bEnableRestitution;
226 }
227
229 {
230 GravityDirection = InGravity;
231 GravitySize = GravityDirection.SafeNormalize();
232 }
233
235 {
236 return GravityDirection;
237 }
238
240 {
241 return GravitySize;
242 }
243
245 {
246 SolverSettings.MaxPushOutVelocity = FMath::Max(InMaxPushOutVelocity, FReal(0));
247 }
248
250 {
251 // The user can specify a very large number up to float_max or any negative number to mean "infinity".
252 // However, we don't use float_max for infinity because we want to be able to perform simple math on
253 // it without numeric limit issues (search MaxDepenetrationVelocity).
254 constexpr float MaxDepenetrationVelocity = 1e10f; // [cm/s] almost speed of light :)
255
256 if (InVel >= 0.0f)
257 {
258 SolverSettings.DepenetrationVelocity = FMath::Min(InVel, MaxDepenetrationVelocity);
259 }
260 else
261 {
262 SolverSettings.DepenetrationVelocity = MaxDepenetrationVelocity;
263 }
264 }
265
270
275
280
285
287 {
288 return (SolverSettings.NumPositionShockPropagationIterations > 0) || (SolverSettings.NumVelocityShockPropagationIterations > 0);
289 }
290
292 {
293 return GetConstraints().Num();
294 }
295
297 {
298 return ConstraintAllocator.GetConstraints();
299 }
300
303
306
308
310
311 const FPBDCollisionSolverSettings& GetSolverSettings() const { return SolverSettings; }
312
314 {
315 SolverSettings = InSettings;
316 }
317
318 const FCollisionDetectorSettings& GetDetectorSettings() const { return DetectorSettings; }
319
321 {
322 DetectorSettings = InSettings;
323 }
324
326 {
327 DetectorSettings.BoundsExpansion = InCullDistance;
328 }
329
330 void SetVelocityBoundsExpansion(const FReal BoundsVelocityMultiplier, const FReal MaxVelocityBoundsExpansion)
331 {
333 DetectorSettings.MaxVelocityBoundsExpansion = MaxVelocityBoundsExpansion;
334 }
335
336 void SetVelocityBoundsExpansionMACD(const FReal BoundsVelocityMultiplier, const FReal MaxVelocityBoundsExpansion)
337 {
339 DetectorSettings.MaxVelocityBoundsExpansionMACD = MaxVelocityBoundsExpansion;
340 }
341
342 void SetAllowManifolds(const bool bAllowManifolds)
343 {
344 DetectorSettings.bAllowManifolds = bAllowManifolds;
345 }
346
347protected:
349
350 // Call PruneParticleEdgeCollisions on all particles with ECollisionConstraintFlags::CCF_SmoothEdgeCollisions set in CollisionFlags
352
353private:
354 const FPBDRigidsSOAs& Particles;
355
356 Private::FCollisionConstraintAllocator ConstraintAllocator;
357 int32 NumActivePointConstraints;
358 TArray<FPBDCollisionConstraintHandle*> TempCollisions; // Reused from tick to tick to build contact lists
359
362 const TArrayCollectionArray<TUniquePtr<FChaosPhysicsMaterial>>& MPerParticlePhysicsMaterials;
363 const THandleArray<FChaosPhysicsMaterial>* const SimMaterials;
364
365 FReal RestitutionThreshold;
366 bool bEnableCollisions;
367 bool bEnableRestitution;
368 bool bHandlesEnabled;
369 bool bEnableEdgePruning;
370 bool bIsDeterministic;
371
372 // This is passed to IterationParameters. If true, then an iteration can cull a contact
373 // permanently (ie, for the remaining iterations) if it is ignored due to culldistance.
374 // This improves performance, but can decrease stability if contacts are culled prematurely.
375 bool bCanDisableContacts;
376
377 Private::ECollisionSolverType CollisionSolverType;
378
379 // Used to determine constraint directions
380 FVec3 GravityDirection;
381 FReal GravitySize;
382
383 // Settings for the low-level collision solvers
384 FPBDCollisionSolverSettings SolverSettings;
385
386 // Settings for collision detection
387 FCollisionDetectorSettings DetectorSettings;
388};
389
390//
391//
392// Inlined FPBDCollisionConstraintHandle functions. Here to avoid circular deps
393//
394//
395
400
405
410
415
417{
418 return GetContact().GetCCDEnabled();
419}
420
425
427{
428 return !GetContact().GetDisabled();
429}
430
432{
433 return GetContact().GetIsProbe();
434}
435
440
445
446}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#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
Definition CollisionContext.h:17
bool bAllowManifolds
Definition CollisionContext.h:59
const FString & GetName() const
Definition CollisionContext.h:73
FSharedDebugName EvolutionName
Definition CollisionContext.h:71
FReal BoundsExpansion
Definition CollisionContext.h:36
FReal BoundsVelocityInflation
Definition CollisionContext.h:39
FReal MaxVelocityBoundsExpansionMACD
Definition CollisionContext.h:48
FReal BoundsVelocityInflationMACD
Definition CollisionContext.h:45
FReal MaxVelocityBoundsExpansion
Definition CollisionContext.h:42
FPBDConstraintContainer * ConstraintContainer
Definition ConstraintHandle.h:213
A handle to a contact constraint.
Definition PBDCollisionConstraintHandle.h:49
virtual void SetEnabled(bool InEnabled) override final
Definition PBDCollisionConstraints.h:421
const FPBDCollisionConstraint & GetContact() const
Definition PBDCollisionConstraints.h:406
bool GetCCDEnabled() const
Definition PBDCollisionConstraints.h:416
virtual bool IsProbe() const override final
Definition PBDCollisionConstraints.h:431
virtual bool IsEnabled() const override final
Definition PBDCollisionConstraints.h:426
FVec3 GetAccumulatedImpulse() const
Definition PBDCollisionConstraints.h:436
virtual FParticlePair GetConstrainedParticles() const override final
Definition PBDCollisionConstraints.h:441
const FPBDCollisionConstraints * ConcreteContainer() const
Definition PBDCollisionConstraints.h:396
A contact constraint.
Definition PBDCollisionConstraint.h:225
FGeometryParticleHandle * GetParticle0() const
Definition PBDCollisionConstraint.h:349
FGeometryParticleHandle * GetParticle1() const
Definition PBDCollisionConstraint.h:350
bool GetIsProbe() const
Definition PBDCollisionConstraint.h:418
void SetDisabled(bool bInDisabled)
Definition PBDCollisionConstraint.h:410
bool GetCCDEnabled() const
Definition PBDCollisionConstraint.h:290
FVec3f AccumulatedImpulse
Definition PBDCollisionConstraint.h:978
bool GetDisabled() const
Definition PBDCollisionConstraint.h:413
Definition PBDCollisionConstraints.h:49
virtual void PrepareTick() override final
Definition PBDCollisionConstraints.h:165
CHAOS_API void DisableHandles()
Definition PBDCollisionConstraints.cpp:411
CHAOS_API void ApplyCollisionModifier(const TArray< ISimCallbackObject * > &CollisionModifiers, FReal Dt)
Definition PBDCollisionConstraints.cpp:622
CHAOS_API void EndDetectCollisions()
Called after collision detection to finalize the contacts.
Definition PBDCollisionConstraints.cpp:570
const FPBDCollisionSolverSettings & GetSolverSettings() const
Definition PBDCollisionConstraints.h:311
CHAOS_API FHandles GetConstraintHandles() const
Definition PBDCollisionConstraints.cpp:417
virtual CHAOS_API ~FPBDCollisionConstraints()
Definition PBDCollisionConstraints.cpp:361
virtual CHAOS_API void AddConstraintsToGraph(Private::FPBDIslandManager &IslandManager) override final
Definition PBDCollisionConstraints.cpp:653
void SetVelocityFrictionIterations(const int32 InNumIterations)
Definition PBDCollisionConstraints.h:271
void SetDepenetrationVelocity(const FRealSingle InVel)
Definition PBDCollisionConstraints.h:249
void SetVelocityShockPropagationIterations(const int32 InNumIterations)
Definition PBDCollisionConstraints.h:281
void ApplyMidPhaseModifier(const TArray< ISimCallbackObject * > &MidPhaseModifiers, FReal Dt)
Definition PBDCollisionConstraints.h:128
void SetSolverType(const Private::ECollisionSolverType InSolverType)
Definition PBDCollisionConstraints.h:179
bool GetRestitutionEnabled() const
Definition PBDCollisionConstraints.h:223
virtual void UnprepareTick() override final
Definition PBDCollisionConstraints.h:166
Private::FCollisionConstraintAllocator & GetConstraintAllocator()
Definition PBDCollisionConstraints.h:307
void SetRestitutionEnabled(bool bInEnableRestitution)
Definition PBDCollisionConstraints.h:218
void SetMaxPushOutVelocity(const FReal InMaxPushOutVelocity)
Definition PBDCollisionConstraints.h:244
virtual CHAOS_API TUniquePtr< FConstraintContainerSolver > CreateGroupSolver(const int32 Priority) override final
Definition PBDCollisionConstraints.cpp:371
CHAOS_API void UpdateConstraintMaterialProperties(FPBDCollisionConstraint &Contact)
Definition PBDCollisionConstraints.cpp:445
CHAOS_API const FPBDCollisionConstraint & GetConstConstraint(int32 Index) const
Definition PBDCollisionConstraints.cpp:765
virtual CHAOS_API void DisconnectConstraints(const TSet< FGeometryParticleHandle * > &ParticleHandles) override
Remove all constraints associated with the particles - called when particles are destroyed.
Definition PBDCollisionConstraints.cpp:640
CHAOS_API FConstHandles GetConstConstraintHandles() const
Definition PBDCollisionConstraints.cpp:422
friend class FPBDCollisionConstraintHandle
Definition PBDCollisionConstraints.h:51
void SetVelocityBoundsExpansion(const FReal BoundsVelocityMultiplier, const FReal MaxVelocityBoundsExpansion)
Definition PBDCollisionConstraints.h:330
virtual void ResetConstraints() override final
Definition PBDCollisionConstraints.h:163
bool GetCanDisableContacts() const
Definition PBDCollisionConstraints.h:193
void SetName(const FSharedDebugName &InName)
Definition PBDCollisionConstraints.h:73
CHAOS_API void BeginDetectCollisions()
Called before collision detection to reset contacts.
Definition PBDCollisionConstraints.cpp:563
void SetCanDisableContacts(bool bInCanDisableContacts)
Definition PBDCollisionConstraints.h:188
void SetAllowManifolds(const bool bAllowManifolds)
Definition PBDCollisionConstraints.h:342
const FCollisionDetectorSettings & GetDetectorSettings() const
Definition PBDCollisionConstraints.h:318
FReal GetRestitutionThreshold() const
Definition PBDCollisionConstraints.h:203
CHAOS_API void PruneEdgeCollisions()
Definition PBDCollisionConstraints.cpp:779
void SetCullDistance(const FReal InCullDistance)
Definition PBDCollisionConstraints.h:325
void SetIsDeterministic(const bool bInIsDeterministic)
Enable or disable determinism. Support for determinism requires that we sort active constraints each ...
Definition PBDCollisionConstraints.cpp:400
bool GetIsDeterministic() const
Get determinism. Support for determinism requires that we sort active constraints each tick,...
Definition PBDCollisionConstraints.cpp:406
CHAOS_API void Reset()
Definition PBDCollisionConstraints.cpp:556
virtual CHAOS_API TUniquePtr< FConstraintContainerSolver > CreateSceneSolver(const int32 Priority) override final
Definition PBDCollisionConstraints.cpp:365
CHAOS_API void BeginFrame()
Definition PBDCollisionConstraints.cpp:551
int32 NumConstraints() const
Definition PBDCollisionConstraints.h:291
CHAOS_API void DetectProbeCollisions(FReal Dt)
Called after collision resolution in order to detect probes.
Definition PBDCollisionConstraints.cpp:582
void SetSolverSettings(const FPBDCollisionSolverSettings &InSettings)
Definition PBDCollisionConstraints.h:313
void SetRestitutionThreshold(FReal InRestitutionThreshold)
Definition PBDCollisionConstraints.h:198
TArrayView< FPBDCollisionConstraint *const > FHandles
Definition PBDCollisionConstraints.h:56
CHAOS_API void RemoveConstraints(const TSet< FGeometryParticleHandle * > &ParticleHandle)
Definition PBDCollisionConstraints.cpp:645
bool GetCollisionsEnabled() const
Definition PBDCollisionConstraints.h:213
void SetPositionFrictionIterations(const int32 InNumIterations)
Definition PBDCollisionConstraints.h:266
void SetGravity(const FVec3 &InGravity)
Definition PBDCollisionConstraints.h:228
bool GetHandlesEnabled() const
Definition PBDCollisionConstraints.h:78
virtual int32 GetNumConstraints() const override final
Definition PBDCollisionConstraints.h:162
TArrayView< FPBDCollisionConstraint *const > GetConstraints() const
Definition PBDCollisionConstraints.h:296
CHAOS_API const FPBDCollisionConstraint & GetConstraint(int32 Index) const
Definition PBDCollisionConstraints.cpp:758
void SetDetectorSettings(const FCollisionDetectorSettings &InSettings)
Definition PBDCollisionConstraints.h:320
void SetPositionShockPropagationIterations(const int32 InNumIterations)
Definition PBDCollisionConstraints.h:276
void SetCollisionsEnabled(bool bInEnableCollisions)
Definition PBDCollisionConstraints.h:208
Private::ECollisionSolverType GetSolverType() const
Definition PBDCollisionConstraints.h:173
void DisableConstraints(const TSet< FGeometryParticleHandle * > &ParticleHandle)
Definition PBDCollisionConstraints.h:157
FVec3 GetGravityDirection() const
Definition PBDCollisionConstraints.h:234
TArrayView< const FPBDCollisionConstraint *const > FConstHandles
Definition PBDCollisionConstraints.h:57
CHAOS_API void ApplyCCDModifier(const TArray< ISimCallbackObject * > &CCDModifiers, FReal Dt)
Definition PBDCollisionConstraints.cpp:613
const FString & GetName() const
Definition PBDCollisionConstraints.h:72
FReal GetGravitySize() const
Definition PBDCollisionConstraints.h:239
void SetVelocityBoundsExpansionMACD(const FReal BoundsVelocityMultiplier, const FReal MaxVelocityBoundsExpansion)
Definition PBDCollisionConstraints.h:336
bool IsShockPropagationEnabled() const
Definition PBDCollisionConstraints.h:286
Settings to control the low-level collision solver behaviour.
Definition PBDCollisionSolverSettings.h:12
int32 NumVelocityShockPropagationIterations
Definition PBDCollisionSolverSettings.h:47
int32 NumPositionFrictionIterations
Definition PBDCollisionSolverSettings.h:34
FRealSingle DepenetrationVelocity
Definition PBDCollisionSolverSettings.h:31
int32 NumPositionShockPropagationIterations
Definition PBDCollisionSolverSettings.h:44
int32 NumVelocityFrictionIterations
Definition PBDCollisionSolverSettings.h:41
FReal MaxPushOutVelocity
Definition PBDCollisionSolverSettings.h:27
Definition PBDConstraintContainer.h:19
Definition IndexedConstraintContainer.h:243
Definition PBDRigidsSOAs.h:269
Definition ChaosDebugName.h:17
Definition SimCallbackObject.h:68
An allocator and container of collision constraints that supports reuse of constraints from the previ...
Definition CollisionConstraintAllocator.h:234
TArrayView< FPBDCollisionConstraint *const > GetConstraints() const
The set of collision constraints for the current tick (created or reinstated)
Definition CollisionConstraintAllocator.h:291
Definition IslandManager.h:453
Definition ArrayCollectionArray.h:15
Definition Handles.h:152
FConstraint * GetConstraint()
Definition ConstraintHandle.h:270
Definition Serializable.h:10
Definition ArrayView.h:139
Definition Array.h:670
Definition UniquePtr.h:107
ECollisionSolverType
Definition PBDCollisionConstraints.h:36
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
float FRealSingle
Definition Real.h:14
Definition OverriddenPropertySet.cpp:45
U16 Index
Definition radfft.cpp:71