UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
EventsData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8
9class UPrimitiveComponent;
10
11namespace Chaos
12{
13 // base class for data that requires time of creation to be recorded
19
26
27 /* Common */
28
29 /* Maps PhysicsProxy to list of indices in events arrays
30 * - for looking up say all collisions a particular physics object had this frame
31 */
45
46 /* Collision */
47
48 /*
49 * All the collision events for one frame time stamped with the time for that frame
50 */
62
76
77 /* Breaking */
78
79 /*
80 * All the breaking events for one frame time stamped with the time for that frame
81 */
95
109
110 /* Trailing */
111
112 /*
113 * All the trailing events for one frame time stamped with the time for that frame
114 */
126
127
141
142 /* Removal */
143
144 /*
145 * All the removal events for one frame time stamped with the time for that frame
146 */
158
159
173
185
186 /*
187 * All the crumbling events for one frame time stamped with the time for that frame
188 */
202
233
234 template<typename PayloadType>
235 bool IsEventDataEmpty(const PayloadType* Buffer)
236 {
237 if (!Buffer)
238 {
239 return false;
240 }
241
242 if constexpr (std::is_same_v<PayloadType, FCollisionEventData>)
243 {
244 return Buffer->CollisionData.AllCollisionsArray.IsEmpty();
245 }
246 else if constexpr (std::is_same_v<PayloadType, FBreakingEventData>)
247 {
248 return Buffer->BreakingData.AllBreakingsArray.IsEmpty();
249 }
250 else if constexpr (std::is_same_v<PayloadType, FTrailingEventData>)
251 {
252 return Buffer->TrailingData.AllTrailingsArray.IsEmpty();
253 }
254 else if constexpr (std::is_same_v<PayloadType, FRemovalEventData>)
255 {
256 return Buffer->RemovalData.AllRemovalArray.IsEmpty();
257 }
258 else if constexpr (std::is_same_v<PayloadType, FSleepingEventData>)
259 {
260 return Buffer->SleepingData.IsEmpty();
261 }
262 else if constexpr (std::is_same_v<PayloadType, FCrumblingEventData>)
263 {
264 return Buffer->CrumblingData.AllCrumblingsArray.IsEmpty();
265 }
266 else
267 {
268 return false;
269 }
270 }
271
272 template<typename PayloadType>
274 {
275 if (!Buffer)
276 {
277 return nullptr;
278 }
279
280 if constexpr (std::is_same_v<PayloadType, FCollisionEventData>)
281 {
282 return &Buffer->PhysicsProxyToCollisionIndices.PhysicsProxyToIndicesMap;
283 }
284 else if constexpr (std::is_same_v<PayloadType, FBreakingEventData>)
285 {
286 return &Buffer->PhysicsProxyToBreakingIndices.PhysicsProxyToIndicesMap;
287 }
288 else if constexpr (std::is_same_v<PayloadType, FTrailingEventData>)
289 {
290 return nullptr; //&Buffer->PhysicsProxyToTrailingIndices.PhysicsProxyToIndicesMap;
291 }
292 else if constexpr (std::is_same_v<PayloadType, FRemovalEventData>)
293 {
294 return &Buffer->PhysicsProxyToRemovalIndices.PhysicsProxyToIndicesMap;
295 }
296 else if constexpr (std::is_same_v<PayloadType, FSleepingEventData>)
297 {
298 return nullptr;
299 }
300 else if constexpr (std::is_same_v<PayloadType, FCrumblingEventData>)
301 {
302 return &Buffer->PhysicsProxyToCrumblingIndices.PhysicsProxyToIndicesMap;
303 }
304 else
305 {
306 return nullptr;
307 }
308 }
309
310 // An index into a FCollisionEventData array of FCollidingDataobjects obtained from
311 // the PhysicsProxyToIndicesMap for a specific proxy.
312 // Indices held in FCollisionEventData::PhysicsProxyToCollisionIndices are encoded
313 // to include the proxy index in the collision data structure (0 or 1).
314 // This is useful if you collect a set of collision indices for a set of proxies, and
315 // the store a flat list of FCollidingDataIndexes. In this case it may be expensive
316 // to determine which of the proxies in the collision belongs to one of our proxies.
318 {
319 public:
321 : ProxyIndex(0)
322 , CollisionIndex(INDEX_NONE)
323 {
324 }
325
326 // InProxyIndex: The index of the proxy in the FCollidingData (0 or 1)
327 // InCollisionIndex: The index of the FCollidingData in the FCollisionEventData array
329 : ProxyIndex(InProxyIndex)
330 , CollisionIndex(InCollisionIndex)
331 {
333 check(InProxyIndex >= 0);
334 check(InProxyIndex <= 1);
335 }
336
337 // Reset to invalid state
338 void Reset()
339 {
340 ProxyIndex = 0;
341 CollisionIndex = INDEX_NONE;
342 }
343
344 // Is this index a valid index into the FCollidingData array?
345 bool IsValid() const
346 {
347 return CollisionIndex >= 0;
348 }
349
350 // The index into the FCollidingData array
352 {
353 return CollisionIndex;
354 }
355
356 // The index of our body in the collision data. This will be zero or one.
358 {
359 return ProxyIndex;
360 }
361
362 private:
363 uint32 ProxyIndex : 1;
364 int32 CollisionIndex : 31;
365 };
366
367 // It wouldn't matter if it were larger, but just in case more flags are added and we do something unexpected...
368 static_assert(sizeof(FCollidingDataIndex) == sizeof(int32), "FCollidingDataIndex should be same size as int32");
369
370 // Iterates over the FCollidingData objects for a set of proxies
371 //
372 // Usage:
373 // for (FCollisionEventDataIterator It(MyProxyList, CollisionData); It; ++It)
374 // {
375 // Chaos::FCollidingDataIndex CollidingDataIndex = It.GetCurrentCollidingDataIndex();
376 // if (CollidingDataIndex.IsValid())
377 // {
378 // // CollidingData is between one ot the proxies in MyProxyList and another (which in general may also be in MyProxyList!)
379 // const Chaos::FCollidingData& CollidingData = CollisionEventData.CollisionData.AllCollisionsArray[CollidingDataIndex.GetIndex()];
380 //
381 // Chaos::FVec3 Normal = (CollidingDataIndex.GetProxyIndex() == 0) ? CollidingData.Normal : -CollidingData.Normal
382 // float Mass = (CollidingDataIndex.GetProxyIndex() == 0) ? CollidingData.Mass1 : CollidingData.Mass2;
383 // // ...
384 // }}
385 // }
386 //
388 {
389 public:
391
392 // Reset the iterator to point at the first FCollidingData for the first proxy that has any collisions.
393 CHAOS_API void Reset();
394
395 // Move to the next collision. If we have reached the end of collisions for the current proxy,
396 // move to the next proxy with collisions and select its first collision.
397 CHAOS_API void Next();
398
399 // Get the index of the current collision in the CollisionEventData's CollidingData array
400 // or INDEX_NONE if we have reached the end of the collisions for all proxies.
402
403 // Get the Proxy that the iterator is currently pointing to
404 // or null if we have reached the end of the collisions for all proxies.
406
407 // Have we reached the end of the collisions for all proxies?
408 bool IsFinished() const
409 {
410 return (ProxyIndex >= Proxies.Num());
411 }
412
413 // Returns true if we are still iterating (have not reached the end)
414 operator bool() const
415 {
416 return !IsFinished();
417 }
418
419 // Move to the next non-empty collision/proxy
421 {
422 Next();
423 return *this;
424 }
425
426 // NOTE: Deliberately not providing a post-increment operator
427 // because it is more expensive to copy than users might expect
428 // (although not that bad really, so feel free to add one if
429 // you really need it!)
431
432 private:
433 // Current Iteration state
434 int32 ProxyIndex;
435 int32 ProxyCollisionIndex;
436 const TArray<int32>* ProxyCollisionIndices;
437
438 // Set of proxies we care about
440
441 // Collision data from the whole scene
442 const Chaos::FCollisionEventData& CollisionEventData;
443 };
444
445}
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
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
@ Num
Definition MetalRHIPrivate.h:234
const bool
Definition NetworkReplayStreaming.h:178
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition EventsData.h:318
void Reset()
Definition EventsData.h:338
int32 GetProxyIndex() const
Definition EventsData.h:357
FCollidingDataIndex()
Definition EventsData.h:320
bool IsValid() const
Definition EventsData.h:345
int32 GetIndex() const
Definition EventsData.h:351
FCollidingDataIndex(int32 InCollisionIndex, int32 InProxyIndex)
Definition EventsData.h:328
Definition EventsData.h:388
FCollisionEventDataIterator & operator++()
Definition EventsData.h:420
CHAOS_API void Next()
Definition EventsData.cpp:35
CHAOS_API const IPhysicsProxyBase * GetCurrentProxy() const
Definition EventsData.cpp:83
FCollisionEventDataIterator operator++(int)=delete
CHAOS_API void Reset()
Definition EventsData.cpp:17
bool IsFinished() const
Definition EventsData.h:408
CHAOS_API FCollidingDataIndex GetCurrentCollidingDataIndex() const
Definition EventsData.cpp:67
Definition PhysicsProxyBase.h:97
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition Array.h:670
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UnrealString.h.inl:34
Definition SkeletalMeshComponent.h:307
TArray< FBreakingData > FBreakingDataArray
Definition EventsData.h:21
TArray< FRemovalData > FRemovalDataArray
Definition EventsData.h:23
TArray< FTrailingData > FTrailingDataArray
Definition EventsData.h:22
FRealDouble FReal
Definition Real.h:22
TArray< FSleepingData > FSleepingDataArray
Definition EventsData.h:24
bool IsEventDataEmpty(const PayloadType *Buffer)
Definition EventsData.h:235
TArray< FCollidingData > FCollisionDataArray
Definition EventsData.h:20
TArray< FCrumblingData > FCrumblingDataArray
Definition EventsData.h:25
const TMap< IPhysicsProxyBase *, TArray< int32 > > * GetProxyToIndexMap(const PayloadType *Buffer)
Definition EventsData.h:273
@ false
Definition radaudio_common.h:23
Definition EventsData.h:83
FAllBreakingData()
Definition EventsData.h:84
void Reset()
Definition EventsData.h:86
FBreakingDataArray AllBreakingsArray
Definition EventsData.h:92
bool bHasGlobalEvent
Definition EventsData.h:93
Definition EventsData.h:52
void Reset()
Definition EventsData.h:55
FAllCollisionData()
Definition EventsData.h:53
FCollisionDataArray AllCollisionsArray
Definition EventsData.h:60
Definition EventsData.h:190
FCrumblingDataArray AllCrumblingsArray
Definition EventsData.h:199
bool bHasGlobalEvent
Definition EventsData.h:200
void Reset()
Definition EventsData.h:193
FAllCrumblingData()
Definition EventsData.h:191
Definition EventsData.h:148
FAllRemovalData()
Definition EventsData.h:149
FRemovalDataArray AllRemovalArray
Definition EventsData.h:156
void Reset()
Definition EventsData.h:151
Definition EventsData.h:116
FTrailingDataArray AllTrailingsArray
Definition EventsData.h:124
FAllTrailingData()
Definition EventsData.h:117
void Reset()
Definition EventsData.h:119
Definition EventsData.h:97
FAllBreakingData BreakingData
Definition EventsData.h:106
FBreakingEventData()
Definition EventsData.h:98
FIndicesByPhysicsProxy PhysicsProxyToBreakingIndices
Definition EventsData.h:107
void Reset()
Definition EventsData.h:100
Definition EventsData.h:64
FAllCollisionData CollisionData
Definition EventsData.h:73
FCollisionEventData()
Definition EventsData.h:65
FIndicesByPhysicsProxy PhysicsProxyToCollisionIndices
Definition EventsData.h:74
void Reset()
Definition EventsData.h:67
Definition ExternalCollisionData.h:248
Definition EventsData.h:204
FAllCrumblingData CrumblingData
Definition EventsData.h:230
FIndicesByPhysicsProxy PhysicsProxyToCrumblingIndices
Definition EventsData.h:231
void Reset()
Definition EventsData.h:207
FORCEINLINE_DEBUGGABLE void SetTimeCreated(FReal TimeCreatedIn)
Definition EventsData.h:218
FORCEINLINE_DEBUGGABLE void Reserve(int32 Num)
Definition EventsData.h:213
FORCEINLINE_DEBUGGABLE void AddCrumbling(const FCrumblingData &CrumblingToAdd)
Definition EventsData.h:223
FCrumblingEventData()
Definition EventsData.h:205
Definition EventsData.h:33
void Reset()
Definition EventsData.h:38
FIndicesByPhysicsProxy()
Definition EventsData.h:34
TMap< IPhysicsProxyBase *, TArray< int32 > > PhysicsProxyToIndicesMap
Definition EventsData.h:43
Definition EventsData.h:161
FAllRemovalData RemovalData
Definition EventsData.h:170
FRemovalEventData()
Definition EventsData.h:162
void Reset()
Definition EventsData.h:164
FIndicesByPhysicsProxy PhysicsProxyToRemovalIndices
Definition EventsData.h:171
Definition EventsData.h:175
FSleepingEventData()
Definition EventsData.h:176
void Reset()
Definition EventsData.h:178
FSleepingDataArray SleepingData
Definition EventsData.h:183
Definition EventsData.h:15
FTimeResource()
Definition EventsData.h:16
FReal TimeCreated
Definition EventsData.h:17
Definition EventsData.h:129
FAllTrailingData TrailingData
Definition EventsData.h:138
FIndicesByPhysicsProxy PhysicsProxyToTrailingIndices
Definition EventsData.h:139
void Reset()
Definition EventsData.h:132
FTrailingEventData()
Definition EventsData.h:130
Definition NumericLimits.h:41