18#include <unordered_map>
62 AddParticles(
Other.Size());
90 MIndices[ConstraintIndex] =
SingleData.SingleIndices;
91 MSecondIndices[ConstraintIndex] =
SingleData.SingleSecondIndices;
92 MStiffness[ConstraintIndex] =
SingleData.SingleStiffness;
93 MWeights[ConstraintIndex] =
SingleData.SingleWeights;
94 MSecondWeights[ConstraintIndex] =
SingleData.SingleSecondWeights;
95 MNormals[ConstraintIndex] =
SingleData.SingleNormal;
96 MIsAnisotropic[ConstraintIndex] =
SingleData.bIsAnisotropic;
97 MIsZeroRestLength[ConstraintIndex] =
SingleData.bIsZeroRestLength;
138 return MIndices[
Index];
148 return MSecondIndices;
153 return MSecondIndices[
Index];
168 return MWeights[
Index];
178 return MSecondWeights;
183 return MSecondWeights[
Index];
193 return MIsAnisotropic[
Index];
208 return MNormals[
Index];
223 return MStiffness[
Index];
233 return MIsZeroRestLength[
Index];
279 template <
typename T,
typename ParticleType>
313 for (
int32 j = 0; j < SingleSecondIndices.
Num(); j++)
315 ensureMsgf(!SingleIndices.
Contains(SingleSecondIndices[j]),
TEXT(
"Indices and Second Indices overlaps. Currently not supported"));
430 for (
int32 alpha = 0; alpha < 3; alpha++)
605 for (
int32 alpha = 0; alpha < 3; alpha++)
616 for (
int32 alpha = 0; alpha < 3; alpha++)
633 for (
int32 i = 0; i < SurfaceElements.Num(); i++)
636 for (
int32 j = 0; j < 3; j++)
651 for (
int32 l = 0; l < GlobalIndex.
Num(); l++)
653 if (GlobalIndex[l].
Num() > 0)
663 for (
int32 i = 0; i < GlobalIndex.
Num(); i++)
665 if (GlobalIndex[i].
Num() > 0)
692 for (
int32 i = 0; i < SurfaceElements.Num(); i++)
711 int32 TriangleIndex = ComponentIndex[SurfaceElements[i][0]];
728 Normal.SafeNormalize(1e-8f);
739 && MinIndex != SurfaceElements[i][0]
740 && MinIndex != SurfaceElements[i][1]
741 && MinIndex != SurfaceElements[i][2])
753 for (
int32 k = 0; k < 3; k++)
764 template<
typename SpatialAccelerator>
773 [
this, &
Spatial, &Particles, &
SurfaceVertices, &ConstraintIndex, &TriangleMesh, &Elements, &
HalfRadius, &ComponentIndex, &
PositionTargetStiffness, &
UseAnisotropicSpring](
int32 i)
775 const int32 Index = SurfaceVertices[i];
776 TArray< TTriangleCollisionPoint<FSolverReal>> Result;
778 if (TriangleMesh.PointClosestTriangleQuery(Spatial, static_cast<const TArrayView<const FSolverVec3>&>(Particles.XArray()), Index, Particles.GetX(Index), HalfRadius, HalfRadius,
779 [this, &ComponentIndex, &Elements](const int32 PointIndex, const int32 TriangleIndex)->bool
782 return ComponentIndex[PointIndex] != ComponentIndex[Elements[TriangleIndex][0]] && (!NoCollisionWCIncidentElements.IsValidIndex(PointIndex) || NoCollisionWCIncidentElements[PointIndex].Num() == 0);
803 for (
int32 k = 0; k < 3; k++)
821 template<
typename SpatialAccelerator>
825 Resize(InitialWCSize + Particles.
Size());
826 std::atomic<int32> ConstraintIndex(InitialWCSize);
830 [
this, &
Spatial, &Particles, &
SurfaceVertices, &ConstraintIndex, &TriangleMesh, &
ExcludeMap, &Elements, &
HalfRadius, &
PositionTargetStiffness, &
UseAnisotropicSpring](
int32 i)
832 const int32 Index = SurfaceVertices[i];
833 TArray< TTriangleCollisionPoint<FSolverReal>> Result;
835 if (TriangleMesh.PointClosestTriangleQuery(Spatial, static_cast<const TArrayView<const FSolverVec3>&>(Particles.XArray()), Index, Particles.GetX(Index), HalfRadius, HalfRadius,
836 [this, &Elements, &ExcludeMap](const int32 PointIndex, const int32 TriangleIndex)->bool
838 return !(ExcludeMap.Find(PointIndex) && ExcludeMap[PointIndex].Contains(TriangleIndex));
859 for (
int32 k = 0; k < 3; k++)
879 ensureMsgf(ConstraintsData.Size() >= InitialWCSize,
TEXT(
"The size of Indices is smaller than InitialWCSize"));
900 NodalWeights = NoCollisionNodalWeights;
906 if (NodalWeights[p].
Num() == 0)
908 NodalWeights[p].Init(T(0), 6);
918 if (LocalIndex >=
SingleData.SingleIndices.Num())
928 for (
int32 alpha = 0; alpha < 3; alpha++)
939 for (
int32 alpha = 0; alpha < 3; alpha++)
952 IncidentElements = NoCollisionWCIncidentElements;
953 IncidentElementsLocal = NoCollisionWCIncidentElementsLocal;
954 return NoCollisionConstraints;
961 for (
int32 i = InitialWCSize; i < ConstraintsData.Size(); i++)
989 if (LocalIndex >=
SingleData.SingleIndices.Num())
1001 for (
int32 alpha = 0; alpha < 3; alpha++)
1008 for (
int32 alpha = 0; alpha < 3; alpha++)
1022 if (LocalIndex >=
SingleData.SingleIndices.Num())
1044 for (
int32 alpha = 0; alpha < 3; ++alpha)
#define check(expr)
Definition AssertionMacros.h:314
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
UE::Math::TVector< double > FVector3d
Definition MathFwd.h:60
AUTORTFM_INFER constexpr auto Projection(Invocable0Type &&Invocable0, InvocableTypes &&... Invocables)
Definition Projection.h:108
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
Definition TriangleMesh.h:24
Definition PBDSoftsSolverParticles.h:20
const FSolverVec3 & P(const int32 index) const
Definition PBDSoftsSolverParticles.h:36
Definition GaussSeidelWeakConstraints.h:39
void SetRestLength(const int32 Index, const T InRestLength)
Definition GaussSeidelWeakConstraints.h:241
void SetWeights(const int32 Index, const TArray< int32 > &InWeights)
Definition GaussSeidelWeakConstraints.h:171
TGaussSeidelWeakConstraintData()
Definition GaussSeidelWeakConstraints.h:41
const TArrayCollectionArray< TArray< T > > & Weights() const
Definition GaussSeidelWeakConstraints.h:161
virtual ~TGaussSeidelWeakConstraintData()
Definition GaussSeidelWeakConstraints.h:75
const TArrayCollectionArray< TArray< int32 > > & SecondIndices() const
Definition GaussSeidelWeakConstraints.h:146
void SetIsZeroRestLength(const int32 Index, const bool InIsZeroRestLength)
Definition GaussSeidelWeakConstraints.h:236
void SetIndices(const int32 Index, const TArray< int32 > &InIndices)
Definition GaussSeidelWeakConstraints.h:141
const TArrayCollectionArray< TArray< T > > & SecondWeights() const
Definition GaussSeidelWeakConstraints.h:176
const FGaussSeidelWeakConstraintSingleData< T > GetSingleConstraintData(const int32 ConstraintIndex) const
Definition GaussSeidelWeakConstraints.h:246
void RemoveConstraint(const int32 Idx)
Definition GaussSeidelWeakConstraints.h:83
void SetSingleConstraint(const FGaussSeidelWeakConstraintSingleData< T > &SingleData, const int32 ConstraintIndex)
Definition GaussSeidelWeakConstraints.h:88
const TArrayCollectionArray< TArray< int32 > > & Indices() const
Definition GaussSeidelWeakConstraints.h:131
TGaussSeidelWeakConstraintData & operator=(TGaussSeidelWeakConstraintData< T > &&Other)
Definition GaussSeidelWeakConstraints.h:116
const TArrayCollectionArray< T > & Stiffness() const
Definition GaussSeidelWeakConstraints.h:216
TGaussSeidelWeakConstraintData(TGaussSeidelWeakConstraintData< T > &&Other)
Definition GaussSeidelWeakConstraints.h:54
void Resize(const int32 Num)
Definition GaussSeidelWeakConstraints.h:111
TGaussSeidelWeakConstraintData(const TGaussSeidelWeakConstraintData< T > &Other)=delete
const TArray< int32 > & GetSecondIndices(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:151
const TArray< int32 > & GetIndices(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:136
void SetStiffness(const int32 Index, const T InStiffness)
Definition GaussSeidelWeakConstraints.h:226
const bool GetIsAnisotropic(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:191
void SetIsAnisotropic(const int32 Index, const bool InIsAnisotropic)
Definition GaussSeidelWeakConstraints.h:196
void AddSingleConstraint(const FGaussSeidelWeakConstraintSingleData< T > &SingleData)
Definition GaussSeidelWeakConstraints.h:100
const bool GetIsZeroRestLength(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:231
const TArrayCollectionArray< TVec3< T > > & Normals() const
Definition GaussSeidelWeakConstraints.h:201
int32 Size() const
Definition GaussSeidelWeakConstraints.h:106
const TVec3< T > & GetNormal(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:206
void SetNormal(const int32 Index, const TVec3< T > &InNormal)
Definition GaussSeidelWeakConstraints.h:211
void AddConstraints(const int32 Num)
Definition GaussSeidelWeakConstraints.h:78
void SetSecondWeights(const int32 Index, const TArray< int32 > &InWeights)
Definition GaussSeidelWeakConstraints.h:186
const TArray< T > & GetSecondWeights(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:181
void SetSecondIndices(const int32 Index, const TArray< int32 > &InIndices)
Definition GaussSeidelWeakConstraints.h:156
T GetStiffness(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:221
const TArray< T > & GetWeights(const int32 Index) const
Definition GaussSeidelWeakConstraints.h:166
Definition ArrayCollectionArray.h:15
Definition ArrayCollection.h:10
uint32 MSize
Definition ArrayCollection.h:152
int32 AddArray(TArrayCollectionArrayBase *Array)
Definition ArrayCollection.h:36
uint32 Size() const
Definition ArrayCollection.h:66
void ResizeHelper(const int32 Num)
Definition ArrayCollection.h:93
void RemoveAtSwapHelper(const int32 Index)
Definition ArrayCollection.h:119
void AddElementsHelper(const int32 Num)
Definition ArrayCollection.h:84
Definition BoundingVolumeHierarchy.h:60
const T M(const int32 Index) const
Definition DynamicParticles.h:43
TVector< T, 3 > GetSafeNormal() const
Definition Vector.h:1079
UE_REWRITE SizeType Num() const
Definition Array.h:1144
bool Contains(const ComparisonType &Item) const
Definition Array.h:1518
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
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
UE_NODEBUG void Sort()
Definition Array.h:3418
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TArray< TArray< int > > ComputeIncidentElements(const TArray< TVector< int32, d > > &Mesh, TArray< TArray< int32 > > *LocalIndex=nullptr)
Definition Utilities.h:1013
TSphere< FReal, 3 > FSphere
Definition ImplicitObject.h:36
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
FRealDouble FReal
Definition Real.h:22
TVector< T, d > FindClosestPointAndBaryOnTriangle(const TVector< T, d > &P0, const TVector< T, d > &P1, const TVector< T, d > &P2, const TVector< T, d > &P, TVector< T, 3 > &Bary)
Definition Plane.h:220
float FRealSingle
Definition Real.h:14
U16 Index
Definition radfft.cpp:71
Definition GaussSeidelWeakConstraints.h:25
TArray< int32 > SingleIndices
Definition GaussSeidelWeakConstraints.h:26
TArray< T > SingleWeights
Definition GaussSeidelWeakConstraints.h:29
T RestLength
Definition GaussSeidelWeakConstraints.h:34
TArray< T > SingleSecondWeights
Definition GaussSeidelWeakConstraints.h:30
bool bIsAnisotropic
Definition GaussSeidelWeakConstraints.h:31
bool bIsZeroRestLength
Definition GaussSeidelWeakConstraints.h:33
T SingleStiffness
Definition GaussSeidelWeakConstraints.h:28
TVec3< T > SingleNormal
Definition GaussSeidelWeakConstraints.h:32
TArray< int32 > SingleSecondIndices
Definition GaussSeidelWeakConstraints.h:27
Definition GaussSeidelWeakConstraints.h:321
int32 ConstraintIndex
Definition GaussSeidelWeakConstraints.h:322
Definition GaussSeidelWeakConstraints.h:281
FGaussSeidelWeakConstraints(const TArray< TArray< int32 > > &InIndices, const TArray< TArray< T > > &InWeights, const TArray< T > &InStiffness, const TArray< TArray< int32 > > &InSecondIndices, const TArray< TArray< T > > &InSecondWeights, const FDeformableXPBDWeakConstraintParams &InParams)
Definition GaussSeidelWeakConstraints.h:283
TArray< TArray< int32 > > NoCollisionWCIncidentElementsLocal
Definition GaussSeidelWeakConstraints.h:1063
FDeformableXPBDWeakConstraintParams DebugDrawParams
Definition GaussSeidelWeakConstraints.h:1057
void AddWCResidual(const ParticleType &InParticles, const int32 ConstraintIndex, const int32 LocalIndex, const T Dt, TVec3< T > &ParticleResidual, Chaos::PMatrix< T, 3, 3 > &ParticleHessian) const
Definition GaussSeidelWeakConstraints.h:1015
TVec3< T > ComputeSpringEdge(const ParticleType &InParticles, const TArray< int32 > &LocalIndices, const TArray< int32 > &LocalSecondIndices, const TArray< T > &Weight, const TArray< T > &SecondWeight, bool bUseParticleX) const
Definition GaussSeidelWeakConstraints.h:382
virtual ~FGaussSeidelWeakConstraints()
Definition GaussSeidelWeakConstraints.h:325
void UpdatePointTriangleCollisionWCData(const FSolverParticles &Particles)
Definition GaussSeidelWeakConstraints.h:481
const TArray< TArray< int32 > > & GetStaticConstraintArrays(TArray< TArray< int32 > > &IncidentElements, TArray< TArray< int32 > > &IncidentElementsLocal) const
Definition GaussSeidelWeakConstraints.h:950
TArray< TArray< int32 > > WCIncidentElementsLocal
Definition GaussSeidelWeakConstraints.h:1055
TArray< TArray< T > > NoCollisionNodalWeights
Definition GaussSeidelWeakConstraints.h:1060
void Resize(int32 Size)
Definition GaussSeidelWeakConstraints.h:476
void CollisionDetectionSpatialHashInComponent(const FSolverParticles &Particles, const TArray< int32 > &SurfaceVertices, const FTriangleMesh &TriangleMesh, const TMap< int32, TSet< int32 > > &ExcludeMap, const SpatialAccelerator &Spatial, float DetectRadius=0.f, float PositionTargetStiffness=10000.f, bool UseAnisotropicSpring=true)
Definition GaussSeidelWeakConstraints.h:822
TGaussSeidelWeakConstraintData< T > ConstraintsData
Definition GaussSeidelWeakConstraints.h:1050
void AddZeroRestLengthWCResidualAndHessian(const ParticleType &InParticles, const int32 ConstraintIndex, const int32 LocalIndex, const T Dt, TVec3< T > &ParticleResidual, Chaos::PMatrix< T, 3, 3 > &ParticleHessian) const
Definition GaussSeidelWeakConstraints.h:982
void CollisionDetectionSpatialHash(const FSolverParticles &Particles, const TArray< int32 > &SurfaceVertices, const FTriangleMesh &TriangleMesh, const TArray< int32 > &ComponentIndex, const SpatialAccelerator &Spatial, float DetectRadius=1.f, float PositionTargetStiffness=10000.f, bool UseAnisotropicSpring=true)
Definition GaussSeidelWeakConstraints.h:765
void ComputeInitialWCData(const ParticleType &InParticles)
Definition GaussSeidelWeakConstraints.h:327
void AddWCHessian(const int32 p, const T Dt, Chaos::PMatrix< T, 3, 3 > &ParticleHessian) const
Definition GaussSeidelWeakConstraints.h:426
void UpdateTriangleNormalAndNodalWeight(const FSolverParticles &InParticles, bool bUseParticleX)
Definition GaussSeidelWeakConstraints.h:557
TArray< TArray< int32 > > WCIncidentElements
Definition GaussSeidelWeakConstraints.h:1054
TArray< TArray< int32 > > NoCollisionConstraints
Definition GaussSeidelWeakConstraints.h:1061
void Init(const FSolverParticles &InParticles, const T Dt)
Definition GaussSeidelWeakConstraints.h:548
TArray< TArray< T > > NodalWeights
Definition GaussSeidelWeakConstraints.h:1052
TArray< TArray< int32 > > NoCollisionWCIncidentElements
Definition GaussSeidelWeakConstraints.h:1062
void VisualizeAllBindings(const FSolverParticles &InParticles, const T Dt) const
Definition GaussSeidelWeakConstraints.h:502
void CollisionDetectionBVH(const FSolverParticles &Particles, const TArray< TVec3< int32 > > &SurfaceElements, const TArray< int32 > &ComponentIndex, float DetectRadius=1.f, float PositionTargetStiffness=10000.f, bool UseAnisotropicSpring=true)
Definition GaussSeidelWeakConstraints.h:627
TArray< TArray< int32 > > GetDynamicConstraintArrays(TArray< TArray< int32 > > &IncidentElements, TArray< TArray< int32 > > &IncidentElementsLocal) const
Definition GaussSeidelWeakConstraints.h:957
void ComputeCollisionWCDataSimplified(TArray< TArray< int32 > > &ExtraConstraints, TArray< TArray< int32 > > &ExtraWCIncidentElements, TArray< TArray< int32 > > &ExtraWCIncidentElementsLocal)
Definition GaussSeidelWeakConstraints.h:877
int32 InitialWCSize
Definition GaussSeidelWeakConstraints.h:1059
void AddExtraConstraints(const TArray< TArray< int32 > > &InIndices, const TArray< TArray< T > > &InWeights, const TArray< T > &InStiffness, const TArray< TArray< int32 > > &InSecondIndices, const TArray< TArray< T > > &InSecondWeights, const TArray< bool > &InIsAnisotrpic, const TArray< bool > &InIsZeroRestLength)
Definition GaussSeidelWeakConstraints.h:450
Data returned by TriangleMesh point-triangle and edge-edge queries.
Definition TriangleCollisionPoint.h:17
static CORE_API const FColor Red
Definition Color.h:752
static CORE_API const FColor Yellow
Definition Color.h:755
static CORE_API const FColor Green
Definition Color.h:753
static UE_FORCEINLINE_HINT float DotProduct(const TVector< float > &A, const TVector< float > &B)
Definition Vector.h:1559
TVector< T > GetSafeNormal(T Tolerance=UE_SMALL_NUMBER, const TVector< T > &ResultIfZero=ZeroVector) const
Definition Vector.h:2060
static UE_FORCEINLINE_HINT TVector< float > CrossProduct(const TVector< float > &A, const TVector< float > &B)
Definition Vector.h:1541