UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDSphericalConstraint.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
8#include "ChaosStats.h"
12
13DECLARE_CYCLE_STAT(TEXT("Chaos PBD Spherical Constraints"), STAT_PBD_Spherical, STATGROUP_Chaos);
14DECLARE_CYCLE_STAT(TEXT("Chaos PBD Spherical Backstop Constraints"), STAT_PBD_SphericalBackstop, STATGROUP_Chaos);
15
16#if !defined(CHAOS_SPHERICAL_ISPC_ENABLED_DEFAULT)
17#define CHAOS_SPHERICAL_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)
26static constexpr bool bChaos_Spherical_ISPC_Enabled = INTEL_ISPC && CHAOS_SPHERICAL_ISPC_ENABLED_DEFAULT;
27#else
28extern CHAOS_API bool bChaos_Spherical_ISPC_Enabled;
29#endif
30
31namespace Chaos::Softs
32{
33
35{
36public:
41
45 const TArray<FSolverVec3>& InAnimationPositions, // Use global indexation (will need adding ParticleOffset)
46 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps, // Use local indexation
48 FSolverReal MeshScale
49 )
51 , SphereRadii(WeightMaps.FindRef(GetMaxDistanceString(PropertyCollection, MaxDistanceName.ToString())))
54 , Scale(MeshScale)
55 , MaxDistanceBase((FSolverReal)GetLowMaxDistance(PropertyCollection, 0.f))
56 , MaxDistanceRange((FSolverReal)GetHighMaxDistance(PropertyCollection, 1.f) - MaxDistanceBase)
58 {
59 }
60
64 const TArray<FSolverVec3>& InAnimationPositions, // Use global indexation (will need adding ParticleOffset)
65 const TConstArrayView<FRealSingle>& InSphereRadii // Use local indexation
66 )
71 , Scale((FSolverReal)1.)
73 {
74 }
75
77
80 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
81 FSolverReal MeshScale);
82
83 template<typename SolverParticlesOrRange>
84 void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt) const
85 {
87
88 if (bRealTypeCompatibleWithISPC && bChaos_Spherical_ISPC_Enabled)
89 {
90 ApplyHelperISPC(Particles, Dt);
91 }
92 else
93 {
94 if (SphereRadii.Num() == ParticleCount)
95 {
96 constexpr bool bHasMaxDistance = true;
97 ApplyHelper<bHasMaxDistance>(Particles, Dt);
98 }
99 else
100 {
101 constexpr bool bHasMaxDistance = false;
102 ApplyHelper<bHasMaxDistance>(Particles, Dt);
103 }
104 }
105 }
106
107 // Set a new mesh scale
109 FSolverReal GetScale() const { return Scale; }
110
112
113private:
114
115 template<bool bHasMaxDistance, typename SolverParticlesOrRange>
116 void ApplyHelper(SolverParticlesOrRange& Particles, const FSolverReal Dt) const
117 {
119 PhysicsParallelFor(ParticleCount, [this, &Particles, Dt, &AnimationPositionsView](int32 Index) // TODO: profile need for parallel loop based on particle count
120 {
121 const int32 ParticleIndex = ParticleOffset + Index;
122
123 if (Particles.InvM(ParticleIndex) == 0)
124 {
125 return;
126 }
127
128 const FSolverReal Radius = (bHasMaxDistance ? MaxDistanceBase + MaxDistanceRange * SphereRadii[Index] : MaxDistanceBase) * Scale;
129 const FSolverVec3& Center = AnimationPositionsView[ParticleIndex];
130
131 const FSolverVec3 CenterToParticle = Particles.P(ParticleIndex) - Center;
132 const FSolverReal DistanceSquared = CenterToParticle.SizeSquared();
133
134 static const FSolverReal DeadZoneSquareRadius = UE_SMALL_NUMBER; // We will not push the particle away in the dead zone
135 if (DistanceSquared > FMath::Square(Radius) + DeadZoneSquareRadius)
136 {
137 const FSolverReal Distance = FMath::Sqrt(DistanceSquared);
139 Particles.P(ParticleIndex) = Center + PositionOnSphere;
140 }
141 });
142 }
143
144 template<typename SolverParticlesOrRange>
145 CHAOS_API void ApplyHelperISPC(SolverParticlesOrRange& Particles, const FSolverReal Dt) const;
146
147protected:
148 const TArray<FSolverVec3>& AnimationPositions; // Use global indexation (will need adding ParticleOffset)
152
153private:
154 FSolverReal Scale = (FSolverReal)1.;
155 FSolverReal MaxDistanceBase = (FSolverReal)0.;
156 FSolverReal MaxDistanceRange = (FSolverReal)1.;
157
159};
160
162{
163public:
165 {
166 return IsBackstopRadiusEnabled(PropertyCollection, false) || // Radius makes more sense than distance to enable the constraint here, since without any radius there isn't a backstop
167 IsBackstopRadiusAnimatable(PropertyCollection, false); // Backstop can be re-enabled if animated
168 }
169
175 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps, // Use local indexation
177 FSolverReal MeshScale,
178 bool bInUseGlobalIndexation = true // Use global indexation (will need adding ParticleOffset)
179 )
180 : AnimationPositions(InAnimationPositions)
181 , AnimationNormals(InAnimationNormals)
182 , SphereRadii(WeightMaps.FindRef(GetBackstopRadiusString(PropertyCollection, BackstopRadiusName.ToString())))
183 , SphereOffsetDistances(WeightMaps.FindRef(GetBackstopDistanceString(PropertyCollection, BackstopDistanceName.ToString())))
184 , ParticleOffset(InParticleOffset)
185 , ParticleCount(InParticleCount)
186 , Scale(MeshScale)
187 , BackstopRadiusBase((FSolverReal)FMath::Max(GetLowBackstopRadius(PropertyCollection, 0.f), 0.f))
188 , BackstopRadiusRange((FSolverReal)FMath::Max(GetHighBackstopRadius(PropertyCollection, 1.f), 0.f) - BackstopRadiusBase)
189 , BackstopDistanceBase((FSolverReal)GetLowBackstopDistance(PropertyCollection, 0.f))
190 , BackstopDistanceRange((FSolverReal)GetHighBackstopDistance(PropertyCollection, 1.f) - BackstopDistanceBase)
191 , bUseLegacyBackstop(GetUseLegacyBackstop(PropertyCollection, false)) // Only set the legacy backstop in constructor
192 , bMeshUseGlobalIndexation(bInUseGlobalIndexation)
196 {
197 }
198
204 const TConstArrayView<FRealSingle>& InSphereRadii, // Use local indexation
205 const TConstArrayView<FRealSingle>& InSphereOffsetDistances, // Use local indexation
206 const bool bInUseLegacyBackstop, // Do not include the sphere radius in the distance calculations when this is true,
207 bool bInUseGlobalIndexation = true // Use global indexation (will need adding ParticleOffset)
208 )
209 : AnimationPositions(InAnimationPositions)
210 , AnimationNormals(InAnimationNormals)
211 , SphereRadii(InSphereRadii)
212 , SphereOffsetDistances(InSphereOffsetDistances)
213 , ParticleOffset(InParticleOffset)
214 , ParticleCount(InParticleCount)
215 , Scale((FSolverReal)1.)
216 , bEnabled(true)
217 , bUseLegacyBackstop(bInUseLegacyBackstop)
218 , bMeshUseGlobalIndexation(bInUseGlobalIndexation)
222 {
223 }
225
228 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
229 FSolverReal MeshScale);
230
231 void SetEnabled(bool bInEnabled) { bEnabled = bInEnabled; }
232 bool IsEnabled() const { return bEnabled; }
233
234 void Apply(FSolverParticles& Particles, const FSolverReal Dt) const
235 {
236 FSolverParticlesRange ParticlesAsRange(&Particles, ParticleOffset, ParticleCount);
237 return Apply(ParticlesAsRange, Dt);
238 }
239
240 void Apply(FSolverParticlesRange& Particles, const FSolverReal Dt) const
241 {
243
244 if (bEnabled)
245 {
246 if (bUseLegacyBackstop)
247 {
248 // SphereOffsetDistances includes the sphere radius
249 // This is harder to author, and does not follow the NvCloth specs.
250 // However, this is how it's been done in the Unreal Engine PhysX cloth implementation.
251 if (bRealTypeCompatibleWithISPC && bChaos_Spherical_ISPC_Enabled)
252 {
253 ApplyLegacyHelperISPC(Particles, Dt);
254 }
255 else if (SphereRadii.Num() == ParticleCount)
256 {
257 if (SphereOffsetDistances.Num() == ParticleCount)
258 {
259 constexpr bool bHasBackstopDistance = true;
260 constexpr bool bHasBackstopRadius = true;
262 }
263 else
264 {
265 constexpr bool bHasBackstopDistance = false;
266 constexpr bool bHasBackstopRadius = true;
268 }
269 }
270 else if (SphereOffsetDistances.Num() == ParticleCount)
271 {
272 constexpr bool bHasBackstopDistance = true;
273 constexpr bool bHasBackstopRadius = false;
275 }
276 else
277 {
278 constexpr bool bHasBackstopDistance = false;
279 constexpr bool bHasBackstopRadius = false;
281 }
282 }
283 else
284 {
285 // SphereOffsetDistances doesn't include the sphere radius
286 if (bRealTypeCompatibleWithISPC && bChaos_Spherical_ISPC_Enabled)
287 {
288 ApplyHelperISPC(Particles, Dt);
289 }
290 else if (SphereRadii.Num() == ParticleCount)
291 {
292 if (SphereOffsetDistances.Num() == ParticleCount)
293 {
294 constexpr bool bHasBackstopDistance = true;
295 constexpr bool bHasBackstopRadius = true;
297 }
298 else
299 {
300 constexpr bool bHasBackstopDistance = false;
301 constexpr bool bHasBackstopRadius = true;
303 }
304 }
305 else if (SphereOffsetDistances.Num() == ParticleCount)
306 {
307 constexpr bool bHasBackstopDistance = true;
308 constexpr bool bHasBackstopRadius = false;
310 }
311 else
312 {
313 constexpr bool bHasBackstopDistance = false;
314 constexpr bool bHasBackstopRadius = false;
316 }
317 }
318 }
319 }
320
321 // Set a new mesh scale
323 FSolverReal GetScale() const { return Scale; }
324
325 bool UseLegacyBackstop() const
326 {
327 return bUseLegacyBackstop;
328 }
329
330 FSolverReal GetBackstopRadius(int32 ConstraintIndex) const
331 {
332 return SphereRadii.Num() == ParticleCount ? BackstopRadiusBase + BackstopRadiusRange * SphereRadii[ConstraintIndex] : BackstopRadiusBase;
333 }
334
335 FSolverReal GetBackstopDistance(int32 ConstraintIndex) const
336 {
337 return SphereOffsetDistances.Num() == ParticleCount ? BackstopDistanceBase + BackstopDistanceRange * SphereOffsetDistances[ConstraintIndex] : BackstopDistanceBase;
338 }
339
343 UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(BackstopMeshName, bool); // Actually just using for string name
344
345private:
346
347 template<bool bHasBackstopDistance, bool bHasBackstopRadius>
348 void ApplyHelper(FSolverParticlesRange& Particles, const FSolverReal Dt) const
349 {
350 const TConstArrayView<FSolverVec3> AnimationPositionsView = bMeshUseGlobalIndexation ? Particles.GetConstArrayView(AnimationPositions) : TConstArrayView<FSolverVec3>(AnimationPositions);
351 const TConstArrayView<FSolverVec3> AnimationNormalsView = bMeshUseGlobalIndexation ? Particles.GetConstArrayView(AnimationNormals) : TConstArrayView<FSolverVec3>(AnimationNormals);
352 PhysicsParallelFor(ParticleCount, [this, &Particles, Dt, &AnimationPositionsView, &AnimationNormalsView](int32 ParticleIndex) // TODO: profile need for parallel loop based on particle count
353 {
354 if (Particles.InvM(ParticleIndex) == 0)
355 {
356 return;
357 }
358
360 const FSolverVec3& AnimationNormal = AnimationNormalsView[ParticleIndex];
361
362 const FSolverReal SphereOffsetDistance = (bHasBackstopDistance ? BackstopDistanceBase + BackstopDistanceRange * SphereOffsetDistances[ParticleIndex] : BackstopDistanceBase) * Scale;
363 const FSolverReal Radius = (bHasBackstopRadius ? BackstopRadiusBase + BackstopRadiusRange * SphereRadii[ParticleIndex] : BackstopRadiusBase) * Scale;
364
365 const FSolverVec3 Center = AnimationPosition - (Radius + SphereOffsetDistance) * AnimationNormal; // Non legacy version adds radius to the distance
366 const FSolverVec3 CenterToParticle = Particles.P(ParticleIndex) - Center;
367 const FSolverReal DistanceSquared = CenterToParticle.SizeSquared();
368
370 if (DistanceSquared < DeadZoneSquareRadius)
371 {
372 Particles.P(ParticleIndex) = AnimationPosition - SphereOffsetDistance * AnimationNormal; // Non legacy version adds radius to the distance
373 }
374 else if (DistanceSquared < FMath::Square(Radius))
375 {
376 const FSolverVec3 PositionOnSphere = (Radius / sqrt(DistanceSquared)) * CenterToParticle;
377 Particles.P(ParticleIndex) = Center + PositionOnSphere;
378 }
379 // Else the particle is outside the sphere, and there is nothing to do
380 });
381 }
382
383 template<bool bHasBackstopDistance, bool bHasBackstopRadius>
384 void ApplyLegacyHelper(FSolverParticlesRange& Particles, const FSolverReal Dt) const
385 {
386 const TConstArrayView<FSolverVec3> AnimationPositionsView = bMeshUseGlobalIndexation ? Particles.GetConstArrayView(AnimationPositions) : TConstArrayView<FSolverVec3>(AnimationPositions);
387 const TConstArrayView<FSolverVec3> AnimationNormalsView = bMeshUseGlobalIndexation ? Particles.GetConstArrayView(AnimationNormals) : TConstArrayView<FSolverVec3>(AnimationNormals);
388 PhysicsParallelFor(ParticleCount, [this, &Particles, Dt, &AnimationPositionsView, &AnimationNormalsView](int32 ParticleIndex) // TODO: profile need for parallel loop based on particle count
389 {
390 if (Particles.InvM(ParticleIndex) == 0)
391 {
392 return;
393 }
394
396 const FSolverVec3& AnimationNormal = AnimationNormalsView[ParticleIndex];
397
398 const FSolverReal SphereOffsetDistance = (bHasBackstopDistance ? BackstopDistanceBase + BackstopDistanceRange * SphereOffsetDistances[ParticleIndex] : BackstopDistanceBase) * Scale;
399 const FSolverReal Radius = (bHasBackstopRadius ? BackstopRadiusBase + BackstopRadiusRange * SphereRadii[ParticleIndex] : BackstopRadiusBase) * Scale;
400
401 const FSolverVec3 Center = AnimationPosition - SphereOffsetDistance * AnimationNormal; // Legacy version already includes the radius within the distance
402 const FSolverVec3 CenterToParticle = Particles.P(ParticleIndex) - Center;
403 const FSolverReal DistanceSquared = CenterToParticle.SizeSquared();
404
406 if (DistanceSquared < DeadZoneSquareRadius)
407 {
408 Particles.P(ParticleIndex) = AnimationPosition - (SphereOffsetDistance - Radius) * AnimationNormal; // Legacy version already includes the radius to the distance
409 }
410 else if (DistanceSquared < FMath::Square(Radius))
411 {
412 const FSolverVec3 PositionOnSphere = (Radius / sqrt(DistanceSquared)) * CenterToParticle;
413 Particles.P(ParticleIndex) = Center + PositionOnSphere;
414 }
415 // Else the particle is outside the sphere, and there is nothing to do
416 });
417 }
418
419 CHAOS_API void ApplyLegacyHelperISPC(FSolverParticlesRange& Particles, const FSolverReal Dt) const;
420 CHAOS_API void ApplyHelperISPC(FSolverParticlesRange& Particles, const FSolverReal Dt) const;
421
422private:
423 const TArray<FSolverVec3>& AnimationPositions; // Positions of spheres
424 const TArray<FSolverVec3>& AnimationNormals; // Sphere offset directions
425 TConstArrayView<FRealSingle> SphereRadii; // Start at index 0, use local indexation
426 TConstArrayView<FRealSingle> SphereOffsetDistances; // Sphere position offsets, use local indexation
427 const int32 ParticleOffset;
428 const int32 ParticleCount;
429 FSolverReal Scale = (FSolverReal)1.;
430 FSolverReal BackstopRadiusBase = (FSolverReal)0.;
431 FSolverReal BackstopRadiusRange = (FSolverReal)1.;
432 FSolverReal BackstopDistanceBase = (FSolverReal)0.;
433 FSolverReal BackstopDistanceRange = (FSolverReal)1.;
434 bool bEnabled = true;
435 bool bUseLegacyBackstop = false;
436 bool bMeshUseGlobalIndexation = true; // use global indexation (will need adding ParticleOffset)
437
441};
442
443} // End namespace Chaos::Softs
#define UE_CHAOS_DECLARE_INDEXED_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:893
@ ForceInit
Definition CoreMiscDefines.h:155
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define DECLARE_CYCLE_STAT(CounterName, StatId, GroupId)
Definition Stats.h:669
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
#define CHAOS_SPHERICAL_ISPC_ENABLED_DEFAULT
Definition PBDSphericalConstraint.h:17
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CollectionPropertyFacade.h:49
Definition PBDSphericalConstraint.h:162
FSolverReal GetScale() const
Definition PBDSphericalConstraint.h:323
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(BackstopRadius, float)
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(UseLegacyBackstop, bool)
bool IsEnabled() const
Definition PBDSphericalConstraint.h:232
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(BackstopMeshName, bool)
void Apply(FSolverParticlesRange &Particles, const FSolverReal Dt) const
Definition PBDSphericalConstraint.h:240
void SetScale(FSolverReal InScale)
Definition PBDSphericalConstraint.h:322
~FPBDSphericalBackstopConstraint()
Definition PBDSphericalConstraint.h:224
FPBDSphericalBackstopConstraint(const int32 InParticleOffset, const int32 InParticleCount, const TArray< FSolverVec3 > &InAnimationPositions, const TArray< FSolverVec3 > &InAnimationNormals, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection, FSolverReal MeshScale, bool bInUseGlobalIndexation=true)
Definition PBDSphericalConstraint.h:170
FSolverReal GetBackstopDistance(int32 ConstraintIndex) const
Definition PBDSphericalConstraint.h:335
bool UseLegacyBackstop() const
Definition PBDSphericalConstraint.h:325
FPBDSphericalBackstopConstraint(const int32 InParticleOffset, const int32 InParticleCount, const TArray< FSolverVec3 > &InAnimationPositions, const TArray< FSolverVec3 > &InAnimationNormals, const TConstArrayView< FRealSingle > &InSphereRadii, const TConstArrayView< FRealSingle > &InSphereOffsetDistances, const bool bInUseLegacyBackstop, bool bInUseGlobalIndexation=true)
Definition PBDSphericalConstraint.h:199
void SetEnabled(bool bInEnabled)
Definition PBDSphericalConstraint.h:231
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDSphericalConstraint.h:164
FSolverReal GetBackstopRadius(int32 ConstraintIndex) const
Definition PBDSphericalConstraint.h:330
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, FSolverReal MeshScale)
Definition PBDSphericalConstraint.cpp:75
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(BackstopDistance, float)
void Apply(FSolverParticles &Particles, const FSolverReal Dt) const
Definition PBDSphericalConstraint.h:234
Definition PBDSphericalConstraint.h:35
void SetScale(FSolverReal InScale)
Definition PBDSphericalConstraint.h:108
const TArray< FSolverVec3 > & AnimationPositions
Definition PBDSphericalConstraint.h:148
TConstArrayView< FRealSingle > SphereRadii
Definition PBDSphericalConstraint.h:149
const int32 ParticleOffset
Definition PBDSphericalConstraint.h:150
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDSphericalConstraint.h:37
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, FSolverReal MeshScale)
Definition PBDSphericalConstraint.cpp:23
FSolverReal GetScale() const
Definition PBDSphericalConstraint.h:109
void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt) const
Definition PBDSphericalConstraint.h:84
~FPBDSphericalConstraint()
Definition PBDSphericalConstraint.h:76
FPBDSphericalConstraint(const uint32 InParticleOffset, const uint32 InParticleCount, const TArray< FSolverVec3 > &InAnimationPositions, const TConstArrayView< FRealSingle > &InSphereRadii)
Definition PBDSphericalConstraint.h:61
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(MaxDistance, float)
FPBDSphericalConstraint(const uint32 InParticleOffset, const uint32 InParticleCount, const TArray< FSolverVec3 > &InAnimationPositions, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection, FSolverReal MeshScale)
Definition PBDSphericalConstraint.h:42
const int32 ParticleCount
Definition PBDSphericalConstraint.h:151
Definition SoftsSolverParticlesRange.h:12
const FSolverVec3 & P(const int32 Index) const
Definition SoftsSolverParticlesRange.h:30
FSolverReal InvM(const int32 Index) const
Definition SoftsSolverParticlesRange.h:56
Definition PBDSoftsSolverParticles.h:20
TConstArrayView< T > GetConstArrayView(const TArray< T > &Array) const
Definition ParticlesRange.h:73
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TVector< FSolverReal, 3 > FSolverVec3
Definition PBDSoftsEvolutionFwd.h:33
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
constexpr bool bRealTypeCompatibleWithISPC
Definition Real.h:28
T DistanceSquared(const UE::Math::TVector2< T > &V1, const UE::Math::TVector2< T > &V2)
Definition VectorTypes.h:82
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition UnrealMathUtility.h:270
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578