UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDExtremeDeformationConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
7#include "Chaos/Utilities.h"
8#include "Containers/Array.h"
9
10namespace Chaos::Softs
11{
12
14{
15public:
16
22
23 template<int32 Valence UE_REQUIRES(Valence >= 2 && Valence <= 4)>
25 const FSolverParticlesRange& Particles,
27 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
28 const TMap<FString, const TSet<int32>*>& VertexSets,
30 bool bTrimKinematicConstraints = false)
32 , Constraints(TrimConstraints(InConstraints,
33 [&Particles, bTrimKinematicConstraints, this](int32 Index0, int32 Index1)
34 {
35 return (bTrimKinematicConstraints && Particles.InvM(Index0) == (FSolverReal)0. && Particles.InvM(Index1) == (FSolverReal)0.)
36 || (VertexSet && (!VertexSet->Contains(Index0) || !VertexSet->Contains(Index1)));
37 }))
38 , ParticleOffset(0)
39 , ParticleCount(Particles.GetRangeSize())
42 {
43 // Update distances
44 Dists.Reset(Constraints.Num());
45 for (const TVec2<int32>& Constraint : Constraints)
46 {
47 const FSolverVec3& P0 = Particles.X(Constraint[0]);
48 const FSolverVec3& P1 = Particles.X(Constraint[1]);
49 Dists.Add((P1 - P0).Size());
50 }
51 }
52
53 template<int32 Valence UE_REQUIRES(Valence >= 2 && Valence <= 4)>
55 const FSolverParticles& Particles,
59 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
60 const TMap<FString, const TSet<int32>*>& VertexSets,
62 bool bTrimKinematicConstraints = false)
64 , Constraints(TrimConstraints(InConstraints,
65 [&Particles, bTrimKinematicConstraints, this](int32 Index0, int32 Index1)
66 {
67 return (bTrimKinematicConstraints && Particles.InvM(Index0) == (FSolverReal)0. && Particles.InvM(Index1) == (FSolverReal)0.)
68 || (VertexSet && (!VertexSet->Contains(Index0) || !VertexSet->Contains(Index1)));
69 }))
70 , ParticleOffset(InParticleOffset)
71 , ParticleCount(InParticleCount)
74 {
75 // Update distances
76 Dists.Reset(Constraints.Num());
77 for (const TVec2<int32>& Constraint : Constraints)
78 {
79 const FSolverVec3& P0 = Particles.GetX(Constraint[0]);
80 const FSolverVec3& P1 = Particles.GetX(Constraint[1]);
81 Dists.Add((P1 - P0).Size());
82 }
83 }
84
87
96
98
100
107
115
122
130
131private:
132 template<int32 Valence, typename Predicate UE_REQUIRES(Valence >= 2 && Valence <= 4)>
133 static TArray<TVector<int32, 2>> TrimConstraints(const TArray<TVector<int32, Valence>>& InConstraints, Predicate TrimPredicate)
134 {
136 TrimmedConstraints.Reserve(Valence == 2 ? InConstraints.Num() : InConstraints.Num() * Chaos::Utilities::NChooseR(Valence, 2));
137
139 {
140 for (int32 i = 0; i < Valence - 1; ++i)
141 {
142 for (int32 j = i + 1; j < Valence; ++j)
143 {
144 const int32 IndexI = ConstraintV[i];
145 const int32 IndexJ = ConstraintV[j];
146
148 {
150 }
151 }
152 }
153 }
154 return TrimmedConstraints.Array();
155 }
156
157 const TSet<int32>* VertexSet;
159 const int32 ParticleOffset;
160 const int32 ParticleCount;
161 FSolverReal ExtremeDeformationThreshold;
163
164 UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(ExtremeDeformationVertexSelection, bool); // Selection set name string property, the bool value is not actually used
166};
167
168} // End namespace Chaos::Softs
#define UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:853
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
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
uint32 Size
Definition VulkanMemory.cpp:4034
Definition CollectionPropertyFacade.h:49
Definition PBDExtremeDeformationConstraints.h:14
FPBDExtremeDeformationConstraints(const FSolverParticles &Particles, int32 InParticleOffset, int32 InParticleCount, const TArray< TVector< int32, Valence > > &InConstraints, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const TMap< FString, const TSet< int32 > * > &VertexSets, const FCollectionPropertyConstFacade &PropertyCollection, bool bTrimKinematicConstraints=false)
Definition PBDExtremeDeformationConstraints.h:54
FPBDExtremeDeformationConstraints(const FSolverParticlesRange &Particles, const TArray< TVector< int32, Valence > > &InConstraints, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const TMap< FString, const TSet< int32 > * > &VertexSets, const FCollectionPropertyConstFacade &PropertyCollection, bool bTrimKinematicConstraints=false)
Definition PBDExtremeDeformationConstraints.h:24
CHAOS_API FSolverReal GetThreshold() const
Definition PBDExtremeDeformationConstraints.cpp:17
virtual ~FPBDExtremeDeformationConstraints()
Definition PBDExtremeDeformationConstraints.h:85
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDExtremeDeformationConstraints.h:17
const TArray< TVec2< int32 > > & GetConstraints() const
Definition PBDExtremeDeformationConstraints.h:97
CHAOS_API bool IsExtremelyDeformed(TConstArrayView< Softs::FSolverVec3 > Positions) const
Definition PBDExtremeDeformationConstraints.cpp:26
CHAOS_API TArray< TVec2< int32 > > GetExtremelyDeformedEdges(TConstArrayView< Softs::FSolverVec3 > Positions) const
Definition PBDExtremeDeformationConstraints.cpp:66
void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition PBDExtremeDeformationConstraints.h:88
Definition SoftsSolverParticlesRange.h:12
FSolverReal InvM(const int32 Index) const
Definition SoftsSolverParticlesRange.h:56
Definition PBDSoftsSolverParticles.h:20
const T InvM(const int32 Index) const
Definition DynamicParticles.h:48
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
void Reset(SizeType NewSize=0)
Definition Array.h:2246
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 CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
Definition SkeletalMeshComponent.h:307