UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDCollisionSphereConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#if !COMPILE_WITHOUT_UNREAL_SUPPORT
5#include "Chaos/Array.h"
8#include "Chaos/Map.h"
11#include "Chaos/Sphere.h"
12
13#include <algorithm>
14
15// This is an approximation but only collides with spheres in the velocity direction which can hurt compared to all directions when it comes to thickness
16namespace Chaos
17{
19{
20 public:
21 FPBDCollisionSphereConstraints(const FPBDParticles& InParticles, const TSet<TVec2<int32>>& DisabledCollisionElements, const FReal Dt, const FReal Height = (FReal)0.)
22 : MH(Height)
23 {
24 for (int32 i = 0; i < (int32)InParticles.Size(); ++i)
25 {
26 MObjects.Add(Chaos::FImplicitObjectPtr(new FSphere(InParticles.P(i), Height)));
27 }
29 FCriticalSection CriticalSection;
31 TArray<int32> PotentialIntersections = Hierarchy.FindAllIntersections(InParticles.P(Index));
32 for (int32 i = 0; i < PotentialIntersections.Num(); ++i)
33 {
34 int32 Index2 = PotentialIntersections[i];
35 if (Index == Index2 || DisabledCollisionElements.Contains(TVector<int32, 2>(Index, Index2)))
36 continue;
37 if ((InParticles.P(Index2) - InParticles.P(Index)).Size() < Height)
38 {
39 CriticalSection.Lock();
40 MConstraints.FindOrAdd(Index).Add(Index2);
41 CriticalSection.Unlock();
42 }
43 }
44 });
45 }
47
48 void Apply(FPBDParticles& InParticles, const FReal Dt, const int32 Index) const override //-V762
49 {
50 if (InParticles.InvM(Index) == 0 || !MConstraints.Contains(Index))
51 return;
52 for (int32 i = 0; i < MConstraints[Index].Num(); ++i)
53 {
55 FReal Phi = MObjects[MConstraints[Index][i]]->PhiWithNormal(InParticles.P(Index), Normal);
56 if (Phi < 0)
57 {
58 InParticles.P(Index) += -Phi * Normal;
59 }
60 }
61 }
62
63 private:
64 FReal MH;
65 TMap<int32, TArray<int32>> MConstraints;
67};
68
69template <typename T, int d>
70using TPBDCollisionSphereConstraints UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDCollisionSphereConstraints instead") = FPBDCollisionSphereConstraints;
71
72}
73#endif
#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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
Definition PBDCollisionSphereConstraints.h:19
void Apply(FPBDParticles &InParticles, const FReal Dt, const int32 Index) const override
Definition PBDCollisionSphereConstraints.h:48
FPBDCollisionSphereConstraints(const FPBDParticles &InParticles, const TSet< TVec2< int32 > > &DisabledCollisionElements, const FReal Dt, const FReal Height=(FReal) 0.)
Definition PBDCollisionSphereConstraints.h:21
virtual ~FPBDCollisionSphereConstraints()
Definition PBDCollisionSphereConstraints.h:46
Definition PerParticleRule.h:18
Definition BoundingVolumeHierarchy.h:60
Definition PBDParticles.h:12
Definition Vector.h:41
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SkeletalMeshComponent.h:307
TSphere< FReal, 3 > FSphere
Definition ImplicitObject.h:36
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
FRealDouble FReal
Definition Real.h:22
U16 Index
Definition radfft.cpp:71