20#ifndef CHAOS_CHECK_BROADPHASE
21#define CHAOS_CHECK_BROADPHASE 0
33 template <
typename TPayloadType,
typename T,
int d>
34 class ISpatialAcceleration;
35 class IResimCacheBase;
47 const bool bIsResimming,
243 , ParticleUniqueIdx(ParticleHandle ? ParticleHandle->UniqueIdx() :
FUniqueIdx(0))
244 , AccelerationHandle(ParticleHandle)
247 check(ParticleHandle !=
nullptr);
253 UE_DEPRECATED(5.7,
"Use the constructor that does not take the sim filter.")
287 return Instance.Payload.UniqueIdx() == ParticleUniqueIdx;
292 return &AccelerationHandle;
326 return Visitor.PrePreFilter(Payload);
341 , SpatialAcceleration(nullptr)
342 , NumActiveBroadphaseContexts(0)
364 if (!
ensure(SpatialAcceleration))
373 NumBroadPhasePairs = 0;
415 }, PendingTasks[ContextIndex]);
425 CheckOverlapResults();
428 for (
int32 ContextIndex = 0; ContextIndex < NumActiveBroadphaseContexts; ++ContextIndex)
430 NumBroadPhasePairs += BroadphaseContexts[ContextIndex].Overlaps.Num();
431 NumMidPhases += BroadphaseContexts[ContextIndex].MidPhases.Num();
448 RedistributeMidPhasesInContexts();
450 PendingTasks.Reset();
451 ContextsWithConstraints.
Reset();
463 }, UE::Tasks::ETaskPriority::High);
465 ContextsWithConstraints.
Add(ContextIndex);
484 if (bIsDeterministic)
521 if (bIsDeterministic)
524 for (
int32 ContextIndex = 0; ContextIndex < PendingTasks.Num(); ContextIndex++)
526 int32 CurrentIndex = ContextsWithConstraints[ContextIndex];
563 }, PendingTasks[ContextIndex]);
572 while (PendingTasks.Num() >= 2)
598 ensure(PendingTasks.Num() <= 1);
603 if (!ContextsWithConstraints.
IsEmpty() && ContextsWithConstraints[0] != 0)
605 BroadphaseContexts[0].CollisionContext.Allocator->NewActiveConstraints =
606 MoveTemp(BroadphaseContexts[ContextsWithConstraints[0]].CollisionContext.Allocator->NewActiveConstraints);
617 template<
bool bOnlyRig
id,
typename ViewType,
typename SpatialAccelerationType>
634 BroadphaseContexts.SetNum(NumActiveBroadphaseContexts);
635 Allocator->SetMaxContexts(NumActiveBroadphaseContexts);
640 BroadphaseContexts[
Index].CollisionContext.SetSettings(Settings);
644 using TSOA =
typename ViewType::TSOA;
645 using THandle =
typename TSOA::THandleType;
646 using THandleBase =
typename THandle::THandleBase;
647 PendingTasks.Reset();
649 int32 ContextIndex = 0;
651 for (
int32 ViewIndex = 0; ViewIndex <
OverlapView.SOAViews.Num(); ++ViewIndex)
655 if (NumParticles == 0)
665 return THandleBase(HandlePtr->GeometryParticles, HandlePtr->ParticleIdx);
680 template<
typename T_SPATIALACCELERATION>
724 return NumBroadPhasePairs;
733 template<
bool bOnlyRig
id,
typename SpatialAccelerationType,
typename THandle,
typename LambdaType>
736 using THandleBase =
typename THandle::THandleBase;
737 using TTransientHandle =
typename THandle::TTransientHandle;
742 for (
int32 BatchIndex = 0; BatchIndex <
NumBatch; ContextIndex++, BatchIndex++)
744 if (ContextIndex >= NumActiveBroadphaseContexts)
750 EndIndex = BatchIndex ==
NumBatch - 1 ? FMath::Min(NumParticles, EndIndex) : EndIndex;
752 if (ContextIndex >= PendingTasks.Num())
754 Private::FBroadPhaseContext&
BroadPhaseContext = BroadphaseContexts[ContextIndex];
762 TTransientHandle& TransientHandle =
static_cast<TTransientHandle&
>(
Handle);
763 if (!TransientHandle.LightWeightDisabled())
775 Private::FBroadPhaseContext&
BroadPhaseContext = BroadphaseContexts[ContextIndex];
783 TTransientHandle& TransientHandle =
static_cast<TTransientHandle&
>(
Handle);
784 if (!TransientHandle.LightWeightDisabled())
789 }, PendingTasks[ContextIndex]);
797 template<
bool bOnlyRig
id,
typename T_SPATIALACCELERATION>
798 void ProduceParticleOverlaps(
802 Private::FBroadPhaseContext&
Context)
835 const FAABB3 Box1 = Particle1->WorldSpaceInflatedBounds();
850 if (Particle1 !=
Elem.Payload.GetGeometryParticleHandle_PhysicsThread())
852 Context.Overlaps.Emplace(Particle1,
Elem.Payload.GetGeometryParticleHandle_PhysicsThread(), 1);
859 void RedistributeMidPhasesInContexts()
869 for (
int32 ContextIndex = 0; ContextIndex < NumActiveBroadphaseContexts; ++ContextIndex)
918 int32 MidPhaseIndex = 0;
925 Overlap.ApplyFilter(IgnoreCollisionManager, bNeedsResim);
927 if (
Overlap.bCollisionsEnabled)
931 const bool bIsOneWay0 = FConstGenericParticleHandle(
Overlap.Particles[0])->OneWayInteraction();
932 const bool bIsOneWay1 = FConstGenericParticleHandle(
Overlap.Particles[1])->OneWayInteraction();
976 if ((Particle0 !=
nullptr) && (Particle1 !=
nullptr))
988 void CheckOverlapResults()
990#if CHAOS_CHECK_BROADPHASE
995 for (
int32 ContextIndex = 0; ContextIndex < NumActiveBroadphaseContexts; ++ContextIndex)
997 for (
const Private::FBroadPhaseOverlap&
Overlap : BroadphaseContexts[ContextIndex].Overlaps)
999 if (
Overlap.bCollisionsEnabled)
1001 const Private::FCollisionParticlePairKey
PairKey = Private::FCollisionParticlePairKey(
Overlap.Particles[0],
Overlap.Particles[1]);
1018 const FPBDRigidsSOAs& Particles;
1021 FIgnoreCollisionManager IgnoreCollisionManager;
1022 int32 NumActiveBroadphaseContexts;
1025 int32 NumBroadPhasePairs;
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define PHYSICS_CSV_CUSTOM_EXPENSIVE(Category, Name, Value, Op)
Definition ChaosStats.h:156
#define PHYSICS_CSV_SCOPED_EXPENSIVE(Category, Name)
Definition ChaosStats.h:155
#define CVD_GET_WRAPPED_CURRENT_CONTEXT(OutWrappedContext)
Definition ChaosVDContextProvider.h:223
#define CVD_SCOPE_CONTEXT(InContext)
Definition ChaosVDContextProvider.h:219
#define CVD_TRACE_MID_PHASE(MidPhase)
Definition ChaosVDTraceMacros.h:278
#define PRAGMA_DISABLE_INTERNAL_WARNINGS
Definition CoreMiscDefines.h:346
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define PRAGMA_ENABLE_INTERNAL_WARNINGS
Definition CoreMiscDefines.h:347
#define UE_INTERNAL
Definition CoreMiscDefines.h:345
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define QUICK_SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:652
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define CSV_SCOPED_TIMING_STAT(Category, StatName)
Definition CsvProfiler.h:150
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
#define UE_SOURCE_LOCATION
Definition PreprocessorHelpers.h:71
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition ParticleHandle.h:213
static UE_INTERNAL void ComputeParticleSimFilterDataFromShapes(const TParticle &Particle, FCollisionFilterData &OutSimFilterData)
FGeometryParticleHandle * GetGeometryParticleHandle_PhysicsThread() const
Definition ParticleHandle.h:229
bool PrePreSimFilter(const void *SimData) const
Definition ParticleHandle.h:262
Definition CollisionContext.h:83
void Reset()
Definition CollisionContext.h:92
Definition CollisionContext.h:17
Definition CollisionConstraintFlags.h:33
A handle to a contact constraint.
Definition PBDCollisionConstraintHandle.h:49
const FPBDCollisionConstraint & GetContact() const
Definition PBDCollisionConstraints.h:406
Private::FCollisionSortKey GetCollisionSortKey() const
Definition PBDCollisionConstraint.h:847
Definition PBDRigidsSOAs.h:269
const TParticleView< FPBDRigidParticles > & GetActiveDynamicMovingKinematicParticlesView() const
Definition PBDRigidsSOAs.h:950
const TParticleView< FPBDRigidParticles > & GetNonDisabledDynamicView() const
Definition PBDRigidsSOAs.h:926
Definition SpatialAccelerationBroadPhase.h:335
ISpatialAcceleration< FAccelerationStructureHandle, FReal, 3 > FAccelerationStructure
Definition SpatialAccelerationBroadPhase.h:337
void SetSpatialAcceleration(const FAccelerationStructure *InSpatialAcceleration)
Definition SpatialAccelerationBroadPhase.h:347
void ComputeParticlesOverlaps(ViewType &OverlapView, FReal Dt, const SpatialAccelerationType &InSpatialAcceleration, Private::FCollisionConstraintAllocator *Allocator, const FCollisionDetectorSettings &Settings)
This function is the outer loop of collision detection. It loops over the particles view and do the b...
Definition SpatialAccelerationBroadPhase.h:618
FSpatialAccelerationBroadPhase(const FPBDRigidsSOAs &InParticles)
Definition SpatialAccelerationBroadPhase.h:339
void ProduceCollisions(FReal Dt)
Definition SpatialAccelerationBroadPhase.h:438
void ProduceOverlaps(FReal Dt, const T_SPATIALACCELERATION &InSpatialAcceleration, Private::FCollisionConstraintAllocator *Allocator, const FCollisionDetectorSettings &Settings, IResimCacheBase *ResimCache)
Definition SpatialAccelerationBroadPhase.h:681
FIgnoreCollisionManager & GetIgnoreCollisionManager()
Definition SpatialAccelerationBroadPhase.h:719
int32 GetNumMidPhases() const
Definition SpatialAccelerationBroadPhase.h:727
void GatherConstraints(bool bIsDeterministic)
Definition SpatialAccelerationBroadPhase.h:470
void ProduceOverlaps(FReal Dt, Private::FCollisionConstraintAllocator *Allocator, const FCollisionDetectorSettings &Settings, IResimCacheBase *ResimCache)
Definition SpatialAccelerationBroadPhase.h:355
int32 GetNumBroadPhasePairs() const
Definition SpatialAccelerationBroadPhase.h:722
Definition ResimCacheBase.h:11
Definition ISpatialAccelerationCollection.h:23
Definition ISpatialAcceleration.h:267
Definition SpatialAccelerationBroadPhase.h:218
FBroadPhaseContext()
Definition SpatialAccelerationBroadPhase.h:220
TArray< FBroadPhaseOverlap > Overlaps
Definition SpatialAccelerationBroadPhase.h:231
TArray< FParticlePairMidPhase * > MidPhases
Definition SpatialAccelerationBroadPhase.h:232
void Reset()
Definition SpatialAccelerationBroadPhase.h:224
FCollisionContext CollisionContext
Definition SpatialAccelerationBroadPhase.h:233
Definition SpatialAccelerationBroadPhase.h:183
int32 SearchParticleIndex
Definition SpatialAccelerationBroadPhase.h:210
FGeometryParticleHandle * Particles[2]
Definition SpatialAccelerationBroadPhase.h:209
FBroadPhaseOverlap()
Definition SpatialAccelerationBroadPhase.h:185
bool bCollisionsEnabled
Definition SpatialAccelerationBroadPhase.h:211
FBroadPhaseOverlap(FGeometryParticleHandle *Particle0, FGeometryParticleHandle *Particle1, const int32 InSearchParticleIndex)
Definition SpatialAccelerationBroadPhase.h:189
void ApplyFilter(const FIgnoreCollisionManager &IgnoreCollisionManager, const bool bIsResimming)
Definition SpatialAccelerationBroadPhase.h:196
An allocator and container of collision constraints that supports reuse of constraints from the previ...
Definition CollisionConstraintAllocator.h:234
Definition CollisionConstraintAllocator.h:28
Definition AABBTree.h:786
Definition BoundingVolume.h:118
Definition ParticleHandle.h:436
const TPBDRigidParticleHandleImp< T, d, bPersistent > * CastToRigidParticle() const
Definition ParticleHandle.h:1697
Definition ParticleHandle.h:987
Definition ParticleIterator.h:639
static CORE_API FTaskGraphInterface & Get()
Definition TaskGraph.cpp:1794
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
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 AsyncInitBodyHelper.cpp:9
int32 NumWorkerCollisionFactor
Definition SpatialAccelerationBroadPhase.cpp:8
int32 ChaosOneWayInteractionPairCollisionMode
Definition PBDRigidsEvolutionGBF.cpp:177
bool bChaosMidPhaseRedistributionEnabled
Definition PBDRigidsEvolutionGBF.cpp:238
bool ParticlePairCollisionAllowed(const FGeometryParticleHandle *Particle1, const FGeometryParticleHandle *Particle2, const FIgnoreCollisionManager &IgnoreCollisionManager, const bool bIsResimming, bool &bOutSwapOrder)
Definition SpatialAccelerationBroadPhase.h:43
Definition SkeletalMeshComponent.h:307
TPBDRigidParticleHandle< FReal, 3 > FPBDRigidParticleHandle
Definition ParticleHandleFwd.h:60
CHAOS_API bool bDisableCollisionParallelFor
Definition Parallel.cpp:20
FRealDouble FReal
Definition Real.h:22
CHAOS_API int32 GSingleThreadedPhysics
Definition Parallel.cpp:10
bool PrePreFilterHelper(const FAccelerationStructureHandle &Payload, const Private::FSimOverlapVisitor &Visitor)
Definition SpatialAccelerationBroadPhase.h:323
uint8 SpatialAccelerationType
Definition ISpatialAcceleration.h:178
TGeometryParticleHandle< FReal, 3 > FGeometryParticleHandle
Definition ParticleHandleFwd.h:24
CHAOS_API int32 MaxNumWorkers
Definition Parallel.cpp:13
bool ParticlePairBroadPhaseFilter(const FGeometryParticleHandle *Particle1, const FGeometryParticleHandle *Particle2, const FIgnoreCollisionManager *IgnoreCollisionManager)
Definition CollisionFilter.h:22
bool AreParticlesInPreferredOrder(const FGeometryParticleHandle *Particle0, const FGeometryParticleHandle *Particle1)
Definition CollisionKeys.h:28
TAABB< FReal, 3 > FAABB3
Definition ImplicitObject.h:34
CHAOS_API int32 SmallBatchSize
Definition Parallel.cpp:14
bool ShouldSwapParticleOrder(const bool bIsDynamicOrSleeping0, const bool bIsDynamicOrSleeping1, const bool bIsParticle0Preferred)
Definition CollisionKeys.h:37
Definition OverriddenPropertySet.cpp:45
TTask< TInvokeResult_T< TaskBodyType > > Launch(const TCHAR *DebugName, TaskBodyType &&TaskBody, ETaskPriority Priority=ETaskPriority::Normal, EExtendedTaskPriority ExtendedPriority=EExtendedTaskPriority::None, ETaskFlags Flags=ETaskFlags::None)
Definition Task.h:266
bool Wait(const TaskCollectionType &Tasks, FTimespan InTimeout=FTimespan::MaxValue())
Definition Task.h:381
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition ISpatialAcceleration.h:14
Definition GeometryParticlesfwd.h:87
Definition SpatialAccelerationBroadPhase.h:240
FSimOverlapVisitor(FGeometryParticleHandle *ParticleHandle, Private::FBroadPhaseContext &InContext)
Definition SpatialAccelerationBroadPhase.h:241
const void * GetQueryPayload() const
Definition SpatialAccelerationBroadPhase.h:290
UE_INTERNAL bool PrePreFilter(const FAccelerationStructureHandle &Payload) const
Definition SpatialAccelerationBroadPhase.h:300
const void * GetQueryData() const
Definition SpatialAccelerationBroadPhase.h:281
bool ShouldIgnore(const TSpatialVisitorData< FAccelerationStructureHandle > &Instance) const
Definition SpatialAccelerationBroadPhase.h:285
bool VisitSweep(TSpatialVisitorData< FAccelerationStructureHandle >, FQueryFastData &CurData)
Definition SpatialAccelerationBroadPhase.h:269
const void * GetSimData() const
Definition SpatialAccelerationBroadPhase.h:283
bool VisitOverlap(const TSpatialVisitorData< FAccelerationStructureHandle > &Instance)
Definition SpatialAccelerationBroadPhase.h:259
bool VisitRaycast(TSpatialVisitorData< FAccelerationStructureHandle >, FQueryFastData &CurData)
Definition SpatialAccelerationBroadPhase.h:275
bool HasBlockingHit() const
Definition SpatialAccelerationBroadPhase.h:295
Definition AABBTree.h:260
Definition ParticleIterator.h:323
int32 Size() const
Definition ParticleIterator.h:351
Definition ISpatialAcceleration.h:99
Definition ChaosVDContextProvider.h:233
Definition CollisionFilterData.h:46
static constexpr UE_FORCEINLINE_HINT T DivideAndRoundUp(T Dividend, T Divisor)
Definition UnrealMathUtility.h:694