UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
XPBDBendingConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
6#include "ChaosStats.h"
8
9namespace Chaos::Softs
10{
11
13{
15
16public:
17 // Stiffness is in kg cm^2 / rad^2 s^2
18 static constexpr FSolverReal MinStiffness = (FSolverReal)0; // We're not checking against MinStiffness (except when it's constant and == 0)
19 static constexpr FSolverReal MaxStiffness = (FSolverReal)1e7;
20 static constexpr FSolverReal MinDamping = (FSolverReal)0.;
21 static constexpr FSolverReal MaxDamping = (FSolverReal)1000.;
22
27
30 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
32 : Base(
35 TConstArrayView<FRealSingle>(), // We don't use base stiffness weight maps
37 TConstArrayView<FRealSingle>(), // We don't use base stiffness weight maps
38 GetRestAngleMapFromCollection(WeightMaps, PropertyCollection),
42 GetRestAngleValueFromCollection(PropertyCollection),
44 true /*bTrimKinematicConstraints*/,
46 , XPBDStiffness(
50 ParticleOffset,
51 ParticleCount)
52 , XPBDBucklingStiffness(
56 ParticleOffset,
57 ParticleCount)
58 , DampingRatio(
62 ParticleOffset,
63 ParticleCount)
71 {
72 Lambdas.Init((FSolverReal)0., Constraints.Num());
73 LambdasDamping.Init((FSolverReal)0., Constraints.Num());
74 InitColor(InParticles);
75 }
76
77 UE_DEPRECATED(5.4, "XPBD Constraints must always trim kinematic constraints")
85
90 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
92 : Base(
97 TConstArrayView<FRealSingle>(), // We don't use base stiffness weight maps
99 TConstArrayView<FRealSingle>(), // We don't use base stiffness weight maps
100 GetRestAngleMapFromCollection(WeightMaps, PropertyCollection),
104 GetRestAngleValueFromCollection(PropertyCollection),
106 true /*bTrimKinematicConstraints*/,
108 , XPBDStiffness(
112 ParticleOffset,
113 ParticleCount)
114 , XPBDBucklingStiffness(
118 ParticleOffset,
119 ParticleCount)
120 , DampingRatio(
124 ParticleOffset,
125 ParticleCount)
133 {
134 Lambdas.Init((FSolverReal)0., Constraints.Num());
135 LambdasDamping.Init((FSolverReal)0., Constraints.Num());
136 InitColor(InParticles);
137 }
138
139 UE_DEPRECATED(5.4, "XPBD Constraints must always trim kinematic constraints")
149
151 int32 ParticleOffset,
152 int32 ParticleCount,
165 : Base(
167 ParticleOffset,
168 ParticleCount,
170 TConstArrayView<FRealSingle>(), // We don't use base stiffness weight maps
172 TConstArrayView<FRealSingle>(), // We don't use base stiffness weight maps
179 true /*bTrimKinematicConstraints*/,
181 , XPBDStiffness(
182 InStiffness.ClampAxes(0, MaxStiffness),
185 ParticleOffset,
186 ParticleCount)
187 , XPBDBucklingStiffness(
188 InBucklingStiffness.ClampAxes(0, MaxStiffness),
191 ParticleOffset,
192 ParticleCount)
193 , DampingRatio(
194 InDampingRatio.ClampAxes((FSolverReal)0., (FSolverReal)1.),
197 ParticleOffset,
198 ParticleCount)
206 {
207 Lambdas.Init((FSolverReal)0., Constraints.Num());
208 LambdasDamping.Init((FSolverReal)0., Constraints.Num());
209 InitColor(InParticles);
210 }
211
212
213 UE_DEPRECATED(5.5, "Use constructor with BucklingRatioMultipliers")
242
243 UE_DEPRECATED(5.4, "XPBD Constraints must always trim kinematic constraints")
273
274 virtual ~FXPBDBendingConstraints() override {}
275
276 template<typename SolverParticlesOrRange>
278
281 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps);
282
290
291 UE_DEPRECATED(5.5, "Use SetProperties with Weighted Buckling Ratio")
296
297 void ApplyProperties(const FSolverReal /*Dt*/, const int32 /*NumIterations*/)
298 {
300 }
301
302 template<typename SolverParticlesOrRange>
303 CHAOS_API void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt) const;
304
305 const TArray<int32>& GetConstraintsPerColorStartIndex() const { return ConstraintsPerColorStartIndex; }
306
308
310 {
313 for (int32 i = 0; i < Constraints.Num(); i++)
314 {
315 ConstraintsArray[i].SetNum(4);
316 for (int32 j = 0; j < 4; j++)
317 {
318 ConstraintsArray[i][j] = Constraints[i][j];
319 }
320 }
321 return ConstraintsArray;
322 }
323
325
327
330 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps)
331 {
332 CalculateRestAngles(Positions, ParticleOffset, ParticleCount,
333 GetRestAngleMapFromCollection(WeightMaps, PropertyCollection),
334 GetRestAngleValueFromCollection(PropertyCollection),
336 }
337private:
338 template<typename SolverParticlesOrRange>
339 CHAOS_API void InitColor(const SolverParticlesOrRange& InParticles);
340 template<bool bDampingOnly, bool bElasticOnly, typename SolverParticlesOrRange>
341 void ApplyHelper(SolverParticlesOrRange& Particles, const FSolverReal Dt, const int32 ConstraintIndex, const FSolverReal ExpStiffnessValue, const FSolverReal ExpBucklingValue, const FSolverReal DampingRatioValue) const;
342
343 TConstArrayView<FRealSingle> GetRestAngleMapFromCollection(
344 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
346 {
348
349 switch (ConstructionType)
350 {
351 default:
353 return TConstArrayView<FRealSingle>(); // Unused
355 return WeightMaps.FindRef(GetXPBDFlatnessRatioString(PropertyCollection, XPBDFlatnessRatioName.ToString()));
357 return WeightMaps.FindRef(GetXPBDRestAngleString(PropertyCollection, XPBDRestAngleName.ToString()));
358 }
359 }
360
361 FSolverVec2 GetRestAngleValueFromCollection(const FCollectionPropertyConstFacade& PropertyCollection)
362 {
364
365 switch (ConstructionType)
366 {
367 default:
369 return FSolverVec2(0.f); // Unused
374 }
375 }
376
377 using Base::Constraints;
380 using Base::RestAngles;
381
382 FPBDFlatWeightMap XPBDStiffness;
383 FPBDFlatWeightMap XPBDBucklingStiffness;
384 FPBDFlatWeightMap DampingRatio;
385 mutable TArray<FSolverReal> Lambdas;
386 mutable TArray<FSolverReal> LambdasDamping;
387 TArray<int32> ConstraintsPerColorStartIndex; // Constraints are ordered so each batch is contiguous. This is ColorNum + 1 length so it can be used as start and end.
388
389#if INTEL_ISPC
390 // Constraint SOA. InitColor will initialize these. Only used by ISPC
395
396 // Particles.X but stored per constraint.
397 // These are only copied over if using ISPC.
402#endif
403
407 UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(XPBDBucklingStiffness, float);
411};
412
413// Support split vs shared damping models in non-shipping builds
414#if UE_BUILD_SHIPPING
416#else
418#endif
419
420} // End namespace Chaos::Softs
421
422#if !defined(CHAOS_XPBD_BENDING_ISPC_ENABLED)
423#define CHAOS_XPBD_BENDING_ISPC_ENABLED 1
424#endif
425
426// Support ISPC enable/disable in non-shipping builds
427#if !INTEL_ISPC || UE_BUILD_SHIPPING
428static constexpr bool bChaos_XPBDBending_ISPC_Enabled = INTEL_ISPC && CHAOS_XPBD_BENDING_ISPC_ENABLED;
429#else
430extern CHAOS_API bool bChaos_XPBDBending_ISPC_Enabled;
431#endif
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
@ ForceInit
Definition CoreMiscDefines.h:155
#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
return true
Definition ExternalRpcRegistry.cpp:601
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
#define CHAOS_XPBD_BENDING_ISPC_ENABLED
Definition XPBDBendingConstraints.h:423
Definition Matrix.h:21
Definition CollectionPropertyFacade.h:49
Definition PBDBendingConstraintsBase.h:15
const int32 ParticleOffset
Definition PBDBendingConstraintsBase.h:386
ERestAngleConstructionType
Definition PBDBendingConstraintsBase.h:18
CHAOS_API void CalculateRestAngles(const TConstArrayView< FSolverVec3 > &InPositions, int32 InParticleOffset, int32 InParticleCount, const TConstArrayView< FRealSingle > &RestAngleMap, const FSolverVec2 &RestAngleValue, ERestAngleConstructionType RestAngleConstructionType)
Definition PBDBendingConstraintsBase.cpp:112
TArray< FSolverReal > RestAngles
Definition PBDBendingConstraintsBase.h:393
FPBDWeightMap BucklingRatioWeighted
Definition PBDBendingConstraintsBase.h:390
const int32 ParticleCount
Definition PBDBendingConstraintsBase.h:387
TArray< TVec4< int32 > > Constraints
Definition PBDBendingConstraintsBase.h:383
TArray< TVec2< int32 > > ConstraintSharedEdges
Definition PBDBendingConstraintsBase.h:384
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDFlatWeightMap.h:142
void ApplyValues(bool *bOutUpdated=nullptr)
Definition PBDWeightMap.h:71
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDWeightMap.h:62
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
Definition XPBDBendingConstraints.h:13
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition XPBDBendingConstraints.cpp:158
CHAOS_API FSolverReal ComputeTotalEnergy(const FSolverParticles &InParticles, const FSolverReal ExplicitStiffness=-1.f)
Definition XPBDBendingConstraints.cpp:588
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDBendingConstraints.h:23
static constexpr FSolverReal MinDamping
Definition XPBDBendingConstraints.h:20
const TArray< int32 > & GetConstraintsPerColorStartIndex() const
Definition XPBDBendingConstraints.h:305
static constexpr FSolverReal MaxDamping
Definition XPBDBendingConstraints.h:21
TArray< TArray< int32 > > GetConstraintsArray() const
Definition XPBDBendingConstraints.h:309
FXPBDBendingConstraints(const FSolverParticles &InParticles, int32 ParticleOffset, int32 ParticleCount, TArray< TVec4< int32 > > &&InConstraints, const TConstArrayView< FRealSingle > &StiffnessMultipliers, const TConstArrayView< FRealSingle > &BucklingRatioMultipliers, const TConstArrayView< FRealSingle > &BucklingStiffnessMultipliers, const TConstArrayView< FRealSingle > &InDampingMultipliers, const TConstArrayView< FRealSingle > &RestAngleMap, const FSolverVec2 &InStiffness, const FSolverVec2 &InBucklingRatio, const FSolverVec2 &InBucklingStiffness, const FSolverVec2 &InDampingRatio, const FSolverVec2 &RestAngleValue, ERestAngleConstructionType RestAngleConstructionType)
Definition XPBDBendingConstraints.h:150
void ResetRestLengths(const TConstArrayView< FSolverVec3 > &Positions, const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition XPBDBendingConstraints.h:328
static constexpr FSolverReal MaxStiffness
Definition XPBDBendingConstraints.h:19
CHAOS_API void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt) const
void ApplyProperties(const FSolverReal, const int32)
Definition XPBDBendingConstraints.h:297
void CHAOS_API Init(const SolverParticlesOrRange &InParticles)
FXPBDBendingConstraints(const FSolverParticles &InParticles, int32 InParticleOffset, int32 InParticleCount, TArray< TVec4< int32 > > &&InConstraints, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDBendingConstraints.h:86
CHAOS_API void AddBendingResidualAndHessian(const FSolverParticles &Particles, const int32 ConstraintIndex, const int32 ConstraintIndexLocal, const FSolverReal Dt, TVec3< FSolverReal > &ParticleResidual, Chaos::PMatrix< FSolverReal, 3, 3 > &ParticleHessian)
Definition XPBDBendingConstraints.cpp:693
virtual ~FXPBDBendingConstraints() override
Definition XPBDBendingConstraints.h:274
void SetProperties(const FSolverVec2 &InStiffness, const FSolverVec2 &InBucklingRatio, const FSolverVec2 &InBucklingStiffness, const FSolverVec2 &InDampingRatio)
Definition XPBDBendingConstraints.h:283
CHAOS_API void AddInternalForceDifferential(const FSolverParticles &InParticles, const TArray< TVector< FSolverReal, 3 > > &DeltaParticles, TArray< TVector< FSolverReal, 3 > > &ndf)
Definition XPBDBendingConstraints.cpp:730
static constexpr FSolverReal MinStiffness
Definition XPBDBendingConstraints.h:18
FXPBDBendingConstraints(const FSolverParticlesRange &InParticles, TArray< TVec4< int32 > > &&InConstraints, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDBendingConstraints.h:28
Definition Vector.h:1000
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TVector< FSolverReal, 2 > FSolverVec2
Definition PBDSoftsEvolutionFwd.h:32
bool bChaos_XPBDBending_SplitLambdaDamping
Definition XPBDBendingConstraints.cpp:28
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
float FRealSingle
Definition Real.h:14