UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PerParticlePBDCollisionConstraint.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"
8#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_4
10#endif
13#include "Chaos/Levelset.h"
14#include "HAL/PlatformMath.h"
15
16#if !defined(CHAOS_PER_PARTICLE_COLLISION_ISPC_ENABLED_DEFAULT)
17#define CHAOS_PER_PARTICLE_COLLISION_ISPC_ENABLED_DEFAULT 1
18#endif
19
20#if !defined(USE_ISPC_KERNEL_CONSOLE_VARIABLES_IN_SHIPPING)
21#define USE_ISPC_KERNEL_CONSOLE_VARIABLES_IN_SHIPPING 0
22#endif
23
24// Support run-time toggling on supported platforms in non-shipping configurations
25#if !INTEL_ISPC || (UE_BUILD_SHIPPING && !USE_ISPC_KERNEL_CONSOLE_VARIABLES_IN_SHIPPING)
27#else
29#endif
30
31namespace Chaos::Softs
32{
33
35{
36 struct FVelocityConstraint
37 {
40 };
41
42public:
44 : bFastPositionBasedFriction(true)
45 , MCollisionParticlesActiveView(InParticlesActiveView)
46 , MCollided(Collided), MDynamicGroupIds(DynamicGroupIds)
47 , MKinematicGroupIds(KinematicGroupIds), MPerGroupThickness(PerGroupThickness)
48 , MPerGroupFriction(PerGroupFriction) {}
49
54 TArray<uint32>& DynamicGroupIds, TArray<uint32>& KinematicGroupIds, const TArray<FSolverReal>& PerGroupThickness, const TArray<FSolverReal>& PerGroupFriction,
56 : bFastPositionBasedFriction(true), MCollisionParticlesActiveView(InParticlesActiveView), MCollided(Collided)
57 , Contacts(&InContacts)
58 , Normals(&InNormals)
59 , Phis(&InPhis)
60 , MDynamicGroupIds(DynamicGroupIds), MKinematicGroupIds(KinematicGroupIds), MPerGroupThickness(PerGroupThickness), MPerGroupFriction(PerGroupFriction)
61 , Mutex(bWriteCCDContacts ? new FCriticalSection : nullptr) {}
62
64 {
65 delete Mutex;
66 }
67
68 CHAOS_API void ApplyRange(FSolverParticles& Particles, const FSolverReal Dt, const int32 Offset, const int32 Range) const;
69
70 void ApplyFriction(FSolverParticles& Particles, const FSolverReal Dt, const int32 Index) const
71 {
72 check(!bFastPositionBasedFriction); // Do not call this function if this is setup to run with fast PB friction
73
74 if (!MVelocityConstraints.Contains(Index))
75 {
76 return;
77 }
78 const FSolverReal VN = FSolverVec3::DotProduct(Particles.V(Index), MVelocityConstraints[Index].Normal);
79 const FSolverReal VNBody = FSolverVec3::DotProduct(MVelocityConstraints[Index].Velocity, MVelocityConstraints[Index].Normal);
80 const FSolverVec3 VTBody = MVelocityConstraints[Index].Velocity - VNBody * MVelocityConstraints[Index].Normal;
81 const FSolverVec3 VTRelative = Particles.V(Index) - VN * MVelocityConstraints[Index].Normal - VTBody;
83 const FSolverReal VNMax = FMath::Max(VN, VNBody);
84 const FSolverReal VNDelta = VNMax - VN;
85 const FSolverReal CoefficientOfFriction = MPerGroupFriction[MDynamicGroupIds[Index]];
88 Particles.V(Index) = VNMax * MVelocityConstraints[Index].Normal + VTBody + VTRelative * (1 - Friction);
89 }
90
91private:
92 template<bool bLockAndWriteContacts>
93 void ApplyHelper(FSolverParticles& Particles, const FSolverReal Dt, const int32 Offset, const int32 Range) const;
94 void ApplyHelperISPC(FSolverParticles& Particles, const FSolverReal Dt, const int32 Offset, const int32 Range) const;
95
96private:
97 bool bFastPositionBasedFriction;
98 // TODO(mlentine): Need a bb hierarchy
99 const TPBDActiveView<FSolverCollisionParticles>& MCollisionParticlesActiveView;
100 TArray<bool>& MCollided;
101 TArray<FSolverVec3>* const Contacts = nullptr;
102 TArray<FSolverVec3>* const Normals = nullptr;
103 TArray<FSolverReal>* const Phis = nullptr;
104 const TArray<uint32>& MDynamicGroupIds;
105 const TArray<uint32>& MKinematicGroupIds;
106 mutable TMap<int32, FVelocityConstraint> MVelocityConstraints;
107 const TArray<FSolverReal>& MPerGroupThickness;
108 const TArray<FSolverReal>& MPerGroupFriction;
109 FCriticalSection* const Mutex = nullptr;
110};
111
112} // End namespace Chaos::Softs
@ Normal
Definition AndroidInputInterface.h:116
#define check(expr)
Definition AssertionMacros.h:314
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
return true
Definition ExternalRpcRegistry.cpp:601
#define CHAOS_PER_PARTICLE_COLLISION_ISPC_ENABLED_DEFAULT
Definition PerParticlePBDCollisionConstraint.h:17
const bool bChaos_PerParticleCollision_ISPC_Enabled
Definition PerParticlePBDCollisionConstraint.h:26
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition PerParticlePBDCollisionConstraint.h:35
void ApplyFriction(FSolverParticles &Particles, const FSolverReal Dt, const int32 Index) const
Definition PerParticlePBDCollisionConstraint.h:70
~FPerParticlePBDCollisionConstraint()
Definition PerParticlePBDCollisionConstraint.h:63
FPerParticlePBDCollisionConstraint(const TPBDActiveView< FSolverCollisionParticles > &InParticlesActiveView, TArray< bool > &Collided, TArray< FSolverVec3 > &InContacts, TArray< FSolverVec3 > &InNormals, TArray< FSolverReal > &InPhis, TArray< uint32 > &DynamicGroupIds, TArray< uint32 > &KinematicGroupIds, const TArray< FSolverReal > &PerGroupThickness, const TArray< FSolverReal > &PerGroupFriction, bool bWriteCCDContacts)
Definition PerParticlePBDCollisionConstraint.h:50
CHAOS_API void ApplyRange(FSolverParticles &Particles, const FSolverReal Dt, const int32 Offset, const int32 Range) const
Definition PerParticlePBDCollisionConstraint.cpp:304
FPerParticlePBDCollisionConstraint(const TPBDActiveView< FSolverCollisionParticles > &InParticlesActiveView, TArray< bool > &Collided, TArray< uint32 > &DynamicGroupIds, TArray< uint32 > &KinematicGroupIds, const TArray< FSolverReal > &PerGroupThickness, const TArray< FSolverReal > &PerGroupFriction)
Definition PerParticlePBDCollisionConstraint.h:43
Definition PBDSoftsSolverParticles.h:20
const TVector< T, d > & V(const int32 Index) const
Definition DynamicParticles.h:31
Definition PBDActiveView.h:47
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
@ Velocity
Definition SimulationModuleBase.h:147
U16 Index
Definition radfft.cpp:71