UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CollisionKeys.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5#include "Chaos/Core.h"
7
8namespace Chaos
9{
14 {
15 if (A < B)
16 {
17 return ::HashCombine(A, B);
18 }
19 else
20 {
21 return ::HashCombine(B, A);
22 }
23 }
24
29 {
30 return (Particle1->ParticleID() < Particle0->ParticleID());
31 }
32
49
50 namespace Private
51 {
52
59 {
60 public:
61 using KeyType = uint64;
62
64 {
65 Key.Key64 = 0;
66 }
67
68 FCollisionParticlePairKey(const FGeometryParticleHandle* Particle0, const FGeometryParticleHandle* Particle1, const bool bSymmetric = true)
69 {
70 GenerateKey(Particle0, Particle1, bSymmetric);
71 }
72
73 uint64 GetKey() const
74 {
75 return Key.Key64;
76 }
77
79 {
80 // NOTE: GetTypeHash(uint64 V) does not work well if the 64 bit int is actually 2x32 bit ints
81 // so we hash-combine the two 32 bit ints instead
82 return ::HashCombineFast(uint32(Key.Key64 & 0xFFFFFFFF), uint32((Key.Key64 >> 32) & 0xFFFFFFFF));
83 }
84
86 {
87 return L.Key.Key64 == R.Key.Key64;
88 }
89
91 {
92 return L.Key.Key64 != R.Key.Key64;
93 }
94
96 {
97 return L.Key.Key64 < R.Key.Key64;
98 }
99
100 private:
101 void GenerateKey(const FGeometryParticleHandle* Particle0, const FGeometryParticleHandle* Particle1, const bool bSymmetric)
102 {
103 Key.Key64 = 0;
104 if ((Particle0 != nullptr) && (Particle1 != nullptr))
105 {
106 const bool bIsLocalID0 = Particle0->ParticleID().LocalID != INDEX_NONE;
107 const bool bIsLocalID1 = Particle1->ParticleID().LocalID != INDEX_NONE;
108 const uint32 ID0 = uint32((bIsLocalID0) ? Particle0->ParticleID().LocalID : Particle0->ParticleID().GlobalID);
109 const uint32 ID1 = uint32((bIsLocalID1) ? Particle1->ParticleID().LocalID : Particle1->ParticleID().GlobalID);
110
111 // If we want Key(A,B) == Key(B,A) swap the order if particle IDs to guarantee this
112 if (!bSymmetric || (ID0 < ID1))
113 {
114 Key.Key32s[0].Key31 = ID0;
115 Key.Key32s[0].IsLocal = bIsLocalID0;
116 Key.Key32s[1].Key31 = ID1;
117 Key.Key32s[1].IsLocal = bIsLocalID1;
118 }
119 else
120 {
121 Key.Key32s[0].Key31 = ID1;
122 Key.Key32s[0].IsLocal = bIsLocalID1;
123 Key.Key32s[1].Key31 = ID0;
124 Key.Key32s[1].IsLocal = bIsLocalID0;
125 }
126 }
127 }
128
129 struct FParticleIDKey
130 {
131 uint32 Key31 : 31;
132 uint32 IsLocal : 1;
133 };
134 union FIDKey
135 {
136 uint64 Key64;
137 FParticleIDKey Key32s[2];
138 };
139
140 // This class is sensitive to changes in FParticleID - try to catch that here...
141 static_assert(sizeof(FParticleID) == 8, "FParticleID size does not match FCollisionParticlePairKey (expected 64 bits)");
142 static_assert(sizeof(FParticleID::GlobalID) == 4, "FParticleID::GlobalID size does not match FCollisionParticlePairKey (expected 32 bits)");
143 static_assert(sizeof(FParticleID::LocalID) == 4, "FParticleID::LocalID size does not match FCollisionParticlePairKey (expected 32 bits)");
144 static_assert(sizeof(FParticleIDKey) == 4, "FCollisionParticlePairKey::FParticleIDKey size is not 32 bits");
145 static_assert(sizeof(FIDKey) == 8, "FCollisionParticlePairKey::FIDKey size is not 64 bits");
146
147 FIDKey Key;
148 };
149
150
156 {
157 public:
159 : Key(0)
160 {
161 }
162
168
170 {
171 return Key;
172 }
173
175 {
176 return L.Key == R.Key;
177 }
178
180 {
181 return L.Key != R.Key;
182 }
183
185 {
186 return L.Key < R.Key;
187 }
188
189 private:
190 union
191 {
192 struct
193 {
196 };
198 };
199 };
200
210 {
211 public:
213 : Key(0)
214 {
215 }
216
220 {
221 check(false); // Don't use unless we can make a better hash
223 ParticlesKey = ParticlePairKey.GetHash();
225 }
226
228 {
229 return L.Key == R.Key;
230 }
231
233 {
234 return L.Key != R.Key;
235 }
236
238 {
239 return L.Key < R.Key;
240 }
241
242 private:
243 union
244 {
245 struct
246 {
249 };
251 };
252 };
253
261 {
262 public:
264 : ParticlePairKey()
265 , ShapePairKey()
266 {
267 }
268
276
278 {
279 return (L.ParticlePairKey == R.ParticlePairKey) && (L.ShapePairKey == R.ShapePairKey);
280 }
281
283 {
284 return (L.ParticlePairKey != R.ParticlePairKey) || (L.ShapePairKey != R.ShapePairKey);
285 }
286
288 {
289 // @todo(chaos): make sure this doesn't add extra branches
290 const bool ParticlePairLess = (L.ParticlePairKey < R.ParticlePairKey);
291 const bool ShapePairLess = (L.ShapePairKey < R.ShapePairKey);
292 const bool ParticlePairNotEqual = (L.ParticlePairKey != R.ParticlePairKey);
294 }
295
296 private:
297 FCollisionParticlePairKey ParticlePairKey;
298 FCollisionShapePairKey ShapePairKey;
299 };
300
301 // A key used to sort constraints
302 // @todo(chaos): ideally we would use the smallest key possible here, but see comments in FCollisionSortKeyHashed
304 }
305
306
309 //
310 // DEPRECATED STUFF
311 //
314
315
317
318 class UE_DEPRECATED(5.4, "No longer used") FCollisionParticlePairConstraintKey
319 {
320 public:
322 : Key(0)
323 {
324 }
325
326 UE_DEPRECATED(5.3, "Replaced with version that takes Shape and ImplicitID")
328 : Key(0)
329 {
330 check((Implicit0 != nullptr) || (Simplicial0 != nullptr));
331 check((Implicit1 != nullptr) || (Simplicial1 != nullptr));
332 GenerateHash(nullptr, Implicit0, 0, Simplicial0, nullptr, Implicit1, 0, Simplicial1);
333 }
334
336 const FShapeInstance* Shape0,
338 const int32 ImplicitId0,
340 const FShapeInstance* Shape1,
342 const int32 ImplicitId1,
344 : Key(0)
345 {
346 check((Implicit0 != nullptr) || (Simplicial0 != nullptr));
347 check((Implicit1 != nullptr) || (Simplicial1 != nullptr));
348 GenerateHash(Shape0, Implicit0, ImplicitId0, Simplicial0, Shape1, Implicit1, ImplicitId1, Simplicial1);
349 }
350
351 uint32 GetKey() const
352 {
353 return Key;
354 }
355
356 friend bool operator==(const FCollisionParticlePairConstraintKey& L, const FCollisionParticlePairConstraintKey& R)
357 {
358 return L.Key == R.Key;
359 }
360
362 {
363 return !(L == R);
364 }
365
367 {
368 return L.Key < R.Key;
369 }
370
371 private:
372 void GenerateHash(
373 const FShapeInstance* Shape0,
375 const int32 ImplicitId0,
377 const FShapeInstance* Shape1,
379 const int32 ImplicitId1,
381 {
382 uint32 Hash0 = (Implicit0 != nullptr) ? ::GetTypeHash(Implicit0) : ::GetTypeHash(Simplicial0);
384 uint32 Hash1 = (Implicit1 != nullptr) ? ::GetTypeHash(Implicit1) : ::GetTypeHash(Simplicial1);
386 Key = HashCombine(Hash0, Hash1);
387 }
388
389 uint32 Key;
390 };
391}
#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
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
bool operator<(const FTextFormatString &LHS, const FTextFormatString &RHS)
Definition ITextFormatArgumentModifier.h:147
UE_FORCEINLINE_HINT bool operator!=(const FIndexedPointer &Other) const
Definition LockFreeList.h:76
constexpr uint32 HashCombineFast(uint32 A, uint32 B)
Definition TypeHash.h:74
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BVHParticles.h:24
Definition ImplicitObject.h:111
Definition ShapeInstance.h:554
Definition CollisionKeys.h:59
friend bool operator<(const FCollisionParticlePairKey &L, const FCollisionParticlePairKey &R)
Definition CollisionKeys.h:95
uint64 KeyType
Definition CollisionKeys.h:61
FCollisionParticlePairKey()
Definition CollisionKeys.h:63
uint32 GetHash() const
Definition CollisionKeys.h:78
uint64 GetKey() const
Definition CollisionKeys.h:73
friend bool operator!=(const FCollisionParticlePairKey &L, const FCollisionParticlePairKey &R)
Definition CollisionKeys.h:90
friend bool operator==(const FCollisionParticlePairKey &L, const FCollisionParticlePairKey &R)
Definition CollisionKeys.h:85
FCollisionParticlePairKey(const FGeometryParticleHandle *Particle0, const FGeometryParticleHandle *Particle1, const bool bSymmetric=true)
Definition CollisionKeys.h:68
Definition CollisionKeys.h:156
friend bool operator<(const FCollisionShapePairKey &L, const FCollisionShapePairKey &R)
Definition CollisionKeys.h:184
friend bool operator==(const FCollisionShapePairKey &L, const FCollisionShapePairKey &R)
Definition CollisionKeys.h:174
uint32 ShapeID0
Definition CollisionKeys.h:194
uint32 ShapeID1
Definition CollisionKeys.h:195
FCollisionShapePairKey(const int32 InShapeID0, const int32 InShapeID1)
Definition CollisionKeys.h:163
friend bool operator!=(const FCollisionShapePairKey &L, const FCollisionShapePairKey &R)
Definition CollisionKeys.h:179
uint64 Key
Definition CollisionKeys.h:197
FCollisionShapePairKey()
Definition CollisionKeys.h:158
uint64 GetKey() const
Definition CollisionKeys.h:169
Definition CollisionKeys.h:210
friend bool operator==(const FCollisionSortKeyHashed &L, const FCollisionSortKeyHashed &R)
Definition CollisionKeys.h:227
friend bool operator!=(const FCollisionSortKeyHashed &L, const FCollisionSortKeyHashed &R)
Definition CollisionKeys.h:232
uint32 ShapesKey
Definition CollisionKeys.h:248
uint32 ParticlesKey
Definition CollisionKeys.h:247
FCollisionSortKeyHashed(const FGeometryParticleHandle *InParticle0, const int32 InShapeID0, const FGeometryParticleHandle *InParticle1, const int32 InShapeID1)
Definition CollisionKeys.h:217
friend bool operator<(const FCollisionSortKeyHashed &L, const FCollisionSortKeyHashed &R)
Definition CollisionKeys.h:237
FCollisionSortKeyHashed()
Definition CollisionKeys.h:212
uint64 Key
Definition CollisionKeys.h:250
Definition CollisionKeys.h:261
friend bool operator<(const FCollisionSortKeyNonHashed &L, const FCollisionSortKeyNonHashed &R)
Definition CollisionKeys.h:287
FCollisionSortKeyNonHashed()
Definition CollisionKeys.h:263
FCollisionSortKeyNonHashed(const FGeometryParticleHandle *InParticle0, const int32 InShapeID0, const FGeometryParticleHandle *InParticle1, const int32 InShapeID1)
Definition CollisionKeys.h:269
friend bool operator!=(const FCollisionSortKeyNonHashed &L, const FCollisionSortKeyNonHashed &R)
Definition CollisionKeys.h:282
friend bool operator==(const FCollisionSortKeyNonHashed &L, const FCollisionSortKeyNonHashed &R)
Definition CollisionKeys.h:277
Definition ParticleHandle.h:436
EObjectStateType ObjectState() const
Definition ParticleHandle.h:1716
Definition SkeletalMeshComponent.h:307
uint32 OrderIndependentHashCombine(const uint32 A, const uint32 B)
Definition CollisionKeys.h:13
EObjectStateType
Definition ObjectState.h:10
FORCEINLINE uint32 GetTypeHash(const FParticleID &Unique)
Definition GeometryParticles.h:99
bool AreParticlesInPreferredOrder(const FGeometryParticleHandle *Particle0, const FGeometryParticleHandle *Particle1)
Definition CollisionKeys.h:28
bool ShouldSwapParticleOrder(const bool bIsDynamicOrSleeping0, const bool bIsDynamicOrSleeping1, const bool bIsParticle0Preferred)
Definition CollisionKeys.h:37
Definition OverriddenPropertySet.cpp:45
@ false
Definition radaudio_common.h:23
int32 LocalID
Definition ParticleDirtyFlags.h:39
int32 GlobalID
Definition ParticleDirtyFlags.h:38