UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CollisionConstraintFlags.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"
10
11#ifndef WITH_TODO_COLLISION_DISABLE
12#define WITH_TODO_COLLISION_DISABLE 0
13#endif
14
15namespace Chaos
16{
22 {
23 CCF_None = 0x0,
24 CCF_BroadPhaseIgnoreCollisions = 0x1, // Not used
27 };
28
29 // @todo(chaos): this should be broken out into FIgnoreCollisionManager (PT-only) and FIgnoreCollisionManagerProxy (interop).
30 // E.g., The interop could store sets of particle proxy pairs to enable/disable and call the ParticleHandle API on the PT object.
31 // Or it could use the solver to map IDs to particle handles like we currently do.
33 {
34 public:
37 using FActiveMap UE_DEPRECATED(5.1, "This type is no longer used") = TMap<FHandleID, TArray<FHandleID>>;
39
53
55 : StorageDataProducer(nullptr)
56 {
57 StorageDataProducer = GetNewStorageData();
58 }
59
60 //
61 //
62 // PHYSICS THREAD API
63 //
64 //
65
66 CHAOS_API bool ContainsHandle(FHandleID Body0) const;
67
68 CHAOS_API bool IgnoresCollision(FHandleID Body0, FHandleID Body1) const;
69
71
75 CHAOS_API bool IgnoresCollision(const FGeometryParticleHandle* Particle0, const FGeometryParticleHandle* Particle1) const;
76
82
87
88 //
89 //
90 // GAME THREAD API
91 //
92 //
93
95 {
96 if (StorageDataProducer->ExternalTimestamp == INDEX_NONE)
97 {
98 StorageDataProducer->ExternalTimestamp = ExternalTimestamp;
99 }
100 else
101 {
102 ensure(StorageDataProducer->ExternalTimestamp == ExternalTimestamp);
103 }
104
105 return StorageDataProducer->PendingActivations;
106 }
107
109 {
110 if (StorageDataProducer->ExternalTimestamp == INDEX_NONE)
111 {
112 StorageDataProducer->ExternalTimestamp = ExternalTimestamp;
113 }
114 else
115 {
116 ensure(StorageDataProducer->ExternalTimestamp == ExternalTimestamp);
117 }
118
119 return StorageDataProducer->PendingDeactivations;
120 }
121
123 {
124 if (StorageDataProducer->ExternalTimestamp != INDEX_NONE)
125 {
126 ensure(ExternalTimestamp == StorageDataProducer->ExternalTimestamp);
127 StorageDataQueue.Enqueue(StorageDataProducer);
128 StorageDataProducer = GetNewStorageData();
129 }
130 }
131
132 //
133 //
134 // INTEROP API
135 //
136 //
137
138 /*
139 *
140 */
142
143 /*
144 *
145 */
146 CHAOS_API void PopStorageData_Internal(int32 ExternalTimestamp);
147
148
149 // DEPRECATED
150 UE_DEPRECATED(5.2, "The physics thread uses the ParticleHandle API. See AddIgnoreCollisions")
152 UE_DEPRECATED(5.2, "The physics thread uses the ParticleHandle API. See RemoveIgnoreCollisions")
154
155 private:
156
157 CHAOS_API FGeometryParticleHandle* GetParticleHandle(FHandleID Body, FPBDRigidsSolver& Solver);
158 CHAOS_API void SetIgnoreCollisionFlag(FPBDRigidParticleHandle* Rigid, const bool bUsesIgnoreCollisionManager);
159 CHAOS_API void AddIgnoreCollisionsImpl(FHandleID Body0, FHandleID Body1);
160 CHAOS_API int32 RemoveIgnoreCollisionsImpl(FHandleID Body0, FHandleID Body1);
161
162 // Multiple sources can request an ignore pair, so we handle a simple count of
163 // ignore requests to ensure we don't prematurely remove an ignore pair
164 // #CHAOSTODO replace bi-directional map to pair hash to reduce required storage and dependency
165 struct FIgnoreEntry
166 {
167 FIgnoreEntry() = delete;
168 explicit FIgnoreEntry(FHandleID InId)
169 : Id(InId)
170 , Count(1) // Begin at 1 for convenience when adding entries
171 {}
172
173 FHandleID Id;
174 int32 Count;
175 };
176
177 FStorageData* GetNewStorageData()
178 {
179 FStorageData* StorageData;
180 if (StorageDataFreePool.Dequeue(StorageData))
181 {
182 return StorageData;
183 }
184
185 StorageDataBackingBuffer.Emplace(MakeUnique<FStorageData>());
186 return StorageDataBackingBuffer.Last().Get();
187 }
188
189 void ReleaseStorageData(FStorageData *InStorageData)
190 {
191 InStorageData->Reset();
192 StorageDataFreePool.Enqueue(InStorageData);
193 }
194
195 // Maps collision body0 to a list of other bodies and a count for how many
196 // sources have requested for this pair to be ignored
197 TMap<FHandleID, TArray<FIgnoreEntry>> IgnoreCollisionsList;
198
199 FPendingMap PendingActivations;
200 FDeactivationSet PendingDeactivations;
201
202 // Producer storage data, pending changes written here until pushed into queue.
203 FStorageData* StorageDataProducer;
204
205 TSpscQueue<FStorageData*> StorageDataQueue; // Queue of storage data being passed to physics thread
206 TSpscQueue<FStorageData*> StorageDataFreePool; //free pool of storage data
207 TArray<TUniquePtr<FStorageData>> StorageDataBackingBuffer; // Holds unique ptrs for storage data allocation
208 };
209
210} // Chaos
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
#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
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CollisionConstraintFlags.h:33
void AddIgnoreCollisionsFor(FHandleID Body0, FHandleID Body1)
Definition CollisionConstraintFlags.h:151
TSet< FUniqueIdx > FDeactivationSet
Definition CollisionConstraintFlags.h:36
TMap< FHandleID, TArray< FHandleID > > FPendingMap
Definition CollisionConstraintFlags.h:38
CHAOS_API bool IgnoresCollision(FHandleID Body0, FHandleID Body1) const
Definition CollisionConstraintFlags.cpp:20
CHAOS_API void AddIgnoreCollisions(FGeometryParticleHandle *Particle0, FGeometryParticleHandle *Particle1)
Definition CollisionConstraintFlags.cpp:111
CHAOS_API int32 NumIgnoredCollision(FHandleID Body0) const
Definition CollisionConstraintFlags.cpp:35
CHAOS_API void PopStorageData_Internal(int32 ExternalTimestamp)
Definition CollisionConstraintFlags.cpp:176
FDeactivationSet & GetPendingDeactivationsForGameThread(int32 ExternalTimestamp)
Definition CollisionConstraintFlags.h:108
CHAOS_API bool ContainsHandle(FHandleID Body0) const
Definition CollisionConstraintFlags.cpp:15
FIgnoreCollisionManager()
Definition CollisionConstraintFlags.h:54
CHAOS_API void RemoveIgnoreCollisions(FGeometryParticleHandle *Particle0, FGeometryParticleHandle *Particle1)
Definition CollisionConstraintFlags.cpp:137
CHAOS_API void ProcessPendingQueues(FPBDRigidsSolver &Solver)
Definition CollisionConstraintFlags.cpp:211
int32 RemoveIgnoreCollisionsFor(FHandleID Body0, FHandleID Body1)
Definition CollisionConstraintFlags.h:153
FUniqueIdx FHandleID
Definition CollisionConstraintFlags.h:35
FPendingMap & GetPendingActivationsForGameThread(int32 ExternalTimestamp)
Definition CollisionConstraintFlags.h:94
void PushProducerStorageData_External(int32 ExternalTimestamp)
Definition CollisionConstraintFlags.h:122
Definition PBDRigidsSolver.h:84
Definition ParticleHandle.h:436
Definition ParticleHandle.h:987
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SpscQueue.h:18
Definition SkeletalMeshComponent.h:307
ECollisionConstraintFlags
Flags for user-control over per-particle collision behaviour.
Definition CollisionConstraintFlags.h:22
Definition CollisionConstraintFlags.h:41
int32 ExternalTimestamp
Definition CollisionConstraintFlags.h:44
FPendingMap PendingActivations
Definition CollisionConstraintFlags.h:42
void Reset()
Definition CollisionConstraintFlags.h:46
FDeactivationSet PendingDeactivations
Definition CollisionConstraintFlags.h:43
Definition GeometryParticlesfwd.h:87