UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDFlatWeightMap.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
5#include "Chaos/Vector.h"
7
8namespace Chaos::Softs
9{
14{
15public:
16
25
27
32
34 int32 Num() const { return MapValues.Num(); }
35
37 bool HasWeightMap() const { return MapValues.Num() > 0 && FMath::Abs(OffsetRange[1]) > UE_KINDA_SMALL_NUMBER; }
38
42 void SetWeightedValue(const FSolverVec2& InWeightedValue) { OffsetRange[0] = InWeightedValue[0]; OffsetRange[1] = InWeightedValue[1] - InWeightedValue[0]; }
43
47 const FSolverVec2& GetOffsetRange() const { return OffsetRange; }
48
53 FSolverReal operator[](int32 Index) const { return OffsetRange[0] + OffsetRange[1] * MapValues[Index]; }
54
56 FSolverReal GetLow() const { return OffsetRange[0]; }
57
59 FSolverReal GetHigh() const { return OffsetRange[0] + OffsetRange[1]; }
60
62 {
63 if (HasWeightMap())
64 {
65 return (*this)[Index];
66 }
67 return GetLow();
68 }
69
71 explicit operator FSolverReal() const { return GetLow(); }
72
74 {
75 if (InMapValues.Num() == NumElements)
76 {
77 MapValues = InMapValues;
78 }
79 else
80 {
81 MapValues = TConstArrayView<FSolverReal>();
82 }
83 }
84
86 TConstArrayView<FSolverReal> GetMapValues() const { return MapValues; }
87
88private:
89 int32 NumElements;
91 FSolverVec2 OffsetRange;
92};
93
98{
99public:
100
104 inline explicit FPBDFlatWeightMap(
107 int32 ParticleCount = 0, // A value of 0 also disables the map
109
110 inline FPBDFlatWeightMap(
113
117 template<int32 Valence>
118 inline explicit FPBDFlatWeightMap(
122 int32 ParticleOffset = INDEX_NONE, // Constraints have usually a particle offset added to them compared to the weight maps that always starts at index 0
123 int32 ParticleCount = 0, // A value of 0 also disables the map
124 typename TEnableIf<Valence >= 2 && Valence <= 4>::Type* = nullptr); // Prevents incorrect valence, the value is actually unused
125
127
132
134 int32 Num() const { return MapView.Num(); }
135
137 bool HasWeightMap() const { return MapView.HasWeightMap(); }
138
143
147 const FSolverVec2& GetOffsetRange() const { return MapView.GetOffsetRange(); }
148
153 FSolverReal operator[](int32 Index) const { return MapView[Index]; }
154
156 FSolverReal GetLow() const { return MapView.GetLow(); }
157
159 FSolverReal GetHigh() const { return MapView.GetHigh(); }
160
162 explicit operator FSolverReal() const { return (FSolverReal)MapView; }
163
166
167 FSolverReal GetValue(int32 Index) const { return MapView.GetValue(Index); }
168
175
176private:
177 static TArray<FSolverReal> CalculateMapValues(const TConstArrayView<FRealSingle>& Multipliers, int32 ParticleCount, const FSolverVec2& MultiplierClampRange)
178 {
179 TArray<FSolverReal> Result;
180 if (Multipliers.Num() == ParticleCount && ParticleCount > 0)
181 {
182 // Copy multipliers with clamp
183 Result.SetNumUninitialized(ParticleCount);
184 for (int32 Index = 0; Index < ParticleCount; ++Index)
185 {
187 }
188 }
189 return Result;
190 }
191
192 template<int32 Valence>
193 static TArray<FSolverReal> CalculateMapValues(
196 int32 ParticleOffset,
197 int32 ParticleCount)
198 {
200 const int32 ConstraintCount = Constraints.Num();
201 if (Multipliers.Num() == ParticleCount && ParticleCount > 0 && ConstraintCount > 0)
202 {
203 // Average vertex multipliers to constraints.
204 Result.SetNumUninitialized(ConstraintCount);
205
206 for (int32 ConstraintIndex = 0; ConstraintIndex < ConstraintCount; ++ConstraintIndex)
207 {
208 const TVector<int32, Valence>& Constraint = Constraints[ConstraintIndex];
209
210 FSolverReal Weight = 0.f;
211 for (int32 Index = 0; Index < Valence; ++Index)
212 {
213 Weight += FMath::Clamp((FSolverReal)Multipliers[Constraint[Index] - ParticleOffset], (FSolverReal)0.f, (FSolverReal)1.f);
214 }
216
217 Result[ConstraintIndex] = Weight;
218 }
219 }
220 return Result;
221 }
222
223 TArray<FSolverReal> MapValues;
224 FPBDFlatWeightMapView MapView;
225};
226
230 int32 ParticleCount,
232 : MapValues(CalculateMapValues(Multipliers, ParticleCount, MultiplierClampRange))
233 , MapView(InWeightedValue, TConstArrayView<FSolverReal>(MapValues), ParticleCount)
234{
235}
236
240 : MapValues(MoveTemp(Multipliers))
241 , MapView(InWeightedValue, MapValues, MapValues.Num())
242{}
243
244template<int32 Valence>
249 int32 ParticleOffset,
250 int32 ParticleCount,
251 typename TEnableIf<Valence >= 2 && Valence <= 4>::Type*)
252 : MapValues(CalculateMapValues(Multipliers, Constraints, ParticleOffset, ParticleCount))
254{
255}
256
279
280} // End namespace Chaos::Softs
#define check(expr)
Definition AssertionMacros.h:314
@ 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
@ Num
Definition MetalRHIPrivate.h:234
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition PBDFlatWeightMap.h:14
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDFlatWeightMap.h:42
int32 Num() const
Definition PBDFlatWeightMap.h:34
FPBDFlatWeightMapView(const FPBDFlatWeightMapView &)=default
FPBDFlatWeightMapView & operator=(const FPBDFlatWeightMapView &)=default
FPBDFlatWeightMapView(const FSolverVec2 &InWeightedValue, const TConstArrayView< FSolverReal > &Multipliers, int32 InNumElements)
Definition PBDFlatWeightMap.h:17
FPBDFlatWeightMapView & operator=(FPBDFlatWeightMapView &&)=default
const FSolverVec2 & GetOffsetRange() const
Definition PBDFlatWeightMap.h:47
FSolverReal GetHigh() const
Definition PBDFlatWeightMap.h:59
FPBDFlatWeightMapView(FPBDFlatWeightMapView &&)=default
void SetMapValues(const TConstArrayView< FSolverReal > &InMapValues)
Definition PBDFlatWeightMap.h:73
FSolverReal GetValue(int32 Index) const
Definition PBDFlatWeightMap.h:61
bool HasWeightMap() const
Definition PBDFlatWeightMap.h:37
FSolverReal GetLow() const
Definition PBDFlatWeightMap.h:56
TConstArrayView< FSolverReal > GetMapValues() const
Definition PBDFlatWeightMap.h:86
FSolverReal operator[](int32 Index) const
Definition PBDFlatWeightMap.h:53
Definition PBDFlatWeightMap.h:98
void ReorderIndices(const TArray< int32 > &OrigToReorderedIndices)
Definition PBDFlatWeightMap.h:171
void ReorderIndicesAndShrink(const TArray< int32 > &OrigToReorderedIndices, int32 NewNum)
Definition PBDFlatWeightMap.h:257
FPBDFlatWeightMap(FPBDFlatWeightMap &&)=default
TConstArrayView< FSolverReal > GetMapValues() const
Definition PBDFlatWeightMap.h:165
FSolverReal GetHigh() const
Definition PBDFlatWeightMap.h:159
FSolverReal GetLow() const
Definition PBDFlatWeightMap.h:156
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDFlatWeightMap.h:142
FSolverReal operator[](int32 Index) const
Definition PBDFlatWeightMap.h:153
bool HasWeightMap() const
Definition PBDFlatWeightMap.h:137
FPBDFlatWeightMap(const FPBDFlatWeightMap &)=default
FPBDFlatWeightMap & operator=(const FPBDFlatWeightMap &)=default
const FSolverVec2 & GetOffsetRange() const
Definition PBDFlatWeightMap.h:147
FPBDFlatWeightMap(const FSolverVec2 &InWeightedValue, const TConstArrayView< FRealSingle > &Multipliers=TConstArrayView< FRealSingle >(), int32 ParticleCount=0, const FSolverVec2 &MultiplierClampRange=FSolverVec2(0., 1.))
Definition PBDFlatWeightMap.h:227
int32 Num() const
Definition PBDFlatWeightMap.h:134
FSolverReal GetValue(int32 Index) const
Definition PBDFlatWeightMap.h:167
FPBDFlatWeightMap & operator=(FPBDFlatWeightMap &&)=default
Definition Constraints.Build.cs:6
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNumUninitialized(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2369
Definition EnableIf.h:20
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TVector< FSolverReal, 2 > FSolverVec2
Definition PBDSoftsEvolutionFwd.h:32
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
U16 Index
Definition radfft.cpp:71
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592