UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GaussSeidelDynamicWeakConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
7#include "ChaosStats.h"
12#include "Chaos/Utilities.h"
15#include "Chaos/Triangle.h"
17#include "Chaos/TriangleMesh.h"
20namespace Chaos::Softs
21{
22 using Chaos::TVec3;
23 template <typename T, typename ParticleType>
25 {
26
33
39
41 {
43 {
44 delete Handle;
45 }
46 }
47
49 {
51 NewConstraintPtr -> ConstraintIndex = InConstraintIndex;
53
54 const FIntVector4 TargetTet = InTargetGeom.Tetrahedron[InTargetGeom.TetrahedronStart[InIntersection.GeometryIndex] + InIntersection.TetrahedronIndex] + FIntVector4(TargetRange.Start);
55
58 SingleConstraintData.SingleSecondIndices = {TargetTet[0], TargetTet[1], TargetTet[2], TargetTet[3]};
59 SingleConstraintData.SingleWeights = {(T)1.};
60 SingleConstraintData.SingleSecondWeights = {InIntersection.BarycentricWeights[0], InIntersection.BarycentricWeights[1], InIntersection.BarycentricWeights[2], InIntersection.BarycentricWeights[3]};
61 SingleConstraintData.bIsAnisotropic = false;
62 SingleConstraintData.SingleNormal = TVec3<T>((T)0.);
63 float ConstraintStiffness = 0.f;
64 for (int32 k = 0; k < 4; k++)
65 {
66 ConstraintStiffness += SingleConstraintData.SingleSecondWeights[k] * PositionTargetStiffness * AllParticles.M(TargetTet[k]);
67 }
68 ConstraintStiffness += PositionTargetStiffness * AllParticles.M(SingleConstraintData.SingleIndices[0]);
69 SingleConstraintData.SingleStiffness = (T)ConstraintStiffness;
70
72
73 return NewConstraintPtr;
74
75 }
76
78 {
79 const int32 OldConstraintIndex = DeletedSingleConstraint->ConstraintIndex;
80
82
84
85 ConstraintsData.RemoveConstraint(OldConstraintIndex);
86 if (ConstraintsData.Size() > 0)
87 {
89 }
90 //Update incident element information:
92 for (int32 i = 0; i < SingleData.SingleIndices.Num(); i++)
93 {
94 const int32 ParticleIndex = SingleData.SingleIndices[i];
95 for (int32 j = 0; j < WCIncidentElements[ParticleIndex].Num(); j++)
96 {
97 if (WCIncidentElements[ParticleIndex][j] == i && WCIncidentElementsLocal[ParticleIndex][j] == i)
98 {
99 WCIncidentElements[ParticleIndex].Remove(j);
100 WCIncidentElementsLocal[ParticleIndex].Remove(j);
101 break;
102 }
103 }
104 }
105 for (int32 i = 0; i < SingleData.SingleSecondIndices.Num(); i++)
106 {
107 const int32 ParticleIndex = SingleData.SingleSecondIndices[i];
108 for (int32 j = 0; j < WCIncidentElements[ParticleIndex].Num(); j++)
109 {
110 if (WCIncidentElements[ParticleIndex][j] == i && WCIncidentElementsLocal[ParticleIndex][j] == i + IndicesOffset)
111 {
112 WCIncidentElements[ParticleIndex].Remove(j);
113 WCIncidentElementsLocal[ParticleIndex].Remove(j);
114 break;
115 }
116 }
117 }
118
119 }
120
136
144
146 {
147 for (const int32 Vert : DirtyVerts)
148 {
149 check(Vert < NodalWeights.Num());
150 NodalWeights[Vert].Init(T(0), 6);
151 for (int32 j = 0; j < WCIncidentElements[Vert].Num(); j++)
152 {
153 const int32 ConstraintIndex = WCIncidentElements[Vert][j];
154 const int32 LocalIndex = WCIncidentElementsLocal[Vert][j];
155
156 T Weight = T(0);
157 if (LocalIndex >= ConstraintsData.GetIndices(ConstraintIndex).Num())
158 {
159 Weight = ConstraintsData.GetSecondWeights(ConstraintIndex)[LocalIndex - ConstraintsData.GetIndices(ConstraintIndex).Num()];
160 }
161 else
162 {
163 Weight = ConstraintsData.GetWeights(ConstraintIndex)[LocalIndex];
164 }
165
166 if (ConstraintsData.GetIsAnisotropic(ConstraintIndex))
167 {
168 for (int32 alpha = 0; alpha < 3; alpha++)
169 {
170 NodalWeights[Vert][alpha] += ConstraintsData.GetNormal(ConstraintIndex)[alpha] * ConstraintsData.GetNormal(ConstraintIndex)[alpha] * Weight * Weight * ConstraintsData.GetStiffness(ConstraintIndex);
171 }
172
173 NodalWeights[Vert][3] += ConstraintsData.GetNormal(ConstraintIndex)[0] * ConstraintsData.GetNormal(ConstraintIndex)[1] * Weight * Weight * ConstraintsData.GetStiffness(ConstraintIndex);
174 NodalWeights[Vert][4] += ConstraintsData.GetNormal(ConstraintIndex)[0] * ConstraintsData.GetNormal(ConstraintIndex)[2] * Weight * Weight * ConstraintsData.GetStiffness(ConstraintIndex);
175 NodalWeights[Vert][5] += ConstraintsData.GetNormal(ConstraintIndex)[1] * ConstraintsData.GetNormal(ConstraintIndex)[2] * Weight * Weight * ConstraintsData.GetStiffness(ConstraintIndex);
176 }
177 else
178 {
179 for (int32 alpha = 0; alpha < 3; alpha++)
180 {
181 NodalWeights[Vert][alpha] += Weight * Weight * ConstraintsData.GetStiffness(ConstraintIndex);
182 }
183 }
184 }
185 }
186 }
187
189 {
191 for (int32 i = 0; i < ConstraintHandles.Num(); i++)
192 {
195 const int32 ConstraintIndex = SingleHandle->ConstraintIndex;
196 const FGaussSeidelWeakConstraintSingleData<T>& SingleConstraintData = ConstraintsData.GetSingleConstraintData(ConstraintIndex);
197 T NewConstraintStiffness = (T)0.;
198 for (int32 k = 0; k < SingleConstraintData.SingleWeights.Num(); k++)
199 {
201 }
202 for (int32 k = 0; k < SingleConstraintData.SingleSecondWeights.Num(); k++)
203 {
204 NewConstraintStiffness += SingleConstraintData.SingleSecondWeights[k] * NewStiffness * Particles.M(SingleConstraintData.SingleSecondIndices[k]);
205 }
206 ConstraintsData.SetStiffness(ConstraintIndex, NewConstraintStiffness);
208 DirtyVertices.Append(SingleConstraintData.SingleSecondIndices);
209 }
211 }
212
213 TArrayCollectionArray<GSConstraintHandle*> Handles; //same size as number of constraints
214
215 };
216
217}
#define check(expr)
Definition AssertionMacros.h:314
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
UE::Math::TIntVector4< int32 > FIntVector4
Definition MathFwd.h:93
Definition ArrayCollectionArray.h:15
Definition Vector.h:1000
Definition CollectionTetrahedralFacade.h:36
Definition Array.h:670
SizeType Remove(const ElementType &Item)
Definition Array.h:3091
UE_REWRITE SizeType Num() const
Definition Array.h:1144
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
void Append(const TArray< OtherElementType, OtherAllocatorType > &Source)
Definition Array.h:2412
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
Definition Range.h:9
Definition XPBDWeakConstraints.h:25
Definition GaussSeidelDynamicWeakConstraints.h:25
const GSConstraintHandle * AddSingleParticleTetrahedraConstraint(const GeometryCollection::Facades::FTetrahedralFacade &InTargetGeom, const ParticleType &AllParticles, const GeometryCollection::Facades::TetrahedralParticleEmbedding &InIntersection, const int32 InConstraintIndex, const Chaos::FRange &SourceRange, const Chaos::FRange &TargetRange, const T PositionTargetStiffness)
Definition GaussSeidelDynamicWeakConstraints.h:48
void RemoveSingleConstraint(const GSConstraintHandle *DeletedSingleConstraint)
Definition GaussSeidelDynamicWeakConstraints.h:77
TArray< TArray< int32 > > WCIncidentElementsLocal
Definition GaussSeidelWeakConstraints.h:1055
FGaussSeidelWeakConstraints< T, ParticleType > Base
Definition GaussSeidelDynamicWeakConstraints.h:27
TGaussSeidelWeakConstraintData< T > ConstraintsData
Definition GaussSeidelWeakConstraints.h:1050
TArray< const GSConstraintHandle * > AddParticleTetrahedraConstraints(const GeometryCollection::Facades::FTetrahedralFacade &InTargetGeom, const ParticleType &AllParticles, const TArray< GeometryCollection::Facades::TetrahedralParticleEmbedding > &InIntersections, const Chaos::FRange &SourceRange, const Chaos::FRange &TargetRange, const T ConstraintStiffness)
Definition GaussSeidelDynamicWeakConstraints.h:121
virtual ~FGaussSeidelDynamicWeakConstraints()
Definition GaussSeidelDynamicWeakConstraints.h:40
FGaussSeidelDynamicWeakConstraints(const FDeformableXPBDWeakConstraintParams &InParams)
Definition GaussSeidelDynamicWeakConstraints.h:34
void ReComputeNodalWeights(const TSet< int32 > &DirtyVerts)
Definition GaussSeidelDynamicWeakConstraints.h:145
TArray< TArray< int32 > > WCIncidentElements
Definition GaussSeidelWeakConstraints.h:1054
TArrayCollectionArray< GSConstraintHandle * > Handles
Definition GaussSeidelDynamicWeakConstraints.h:213
TArray< TArray< T > > NodalWeights
Definition GaussSeidelWeakConstraints.h:1052
void RemoveConstraints(const TArray< const GSConstraintHandle * > &DeletedPtrs)
Definition GaussSeidelDynamicWeakConstraints.h:137
void AdjustStiffness(const TArray< const GSConstraintHandle * > ConstraintHandles, const TArray< T > &StiffnessPerConstraint, const ParticleType &Particles)
Definition GaussSeidelDynamicWeakConstraints.h:188
FGaussSeidelWeakConstraints< T, ParticleType >::FGaussSeidelConstraintHandle GSConstraintHandle
Definition GaussSeidelDynamicWeakConstraints.h:32
Definition GaussSeidelWeakConstraints.h:25
TArray< int32 > SingleIndices
Definition GaussSeidelWeakConstraints.h:26
TArray< T > SingleWeights
Definition GaussSeidelWeakConstraints.h:29
int32 ConstraintIndex
Definition GaussSeidelWeakConstraints.h:322
Definition GaussSeidelWeakConstraints.h:281
TArray< TArray< int32 > > WCIncidentElementsLocal
Definition GaussSeidelWeakConstraints.h:1055
TGaussSeidelWeakConstraintData< T > ConstraintsData
Definition GaussSeidelWeakConstraints.h:1050
void ComputeInitialWCData(const ParticleType &InParticles)
Definition GaussSeidelWeakConstraints.h:327
TArray< TArray< int32 > > WCIncidentElements
Definition GaussSeidelWeakConstraints.h:1054
TArray< TArray< T > > NodalWeights
Definition GaussSeidelWeakConstraints.h:1052
Definition CollectionTetrahedralFacade.h:14