UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SoftsMultiResConstraints.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"
10
11namespace Chaos::Softs
12{
14{
15public:
20
21 static constexpr FSolverReal MinStiffness = (FSolverReal)0; // We're not checking against MinStiffness (except when it's constant and == 0)
22 static constexpr FSolverReal MaxStiffness = (FSolverReal)1e9;
23
30 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
32 : NumParticles(FineParticles.Size())
33 , CoarseSoftBodyId(InCoarseSoftBodyId)
34 , CoarseMesh(InCoarseMesh)
35 , CoarseToFinePositionBaryCoordsAndDist(MoveTemp(InCoarseToFinePositionBaryCoordsAndDist))
36 , CoarseToFineSourceMeshVertIndices(MoveTemp(InCoarseToFineSourceMeshVertIndices))
38 , Stiffness(
41 NumParticles,
42 FPBDStiffness::DefaultTableSize,
43 FPBDStiffness::DefaultParameterFitBase,
44 bUseXPBD ? MaxStiffness : (FSolverReal)1.f)
45 , VelocityTargetStiffness(
48 NumParticles,
49 FPBDStiffness::DefaultTableSize,
50 FPBDStiffness::DefaultParameterFitBase,
51 bUseXPBD ? MaxStiffness : (FSolverReal)1.f)
55 {
56 check(NumParticles == CoarseToFinePositionBaryCoordsAndDist.Num());
57 check(NumParticles == CoarseToFineSourceMeshVertIndices.Num());
58 }
59
61
62 void Init() const
63 {
64 if (bUseXPBD)
65 {
66 Lambdas.Reset();
67 Lambdas.SetNumZeroed(NumParticles);
68 }
69 }
70
71 void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
72 {
73 if (bUseXPBD)
74 {
76 VelocityTargetStiffness.ApplyXPBDValues(MaxStiffness);
77 }
78 else
79 {
80 Stiffness.ApplyPBDValues(Dt, NumIterations);
81 VelocityTargetStiffness.ApplyPBDValues(Dt, NumIterations);
82 }
83 }
84
86
87 // Update stiffness values
89 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps);
90
92
93 const TArray<FSolverVec3>& GetFineTargetPositions() const { return FineTargetPositions; }
94 int32 GetCoarseSoftBodyId() const { return CoarseSoftBodyId; }
95 const FTriangleMesh& GetCoarseMesh() const { return CoarseMesh; }
96 bool IsConstraintActive(const int32 ParticleIndex) const
97 {
98 const FSolverReal StiffnessValue = Stiffness.HasWeightMap() ? Stiffness[ParticleIndex] : (FSolverReal)Stiffness;
99 const FSolverReal VelocityStiffnessValue = VelocityTargetStiffness.HasWeightMap() ? VelocityTargetStiffness[ParticleIndex] : (FSolverReal)VelocityTargetStiffness;
100 return StiffnessValue > 0.f || VelocityStiffnessValue > 0.f;
101 }
102
103private:
104 void ApplyHelper(FSolverParticlesRange& Particles, const FSolverReal Dt, const int32 ConstraintIndex, const FSolverReal ExpStiffnessValue, const FSolverReal ExpVelocityTargetStiffnessValue) const;
105
106 const int32 NumParticles;
107 const int32 CoarseSoftBodyId;
108 const FTriangleMesh& CoarseMesh;
109 const TArray<TVec4<FSolverReal>> CoarseToFinePositionBaryCoordsAndDist;
110 const TArray<TVec3<int32>> CoarseToFineSourceMeshVertIndices;
111
112 bool bUseXPBD;
113 FPBDStiffness Stiffness;
114 FPBDStiffness VelocityTargetStiffness;
115
116 mutable TArray<FSolverReal> Lambdas;
117 TArray<FSolverVec3> FineTargetPositions;
118 TArray<FSolverVec3> FineTargetVelocities;
119 TArray<FSolverReal> CoarseBarycentricMass;
120
121 int32 NonZeroStiffnessMin = INDEX_NONE;
122 int32 NonZeroStiffnessMax = INDEX_NONE;
123 bool bStiffnessEntriesInitialized = false;
124
128};
129
130} // End namespace Chaos::Softs
131
132#if !defined(CHAOS_MULTIRES_ISPC_ENABLED_DEFAULT)
133#define CHAOS_MULTIRES_ISPC_ENABLED_DEFAULT 1
134#endif
135
136// Support ISPC enable/disable in non-shipping builds
137#if !INTEL_ISPC || UE_BUILD_SHIPPING
138static constexpr bool bChaos_MultiRes_ISPC_Enabled = INTEL_ISPC && CHAOS_MULTIRES_ISPC_ENABLED_DEFAULT;
139#else
140extern CHAOS_API bool bChaos_MultiRes_ISPC_Enabled;
141#endif
#define check(expr)
Definition AssertionMacros.h:314
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
#define CHAOS_MULTIRES_ISPC_ENABLED_DEFAULT
Definition SoftsMultiResConstraints.h:133
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition TriangleMesh.h:24
Definition CollectionPropertyFacade.h:49
Definition SoftsMultiResConstraints.h:14
static constexpr FSolverReal MinStiffness
Definition SoftsMultiResConstraints.h:21
FMultiResConstraints(const FSolverParticlesRange &FineParticles, const int32 InCoarseSoftBodyId, const FTriangleMesh &InCoarseMesh, TArray< TVec4< FSolverReal > > &&InCoarseToFinePositionBaryCoordsAndDist, TArray< TVec3< int32 > > &&InCoarseToFineSourceMeshVertIndices, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection)
Definition SoftsMultiResConstraints.h:24
void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
Definition SoftsMultiResConstraints.h:71
bool IsConstraintActive(const int32 ParticleIndex) const
Definition SoftsMultiResConstraints.h:96
void Init() const
Definition SoftsMultiResConstraints.h:62
~FMultiResConstraints()
Definition SoftsMultiResConstraints.h:60
CHAOS_API void Apply(FSolverParticlesRange &FineParticles, const FSolverReal Dt) const
Definition SoftsMultiResConstraints.cpp:134
const FTriangleMesh & GetCoarseMesh() const
Definition SoftsMultiResConstraints.h:95
const TArray< FSolverVec3 > & GetFineTargetPositions() const
Definition SoftsMultiResConstraints.h:93
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition SoftsMultiResConstraints.cpp:33
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition SoftsMultiResConstraints.h:16
CHAOS_API void UpdateFineTargets(const FSolverParticlesRange &CoarseParticles)
Definition SoftsMultiResConstraints.cpp:253
static constexpr FSolverReal MaxStiffness
Definition SoftsMultiResConstraints.h:22
int32 GetCoarseSoftBodyId() const
Definition SoftsMultiResConstraints.h:94
Definition PBDStiffness.h:21
void ApplyPBDValues(const FSolverReal Dt, const int32 NumIterations)
Definition PBDStiffness.h:124
void ApplyXPBDValues(const FSolverReal MaxStiffnesss)
Definition PBDStiffness.h:164
bool HasWeightMap() const
Definition PBDWeightMap.h:55
Definition SoftsSolverParticlesRange.h:12
Definition Vector.h:1000
Definition Vector.h:41
Definition Array.h:670
void SetNumZeroed(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2340
void Reset(SizeType NewSize=0)
Definition Array.h:2246
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
@ false
Definition radaudio_common.h:23