UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ContactModification.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#include "ParticleHandleFwd.h"
6#include "Chaos/ImplicitFwd.h"
7
8namespace
9{
10 // When a FContactPairModifierParticleRange is created to iterate over the contacts
11 // of a particular particle, an array of relevant constraints is generated.
12 //
13 // So long as the number of constraints for this particle does not exceed this constant
14 // value, no heap allocations will occur.
15 constexpr int32 ParticleContactsStackSize = 16;
16}
17
18namespace Chaos
19{
20 class FImplicitObject;
21 class FPBDCollisionConstraint;
22 class FPBDCollisionConstraints;
23 class FCollisionContactModifier;
24 class FContactPairModifier;
25 class FPerShapeData;
26 class FShapeInstance;
27 class FPBDCollisionConstraintContainerCookie;
28
30 {
31 public:
33 : Constraint(nullptr)
34 , Modifier(nullptr)
35 {}
36
41
45 CHAOS_API void Disable();
46
50 CHAOS_API void Enable();
51
58
63
67 CHAOS_API bool GetIsProbe() const;
68
73
78
82 CHAOS_API bool GetIsInitialContact() const;
83
89
94
99
104
109
114
123
129
134
139
144
149
153 CHAOS_API void ModifyRestitution(FReal Restitution);
154
159
164
169
173 CHAOS_API void ModifyDynamicFriction(FReal DynamicFriction);
174
179
183 CHAOS_API void ModifyStaticFriction(FReal StaticFriction);
184
188 CHAOS_API FVec3 GetParticleVelocity(int32 ParticleIdx) const;
189
194
199
204
208 CHAOS_API FVec3 GetParticlePosition(int32 ParticleIdx) const;
209
215
220
226
230 CHAOS_API FReal GetInvInertiaScale(int32 ParticleIdx) const;
231
236
240 CHAOS_API FReal GetInvMassScale(int32 ParticleIdx) const;
241
246
247 /*
248 * Get the other particle in the constraint - if the input particle isn't in the constraint,
249 * get null
250 */
252
253 /*
254 * Retrieve physics handles for particles in contact pair.
255 */
257
258 /*
259 * Get shape pair from constraint.
260 */
262
263 /*
264 * Get one of the particle's shapes.
265 */
266 CHAOS_API const FShapeInstance* GetShape(int32 ParticleIdx) const;
267
268 /*
269 * Get one of the particle's implicit objects.
270 */
271 CHAOS_API const FConstImplicitObjectRef GetImplicit(int32 ParticleIdx) const;
272
273 /*
274 * Whether this contact was generated from a CCD hit. Even if CCD is enabled for the bodies,
275 * the hit may be a non-CCD contact if they are moving slowly.
276 * NOTE: You can disable CCD in a MidPhase Modifier, but it is too late to do that here.
277 */
278 CHAOS_API bool GetIsCCD() const;
279
280 /*
281 * Check to see if a contact point index is an edge contact.
282 */
284
285 /*
286 * Check to see if a contact point index is disabled.
287 */
289
290 /*
291 * Set a contact point disabled.
292 */
294
295 private:
296
297 /*
298 * Get direct const access to the index of this constraint container cookie
299 */
300 CHAOS_API const FPBDCollisionConstraintContainerCookie& GetConstraintContainerCookie() const;
301
305 CHAOS_API void UpdateConstraintShapeTransforms();
306
307 FPBDCollisionConstraint* Constraint;
309
311 };
312
314 {
315 public:
317
319 : ConstraintIdx(0)
320 , Modifier(&InModifier)
321 , PairModifier()
322 {
323 // Initialize modifier at idx 0 or move to end.
324 SeekValidContact();
325 }
326
328 {
329 // Make sure we are not returning invalid modifier if at End.
330 EnsureValid();
331
332 return PairModifier;
333 }
334
336 {
337 // Make sure we are not returning invalid modifier if at End.
338 EnsureValid();
339
340 return &PairModifier;
341 }
342
344 {
345 ++ConstraintIdx;
346 SeekValidContact();
347 return *this;
348 }
349
350 explicit operator bool() const
351 {
352 return IsValid();
353 }
354
356 {
357 // All other data should match if index matches.
358 return ConstraintIdx == Value.ConstraintIdx;
359 }
360
362 {
363 return !(*this == Value);
364 }
365
366 bool IsValid() const
367 {
368 return ConstraintIdx != INDEX_NONE ;
369 }
370
371 private:
372
373 void SetToEnd()
374 {
375 ConstraintIdx = INDEX_NONE;
376 Modifier = nullptr;
377 }
378
379 void EnsureValid() const
380 {
381 ensure(IsValid());
382 }
383
384 // Moves to constraint at ConstraintIdx, or finds next valid constraint. Moves to end if no remaining valid constraints.
385 CHAOS_API void SeekValidContact();
386
387 int32 ConstraintIdx;
388 FCollisionContactModifier* Modifier;
389 FContactPairModifier PairModifier;
390 };
391
392 /*
393 * Iterator for FContactPairModifierParticleRange
394 */
396 {
397 public:
398
400 {
401 return PairModifier;
402 }
403
405 {
406 return &PairModifier;
407 }
408
410 {
411 ++Index;
412
413 PairModifier
414 = IsValid()
417
418 return *this;
419 }
420
422 {
423 return
425 Index == Other.Index;
426 }
427
429 {
430 return !(*this == Other);
431 }
432
433 bool IsValid() const
434 {
435 return 0 <= Index && Index < Constraints.Num();
436 }
437
438 private:
440 : Modifier(InModifier)
442 , Index(InIndex)
443 {
444 PairModifier
445 = IsValid()
448 }
449
450 FCollisionContactModifier* Modifier;
451 FContactPairModifier PairModifier;
452
454 int32 Index;
455
456 // Befriend the range object so that it can create iterators
458 };
459
460 /*
461 * Interface for iterating over a range of contacts for a particular particle
462 */
484
485 /*
486 * Utility for tracking visited contact pair modifiers so that clients can avoid processing duplicates
487 */
489 {
490 public:
491
492 // If a contact pair was not already visited, mark it visited and return true. Otherwise return false.
494
495 private:
498 , VisitedContacts(false, Constraints.Num())
499 { }
500
502 TBitArray<> VisitedContacts;
503
504 // Befriend the modifier so that it can create these
506 };
507
508 /*
509 * Provides interface for iterating over modifiable contact pairs
510 */
512 {
513 public:
516 friend FPBDCollisionConstraints; // Calls UpdateConstraintManifolds after callback.
517
518
523
526
529
531
533
534 private:
536 CHAOS_API void DisableConstraint(FPBDCollisionConstraint& Constraint);
537 CHAOS_API void EnableConstraint(FPBDCollisionConstraint& Constraint);
538
539 // Turn this constraint into a probe. It will still generate hit events,
540 // but will not produce impulses
541 CHAOS_API void ConvertToProbeConstraint(FPBDCollisionConstraint& Constraint);
542
543 // Turn this constraint from a probe into a regular constraint
544 CHAOS_API void ConvertToNonProbeConstraint(FPBDCollisionConstraint& Constraint);
545
546 CHAOS_API void MarkConstraintForManifoldUpdate(FPBDCollisionConstraint& Constraint);
547
548 // Update manifolds of modified constraints.
549 CHAOS_API void UpdateConstraintManifolds();
550
552
553 // Constraints that should update manifold from contact points.
554 TSet<FPBDCollisionConstraint*> NeedsManifoldUpdate;
555
556 FReal Dt;
557 };
558
560}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
const bool
Definition NetworkReplayStreaming.h:178
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition ContactModification.h:512
CHAOS_API FContactPairModifierParticleRange GetContacts(FGeometryParticleHandle *Particle)
Definition ContactModification.cpp:631
FCollisionContactModifier(const TArrayView< FPBDCollisionConstraint *const > &InConstraints, FReal InDt)
Definition ContactModification.h:519
FContactPairModifierIterator begin()
Definition ContactModification.h:525
FContactPairModifierIterator End() const
Definition ContactModification.h:527
FContactPairModifierIterator end() const
Definition ContactModification.h:528
friend FPBDCollisionConstraints
Definition ContactModification.h:516
friend FContactPairModifier
Definition ContactModification.h:514
CHAOS_API FVisitedContactPairsTracker MakeVisitedContactPairsTracker() const
Definition ContactModification.cpp:636
friend FContactPairModifierIterator
Definition ContactModification.h:515
FContactPairModifierIterator Begin()
Definition ContactModification.h:524
Definition ContactModification.h:314
FContactPairModifier * operator->()
Definition ContactModification.h:335
FContactPairModifierIterator(FCollisionContactModifier &InModifier)
Definition ContactModification.h:318
bool operator==(const FContactPairModifierIterator &Value) const
Definition ContactModification.h:355
FContactPairModifierIterator()
Definition ContactModification.h:316
bool operator!=(const FContactPairModifierIterator &Value) const
Definition ContactModification.h:361
FContactPairModifier & operator*()
Definition ContactModification.h:327
bool IsValid() const
Definition ContactModification.h:366
FContactPairModifierIterator & operator++()
Definition ContactModification.h:343
Definition ContactModification.h:396
bool IsValid() const
Definition ContactModification.h:433
FContactPairModifier & operator*()
Definition ContactModification.h:399
FContactPairModifierParticleRangeIterator & operator++()
Definition ContactModification.h:409
FContactPairModifier * operator->()
Definition ContactModification.h:404
bool operator==(const FContactPairModifierParticleRangeIterator &Other)
Definition ContactModification.h:421
bool operator!=(const FContactPairModifierParticleRangeIterator &Other)
Definition ContactModification.h:428
Definition ContactModification.h:464
CHAOS_API FContactPairModifierParticleRangeIterator begin()
Definition ContactModification.cpp:576
CHAOS_API FContactPairModifierParticleRangeIterator end()
Definition ContactModification.cpp:581
FContactPairModifierParticleRange(FContactPairModifierParticleRange &&Other)
Definition ContactModification.h:469
Definition ContactModification.h:30
CHAOS_API bool GetIsCCD() const
Definition ContactModification.cpp:516
CHAOS_API FVec3 GetParticleVelocity(int32 ParticleIdx) const
Definition ContactModification.cpp:234
CHAOS_API FVec3 GetWorldNormal(int32 ContactPointIdx) const
Get the world-space contact normal.
Definition ContactModification.cpp:118
CHAOS_API int32 GetNumContacts() const
Definition ContactModification.cpp:36
CHAOS_API void ModifyRestitution(FReal Restitution)
Definition ContactModification.cpp:191
CHAOS_API void ModifyDynamicFriction(FReal DynamicFriction)
Definition ContactModification.cpp:215
CHAOS_API bool GetIsInitialContact() const
Definition ContactModification.cpp:63
CHAOS_API void ConvertToProbe()
Definition ContactModification.cpp:21
CHAOS_API void ModifyWorldNormal(const FVec3 &Normal, int32 ContactPointIdx)
Definition ContactModification.cpp:128
CHAOS_API const FConstImplicitObjectRef GetImplicit(int32 ParticleIdx) const
Definition ContactModification.cpp:511
CHAOS_API FVec3 GetWorldContactLocation(int32 ContactPointIdx) const
Definition ContactModification.cpp:160
CHAOS_API const FShapeInstance * GetShape(int32 ParticleIdx) const
Definition ContactModification.cpp:506
CHAOS_API void ModifyParticleVelocity(FVec3 Velocity, int32 ParticleIdx)
Definition ContactModification.cpp:247
CHAOS_API void Disable()
Definition ContactModification.cpp:11
CHAOS_API void ModifyParticleAngularVelocity(FVec3 AngularVelocity, int32 ParticleIdx)
Definition ContactModification.cpp:286
CHAOS_API FVec3 GetParticlePosition(int32 ParticleIdx) const
Definition ContactModification.cpp:310
CHAOS_API void ModifyInvInertiaScale(FReal InvInertiaScale, int32 ParticleIdx)
Definition ContactModification.cpp:450
FContactPairModifier()
Definition ContactModification.h:32
CHAOS_API const FImplicitObject * GetContactGeometry(int32 ParticleIdx)
Definition ContactModification.cpp:75
CHAOS_API FReal GetDynamicFriction() const
Definition ContactModification.cpp:210
FContactPairModifier(FPBDCollisionConstraint *InConstraint, FCollisionContactModifier &InModifier)
Definition ContactModification.h:37
CHAOS_API FReal GetInvMassScale(int32 ParticleIdx) const
Definition ContactModification.cpp:464
CHAOS_API void ModifyParticlePosition(FVec3 Position, bool bMaintainVelocity, int32 ParticleIdx)
Definition ContactModification.cpp:330
CHAOS_API TVec2< const FPerShapeData * > GetShapePair() const
Definition ContactModification.cpp:501
CHAOS_API void ModifyTargetSeparation(FReal TargetSeparation, int32 ContactPointIdx)
Definition ContactModification.cpp:110
CHAOS_API FReal GetSeparation(int32 ContactPointIdx) const
Definition ContactModification.cpp:94
CHAOS_API FGeometryParticleHandle * GetOtherParticle(FGeometryParticleHandle *Particle) const
Definition ContactModification.cpp:483
CHAOS_API FReal GetInvInertiaScale(int32 ParticleIdx) const
Definition ContactModification.cpp:445
CHAOS_API void SetIsInitialContact(bool bIsInitialContact) const
Definition ContactModification.cpp:68
CHAOS_API FRigidTransform3 GetShapeToWorld(int32 ParticleIdx) const
Definition ContactModification.cpp:80
CHAOS_API void ModifyStaticFriction(FReal StaticFriction)
Definition ContactModification.cpp:227
CHAOS_API void ModifyRestitutionThreshold(FReal Restitution)
Definition ContactModification.cpp:203
CHAOS_API void SetContactPointDisabled(int32 ContactPointIdx) const
Definition ContactModification.cpp:536
CHAOS_API void ModifyParticleRotation(FRotation3 Rotation, bool bMaintainVelocity, int32 ParticleIdx)
Definition ContactModification.cpp:395
CHAOS_API FReal GetRestitutionThreshold() const
Definition ContactModification.cpp:198
CHAOS_API FReal GetTargetSeparation(int32 ContactPointIdx) const
Definition ContactModification.cpp:104
CHAOS_API int32 GetDeepestContactIndex() const
Definition ContactModification.cpp:41
CHAOS_API void ModifyWorldContactLocations(const FVec3 &Location0, const FVec3 &Location1, int32 ContactPointIdx)
Definition ContactModification.cpp:167
CHAOS_API void GetWorldContactLocations(int32 ContactPointIdx, FVec3 &OutLocation0, FVec3 &OutLocation1) const
Definition ContactModification.cpp:147
CHAOS_API FReal GetRestitution() const
Definition ContactModification.cpp:186
CHAOS_API FRotation3 GetParticleRotation(int32 ParticleIdx) const
Definition ContactModification.cpp:380
CHAOS_API void Enable()
Definition ContactModification.cpp:16
CHAOS_API bool IsEdgeContactPoint(int32 ContactPointIdx) const
Definition ContactModification.cpp:522
CHAOS_API bool GetIsProbe() const
Definition ContactModification.cpp:31
CHAOS_API FReal GetStaticFriction() const
Definition ContactModification.cpp:222
CHAOS_API TVec2< FGeometryParticleHandle * > GetParticlePair() const
Definition ContactModification.cpp:496
CHAOS_API void ConvertToNonProbe()
Definition ContactModification.cpp:26
CHAOS_API bool IsContactPointDisabled(int32 ContactPointIdx) const
Definition ContactModification.cpp:529
CHAOS_API void ModifyInvMassScale(FReal InvMassScale, int32 ParticleIdx)
Definition ContactModification.cpp:469
CHAOS_API FVec3 GetParticleAngularVelocity(int32 ParticleIdx) const
Definition ContactModification.cpp:273
Definition ImplicitObject.h:111
Information used by the constraint allocator This includes any information used for optimizations lik...
Definition PBDCollisionConstraint.h:164
A contact constraint.
Definition PBDCollisionConstraint.h:225
Definition ShapeInstance.h:554
Definition ContactModification.h:489
CHAOS_API bool Visit(const FContactPairModifier &ContactPair)
Definition ContactModification.cpp:606
Definition ParticleHandle.h:436
Definition Constraints.Build.cs:6
Constraints(ReadOnlyTargetRules Target)
Definition Constraints.Build.cs:7
Definition ArrayView.h:139
Definition Array.h:670
Definition AndroidPlatformMisc.h:14
Definition ContainerAllocationPolicies.h:894
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
@ Velocity
Definition SimulationModuleBase.h:147
U16 Index
Definition radfft.cpp:71