UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ParticleHandle.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
11#include "Chaos/Properties.h"
13#include "ChaosCheck.h"
18#if CHAOS_DEBUG_DRAW
20#endif
21
22#ifndef UE_DEBUG_DANGLING_HANDLES
23#define UE_DEBUG_DANGLING_HANDLES 0 // Will deliberately cause a memory leak
24#endif
25
28
29namespace Chaos
30{
31 class FConstraintHandle;
32 class FPBDRigidsEvolutionBase;
33
34 namespace Private
35 {
36 class FConvexOptimizer;
37
38 CHAOS_API extern FString EmptyParticleName;
39 }
40
41 namespace CVars
42 {
44 }
45
52
53template <typename T, int d>
54using TGeometryParticleParameters UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FGeometryParticleParameters instead") = FGeometryParticleParameters;
55
61
62template <typename T, int d>
63using TKinematicGeometryParticleParameters UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FKinematicGeometryParticleParameters instead") = FKinematicGeometryParticleParameters;
64
65
78
79template <typename T, int d>
80using TPBDRigidParticleParameters UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDRigidParticleParameters instead") = FPBDRigidParticleParameters;
81
83template <typename T, int d, typename FConcrete>
85{
86 Concrete.SetX(TVector<T, d>(0));
87 Concrete.SetR(TRotation<T, d>::Identity);
88 Concrete.SetSpatialIdx(FSpatialAccelerationIdx{ 0,0 });
89 Concrete.SetResimType(EResimType::FullResim);
90 Concrete.SetEnabledDuringResim(true);
91}
92
93
95template <typename T, int d, typename FConcrete>
97{
98 Concrete.SetV(TVector<T, d>(0));
99 Concrete.SetW(TVector<T, d>(0));
101 {
102 Concrete.SetSpatialIdx(FSpatialAccelerationIdx{ 0,1 });
103 }
104 else
105 {
106 Concrete.SetSpatialIdx(FSpatialAccelerationIdx{ 0,0 });
107 }
108}
109template <typename T, int d, typename FConcrete>
111{
112 //don't bother calling parent since the call gets made by the corresponding hierarchy in FConcrete
113 Concrete.SetCollisionGroup(0);
114 Concrete.SetLinearImpulseVelocity(TVector<T, d>(0));
115 Concrete.SetAngularImpulseVelocity(TVector<T, d>(0));
116 Concrete.SetMaxLinearSpeedSq(TNumericLimits<T>::Max());
117 Concrete.SetMaxAngularSpeedSq(TNumericLimits<T>::Max());
118 Concrete.SetInitialOverlapDepenetrationVelocity(-1.0f);
119 Concrete.SetSleepThresholdMultiplier(1.0f);
120 Concrete.SetM(1);
121 Concrete.SetInvM(1);
122 Concrete.SetCenterOfMass(TVector<T,d>(0));
123 Concrete.SetRotationOfMass(TRotation<T, d>::FromIdentity());
124 Concrete.SetI(TVec3<FRealSingle>(1, 1, 1));
125 Concrete.SetInvI(TVec3<FRealSingle>(1, 1, 1));
126 Concrete.SetLinearEtherDrag(0.f);
127 Concrete.SetAngularEtherDrag(0.f);
128 Concrete.SetGravityEnabled(Params.bGravityEnabled);
129 Concrete.SetGravityGroupIndex(0);
130 Concrete.SetCCDEnabled(Params.bCCDEnabled);
131 Concrete.SetMACDEnabled(false);
132 Concrete.SetPartialIslandSleepAllowed(true);
133 Concrete.SetIterationSettings(Private::FIterationSettings(INDEX_NONE, INDEX_NONE, INDEX_NONE));
134 Concrete.SetDisabled(Params.bDisabled);
135 Concrete.SetSleepType(ESleepType::MaterialSleep);
136}
137
138
139
140template <typename T, int d, typename FConcrete>
142{
143 //don't bother calling parent since the call gets made by the corresponding hierarchy in FConcrete
144}
145
146template <typename FConcrete>
148{
149 if(auto Rigid = Concrete.CastToRigidParticle())
150 {
151 return Rigid->Sleeping();
152 }
153 else
154 {
155 return Concrete.ObjectState() == EObjectStateType::Sleeping;
156 }
157}
158
159//Used to filter out at the acceleration structure layer using Query data
160//Returns true when there is no way a later PreFilter will succeed. Avoid virtuals etc..
162{
163 //HACK: need to replace all these hard-coded values with proper enums, bad modules are not setup for it right now
164 //ECollisionQuery QueryType = (ECollisionQuery)QueryFilter.Word0;
165 //if (QueryType != ECollisionQuery::ObjectQuery)
166 if(QueryFilterData.Word0)
167 {
168 //since we're taking the union of shapes we can only support trace channel
169 //const ECollisionChannel QuerierChannel = GetCollisionChannel(QueryFilter.Word3);
170 const uint32 QuerierChannel = (QueryFilterData.Word3 << 6) >> (32 - 5);
171
172 //uint32 const QuerierBit = ECC_TO_BITFIELD(QuerierChannel);
173 const uint32 QuerierBit = (1 << (QuerierChannel));
174
175 // check if Querier wants a hit
176 const uint32 TouchOrBlock = (UnionFilterData.Word1 | UnionFilterData.Word2);
177 return !(QuerierBit & TouchOrBlock);
178 }
179
180 return false;
181}
182
189
190//Used to filter out at the acceleration structure layer using Simdata
191//Returns true when there is no way a later PreFilter will succeed. Avoid virtuals etc..
193{
194 //HACK: need to replace all these hard-coded values with proper enums, bad modules are not setup for it right now
195 //since we're taking the union of shapes we can only support trace channel
196 //const ECollisionChannel QuerierChannel = GetCollisionChannel(QueryFilter.Word3);
201
202 //uint32 const QuerierBit = ECC_TO_BITFIELD(QuerierChannel);
203 const uint32 QuerierBit = (1 << (QuerierChannel));
204 const uint32 OtherBit = (1 << (OtherChannel));
205
206 // check if they can collide ( same logic as DoCollide in CollisionResolution.cpp )
207 const bool CanCollide = (QuerierBit & OtherSimFilterData.Word1) && (OtherBit & SimFilterData.Word1);
208 return !CanCollide;
209}
210
213{
214public:
215 static constexpr bool bHasPayloadOnInternalThread = true;
216
218
219 // @param bUsePrefiltering make sur the prefiltering data is computed. setting it to false may be useful when building a payload for a remove operation
221
222 template <bool bPersistent>
224
225 //Should only be used by GT and scene query threads where an appropriate lock has been acquired
226 FGeometryParticle* GetExternalGeometryParticle_ExternalThread() const { return ExternalGeometryParticle; }
227
228 //Should only be used by PT
229 FGeometryParticleHandle* GetGeometryParticleHandle_PhysicsThread() const { return GeometryParticleHandle; }
230
232 {
233 return CachedUniqueIdx == Rhs.CachedUniqueIdx;
234 }
235
237 {
238 return !(*this == Rhs);
239 }
240
241 void Serialize(FChaosArchive& Ar);
242
244 {
245 return CachedUniqueIdx;
246 }
247
248 bool PrePreQueryFilter(const void* QueryData) const
249 {
250 if(bCanPrePreFilter)
251 {
252 if (const FCollisionFilterData* QueryFilterData = static_cast<const FCollisionFilterData*>(QueryData))
253 {
254 return PrePreQueryFilterImp(*QueryFilterData, UnionQueryFilterData);
255 }
256 }
257
258 return false;
259 }
260
261
262 bool PrePreSimFilter(const void* SimData) const
263 {
264 if (bCanPrePreFilter)
265 {
266 if (const FCollisionFilterData* SimFilterData = static_cast<const FCollisionFilterData*>(SimData))
267 {
268 return PrePreSimFilterImp(*SimFilterData, UnionSimFilterData);
269 }
270 }
271
272 return false;
273 }
274
276 {
277 if (bCanPrePreFilter)
278 {
281 const uint32 SimBlockMask = UnionSimFilterData.Word1;
282 const uint32 SimChannelMask = UnionSimFilterData.Word2;
283
284 // check if they can collide ( same logic as DoCollide in CollisionResolution.cpp )
286 return !CanCollide;
287 }
288
289 return false;
290 }
291
293 {
294 UnionQueryFilterData.Word0 = InOther.UnionQueryFilterData.Word0;
295 UnionQueryFilterData.Word1 = InOther.UnionQueryFilterData.Word1;
296 UnionQueryFilterData.Word2 = InOther.UnionQueryFilterData.Word2;
297 UnionQueryFilterData.Word3 = InOther.UnionQueryFilterData.Word3;
298
299 UnionSimFilterData.Word0 = InOther.UnionSimFilterData.Word0;
300 UnionSimFilterData.Word1 = InOther.UnionSimFilterData.Word1;
301 UnionSimFilterData.Word2 = InOther.UnionSimFilterData.Word2;
302 UnionSimFilterData.Word3 = InOther.UnionSimFilterData.Word3;
303 }
304
305public:
310 template <typename TParticle>
312
318 template <typename TParticle>
320
321private:
322 FGeometryParticle* ExternalGeometryParticle;
323 FGeometryParticleHandle* GeometryParticleHandle;
324
325 FUniqueIdx CachedUniqueIdx;
326 FCollisionFilterData UnionQueryFilterData;
327 // Note: The union data is a binary or of all of the shapes in the particle. Some data in the normal sim filter is not valid if or'd, such as the channel index in word3, the component id in word2, and the body index in word0.
328 // In order to make pre-pre filtering work, the sim filter's word2 is replaced with the unpacked collision channel mask which can be or'd.
329 FCollisionFilterData UnionSimFilterData;
330 bool bCanPrePreFilter;
331
332 template <typename TParticle>
333 void UpdatePrePreFilter(const TParticle& Particle);
334
335public:
336#if CHAOS_DEBUG_DRAW
337 void DebugDraw(const bool bExternal, const bool bHit) const;
338#endif
339};
340
341template <typename T, int d>
342using TAccelerationStructureHandle UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FAccelerationStructureHandle instead") = FAccelerationStructureHandle;
343
344template <typename T, int d>
346{
347public:
348 using TType = T;
349 static constexpr int D = d;
350
357
358 template <typename TParticlesType>
365
366 //Should only be used for transient handles - maybe we can protect this better?
374
375 //NOTE: this is not virtual and only acceptable because we know the children have no extra data that requires destruction.
376 //You must modify the union to extend this class and do not add any member variables
378 {
379 }
380
382 {
383 Ar << ParticleIdx;
384 uint8 RawType = (uint8)Type;
385 Ar << RawType;
386 Type = (EParticleType)RawType;
388 }
389
390 //This is needed for post serialization fixup of raw pointer. Should only be called by serialization code which is low level and knows the implementation details
392 {
393 //should not be swapping SOAs
396 }
397
399protected:
400 union
401 {
407 };
408
409 template <typename TSOA>
411 //todo: maybe make private?
412 int32 ParticleIdx; //Index into the particle struct of arrays. Note the index can change
414};
415
416template <typename T, int d, bool bPersistent>
418
419template <typename T, int d, bool bPersistent>
421
422template <typename T, int d>
424template <typename T, int d>
426template <typename T, int d>
428template <typename T, int d>
430
431template <typename T, int d>
432class TGeometryParticleHandles;
433
434template <typename T, int d, bool bPersistent>
436{
437public:
440
447
448 static constexpr bool AlwaysSerializable = bPersistent;
449
451
452 template <typename TPayloadType>
453 TPayloadType GetPayload(int32 Idx)
454 {
455 return TPayloadType(Handle());
456 }
457
458
459protected:
460 //needed for serialization
466
470 {
471 //GeometryParticles->Handle(ParticleIdx) = this;
472 //TODO: patch from SOA
474 SetHasBounds(false);
476 SetConstraintGraphNode(nullptr);
477 }
478
479 // For transient handle
484
485 template <typename TParticlesType, typename TParams>
487 {
488 check(bPersistent); //non persistent should not be going through this path
489 auto NewHandle = new typename TParticlesType::THandleType(InParticles, InParticleIdx, InHandleIdx, Params);
491 const_cast<TParticlesType*>(InParticles.Get())->SetHandle(InParticleIdx, NewHandle); //todo: add non const serializable ptr
492 return Unique;
493 }
494public:
495
500
502 {
503 if constexpr (bPersistent)
504 {
505 // If we weren't removed from the graph, invalid pointer dereferencing is possible
506 check(GetConstraintGraphNode() == nullptr);
507
508 GeometryParticles->ResetWeakParticleHandle(ParticleIdx);
509 GeometryParticles->DestroyParticle(ParticleIdx);
510 if (static_cast<uint32>(ParticleIdx) < GeometryParticles->Size())
511 {
512 if (GeometryParticles->RemoveParticleBehavior() == ERemoveParticleBehavior::RemoveAtSwap)
513 {
514 GeometryParticles->Handle(ParticleIdx)->ParticleIdx = ParticleIdx;
515 }
516 else
517 {
518 //need to update all handles >= ParticleIdx
519 for (int32 Idx = ParticleIdx; static_cast<uint32>(Idx) < GeometryParticles->Size(); ++Idx)
520 {
521 GeometryParticles->Handle(Idx)->ParticleIdx -= 1;
522 }
523 }
524 }
525
526 // Zero the handle out to detect dangling handles and associated memory corruptions
528 GeometryParticles = nullptr;
531
533 }
534 }
535
536 template <typename T2, int d2>
538 template <typename T2, int d2>
540
541 friend class TGeometryParticleHandleImp<T, d, false>;
542 friend class TGeometryParticleHandleImp<T, d, true>;
543
548
550
551 UE_DEPRECATED(5.4, "Use GetX instead")
552 const TVector<T, d>& X() const { return GeometryParticles->GetX(ParticleIdx); }
553 UE_DEPRECATED(5.4, "Use GetX or SetX instead")
558 const TVector<T, d>& GetX() const { return GeometryParticles->GetX(ParticleIdx); }
559 void SetX(const TVector<T, d>& InX, bool bInvalidate = false) { GeometryParticles->SetX(ParticleIdx, InX); }
560
561 FUniqueIdx UniqueIdx() const { return GeometryParticles->UniqueIdx(ParticleIdx); }
562 void SetUniqueIdx(const FUniqueIdx UniqueIdx, bool bInvalidate = false) const { GeometryParticles->UniqueIdx(ParticleIdx) = UniqueIdx; }
563
564 UE_DEPRECATED(5.4, "Use GetR instead")
565 const TRotation<T, d> R() const { return GeometryParticles->GetR(ParticleIdx); }
566 UE_DEPRECATED(5.4, "Use SetR or GetR instead")
567 TRotation<T, d> R() { return GeometryParticles->GetR(ParticleIdx); }
568 const TRotation<T, d> GetR() const { return GeometryParticles->GetR(ParticleIdx); }
569 void SetR(const TRotation<T, d>& InR, bool bInvalidate = false) { GeometryParticles->SetR(ParticleIdx, InR); }
572
574
575 // Initialize the transform
576 void InitTransform(const FVec3& InP, const FRotation3& InQ)
577 {
578 SetX(InP);
579 SetR(InQ);
580 }
581
583
585 {
586#if CHAOS_DEBUG_NAME
587 SetDebugName(InData.DebugName());
588#endif
589
591 SetUniqueIdx(InData.UniqueIdx());
592 SetSpatialIdx(InData.SpatialIdx());
593 SetParticleID(InData.ParticleID());
594 }
595
596 bool HasCollision() const { return GeometryParticles->HasCollision(ParticleIdx); }
597
599 {
601 }
602
604 {
605 return GeometryParticles->SyncState(ParticleIdx);
606 }
607
609 {
610 GeometryParticles->SyncState(ParticleIdx) = State;
611 }
612
613 const FImplicitObjectRef GetGeometry() const { return GeometryParticles->GetGeometry(ParticleIdx).GetReference(); }
616
617 // Set a flag on all Unions to indicate that any add/remove operations are errors.
618 // This is called when the shapes are shared between GT/PT
619 void LockGeometry();
620
621 UE_DEPRECATED(5.4, "Use GetGeometry instead")
623
624 UE_DEPRECATED(5.4, "Use SetGeometry with FImplicitObjectPtr instead")
626
627 UE_DEPRECATED(5.4, "Use GeometryRef instead")
628 TSharedPtr<const FImplicitObject, ESPMode::ThreadSafe> SharedGeometry() const { check(false); return nullptr; }
629
630 UE_DEPRECATED(5.4, "Use SetGeometry with FImplicitObjectPtr instead")
632
633 UE_DEPRECATED(5.4, "Use GetGeometry instead")
635
636 UE_DEPRECATED(5.4, "Use GetGeometry instead")
638
639 UE_DEPRECATED(5.4, "Use SetGeometry with FImplicitObjectPtr instead")
641
642 const FShapesArray& ShapesArray() const { return GeometryParticles->ShapesArray(ParticleIdx); }
643
644 const FShapeInstanceArray& ShapeInstances() const { return GeometryParticles->ShapeInstances(ParticleIdx); }
645
648
649 const TAABB<T, d>& LocalBounds() const { return GeometryParticles->LocalBounds(ParticleIdx); }
651
652 const TVector<T, d>& CCDAxisThreshold() const { return GeometryParticles->CCDAxisThreshold(ParticleIdx); }
653
654 const TAABB<T, d>& WorldSpaceInflatedBounds() const { return GeometryParticles->WorldSpaceInflatedBounds(ParticleIdx); }
655
660 void UpdateWorldSpaceState(const FRigidTransform3& WorldTransform, const FVec3& BoundsExpansion)
661 {
662 GeometryParticles->UpdateWorldSpaceState(ParticleIdx, WorldTransform, BoundsExpansion);
663 }
664
673 void UpdateWorldSpaceStateSwept(const FRigidTransform3& WorldTransform, const FVec3& BoundsExpansion, const FVec3& DeltaX)
674 {
675 GeometryParticles->UpdateWorldSpaceStateSwept(ParticleIdx, WorldTransform, BoundsExpansion, DeltaX);
676 }
677
678 bool HasBounds() const { return GeometryParticles->HasBounds(ParticleIdx); }
680
683
684#if CHAOS_DEBUG_NAME
685 const TSharedPtr<FString, ESPMode::ThreadSafe>& DebugName() const { return GeometryParticles->DebugName(ParticleIdx); }
687#endif
688 const FString& GetDebugName() const { return GeometryParticles->GetDebugName(ParticleIdx); }
689
691
694
695 const IPhysicsProxyBase* PhysicsProxy() const { return GeometryParticles->PhysicsProxy(ParticleIdx); }
698
701
704
707
710
713
714 // Useful for logging to indicate particle (this is locally unique among all particles)
715 int32 GetHandleIdx() const { return HandleIdx; }
716
717 bool Sleeping() const { return GeometryParticleSleeping(*this); }
718
719 template <typename Container>
720 const auto& AuxilaryValue(const Container& AuxContainer) const
721 {
722 return AuxContainer[HandleIdx];
723 }
724
725 template <typename Container>
730
731 EResimType ResimType() const { return GeometryParticles->ResimType(ParticleIdx); }
732
734
735
736 bool EnabledDuringResim() const { return GeometryParticles->EnabledDuringResim(ParticleIdx); }
737 void SetEnabledDuringResim(bool bEnabledDuringResim) { GeometryParticles->EnabledDuringResim(ParticleIdx) = bEnabledDuringResim; }
738
739 bool LightWeightDisabled() const { return GeometryParticles->LightWeightDisabled(ParticleIdx); }
741
743 {
744 return GeometryParticles->ListMask(ParticleIdx);
745 }
746
751
753 {
754 return (GeometryParticles->ListMask(ParticleIdx) & ListMask) == ListMask;
755 }
756
761
766
767#if CHAOS_DETERMINISTIC
768 FParticleID ParticleID() const { return GeometryParticles->ParticleID(ParticleIdx); }
769 void SetParticleID(const FParticleID& ParticleID)
770 {
771 //When particles are created they are assigned a unique local index
772 //This index cannot be used for replicated particles (which use a global index)
773 //The global index (if used) is set on the game thread and comes over in the NonFrequent data
774 //However, it's possible that the particle id was never set (not used), so it will come over as -1,-1
775 //In this case we should continue to use the local index
776
777 //TODO: find a better way to deal with this, shouldn't be at such a low level API
778
779 if (ParticleID.GlobalID != INDEX_NONE || ParticleID.LocalID != INDEX_NONE)
780 {
781 GeometryParticles->ParticleID(ParticleIdx) = ParticleID;
782 }
783 }
784#endif
785
787 {
788 static_assert(bPersistent, "Cannot move particles from a transient handle");
789 check(ToSOA.ParticleType() == Type);
790 if (GeometryParticles != &ToSOA)
791 {
792 GeometryParticles->MoveToOtherParticles(ParticleIdx, ToSOA);
793 if (static_cast<uint32>(ParticleIdx) < GeometryParticles->Size())
794 {
795 GeometryParticles->Handle(ParticleIdx)->ParticleIdx = ParticleIdx;
796 }
797
798 const int32 NewParticleIdx = ToSOA.Size() - 1;
800
801 // Update the particles' list mask to match its new container
802 check(GeometryParticles->GetContainerListMask() != EGeometryParticleListMask::None);
803 check(ToSOA.GetContainerListMask() != EGeometryParticleListMask::None);
804 ToSOA.ListMask(ParticleIdx) &= ~GeometryParticles->GetContainerListMask();
805 ToSOA.ListMask(ParticleIdx) |= ToSOA.GetContainerListMask();
806
808 }
809 }
810
811 static constexpr EParticleType StaticType() { return EParticleType::Static; }
812
813 FString ToString() const;
814
816 {
818 Ar << HandleIdx;
819 GeometryParticles->SetHandle(ParticleIdx, this);
820 }
821
823 {
824 return GeometryParticles->WeakParticleHandle(ParticleIdx);
825 }
826
828 {
829 return GeometryParticles->ParticleConstraints(ParticleIdx);
830 }
831
833 {
834 return GeometryParticles->ParticleConstraints(ParticleIdx);
835 }
836
841
846
848 {
849 return GeometryParticles->ParticleCollisions(ParticleIdx);
850 }
851
853 {
854 return GeometryParticles->ParticleCollisions(ParticleIdx);
855 }
856
858 {
859 return (GetConstraintGraphNode() != nullptr);
860 }
861
863 {
864 return GeometryParticles->ConstraintGraphNode(ParticleIdx);
865 }
866
871
872 // Deprecated API
873 UE_DEPRECATED(5.3, "Use GetConstraintGraphNode()") int32 ConstraintGraphIndex() const { return INDEX_NONE; }
874 UE_DEPRECATED(5.3, "Use GetConstraintGraphNode()") void SetConstraintGraphIndex(const int32 InGraphIndex) {}
875
876protected:
877
879
881 std::conditional_t<bPersistent, int32, FInvalidFromTransient> HandleIdx; //Index into the handles array. This is useful for binding external attributes. Note the index can change
882};
883
884template<>
885template<>
887
888template<>
889template<>
891
892
893
894template <typename T, int d>
899template <typename T, int d>
904
905template <typename T, int d, bool bPersistent>
907{
908public:
909 using TGeometryParticleHandleImp<T, d, bPersistent>::ParticleIdx;
911 using TGeometryParticleHandleImp<T, d, bPersistent>::Type;
915 using TGeometryParticleHandleImp<T, d, bPersistent>::SetXR;
916
917protected:
918 friend class TGeometryParticleHandleImp<T, d, bPersistent>;
919 //needed for serialization
921 : TGeometryParticleHandleImp<T, d, bPersistent>()
922 {
923 }
924
930public:
931
936
943
944 UE_DEPRECATED(5.4, "Use GetV instead")
945 const TVector<T, d> V() const { return KinematicGeometryParticles->GetV(ParticleIdx); }
946 UE_DEPRECATED(5.4, "Use SetV or GetV instead")
952
953 UE_DEPRECATED(5.4, "Use GetW instead")
954 const TVector<T, d> W() const { return KinematicGeometryParticles->GetW(ParticleIdx); }
955 UE_DEPRECATED(5.4, "Use SetW or GetW instead")
961
962 UE_DEPRECATED(5.4, "Use FPBDRigidsEvolutionGBF::SetParticleVelocitied or (SetV, SetW if that is not appropriate)")
964 {
965 SetV(Velocities.V());
966 SetW(Velocities.W());
967 }
968
973
974 const FKinematicTarget& KinematicTarget() const { return KinematicGeometryParticles->KinematicTarget(ParticleIdx); }
976
977 //Really only useful when using a transient handle
980
982 static constexpr EParticleType StaticType() { return EParticleType::Kinematic; }
983};
984
985template <typename T, int d, bool bPersistent>
987{
988public:
989 using TGeometryParticleHandleImp<T, d, bPersistent>::ParticleCollisions;
991 using TGeometryParticleHandleImp<T, d, bPersistent>::ParticleIdx;
992 using TGeometryParticleHandleImp<T, d, bPersistent>::PBDRigidParticles;
993 using TGeometryParticleHandleImp<T, d, bPersistent>::SetX;
994 using TGeometryParticleHandleImp<T, d, bPersistent>::SetR;
995 using TGeometryParticleHandleImp<T, d, bPersistent>::Type;
996 using TKinematicGeometryParticleHandleImp<T, d, bPersistent>::GetV;
997 using TKinematicGeometryParticleHandleImp<T, d, bPersistent>::GetW;
998
1001
1002protected:
1003 friend class TGeometryParticleHandleImp<T, d, bPersistent>;
1004
1005 //needed for serialization
1007 : TKinematicGeometryParticleHandleImp<T, d, bPersistent>()
1008 {
1009 }
1010
1013 {
1016 SetDisabled(Params.bDisabled);
1017 SetPreVf(this->GetVf());
1018 SetPreWf(this->GetWf());
1020 SetP(this->GetX());
1021 SetQf(this->GetRf());
1022 SetVSmooth(this->GetV());
1023 SetWSmooth(this->GetW());
1029 SetSleepCounter(0);
1032 }
1033public:
1034
1039
1046
1048
1051
1054
1055 int32 CollisionParticlesSize() const { return PBDRigidParticles->CollisionParticlesSize(ParticleIdx); }
1056 void CollisionParticlesInitIfNeeded() { PBDRigidParticles->CollisionParticlesInitIfNeeded(ParticleIdx); }
1057 void SetCollisionParticles(TParticles<T, d>&& Points) { PBDRigidParticles->SetCollisionParticles(ParticleIdx, MoveTemp(Points)); }
1058
1059 int32 CollisionGroup() const { return PBDRigidParticles->CollisionGroup(ParticleIdx); }
1060 int32& CollisionGroup() { return PBDRigidParticles->CollisionGroup(ParticleIdx); }
1062
1063 bool HasCollisionConstraintFlag(const ECollisionConstraintFlags Flag) const { return PBDRigidParticles->HasCollisionConstraintFlag(Flag, ParticleIdx); }
1064 void AddCollisionConstraintFlag(const ECollisionConstraintFlags Flag) { PBDRigidParticles->AddCollisionConstraintFlag(Flag, ParticleIdx); }
1065 void RemoveCollisionConstraintFlag(const ECollisionConstraintFlags Flag) { PBDRigidParticles->RemoveCollisionConstraintFlag(Flag, ParticleIdx); }
1066 void SetCollisionConstraintFlags(const uint32 Flags) { PBDRigidParticles->SetCollisionConstraintFlags(ParticleIdx, Flags); }
1067 uint32 CollisionConstraintFlags() const { return PBDRigidParticles->CollisionConstraintFlags(ParticleIdx); }
1068
1069 bool Disabled() const { return PBDRigidParticles->Disabled(ParticleIdx); }
1070 //UE_DEPRECATED(5.3, "This method should not be used anymore. SetDisabled should be used instead.")
1071 bool& Disabled() { return PBDRigidParticles->DisabledRef(ParticleIdx); }
1072
1073 // See Comment on TRigidParticle::SetDisabledLowLevel. State changes in Evolution should accompany this call.
1075 void SetDisabled(const bool InDisabled) { PBDRigidParticles->DisabledRef(ParticleIdx) = InDisabled; }
1076
1077 UE_DEPRECATED(5.4, "Use GetPreV instead")
1078 const TVector<T, d> PreV() const { return PBDRigidParticles->GetPreV(ParticleIdx); }
1079 UE_DEPRECATED(5.4, "Use GetPreV or SetPreV instead")
1080 TVector<T, d> PreV() { return PBDRigidParticles->GetPreV(ParticleIdx); }
1081 const TVector<T, d> GetPreV() const { return PBDRigidParticles->GetPreV(ParticleIdx); }
1085
1086 UE_DEPRECATED(5.4, "Use GetPreW instead")
1087 const TVector<T, d> PreW() const { return PBDRigidParticles->GetPreW(ParticleIdx); }
1088 UE_DEPRECATED(5.4, "Use GetPreW or SetPreW instead")
1089 TVector<T, d> PreW() { return PBDRigidParticles->GetPreW(ParticleIdx); }
1090 const TVector<T, d> GetPreW() const { return PBDRigidParticles->GetPreW(ParticleIdx); }
1094
1095 int32 SolverBodyIndex() const { return PBDRigidParticles->SolverBodyIndex(ParticleIdx); }
1097
1098 UE_DEPRECATED(5.4, "Use GetP instead")
1099 const TVector<T, d>& P() const { return PBDRigidParticles->GetP(ParticleIdx); }
1100 UE_DEPRECATED(5.4, "Use GetP or SetP instead")
1106 const TVector<T, d>& GetP() const { return PBDRigidParticles->GetP(ParticleIdx); }
1108
1109 UE_DEPRECATED(5.4, "Use GetQ instead")
1110 const TRotation<T, d> Q() const { return PBDRigidParticles->GetQ(ParticleIdx); }
1111 UE_DEPRECATED(5.4, "Use GetQ or SetQ instead")
1112 TRotation<T, d> Q() { return PBDRigidParticles->GetQ(ParticleIdx); }
1113 const TRotation<T, d> GetQ() const { return PBDRigidParticles->GetQ(ParticleIdx); }
1117
1118 // World-space center of mass position
1119 const TVector<T, d> XCom() const { return PBDRigidParticles->XCom(ParticleIdx); }
1120 const TVector<T, d> PCom() const { return PBDRigidParticles->PCom(ParticleIdx); }
1121
1122 // World-space center of mass rotation
1123 const TRotation<T, d> RCom() const { return PBDRigidParticles->RCom(ParticleIdx); }
1124 const TRotation<T, d> QCom() const { return PBDRigidParticles->QCom(ParticleIdx); }
1125
1126 // Initialize the transform (sets X,R and P,Q)
1127 void InitTransform(const FVec3& InP, const FRotation3& InQ)
1128 {
1129 SetX(InP);
1130 SetR(InQ);
1131 SetP(InP);
1132 SetQ(InQ);
1133 }
1134
1135 // Set world-space center of mass transform
1137
1139
1141
1143
1144 const TVector<T, d>& VSmooth() const { return PBDRigidParticles->VSmooth(ParticleIdx); }
1147
1148 const TVector<T, d>& WSmooth() const { return PBDRigidParticles->WSmooth(ParticleIdx); }
1151
1152 const TVector<T, d>& Acceleration() const { return PBDRigidParticles->Acceleration(ParticleIdx); }
1155
1156 void AddForce(const TVector<T, d>& InF, bool bInvalidate = true)
1157 {
1159 }
1160
1161 const TVector<T, d>& AngularAcceleration() const { return PBDRigidParticles->AngularAcceleration(ParticleIdx); }
1164
1165 CHAOS_API void AddTorque(const TVector<T, d>& InTorque, bool bInvalidate = true);
1166 CHAOS_API void SetTorque(const TVector<T, d>& InTorque, bool bInvalidate = true);
1167
1168 const TVector<T, d>& LinearImpulseVelocity() const { return PBDRigidParticles->LinearImpulseVelocity(ParticleIdx); }
1171
1172 const TVector<T, d>& AngularImpulseVelocity() const { return PBDRigidParticles->AngularImpulseVelocity(ParticleIdx); }
1175
1183
1185 {
1188 SetI(Props.I());
1189 SetInvI(Props.InvI());
1190 SetM(Props.M());
1191 SetInvM(Props.InvM());
1192
1194 }
1195
1196 UE_DEPRECATED(5.2, "Moved to FPBDRigidsSolver")
1198
1200 {
1201 SetVSmooth(GetV());
1202 SetWSmooth(GetW());
1203 }
1204
1205 // Get the raw inertia. @see ConditionedInvI()
1206 const TVec3<FRealSingle>& I() const { return PBDRigidParticles->I(ParticleIdx); }
1209
1210 // Get the raw inverse inertia. @see ConditionedInvI()
1211 const TVec3<FRealSingle>& InvI() const { return PBDRigidParticles->InvI(ParticleIdx); }
1214
1215 T M() const { return PBDRigidParticles->M(ParticleIdx); }
1216 T& M() { return PBDRigidParticles->M(ParticleIdx); }
1217 void SetM(const T& InM) { PBDRigidParticles->M(ParticleIdx) = InM; }
1218
1219 T InvM() const { return PBDRigidParticles->InvM(ParticleIdx); }
1220 T& InvM() { return PBDRigidParticles->InvM(ParticleIdx); }
1222
1223 const TVector<T,d>& CenterOfMass() const { return PBDRigidParticles->CenterOfMass(ParticleIdx); }
1225
1226 const TRotation<T,d>& RotationOfMass() const { return PBDRigidParticles->RotationOfMass(ParticleIdx); }
1228
1229 // Get the inertia conditioning scales. This is a scale applied to the inverse inertia for use by the constraint solvers to improve stability
1230 // and is calculated based on the attached joints and potential collision positions (approximated by object size)
1231 const TVec3<FRealSingle>& InvIConditioning() const { return PBDRigidParticles->InvIConditioning(ParticleIdx); }
1233
1234 // Get the conditioned inertia for use in constraint solvers
1237
1238 T LinearEtherDrag() const { return PBDRigidParticles->LinearEtherDrag(ParticleIdx); }
1239 T& LinearEtherDrag() { return PBDRigidParticles->LinearEtherDrag(ParticleIdx); }
1241
1242 T AngularEtherDrag() const { return PBDRigidParticles->AngularEtherDrag(ParticleIdx); }
1243 T& AngularEtherDrag() { return PBDRigidParticles->AngularEtherDrag(ParticleIdx); }
1245
1246 T MaxLinearSpeedSq() const { return PBDRigidParticles->MaxLinearSpeedSq(ParticleIdx); }
1247 T& MaxLinearSpeedSq() { return PBDRigidParticles->MaxLinearSpeedSq(ParticleIdx); }
1249
1250 T MaxAngularSpeedSq() const { return PBDRigidParticles->MaxAngularSpeedSq(ParticleIdx); }
1251 T& MaxAngularSpeedSq() { return PBDRigidParticles->MaxAngularSpeedSq(ParticleIdx); }
1253
1254 FRealSingle InitialOverlapDepenetrationVelocity() const { return PBDRigidParticles->InitialOverlapDepenetrationVelocity(ParticleIdx); }
1256
1257 inline FRealSingle SleepThresholdMultiplier() const { return PBDRigidParticles->SleepThresholdMultiplier(ParticleIdx); }
1259
1262
1265
1268
1269 bool Sleeping() const { return PBDRigidParticles->Sleeping(ParticleIdx); }
1270 void SetSleeping(bool bSleeping) { PBDRigidParticles->SetSleeping(ParticleIdx, bSleeping); }
1271
1272 //Really only useful when using a transient handle
1275
1277 {
1278 return PBDRigidParticles->ControlFlags(ParticleIdx);
1279 }
1280
1281 // NOTE: ControlFlags should not be changed by the solver during the tick. These are externally controlled settings.
1283 {
1284 PBDRigidParticles->ControlFlags(ParticleIdx) = Flags;
1285 }
1286
1287 inline bool GravityEnabled() const
1288 {
1290 }
1291
1292 inline void SetGravityEnabled(bool bEnabled)
1293 {
1294 PBDRigidParticles->ControlFlags(ParticleIdx).SetGravityEnabled(bEnabled);
1295 }
1296
1298 {
1300 }
1301
1303 {
1304 PBDRigidParticles->ControlFlags(ParticleIdx).SetGravityGroupIndex(GravityGroupIndex);
1305 }
1306
1308 {
1310 }
1311
1312 inline void SetUpdateKinematicFromSimulation(bool bUpdateKinematicFromSimulation)
1313 {
1314 PBDRigidParticles->ControlFlags(ParticleIdx).SetUpdateKinematicFromSimulation(bUpdateKinematicFromSimulation);
1315 }
1316
1317 inline bool GyroscopicTorqueEnabled() const
1318 {
1320 }
1321
1322 inline void SetGyroscopicTorqueEnabled(bool bEnabled)
1323 {
1324 PBDRigidParticles->ControlFlags(ParticleIdx).SetGyroscopicTorqueEnabled(bEnabled);
1325 }
1326
1327 inline bool CCDEnabled() const
1328 {
1329 return ControlFlags().GetCCDEnabled();
1330 }
1331
1332 inline void SetCCDEnabled(bool bEnabled)
1333 {
1334 PBDRigidParticles->ControlFlags(ParticleIdx).SetCCDEnabled(bEnabled);
1335 }
1336
1337 inline bool MACDEnabled() const
1338 {
1339 return ControlFlags().GetMACDEnabled();
1340 }
1341
1342 inline void SetMACDEnabled(bool bEnabled)
1343 {
1344 PBDRigidParticles->ControlFlags(ParticleIdx).SetMACDEnabled(bEnabled);
1345 }
1346
1347 inline bool PartialIslandSleepAllowed() const
1348 {
1350 }
1351
1352 inline void SetPartialIslandSleepAllowed(bool bEnabled)
1353 {
1354 PBDRigidParticles->ControlFlags(ParticleIdx).SetPartialIslandSleepAllowed(bEnabled);
1355 }
1356
1358 {
1359 return PBDRigidParticles->ParticleIterationCounts(ParticleIdx);
1360 }
1361
1366
1368 {
1369 PBDRigidParticles->ParticleIterationCounts(ParticleIdx).SetNumPositionIterations(PositionIterationsIn);
1370 }
1371
1373 {
1374 PBDRigidParticles->ParticleIterationCounts(ParticleIdx).SetNumVelocityIterations(VelocityIterationsIn);
1375 }
1376
1378 {
1379 PBDRigidParticles->ParticleIterationCounts(ParticleIdx).SetNumProjectionIterations(ProjectionIterationsIn);
1380 }
1381
1382 inline bool OneWayInteraction() const
1383 {
1385 }
1386
1387 inline void SetOneWayInteraction(bool bEnabled)
1388 {
1389 PBDRigidParticles->ControlFlags(ParticleIdx).SetOneWayInteractionEnabled(bEnabled);
1390 }
1391
1392 inline bool InertiaConditioningEnabled() const
1393 {
1395 }
1396
1397 inline void SetInertiaConditioningEnabled(bool bEnabled)
1398 {
1399 // NOTE: We still set this flag even for kinematics because they may change to dynamic later. However we
1400 // won't actually calculate the inertia until it gets changed to dynamic (which will also set the dirty flag)
1401 if (bEnabled != InertiaConditioningEnabled())
1402 {
1403 PBDRigidParticles->ControlFlags(ParticleIdx).SetInertiaConditioningEnabled(bEnabled);
1405 }
1406 }
1407
1409 {
1410 return PBDRigidParticles->TransientFlags(ParticleIdx).GetInertiaConditioningDirty();
1411 }
1412
1414 {
1415 PBDRigidParticles->TransientFlags(ParticleIdx).SetInertiaConditioningDirty();
1416 }
1417
1419 {
1420 PBDRigidParticles->TransientFlags(ParticleIdx).ClearInertiaConditioningDirty();
1421 }
1422
1423 inline bool UseIgnoreCollisionManager() const
1424 {
1425 return PBDRigidParticles->TransientFlags(ParticleIdx).GetUseIgnoreCollisionManager();
1426 }
1427
1429 {
1430 PBDRigidParticles->TransientFlags(ParticleIdx).SetUseIgnoreCollisionManager();
1431 }
1432
1434 {
1435 PBDRigidParticles->TransientFlags(ParticleIdx).ClearUseIgnoreCollisionManager();
1436 }
1437
1438 inline bool IsMovingKinematic() const
1439 {
1440 return IsKinematic() && PBDRigidParticles->TransientFlags(ParticleIdx).GetIsMovingKinematic();
1441 }
1442
1444 {
1445 PBDRigidParticles->TransientFlags(ParticleIdx).SetIsMovingKinematic();
1446 }
1447
1449 {
1450 PBDRigidParticles->TransientFlags(ParticleIdx).ClearIsMovingKinematic();
1451 }
1452
1453 ESleepType SleepType() const { return PBDRigidParticles->SleepType(ParticleIdx);}
1454
1456
1458 {
1459 return PBDRigidParticles->SleepCounter(ParticleIdx);
1460 }
1461
1466
1468 {
1469 return PBDRigidParticles->DisableCounter(ParticleIdx);
1470 }
1471
1476
1477 static constexpr EParticleType StaticType() { return EParticleType::Rigid; }
1478
1479 // Deprecated API
1480 UE_DEPRECATED(5.3, "No longer supported") int32 IslandIndex() const { return INDEX_NONE; }
1481 UE_DEPRECATED(5.3, "No longer supported") int32& IslandIndex() { static int32 Dummy = INDEX_NONE; return Dummy; }
1482 UE_DEPRECATED(5.3, "No longer supported") void SetIslandIndex(const int32 InIslandIndex) {}
1483
1484};
1485
1486template <typename T, int d, bool bPersistent>
1488{
1489 SetX(XR.X());
1490 SetR(XR.R());
1491 if(auto Rigid = CastToRigidParticle())
1492 {
1493 Rigid->SetP(GetX());
1494 Rigid->SetQf(GetRf());
1495 }
1496}
1497
1498template <typename T, int d, bool bPersistent>
1500{
1501public:
1502 using TGeometryParticleHandleImp<T, d, bPersistent>::ParticleIdx;
1504 using TGeometryParticleHandleImp<T, d, bPersistent>::Type;
1507
1508protected:
1509 friend class TGeometryParticleHandleImp<T, d, bPersistent>;
1510 //needed for serialization
1512 : TPBDRigidParticleHandleImp<T, d, bPersistent>()
1513 {
1514 }
1515
1517 : TPBDRigidParticleHandleImp<T, d, bPersistent>(TSerializablePtr<TPBDRigidParticles<T, d>>(Particles), InIdx, InGlobalIdx, Params)
1518 {
1520 }
1521public:
1522
1527
1534
1539
1541 const ClusterId& ClusterIds() const { return PBDRigidClusteredParticles->ClusterIds(ParticleIdx); }
1543
1545
1549
1550 const int32& ClusterGroupIndex() const { return PBDRigidClusteredParticles->ClusterGroupIndex(ParticleIdx); }
1552 void SetClusterGroupIndex(const int32 Idx) { PBDRigidClusteredParticles->ClusterGroupIndex(ParticleIdx) = Idx; }
1553
1554 bool InternalCluster() const { return PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).GetInternalCluster(); }
1555 void SetInternalCluster(bool bValue) { PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).SetInternalCluster(bValue); }
1556
1560
1561 UE_DEPRECATED(5.4, "Use GetChildrenSpatial instead")
1563 {
1564 check(false);
1566 return DummyPtr;
1567 }
1568
1569 UE_DEPRECATED(5.4, "Use GetChildrenSpatial instead")
1576
1577 UE_DEPRECATED(5.4, "Use SetChildrenSpatial with FImplicitObjectUnionClusteredPtr instead")
1579
1580 const FRealSingle& CollisionImpulse() const { return PBDRigidClusteredParticles->CollisionImpulses(ParticleIdx); }
1583 const FRealSingle& CollisionImpulses() const { return PBDRigidClusteredParticles->CollisionImpulses(ParticleIdx); }
1586 void ClearCollisionImpulse() { PBDRigidClusteredParticles->CollisionImpulses(ParticleIdx) = static_cast<FRealSingle>(0); }
1587
1589 UE_DEPRECATED(5.2, "This method should not be used anymore. FRigidClustering::SetExternalStrain should be used instead.")
1591 UE_DEPRECATED(5.2, "This method should not be used anymore. FRigidClustering::SetExternalStrain with 0 strain should be used instead.")
1593
1595 const FRealSingle& Strain() const { return PBDRigidClusteredParticles->Strains(ParticleIdx); }
1596 UE_DEPRECATED(5.2, "This method should not be used anymore. FRigidClustering::SetInternalStrain should be used instead.")
1598 UE_DEPRECATED(5.2, "This method should not be used anymore. FRigidClustering::SetInternalStrain should be used instead.")
1600 const FRealSingle& Strains() const { return PBDRigidClusteredParticles->Strains(ParticleIdx); }
1601 UE_DEPRECATED(5.2, "This method should not be used anymore. FRigidClustering::SetInternalStrain should be used instead.")
1603 UE_DEPRECATED(5.2, "This method should not be used anymore. FRigidClustering::SetInternalStrain should be used instead.")
1606
1611
1612 bool IsAnchored() const { return PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).GetAnchored(); }
1613 void SetIsAnchored(bool bValue) { PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).SetAnchored(bValue); }
1614
1615 bool Unbreakable() const { return PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).GetUnbreakable(); }
1616 void SetUnbreakable(bool bValue) { PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).SetUnbreakable(bValue); }
1617
1618 bool IsChildToParentLocked() const { return PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).GetChildToParentLocked(); }
1619 void SetChildToParentLocked(bool bValue) { PBDRigidClusteredParticles->RigidClusteredFlags(ParticleIdx).SetChildToParentLocked(bValue); }
1620
1623
1624 static constexpr EParticleType StaticType() { return EParticleType::Rigid; }
1625
1627
1628 // Get the clustered particle convex optmizer
1631
1632private:
1633 void SetInternalStrains(const FRealSingle Value) { PBDRigidClusteredParticles->Strains(ParticleIdx) = Value; }
1634 void SetExternalStrains(const FRealSingle Value) { PBDRigidClusteredParticles->ExternalStrains(ParticleIdx) = Value; }
1635 friend class FRigidClustering;
1637};
1638
1639template <typename T, int d, bool bPersistent = true>
1641{
1642public:
1643 using TGeometryParticleHandleImp<T, d, bPersistent>::ParticleIdx;
1644 using TGeometryParticleHandleImp<T, d, bPersistent>::PBDRigidParticles;
1645 using TGeometryParticleHandleImp<T, d, bPersistent>::Type;
1648
1649protected:
1650 friend class TGeometryParticleHandleImp<T, d, bPersistent>;
1651
1652 //needed for serialization
1656
1659 int32 InIdx,
1662 : TPBDRigidClusteredParticleHandleImp<T, d, bPersistent>(
1664 {}
1665public:
1666
1676
1683
1686
1688};
1689
1690template <typename T, int d, bool bPersistent>
1692
1693template <typename T, int d, bool bPersistent>
1695
1696template <typename T, int d, bool bPersistent>
1698
1699template <typename T, int d, bool bPersistent>
1701
1702template <typename T, int d, bool bPersistent>
1704
1705template <typename T, int d, bool bPersistent>
1707
1708template <typename T, int d, bool bPersistent>
1710
1711template <typename T, int d, bool bPersistent>
1713
1714
1715template <typename T, int d, bool bPersistent>
1721
1722template <typename T, int d, bool bPersistent>
1728
1730{
1731 None,
1732 Awake,
1733 Sleep
1734};
1735
1736template <typename T, int d, bool bPersistent>
1738{
1739 switch (Type)
1740 {
1742 return FString::Printf(TEXT("Static[%d]"), ParticleIdx);
1744 return FString::Printf(TEXT("Kinemmatic[%d]"), ParticleIdx);
1746 return FString::Printf(TEXT("Dynamic[%d]"), ParticleIdx);
1748 return FString::Printf(TEXT("GeometryCollection[%d]"), ParticleIdx);
1750 return FString::Printf(TEXT("Clustered[%d]"), ParticleIdx);
1751 default:
1752 break;
1753 }
1754 return FString();
1755}
1756
1757template <typename T, int d, bool bPersistent>
1764
1766{
1767public:
1770
1772
1773 // Check for the exact type of particle (see also AsKinematic etc, which will work on derived types)
1774 bool IsStatic() const { return (MHandle->ObjectState() == EObjectStateType::Static); }
1775 bool IsKinematic() const { return (MHandle->ObjectState() == EObjectStateType::Kinematic); }
1776 bool IsDynamic() const { return (MHandle->ObjectState() == EObjectStateType::Dynamic) || (MHandle->ObjectState() == EObjectStateType::Sleeping); }
1777 bool IsSleeping() const { return (MHandle->ObjectState() == EObjectStateType::Sleeping); }
1778
1779 bool WasSleeping() const
1780 {
1782 {
1783 return Rigid->WasSleeping();
1784 }
1785 return IsSleeping();
1786 }
1787
1796
1797 const FGeometryParticleHandle* GeometryParticleHandle() const { return MHandle; }
1799 //Needed for templated code to be the same
1800 const FGeometryParticleHandle* Handle() const { return MHandle; }
1801 FGeometryParticleHandle* Handle() { return MHandle; }
1802 int32 GetHandleIdx() const { return MHandle->GetHandleIdx(); }
1803
1804 void SetTransform(const FVec3& Pos, const FRotation3& Rot)
1805 {
1806 MHandle->SetX(Pos);
1807 MHandle->SetR(Rot);
1809 {
1810 Dynamic->SetP(Pos);
1811 Dynamic->SetQ(Rot);
1812 }
1813 }
1814
1815 // Static Particles
1816 UE_DEPRECATED(5.4, "Use GetX or SetX instead")
1822 UE_DEPRECATED(5.4, "Use GetX instead")
1823 const FVec3& X() const { return MHandle->GetX(); }
1824 void SetX(const FVec3& InX) { MHandle->SetX(InX); }
1825 const FVec3& GetX() const { return MHandle->GetX(); }
1826 UE_DEPRECATED(5.4, "Use GetR or SetR instead")
1827 FRotation3 R() { return MHandle->GetR(); }
1828 UE_DEPRECATED(5.4, "Use GetR instead")
1829 const FRotation3 R() const { return MHandle->GetR(); }
1830 void SetR(const FRotation3& InR) { MHandle->SetR(InR); }
1831 const FRotation3 GetR() const { return MHandle->GetR(); }
1832 const FImplicitObjectRef GetGeometry() const { return MHandle->GetGeometry(); }
1833 bool Sleeping() const { return MHandle->Sleeping(); }
1834 FString ToString() const { return MHandle->ToString(); }
1835
1836 UE_DEPRECATED(5.4, "Use GetGeometry instead")
1838
1839 UE_DEPRECATED(5.4, "Use GetGeometry instead")
1841
1842 bool EnabledDuringResim() const { return MHandle->EnabledDuringResim(); }
1843
1844 template <typename Container>
1845 const auto& AuxilaryValue(const Container& AuxContainer) const { return MHandle->AuxilaryValue(AuxContainer); }
1846 template <typename Container>
1848
1849 // Kinematic Particles
1850 const FVec3 V() const { return GetV(); }
1851 const FVec3 W() const { return GetW(); }
1852
1853 const FVec3 GetV() const { return (MHandle->CastToKinematicParticle()) ? MHandle->CastToKinematicParticle()->GetV() : ZeroVector; }
1854 const FVec3 GetW() const { return (MHandle->CastToKinematicParticle()) ? MHandle->CastToKinematicParticle()->GetW() : ZeroVector; }
1855
1856 void SetV(const FVec3& InV) { if (MHandle->CastToKinematicParticle()) { MHandle->CastToKinematicParticle()->SetV(InV); } }
1857 void SetW(const FVec3& InW) { if (MHandle->CastToKinematicParticle()) { MHandle->CastToKinematicParticle()->SetW(InW); } }
1858
1859 const FVec3f GetVf() const { return (MHandle->CastToKinematicParticle()) ? MHandle->CastToKinematicParticle()->GetVf() : ZeroVectorf; }
1860 const FVec3f GetWf() const { return (MHandle->CastToKinematicParticle()) ? MHandle->CastToKinematicParticle()->GetWf() : ZeroVectorf; }
1861
1862 void SetVf(const FVec3f& InV) { if (MHandle->CastToKinematicParticle()) { MHandle->CastToKinematicParticle()->SetVf(InV); } }
1863 void SetWf(const FVec3f& InW) { if (MHandle->CastToKinematicParticle()) { MHandle->CastToKinematicParticle()->SetWf(InW); } }
1864
1865 const FKinematicTarget& KinematicTarget() const { return (MHandle->CastToKinematicParticle())? MHandle->CastToKinematicParticle()->KinematicTarget() : EmptyKinematicTarget; }
1866
1867 // Dynamic Particles
1868
1869 // TODO: Make all of these check ObjectState to maintain current functionality
1871 {
1872 if (MHandle->CastToRigidParticle())
1873 {
1874 return MHandle->CastToRigidParticle()->CollisionParticlesSize();
1875 }
1876
1877 return 0;
1878 }
1879
1881 {
1882 if (MHandle->CastToRigidParticle())
1883 {
1884 return MHandle->CastToRigidParticle()->CollisionParticles();
1885 }
1886
1887 return NullBVHParticles;
1888 }
1889
1891 {
1892 if (MHandle->CastToRigidParticle())
1893 {
1894 return MHandle->CastToRigidParticle()->CollisionGroup();
1895 }
1896
1897 return 0;
1898 }
1899
1900 bool CCDEnabled() const
1901 {
1902 if (MHandle->CastToRigidParticle())
1903 {
1904 return MHandle->CastToRigidParticle()->CCDEnabled();
1905 }
1906
1907 return false;
1908 }
1909
1910 bool MACDEnabled() const
1911 {
1912 if (MHandle->CastToRigidParticle())
1913 {
1914 return MHandle->CastToRigidParticle()->MACDEnabled();
1915 }
1916
1917 return false;
1918 }
1919
1921 {
1922 if (MHandle->CastToRigidParticle())
1923 {
1924 return MHandle->CastToRigidParticle()->PartialIslandSleepAllowed();
1925 }
1926
1927 return false;
1928 }
1929
1931 {
1932 if (MHandle->CastToRigidParticle())
1933 {
1934 return MHandle->CastToRigidParticle()->IterationSettings();
1935 }
1936
1937 return Private::FIterationSettings(0, 0, 0);
1938
1939 }
1940
1942 {
1943 if (MHandle->CastToRigidParticle())
1944 {
1945 return MHandle->CastToRigidParticle()->HasCollisionConstraintFlag(Flag);
1946 }
1947
1948 return false;
1949 }
1950
1951
1952 // @todo(ccaulfield): should be available on all types?
1953 bool Disabled() const
1954 {
1955 if (MHandle->CastToRigidParticle())
1956 {
1957 return MHandle->CastToRigidParticle()->Disabled();
1958 }
1959
1960 return false;
1961 }
1962
1963 const FVec3 PreV() const
1964 {
1965 if (MHandle->CastToRigidParticle())
1966 {
1967 return MHandle->CastToRigidParticle()->GetPreV();
1968 }
1969
1970 return ZeroVector;
1971 }
1972
1973 const FVec3 PreW() const
1974 {
1975 if (MHandle->CastToRigidParticle())
1976 {
1977 return MHandle->CastToRigidParticle()->GetPreW();
1978 }
1979 return ZeroVector;
1980 }
1981
1982 const FVec3f GetPreVf() const
1983 {
1984 if (MHandle->CastToRigidParticle())
1985 {
1986 return MHandle->CastToRigidParticle()->GetPreVf();
1987 }
1988
1989 return ZeroVectorf;
1990 }
1991
1992 const FVec3f GetPreWf() const
1993 {
1994 if (MHandle->CastToRigidParticle())
1995 {
1996 return MHandle->CastToRigidParticle()->GetPreWf();
1997 }
1998 return ZeroVectorf;
1999 }
2000
2002 {
2003 if (MHandle->CastToRigidParticle())
2004 {
2005 return MHandle->CastToRigidParticle()->SolverBodyIndex();
2006 }
2007 return INDEX_NONE;
2008 }
2009
2011 {
2012 if (MHandle->CastToRigidParticle())
2013 {
2014 return MHandle->CastToRigidParticle()->SetSolverBodyIndex(InSolverBodyIndex);
2015 }
2016 }
2017
2018 void SetP(const FVec3& InP)
2019 {
2020 if (IsDynamic())
2021 {
2022 return MHandle->CastToRigidParticle()->SetP(InP);
2023 }
2024
2025 return SetX(InP);
2026 }
2027
2028 const FVec3& P() const
2029 {
2030 if (IsDynamic())
2031 {
2032 return MHandle->CastToRigidParticle()->GetP();
2033 }
2034
2035 return GetX();
2036 }
2037
2038 const FVec3& GetP() const
2039 {
2040 return P();
2041 }
2042
2043 void SetQ(const FRotation3& InQ)
2044 {
2045 if (IsDynamic())
2046 {
2047 return MHandle->CastToRigidParticle()->SetQ(InQ);
2048 }
2049
2050 SetR(InQ);
2051 }
2052
2053 const FRotation3 Q() const
2054 {
2055 if (IsDynamic())
2056 {
2057 return MHandle->CastToRigidParticle()->GetQ();
2058 }
2059
2060 return GetR();
2061 }
2062
2063 const FRotation3 GetQ() const
2064 {
2065 return Q();
2066 }
2067
2068 // World-space center of mass position
2069 const FVec3 XCom() const
2070 {
2071 if (IsDynamic())
2072 {
2073 return MHandle->CastToRigidParticle()->XCom();
2074 }
2075 return GetX();
2076 }
2077 const FVec3 PCom() const
2078 {
2079 if (IsDynamic())
2080 {
2081 return MHandle->CastToRigidParticle()->PCom();
2082 }
2083 return GetX();
2084 }
2085
2086 // World-space center of mass rotation
2087 const FRotation3 RCom() const
2088 {
2089 if (IsDynamic())
2090 {
2091 return MHandle->CastToRigidParticle()->RCom();
2092 }
2093 return GetR();
2094 }
2095 const FRotation3 QCom() const
2096 {
2097 if (IsDynamic())
2098 {
2099 return MHandle->CastToRigidParticle()->QCom();
2100 }
2101 return GetR();
2102 }
2103
2104 void InitTransform(const FVec3& InP, const FRotation3& InQ)
2105 {
2106 if (MHandle->CastToRigidParticle())
2107 {
2108 MHandle->CastToRigidParticle()->InitTransform(InP, InQ);
2109 }
2110 MHandle->InitTransform(InP, InQ);
2111 }
2112
2114 {
2115 if (IsDynamic())
2116 {
2117 MHandle->CastToRigidParticle()->SetTransformPQCom(InPCom, InQCom);
2118 }
2119 else
2120 {
2122 }
2123 }
2124
2126 {
2127 return MHandle->GetTransformXR();
2128 }
2129
2131 {
2132 if (IsDynamic())
2133 {
2134 return MHandle->CastToRigidParticle()->GetTransformPQ();
2135 }
2136 return MHandle->GetTransformXR();
2137 }
2138
2140 {
2141 if (IsDynamic())
2142 {
2143 return MHandle->CastToRigidParticle()->GetTransformXRCom();
2144 }
2145 return GetTransformXR();
2146 }
2147
2149 {
2150 if (IsDynamic())
2151 {
2152 return MHandle->CastToRigidParticle()->GetTransformPQCom();
2153 }
2154 return GetTransformXR();
2155 }
2156
2161 {
2162 if (IsDynamic())
2163 {
2165 return Rigid->RotationOfMass().UnrotateVector(P - Rigid->CenterOfMass());
2166 }
2167 return P;
2168 }
2169
2174 {
2175 if (IsDynamic())
2176 {
2178 return Rigid->RotationOfMass().Inverse() * Q;
2179 }
2180 return Q;
2181 }
2182
2187 {
2188 if (IsDynamic())
2189 {
2190 return FRigidTransform3(GetComRelativePosition(T.GetLocation()), GetComRelativeRotation(T.GetRotation()));
2191 }
2192 return T;
2193 }
2194
2195 const FVec3 VSmooth() const
2196 {
2197 if (MHandle->CastToRigidParticle())
2198 {
2199 return MHandle->CastToRigidParticle()->VSmooth();
2200 }
2201
2202 return V();
2203 }
2204
2205 const FVec3 WSmooth() const
2206 {
2207 if (MHandle->CastToRigidParticle())
2208 {
2209 return MHandle->CastToRigidParticle()->WSmooth();
2210 }
2211
2212 return W();
2213 }
2214
2215 const FVec3& Acceleration() const
2216 {
2217 if (MHandle->CastToRigidParticle())
2218 {
2219 return MHandle->CastToRigidParticle()->Acceleration();
2220 }
2221
2222 return ZeroVector;
2223 }
2225 {
2226 if (MHandle->CastToRigidParticle())
2227 {
2228 return MHandle->CastToRigidParticle()->AngularAcceleration();
2229 }
2230
2231 return ZeroVector;
2232 }
2233
2235 {
2236 return MHandle->ObjectState();
2237 }
2238
2240 {
2241 return MHandle->ParticleID();
2242 }
2243
2245 {
2246 return MHandle->UniqueIdx();
2247 }
2248
2249 bool HasBounds() const
2250 {
2251 return MHandle->HasBounds();
2252 }
2253
2254 const FAABB3& LocalBounds() const
2255 {
2256 return MHandle->LocalBounds();
2257 }
2258
2259 //Named this way for templated code (GT/PT particles)
2260 bool HasBoundingBox() const
2261 {
2262 return MHandle->HasBounds();
2263 }
2264
2265 //Named this way for templated code (GT/PT particles)
2266 const FAABB3& BoundingBox() const
2267 {
2268 return MHandle->WorldSpaceInflatedBounds();
2269 }
2270
2272 {
2273 return MHandle->WorldSpaceInflatedBounds();
2274 }
2275
2276 void UpdateWorldSpaceState(const FRigidTransform3& WorldTransform, const FVec3& BoundsExpansion)
2277 {
2278 MHandle->UpdateWorldSpaceState(WorldTransform, BoundsExpansion);
2279 }
2280
2281 const TVec3<FRealSingle> I() const
2282 {
2283 if (IsDynamic())
2284 {
2285 return MHandle->CastToRigidParticle()->I();
2286 }
2287
2288 return TVec3<FRealSingle>(0);
2289 }
2290
2292 {
2293 if (IsDynamic())
2294 {
2295 return MHandle->CastToRigidParticle()->InvI();
2296 }
2297
2298 return TVec3<FRealSingle>(0);
2299 }
2300
2301 FReal M() const
2302 {
2303 if (IsDynamic())
2304 {
2305 return MHandle->CastToRigidParticle()->M();
2306 }
2307
2308 return (FReal)0;
2309 }
2310
2311 FReal InvM() const
2312 {
2313 if (IsDynamic())
2314 {
2315 return MHandle->CastToRigidParticle()->InvM();
2316 }
2317
2318 return (FReal)0;
2319 }
2320
2322 {
2323 if (IsDynamic())
2324 {
2325 return MHandle->CastToRigidParticle()->CenterOfMass();
2326 }
2327
2328 return FVec3(0);
2329 }
2330
2332 {
2333 if (IsDynamic())
2334 {
2335 MHandle->CastToRigidParticle()->SetCenterOfMass(InCom);
2336 }
2337 }
2338
2340 {
2341 if (IsDynamic())
2342 {
2343 return MHandle->CastToRigidParticle()->RotationOfMass();
2344 }
2345
2346 return FRotation3::FromIdentity();
2347 }
2348
2350 {
2351 if (IsDynamic())
2352 {
2353 MHandle->CastToRigidParticle()->SetRotationOfMass(InRom);
2354 }
2355 }
2356
2358 {
2359 if (IsDynamic())
2360 {
2361 return MHandle->CastToRigidParticle()->InvIConditioning();
2362 }
2363
2364 return TVec3<FRealSingle>(1);
2365 }
2366
2368 {
2369 if (auto RigidHandle = MHandle->CastToRigidParticle())
2370 {
2371 RigidHandle->SetInvIConditioning(InInvIConditioning);
2372 }
2373 }
2374
2376 {
2377 if (IsDynamic())
2378 {
2379 return MHandle->CastToRigidParticle()->ConditionedInvI();
2380 }
2381
2382 return TVec3<FRealSingle>(0);
2383 }
2384
2386 {
2387 if (IsDynamic())
2388 {
2389 return MHandle->CastToRigidParticle()->ConditionedI();
2390 }
2391
2392 return TVec3<FRealSingle>(0);
2393 }
2394
2396 {
2397 if (auto RigidHandle = MHandle->CastToRigidParticle())
2398 {
2399 return RigidHandle->InertiaConditioningEnabled();
2400 }
2401 return false;
2402 }
2403
2405 {
2406 if (auto RigidHandle = MHandle->CastToRigidParticle())
2407 {
2408 return RigidHandle->InertiaConditioningDirty();
2409 }
2410 return false;
2411 }
2412
2414 {
2415 if (auto RigidHandle = MHandle->CastToRigidParticle())
2416 {
2417 RigidHandle->SetInertiaConditioningDirty();
2418 }
2419 }
2420
2422 {
2423 if (auto RigidHandle = MHandle->CastToRigidParticle())
2424 {
2425 RigidHandle->ClearInertiaConditioningDirty();
2426 }
2427 }
2428
2429 inline bool UseIgnoreCollisionManager() const
2430 {
2431 if (auto RigidHandle = MHandle->CastToRigidParticle())
2432 {
2433 return RigidHandle->UseIgnoreCollisionManager();
2434 }
2435 return false;
2436 }
2437
2439 {
2440 if (auto RigidHandle = MHandle->CastToRigidParticle())
2441 {
2442 RigidHandle->SetUseIgnoreCollisionManager();
2443 }
2444 }
2445
2447 {
2448 if (auto RigidHandle = MHandle->CastToRigidParticle())
2449 {
2450 RigidHandle->ClearUseIgnoreCollisionManager();
2451 }
2452 }
2453
2454 inline bool IsMovingKinematic() const
2455 {
2456 if (auto RigidHandle = MHandle->CastToRigidParticle())
2457 {
2458 return RigidHandle->IsMovingKinematic();
2459 }
2460 return false;
2461 }
2462
2464 {
2465 if (auto RigidHandle = MHandle->CastToRigidParticle())
2466 {
2467 RigidHandle->SetIsMovingKinematic();
2468 }
2469 }
2470
2472 {
2473 if (auto RigidHandle = MHandle->CastToRigidParticle())
2474 {
2475 RigidHandle->ClearIsMovingKinematic();
2476 }
2477 }
2478
2480 {
2481 if (auto RigidHandle = MHandle->CastToRigidParticle())
2482 {
2483 return RigidHandle->LinearEtherDrag();
2484 }
2485 return FReal(0);
2486 }
2487
2489 {
2490 if (auto RigidHandle = MHandle->CastToRigidParticle())
2491 {
2492 return RigidHandle->AngularEtherDrag();
2493 }
2494 return FReal(0);
2495 }
2496
2498 {
2499 if (auto RigidHandle = MHandle->CastToRigidParticle())
2500 {
2501 return RigidHandle->InitialOverlapDepenetrationVelocity();
2502 }
2503 return -1.0f; // Use config
2504 }
2505
2507 {
2508 if (auto RigidHandle = MHandle->CastToRigidParticle())
2509 {
2510 return RigidHandle->SleepThresholdMultiplier();
2511 }
2512 return 1.0f;
2513 }
2514
2516 {
2517 if (auto RigidHandle = MHandle->CastToRigidParticle())
2518 {
2519 return RigidHandle->OneWayInteraction();
2520 }
2521 return false;
2522 }
2523
2524#if CHAOS_DEBUG_NAME
2525 const TSharedPtr<FString, ESPMode::ThreadSafe>& DebugName() const
2526 {
2527 return MHandle->DebugName();
2528 }
2529#endif
2530
2531 const FString& GetDebugName() const
2532 {
2533 return MHandle->GetDebugName();
2534 }
2535
2536
2538 {
2539 return MHandle->IsInConstraintGraph();
2540 }
2541
2546
2551
2552 const FShapesArray& ShapesArray() const { return MHandle->ShapesArray(); }
2553 const FShapeInstanceArray& ShapeInstances() const { return MHandle->ShapeInstances(); }
2554
2555 static constexpr EParticleType StaticType()
2556 {
2558 }
2559
2560 // Deprecated API
2561 UE_DEPRECATED(5.3, "No longer supported") int32 IslandIndex() const { return INDEX_NONE; }
2562 UE_DEPRECATED(5.3, "No longer supported") void SetIslandIndex(const int32 IslandIndex) {}
2563 UE_DEPRECATED(5.3, "No longer supported") int32 ConstraintGraphIndex() const { return INDEX_NONE; }
2564 UE_DEPRECATED(5.3, "No longer supported") void SetConstraintGraphIndex(const int32 InGraphIndex) {}
2565
2566private:
2567 FGeometryParticleHandle* MHandle;
2568
2569 // So we can return vectors by const ref in cases where there's no real value. E.g., Velocity of a Static.
2570 static CHAOS_API const FVec3 ZeroVector;
2571 static CHAOS_API const FVec3f ZeroVectorf;
2572 static CHAOS_API const FRotation3 IdentityRotation;
2573 static CHAOS_API const FMatrix33 ZeroMatrix;
2574 static CHAOS_API const TUniquePtr<FBVHParticles> NullBVHParticles;
2575 static CHAOS_API const FKinematicTarget EmptyKinematicTarget;
2576};
2577
2578template <typename T, int d>
2579using TGenericParticleHandleHandleImp UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FGenericParticleHandleImp instead") = FGenericParticleHandleImp;
2580
2590{
2591public:
2592 FGenericParticleHandle() : Imp(nullptr) {}
2594
2596 FGenericParticleHandleImp* Get() const { return const_cast<FGenericParticleHandleImp*>(&Imp); }
2597
2598 bool IsValid() const { return Imp.Handle() != nullptr; }
2599
2601 {
2602 return GetTypeHash(H->ParticleID());
2603 }
2604
2606 {
2607 return L->ParticleID() == R->ParticleID();
2608 }
2609
2611 {
2612 return !(L->ParticleID() == R->ParticleID());
2613 }
2614
2616 {
2617 return L->ParticleID() < R->ParticleID();
2618 }
2619
2620private:
2622};
2623
2624template <typename T, int d>
2625using TGenericParticleHandle UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FGenericParticleHandle instead") = FGenericParticleHandle;
2626
2628{
2629public:
2633
2634 const FGenericParticleHandleImp* operator->() const { return &Imp; }
2635 const FGenericParticleHandleImp* Get() const { return &Imp; }
2636
2637 bool IsValid() const { return Imp.Handle() != nullptr; }
2638
2640 {
2641 return GetTypeHash(H->ParticleID());
2642 }
2643
2645 {
2646 return L->ParticleID() == R->ParticleID();
2647 }
2648
2650 {
2651 return L->ParticleID() < R->ParticleID();
2652 }
2653
2654private:
2656};
2657
2658template <typename T, int d>
2659using TConstGenericParticleHandle UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FConstGenericParticleHandle instead") = FConstGenericParticleHandle;
2660
2661template <typename T, int d>
2663{
2664public:
2666 {
2667 AddArray(&Handles);
2668 }
2669
2674
2675 void Reset()
2676 {
2677 ResizeHelper(0);
2678 }
2679
2681 {
2682 const int32 UnstableIdx = Handle->HandleIdx;
2683
2684#if UE_DEBUG_DANGLING_HANDLES
2685 // This helps to detect dangling handles and associated memory corruptions
2686 // Leaking memory deliberately here, so only use this while debugging
2687 Handles[UnstableIdx]->~TGeometryParticleHandleImp();
2688 (void)Handles[UnstableIdx].Release();
2689#endif
2690
2692 if (static_cast<uint32>(UnstableIdx) < Size())
2693 {
2694 Handles[UnstableIdx]->HandleIdx = UnstableIdx;
2695 }
2696 }
2697
2699 {
2700 Ar << Handles;
2701 ResizeHelper(Handles.Num());
2702 }
2703
2704 const TUniquePtr<TGeometryParticleHandle<T, d>>& Handle(int32 Idx) const { return Handles[Idx];}
2706private:
2708};
2709
2710template <typename T, int d>
2711class TKinematicGeometryParticle;
2712
2713template <typename T, int d>
2714class TPBDRigidParticle;
2715
2716
2724{
2725public:
2729
2731
2732 virtual ~FParticleData() = default;
2733
2735};
2736
2737template <typename T, int d>
2739{
2740public:
2742
2743 static constexpr bool AlwaysSerializable = true;
2744
2745protected:
2746
2754
2755public:
2760
2761 virtual ~TGeometryParticle() //only virtual for easier memory management. Should generally be a static API
2762 {
2763 SetUniqueIdx(FUniqueIdx{}, false); // Set to an invalid index for dangling handle detection
2764 }
2765
2767
2769
2770 virtual void Serialize(FChaosArchive& Ar)
2771 {
2772 Ar << MXR;
2773 Ar << MNonFrequentData;
2774 Ar << MShapesArray;
2775 Ar << Type;
2776 //Ar << MDirtyFlags;
2777
2780 {
2782 }
2783 }
2784
2785 virtual bool IsParticleValid() const
2786 {
2787 auto Geometry = MNonFrequentData.Read().GetGeometry();
2788 return Geometry && Geometry->IsValidGeometry(); //todo: if we want support for sample particles without geometry we need to adjust this
2789 }
2790
2792
2793 const TVector<T, d>& X() const { return MXR.Read().X(); }
2794 const TVector<T, d>& GetX() const { return MXR.Read().X(); }
2795 void SetX(const TVector<T, d>& InX, bool bInvalidate = true);
2796
2797 FUniqueIdx UniqueIdx() const { return MNonFrequentData.Read().UniqueIdx(); }
2799 {
2800 MNonFrequentData.Modify(bInvalidate,MDirtyFlags,Proxy,[UniqueIdx](auto& Data){ Data.SetUniqueIdx(UniqueIdx);});
2801 }
2802
2803 const FParticleID& ParticleID() const { return MNonFrequentData.Read().ParticleID(); }
2805 {
2806 if (this->ParticleID() == ParticleID)
2807 {
2808 return;
2809 }
2810
2811 MNonFrequentData.Modify(bInvalidate, MDirtyFlags, Proxy, [ParticleID](auto& Data) { Data.SetParticleID(ParticleID); });
2812 }
2813
2814 const TRotation<T, d> R() const { return MXR.Read().R(); }
2815 const TRotation<T, d> GetR() const { return MXR.Read().R(); }
2816 void SetR(const TRotation<T, d>& InR, bool bInvalidate = true);
2817
2818 const FParticlePositionRotation& XR() const { return MXR.Read(); }
2820 {
2821 MXR.Write(InXR,bInvalidate,MDirtyFlags,Proxy);
2822 }
2823
2824 //todo: geometry should not be owned by particle
2826 {
2827 MNonFrequentData.Modify(true,MDirtyFlags,Proxy,[&ImplicitObjectPtr](auto& Data){ Data.SetGeometry(Chaos::FImplicitObjectPtr(ImplicitObjectPtr));});
2829 }
2830
2832
2833 const FImplicitObjectRef GetGeometry() const { return MNonFrequentData.Read().GetGeometry(); }
2834
2835 // Set a flag on all Unions to indicate that any add/remove operations are errors.
2836 // This is called when the shapes are shared between GT/PT
2837 void LockGeometry();
2838
2839 UE_DEPRECATED(5.4, "Use SetGeometry with an array of Chaos::FImplicitObjectPtr instead")
2841
2842 UE_DEPRECATED(5.4, "Use SetGeometry with an array of Chaos::FImplicitObjectPtr instead")
2844
2845 UE_DEPRECATED(5.4, "Use SetGeometry with an array of Chaos::FImplicitObjectPtr instead")
2847
2848 UE_DEPRECATED(5.4, "Use MergeGeometry with an array of Chaos::FImplicitObjectPtr instead")
2850
2851 UE_DEPRECATED(5.4, "Use GetGeometry instead")
2852 TSharedPtr<const FImplicitObject,ESPMode::ThreadSafe> SharedGeometryLowLevel() const { check(false); return nullptr; }
2853
2854 UE_DEPRECATED(5.4, "Use GetGeometry instead")
2856
2859
2860 void* UserData() const { return MUserData; }
2862 {
2863 MUserData = InUserData;
2864 }
2865
2867 {
2869 }
2870
2872 {
2873 auto GeomShared = MNonFrequentData.Read().GetGeometry();
2874 if (GeomShared && GeomShared->HasBoundingBox())
2875 {
2876 for (auto& Shape : MShapesArray)
2877 {
2878 Shape->UpdateShapeBounds(Transform);
2879 }
2880 }
2881 }
2882
2884 {
2885 const bool bCurrent = MShapesArray[InShapeIndex]->GetSimEnabled();
2886 if(bCurrent != bInEnabled)
2887 {
2888 MShapesArray[InShapeIndex]->SetSimEnabled(bInEnabled);
2889 }
2890 }
2891
2893 {
2894 const bool bCurrent = MShapesArray[InShapeIndex]->GetQueryEnabled();
2895 if(bCurrent != bInEnabled)
2896 {
2897 MShapesArray[InShapeIndex]->SetQueryEnabled(bInEnabled);
2898 }
2899 }
2900
2902 {
2903 const EChaosCollisionTraceFlag Current = MShapesArray[InShapeIndex]->GetCollisionTraceType();
2904 if(Current != TraceType)
2905 {
2906 MShapesArray[InShapeIndex]->SetCollisionTraceType(TraceType);
2907 }
2908 }
2909
2911 {
2912 const FCollisionFilterData& Current = MShapesArray[InShapeIndex]->GetSimData();
2913 if(Current != SimData)
2914 {
2915 MShapesArray[InShapeIndex]->SetSimData(SimData);
2916 }
2917 }
2918
2919#if CHAOS_DEBUG_NAME
2920 const TSharedPtr<FString, ESPMode::ThreadSafe>& DebugName() const { return MNonFrequentData.Read().DebugName(); }
2922 {
2923 MNonFrequentData.Modify(true,MDirtyFlags,Proxy,[&InDebugName](auto& Data){ Data.SetDebugName(InDebugName);});
2924 }
2925#endif
2926
2927 const FString& GetDebugName() const
2928 {
2929#if CHAOS_DEBUG_NAME
2931 if (DebugNamePtr.IsValid())
2932 {
2933 return *(DebugNamePtr.Get());
2934 }
2935#endif
2937 }
2938
2943
2944 const FShapesArray& ShapesArray() const { return reinterpret_cast<const FShapesArray&>(MShapesArray); }
2945
2947 {
2948 return MShapesArray;
2949 }
2950
2951 //Note: this must be called after setting geometry. This API seems bad. Should probably be part of setting geometry
2953 {
2954 // This is only called after setting or merging geometry which resizes the shapes array
2955 // so we should always have enough elements at this point
2956 check(InShapes.Num() == MShapesArray.Num());
2957 MShapesArray = MoveTemp(InShapes);
2958 }
2959
2960 // Overwite the last N shapes with the data from InShapes. This is a highly dubious operation
2961 // provided as a utility for use in FPhysInterface_Chaos::AddGeometry. Ideally we would remove this
2963 {
2964 check(InShapes.Num() <= (MShapesArray.Num()));
2965 int Idx = MShapesArray.Num() - InShapes.Num();
2966 for (FShapeInstanceProxyPtr& Shape : InShapes)
2967 {
2968 ensure(Idx < MShapesArray.Num());
2969 Shape->ModifyShapeIndex(Idx);
2970 MShapesArray[Idx++] = MoveTemp(Shape);
2971 }
2972 }
2973
2974
2975 void SetIgnoreAnalyticCollisionsImp(FImplicitObject* Implicit, bool bIgnoreAnalyticCollisions);
2976
2977 CHAOS_API void SetIgnoreAnalyticCollisions(bool bIgnoreAnalyticCollisions);
2978
2980
2982 {
2983 return Type;
2984 }
2985
2986
2987
2990
2993
2994 FSpatialAccelerationIdx SpatialIdx() const { return MNonFrequentData.Read().SpatialIdx(); }
2996 {
2997 MNonFrequentData.Modify(true,MDirtyFlags,Proxy,[Idx](auto& Data){ Data.SetSpatialIdx(Idx);});
2998 }
2999
3001 {
3002 MNonFrequentData.Modify(true, MDirtyFlags, Proxy, [ResimType](auto& Data) { Data.SetResimType(ResimType); });
3003 }
3004
3006 {
3007 return MNonFrequentData.Read().ResimType();
3008 }
3009
3010 void SetEnabledDuringResim(bool bEnabledDuringResim)
3011 {
3012 MNonFrequentData.Modify(true, MDirtyFlags, Proxy, [bEnabledDuringResim](auto& Data) { Data.SetEnabledDuringResim(bEnabledDuringResim); });
3013 }
3014
3016 {
3017 return MNonFrequentData.Read().EnabledDuringResim();
3018 }
3019
3020
3022 {
3023 MNonFrequentData.Write(InData,true,MDirtyFlags,Proxy);
3024 }
3025
3026 bool IsDirty() const
3027 {
3028 return MDirtyFlags.IsDirty();
3029 }
3030
3031 bool IsClean() const
3032 {
3033 return MDirtyFlags.IsClean();
3034 }
3035
3037 {
3039 }
3040
3045
3047 {
3048 return MDirtyFlags;
3049 }
3050
3052 {
3054 }
3055
3057 {
3058 if (Proxy)
3059 {
3060 return static_cast<TGeometryParticleHandle<T, d>*>(Proxy->GetHandleUnsafe());
3061 }
3062
3063 return nullptr;
3064 }
3065
3066
3068 {
3069 RemoteData.SetParticleBufferType(Type);
3070 RemoteData.SetFlags(MDirtyFlags);
3071 SyncRemoteDataImp(Manager, DataIdx, RemoteData);
3072
3073 for(const int32 ShapeDataIdx : ShapeDataIndices)
3074 {
3076 const int32 ShapeIdx = ShapeRemoteData.GetShapeIdx();
3077 MShapesArray[ShapeIdx]->SyncRemoteData(Manager, ShapeDataIdx, ShapeRemoteData);
3078 }
3079 }
3080
3081 // Update the BVH in the geometry hierarchy if we have new geometry
3082 // This exists so that we don't repeatedly rebuild the BVH when welding, for example,
3083 // although ideally we would remove this and change the way welding works
3085 {
3086 if (MNonFrequentData.IsDirty(MDirtyFlags))
3087 {
3089 }
3090 }
3091
3093 {
3094 return Proxy;
3095 }
3096
3098 {
3099 Proxy = InProxy;
3100 if(Proxy)
3101 {
3102 if(MDirtyFlags.IsDirty())
3103 {
3105 {
3106 PhysicsSolverBase->AddDirtyProxy(Proxy);
3107 }
3108 }
3109 }
3110
3111 for(auto& Shape : MShapesArray)
3112 {
3113 Shape->SetProxy(Proxy);
3114 }
3115 }
3116
3117protected:
3118
3119 // Pointer to any data that the solver wants to associate with this particle
3120 // TODO: It's important to eventually hide this!
3121 // Right now it's exposed to lubricate the creation of the whole proxy system.
3123
3124 /*
3125 * Describes how a call to ModifyGeometry wishes to access the underlying particle geometry
3126 */
3128 {
3129 // Grant direct access to the geometry, use with care - if the geometry is in
3130 // use inside a solver this will likely be unsafe. If the geometry is not
3131 // in use, all calls to ModifyGeometry will use Direct
3132 Direct,
3133
3134 // Create a new root union, but shallow copy all geometries within the union.
3135 // This is fine if you are only removing shapes, or adding shapes. If you require
3136 // the ability to modify the actual geometry you must take a deep copy.
3138
3139 // Create a new root union and deep copy all geometries within it. This is required
3140 // if you intend to actually modify the geometry itself and not just grow/shrink
3141 // the number of shapes on the particle
3142 DeepCopy
3143 };
3144
3145 template <typename Lambda>
3146 void ModifyGeometry(const Lambda& Func, const bool bDirectAccess = false)
3147 {
3149 }
3150
3151 template <typename Lambda>
3152 void ModifyGeometry(EGeometryAccess AccessType, const Lambda& Func)
3153 {
3155 FPhysicsSolverBase* Solver = Proxy ? Proxy->GetSolverBase() : nullptr;
3156
3157 if(Solver == nullptr)
3158 {
3159 //not registered yet so we can still modify geometry safely
3160 AccessType = EGeometryAccess::Direct;
3161 }
3163 {
3164 AccessType = EGeometryAccess::DeepCopy;
3165 }
3166
3167 MNonFrequentData.Modify(true, MDirtyFlags, Proxy, [this, Solver, &Func, AccessType](auto& Data)
3168 {
3170 bool bNewGeom = false;
3171 if(Data.GetGeometry())
3172 {
3173 switch(AccessType)
3174 {
3175 case EGeometryAccess::Direct:
3176 GeomToModify = Data.AccessGeometryDangerous();
3177 break;
3178 case EGeometryAccess::ShallowCopy:
3179 GeomToModify = Data.GetGeometry()->CopyGeometry();
3180 bNewGeom = true;
3181 break;
3182 case EGeometryAccess::DeepCopy:
3183 GeomToModify = Data.GetGeometry()->DeepCopyGeometry();
3184 bNewGeom = true;
3185 break;
3186 default:
3187 check(false);
3188 break;
3189 }
3190
3191 Func(*GeomToModify);
3192
3193 if(bNewGeom)
3194 {
3195 //must set geometry after because shapes are rebuilt and we want them to know about anything Func did
3196 Data.SetGeometry(GeomToModify);
3197 }
3198 else
3199 {
3200 // Only invalidate the geometry if we modified the existing one.
3201 // New geometry will be always evaluated the first time it is seen
3203 }
3205 }
3206 });
3207 }
3208private:
3209
3212 void* MUserData;
3213
3214 FShapeInstanceProxyArray MShapesArray;
3215
3216public:
3217 UE_DEPRECATED(5.4, "Use GetGeometry instead")
3218 const TSharedPtr<const FImplicitObject, ESPMode::ThreadSafe>& GeometrySharedLowLevel() const
3219 {
3221 return DummyPtr;
3222 }
3223
3224private:
3225
3226protected:
3227
3230
3232
3233 CHAOS_API void UpdateShapesArray();
3234
3235 void PrepareBVHImpl();
3236
3238 {
3239 MXR.SyncRemote(Manager, DataIdx, RemoteData);
3240 MNonFrequentData.SyncRemote(Manager, DataIdx, RemoteData);
3241 }
3242};
3243
3244// Update all the shapes datas including the convexes ones
3245template<typename ParticleType>
3247 const FShapesArray& ShapesArray, const int32 ActorId, const int32 ComponentID)
3248{
3249 if (!ShapesParticles.IsEmpty() && (ShapesParticles.Num() <= (ShapesArray.Num())))
3250 {
3251 for (int32 ParticleIndex = 0; ParticleIndex < ShapesParticles.Num(); ++ParticleIndex)
3252 {
3253 const TUniquePtr<Chaos::FPerShapeData>& ShapeData = ShapesArray[ParticleIndex];
3254 const TUniquePtr<Chaos::FPerShapeData>& TemplateShape = ShapesParticles[ParticleIndex]->ShapesArray()[0];
3255
3256 if (ShapeData && TemplateShape)
3257 {
3258 {
3259 FCollisionData Data = TemplateShape->GetCollisionData();
3260 Data.UserData = nullptr;
3261 ShapeData->SetCollisionData(Data);
3262 }
3263
3264 {
3265 FCollisionFilterData Data = TemplateShape->GetQueryData();
3266 Data.Word0 = ActorId;
3267 ShapeData->SetQueryData(Data);
3268 }
3269
3270 {
3271 FCollisionFilterData Data = TemplateShape->GetSimData();
3272 Data.Word0 = 0;
3273 Data.Word2 = ComponentID;
3274 ShapeData->SetSimData(Data);
3275 }
3276
3277 ShapeData->SetSimEnabled(TemplateShape->GetSimEnabled());
3278 ShapeData->SetQueryEnabled(TemplateShape->GetQueryEnabled());
3279 }
3280 }
3281 }
3282}
3283
3284template <typename T, int d>
3286{
3287 Particle.Serialize(Ar);
3288 return Ar;
3289}
3290
3291template <typename T, int d>
3293{
3294public:
3296
3297 using TGeometryParticle<T, d>::Type;
3298 using TGeometryParticle<T, d>::CastToRigidParticle;
3300 using Base::MDirtyFlags;
3301
3302protected:
3303 using Base::Proxy;
3304
3312public:
3317
3318 virtual void Serialize(FChaosArchive& Ar) override
3319 {
3321 Ar << MVelocities;
3322 //Ar << MKinematicTarget; // TODO
3323 }
3324
3325 const TVector<T, d> V() const { return MVelocities.Read().V(); }
3326 const TVector<T, d> GetV() const { return MVelocities.Read().V(); }
3327 void SetV(const TVector<T, d>& InV, bool bInvalidate = true);
3328
3329 const TVector<T, d> W() const { return MVelocities.Read().W(); }
3330 const TVector<T, d> GetW() const { return MVelocities.Read().W(); }
3331 void SetW(const TVector<T, d>& InW, bool bInvalidate = true);
3332
3334 return MKinematicTarget.Read();
3335 }
3336
3337 void SetKinematicTarget(const FKinematicTarget& KinematicTarget, bool bInvalidate = true)
3338 {
3339 MKinematicTarget.Write(KinematicTarget, bInvalidate, MDirtyFlags, Proxy);
3340 }
3341
3343 {
3344 return MKinematicTarget.IsDirty(MDirtyFlags);
3345 }
3346
3348 {
3349 MKinematicTarget.Clear(MDirtyFlags, Proxy);
3350 }
3351
3352 const FParticleVelocities& Velocities() const { return MVelocities.Read(); }
3354 {
3355 MVelocities.Write(InVelocities,bInvalidate,MDirtyFlags,Proxy);
3356 }
3357
3359
3361 {
3362 return Particle ? Particle->CastToKinematicParticle() : nullptr;
3363 }
3364
3366 {
3367 return Particle ? Particle->CastToKinematicParticle() : nullptr;
3368 }
3369
3370
3371private:
3374
3375protected:
3377 {
3378 Base::SyncRemoteDataImp(Manager, DataIdx, RemoteData);
3379 MVelocities.SyncRemote(Manager, DataIdx, RemoteData);
3380 MKinematicTarget.SyncRemote(Manager, DataIdx, RemoteData);
3381 }
3382};
3383
3384template <typename T, int d>
3386{
3387public:
3389
3390 using TGeometryParticle<T, d>::Type;
3392
3393 using Base::MDirtyFlags;
3394
3395protected:
3396 using Base::Proxy;
3399 : TKinematicGeometryParticle<T, d>(DynamicParams), MWakeEvent(EWakeEventEntry::None)
3400 {
3401 Type = EParticleType::Rigid;
3402 MIsland = INDEX_NONE;
3403 PBDRigidParticleDefaultConstruct<T, d>(*this, DynamicParams);
3404 ClearForces();
3405 ClearTorques();
3406 SetObjectState(DynamicParams.bStartSleeping ? EObjectStateType::Sleeping : EObjectStateType::Dynamic);
3407 ClearEvents();
3408 SetInitialized(false);
3409 }
3410public:
3411
3416
3417 void Serialize(FChaosArchive& Ar) override
3418 {
3420 Ar << MDynamics;
3421
3422 Ar << MIsland;
3423
3424 // remove on fracture is deprecated and has been removed, so to avoid versioning let's just use a local variable instead
3427 }
3428
3429 //const TUniquePtr<TBVHParticles<T, d>>& CollisionParticles() const { return MCollisionParticles; }
3430
3431 int32 CollisionGroup() const { return MMiscData.Read().CollisionGroup(); }
3433 {
3434 MMiscData.Modify(true,MDirtyFlags,Proxy,[InCollisionGroup](auto& Data){ Data.SetCollisionGroup(InCollisionGroup);});
3435 }
3436
3437 /*
3438 bool Disabled() const { return MMiscData.Read().bDisabled; }
3439 void SetDisabled(const bool InDisabled)
3440 {
3441 MMiscData.Modify(true,MDirtyFlags,Proxy,[InDisabled](auto& Data){ Data.bDisabled = InDisabled;});
3442 }*/
3443
3444 bool GravityEnabled() const { return MMiscData.Read().GravityEnabled(); }
3446 {
3447 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInEnabled](auto& Data) { Data.SetGravityEnabled(bInEnabled); });
3448 }
3449
3450 int32 GravityGroupIndex() const { return MMiscData.Read().GravityGroupIndex(); }
3452 {
3453 MMiscData.Modify(true, MDirtyFlags, Proxy, [NewIndex](auto& Data) { Data.SetGravityGroupIndex(NewIndex); });
3454 }
3455
3456 bool UpdateKinematicFromSimulation() const { return MMiscData.Read().UpdateKinematicFromSimulation(); }
3457 void SetUpdateKinematicFromSimulation(const bool bUpdateKinematicFromSimulation)
3458 {
3459 MMiscData.Modify(true, MDirtyFlags, Proxy, [bUpdateKinematicFromSimulation](auto& Data) { Data.SetUpdateKinematicFromSimulation(bUpdateKinematicFromSimulation); });
3460 }
3461
3462 bool GyroscopicTorqueEnabled() const { return MMiscData.Read().GyroscopicTorqueEnabled(); }
3463 void SetGyroscopicTorqueEnabled(const bool bGyroscopicTorqueEnabled)
3464 {
3465 MMiscData.Modify(true, MDirtyFlags, Proxy, [bGyroscopicTorqueEnabled](auto& Data) { Data.SetGyroscopicTorqueEnabled(bGyroscopicTorqueEnabled); });
3466 }
3467
3468 bool OneWayInteraction() const { return MMiscData.Read().OneWayInteraction(); }
3470 {
3471 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInEnabled](auto& Data) { Data.SetOneWayInteraction(bInEnabled); });
3472 }
3473
3474 // Enable a single flag
3476 {
3477 MMiscData.Modify(true, MDirtyFlags, Proxy, [Flag](auto& Data) { Data.AddCollisionConstraintFlag(Flag); });
3478 }
3479 // Disable a single flag
3481 {
3482 MMiscData.Modify(true, MDirtyFlags, Proxy, [Flag](auto& Data) { Data.RemoveCollisionConstraintFlag(Flag); });
3483 }
3484 // A mask of all the active flags
3485 uint32 CollisionConstraintFlags() const { return MMiscData.Read().CollisionConstraintFlags(); }
3486 // Replace all flags
3488 {
3489 MMiscData.Modify(true, MDirtyFlags, Proxy, [Flags](auto& Data) { Data.SetCollisionConstraintFlags(Flags); });
3490 }
3491
3492 bool CCDEnabled() const { return MMiscData.Read().CCDEnabled(); }
3494 {
3495 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInEnabled](auto& Data) { Data.SetCCDEnabled(bInEnabled); });
3496 }
3497
3498 bool MACDEnabled() const { return MMiscData.Read().MACDEnabled(); }
3500 {
3501 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInEnabled](auto& Data) { Data.SetMACDEnabled(bInEnabled); });
3502 }
3503
3504 bool PartialIslandSleepAllowed() const { return MMiscData.Read().PartialIslandSleepAllowed(); }
3506 {
3507 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInEnabled](auto& Data) { Data.SetPartialIslandSleepAllowed(bInEnabled); });
3508 }
3509
3510 Private::FIterationSettings IterationSettings() const { return MMiscData.Read().IterationSettings(); }
3511
3513 {
3514 MMiscData.Modify(true, MDirtyFlags, Proxy, [SolverIterationSettingsIn](auto& Data) { Data.SetIterationSettings(SolverIterationSettingsIn); });
3515 }
3516
3517 void SetPositionSolverIterations(const int32 PositionSolverIterationCount)
3518 {
3519 MMiscData.Modify(true, MDirtyFlags, Proxy, [PositionSolverIterationCount](auto& Data) { Data.SetPositionSolverIterationCount(PositionSolverIterationCount); });
3520 }
3521
3522 void SetVelocitySolverIterations(const int32 VelocitySolverIterationCount)
3523 {
3524 MMiscData.Modify(true, MDirtyFlags, Proxy, [VelocitySolverIterationCount](auto& Data) { Data.SetVelocitySolverIterationCount(VelocitySolverIterationCount); });
3525 }
3526
3527 void SetProjectionSolverIterations(const int32 ProjectionSolverIterationCount)
3528 {
3529 MMiscData.Modify(true, MDirtyFlags, Proxy, [ProjectionSolverIterationCount](auto& Data) { Data.SetProjectionSolverIterationCount(ProjectionSolverIterationCount); });
3530 }
3531
3532 bool InertiaConditioningEnabled() const { return MMiscData.Read().InertiaConditioningEnabled(); }
3534 {
3535 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInEnabled](auto& Data) { Data.SetInertiaConditioningEnabled(bInEnabled); });
3536 }
3537
3538 bool Disabled() const { return MMiscData.Read().Disabled(); }
3539
3541 {
3542 MMiscData.Modify(true, MDirtyFlags, Proxy, [bInDisabled](auto& Data) {Data.SetDisabled(bInDisabled); });
3543 }
3544
3545 //todo: remove this
3546 bool IsInitialized() const { return MInitialized; }
3548 {
3549 this->MInitialized = InInitialized;
3550 }
3551
3552 const TVector<T, d> Acceleration() const { return MDynamics.Read().Acceleration(); }
3554 {
3555 MDynamics.Modify(bInvalidate, MDirtyFlags, Proxy, [&Acceleration](auto& Data) { Data.SetAcceleration(Acceleration); });
3556 }
3557
3558 void AddForce(const TVector<T, d>& InF, bool bInvalidate = true)
3559 {
3560 FReal InvMass = InvM();
3561 MDynamics.Modify(bInvalidate,MDirtyFlags,Proxy,[&InF, InvMass](auto& Data){ Data.SetAcceleration(InF * InvMass + Data.Acceleration());});
3562 }
3563
3564 void ClearForces(bool bInvalidate = true)
3565 {
3566 MDynamics.Modify(bInvalidate, MDirtyFlags, Proxy, [](auto& Data) { Data.SetAcceleration(FVec3(0)); });
3567 }
3568
3570 {
3571 if (MDynamics.IsDirty(MDirtyFlags))
3572 {
3573 MDynamics.Modify(false, MDirtyFlags, Proxy, [DynamicsWeight](auto& Data)
3574 {
3575 Data.SetAcceleration(Data.Acceleration() * DynamicsWeight);
3576 Data.SetAngularAcceleration(Data.AngularAcceleration() * DynamicsWeight);
3577 });
3578 }
3579 }
3580
3581 const TVector<T, d> AngularAcceleration() const { return MDynamics.Read().AngularAcceleration(); }
3583 {
3584 MDynamics.Modify(bInvalidate, MDirtyFlags, Proxy, [&InTorque](auto& Data) { Data.SetAngularAcceleration(InTorque);});
3585 }
3586 CHAOS_API void AddTorque(const TVector<T, d>& InTorque, bool bInvalidate=true);
3587
3588 void ClearTorques(bool bInvalidate = true)
3589 {
3590 MDynamics.Modify(bInvalidate, MDirtyFlags, Proxy, [](auto& Data) { Data.SetAngularAcceleration(FVec3(0)); });
3591 }
3592
3593 const TVector<T, d> LinearImpulseVelocity() const { return MDynamics.Read().LinearImpulseVelocity(); }
3595 {
3596 MDynamics.Modify(bInvalidate,MDirtyFlags,Proxy,[&InLinearImpulseVelocity](auto& Data){ Data.SetLinearImpulseVelocity(InLinearImpulseVelocity);});
3597 }
3598
3599 const TVector<T, d> AngularImpulseVelocity() const { return MDynamics.Read().AngularImpulseVelocity(); }
3601 {
3602 MDynamics.Modify(bInvalidate,MDirtyFlags,Proxy,[&InAngularImpulseVelocity](auto& Data){ Data.SetAngularImpulseVelocity(InAngularImpulseVelocity);});
3603 }
3604
3606 {
3607 MDynamics.Write(InDynamics,bInvalidate,MDirtyFlags,Proxy);
3608 }
3609
3611 {
3612 // Physics thread only. API required for FGeometryParticleStateBase::SyncToParticle
3613 }
3614
3615 const TVec3<FRealSingle>& I() const { return MMassProps.Read().I(); }
3616 void SetI(const TVec3<FRealSingle>& InI, bool bInvalidate = true)
3617 {
3618 MMassProps.Modify(bInvalidate,MDirtyFlags,Proxy,[&InI](auto& Data){ Data.SetI(InI);});
3619 }
3620
3621 const TVec3<FRealSingle>& InvI() const { return MMassProps.Read().InvI(); }
3623 {
3624 MMassProps.Modify(bInvalidate,MDirtyFlags,Proxy,[&InInvI](auto& Data){ Data.SetInvI(InInvI);});
3625 }
3626
3627 T M() const { return MMassProps.Read().M(); }
3628 void SetM(const T& InM, bool bInvalidate = true)
3629 {
3630 MMassProps.Modify(bInvalidate,MDirtyFlags,Proxy,[InM](auto& Data){ Data.SetM(InM);});
3631 }
3632
3633 T InvM() const { return MMassProps.Read().InvM(); }
3634 void SetInvM(const T& InInvM, bool bInvalidate = true)
3635 {
3636 MMassProps.Modify(bInvalidate,MDirtyFlags,Proxy,[InInvM](auto& Data){ Data.SetInvM(InInvM);});
3637 }
3638
3639 const TVector<T,d>& CenterOfMass() const { return MMassProps.Read().CenterOfMass(); }
3641 {
3642 MMassProps.Modify(bInvalidate,MDirtyFlags,Proxy,[&InCenterOfMass](auto& Data){ Data.SetCenterOfMass(InCenterOfMass);});
3643 }
3644
3645 const TRotation<T,d>& RotationOfMass() const { return MMassProps.Read().RotationOfMass(); }
3647 {
3648 MMassProps.Modify(bInvalidate,MDirtyFlags,Proxy,[&InRotationOfMass](auto& Data){ Data.SetRotationOfMass(InRotationOfMass);});
3649 }
3650
3652 {
3653 MMassProps.Write(InProps,true,MDirtyFlags,Proxy);
3654 }
3655
3657 {
3658 MMiscData.Write(DynamicMisc,true,MDirtyFlags,Proxy);
3659 }
3660
3661 T LinearEtherDrag() const { return MMiscData.Read().LinearEtherDrag(); }
3663 {
3664 MMiscData.Modify(true,MDirtyFlags,Proxy,[&InLinearEtherDrag](auto& Data){ Data.SetLinearEtherDrag(InLinearEtherDrag);});
3665 }
3666
3667 T AngularEtherDrag() const { return MMiscData.Read().AngularEtherDrag(); }
3669 {
3670 MMiscData.Modify(true,MDirtyFlags,Proxy,[&InAngularEtherDrag](auto& Data){ Data.SetAngularEtherDrag(InAngularEtherDrag);});
3671 }
3672
3673 T MaxLinearSpeedSq() const { return MMiscData.Read().MaxLinearSpeedSq(); }
3675 {
3676 MMiscData.Modify(true,MDirtyFlags,Proxy,[&InLinearSpeed](auto& Data){ Data.SetMaxLinearSpeedSq(InLinearSpeed);});
3677 }
3678
3679 T MaxAngularSpeedSq() const { return MMiscData.Read().MaxAngularSpeedSq(); }
3681 {
3682 MMiscData.Modify(true,MDirtyFlags,Proxy,[&InAngularSpeed](auto& Data){ Data.SetMaxAngularSpeedSq(InAngularSpeed);});
3683 }
3684
3685 FRealSingle InitialOverlapDepenetrationVelocity() const { return MMiscData.Read().InitialOverlapDepenetrationVelocity(); }
3687 {
3688 MMiscData.Modify(true, MDirtyFlags, Proxy, [InVel](auto& Data) { Data.SetInitialOverlapDepenetrationVelocity(InVel); });
3689 }
3690
3691 FRealSingle SleepThresholdMultiplier() const { return MMiscData.Read().SleepThresholdMultiplier(); }
3693 {
3694 MMiscData.Modify(true, MDirtyFlags, Proxy, [Multiplier](auto& Data) { Data.SetSleepThresholdMultiplier(Multiplier); });
3695 }
3696
3697 int32 Island() const { return MIsland; }
3698 // TODO(stett): Make the setter private. It is public right now to provide access to proxies.
3700 {
3701 this->MIsland = InIsland;
3702 }
3703
3704 EObjectStateType ObjectState() const { return MMiscData.Read().ObjectState(); }
3706 {
3707 if (bAllowEvents)
3708 {
3709 const auto PreState = ObjectState();
3710 if(PreState == EObjectStateType::Dynamic && InState == EObjectStateType::Sleeping)
3711 {
3712 MWakeEvent = EWakeEventEntry::Sleep;
3713 }
3714 else if(PreState == EObjectStateType::Sleeping && InState == EObjectStateType::Dynamic)
3715 {
3716 MWakeEvent = EWakeEventEntry::Awake;
3717 }
3718 }
3719
3720 if (InState == EObjectStateType::Sleeping)
3721 {
3722 // When an object is forced into a sleep state, the velocities must be zeroed and buffered,
3723 // in case the velocity is queried during sleep, or in case the object is woken up again.
3724 this->SetV(FVec3(0.f), bInvalidate);
3725 this->SetW(FVec3(0.f), bInvalidate);
3726
3727 // Dynamic particle properties must be marked clean in order not to actually apply forces which
3728 // have been buffered. If another force is added after the object is put to sleep, the old forces
3729 // will remain and the new ones will accumulate and re-dirty the dynamic properties which will
3730 // wake the body.
3731 MDirtyFlags.MarkClean(ChaosPropertyToFlag(EChaosProperty::Dynamics));
3732 }
3733
3734 MMiscData.Modify(bInvalidate,MDirtyFlags,Proxy,[&InState](auto& Data){ Data.SetObjectState(InState);});
3735
3736 }
3737
3738 void SetSleepType(ESleepType SleepType, bool bAllowEvents=false, bool bInvalidate=true)
3739 {
3740 MMiscData.Modify(true,MDirtyFlags,Proxy,[SleepType](auto& Data){ Data.SetSleepType(SleepType);});
3741
3742 if (SleepType == ESleepType::NeverSleep && ObjectState() == EObjectStateType::Sleeping)
3743 {
3744 SetObjectState(EObjectStateType::Dynamic, bAllowEvents, bInvalidate);
3745 }
3746 }
3747
3749 {
3750 return MMiscData.Read().SleepType();
3751 }
3752
3753 void ClearEvents() { MWakeEvent = EWakeEventEntry::None; }
3754 EWakeEventEntry GetWakeEvent() { return MWakeEvent; }
3755
3757 {
3758 return Particle ? Particle->CastToRigidParticle() : nullptr;
3759 }
3760
3762 {
3763 return Particle ? Particle->CastToRigidParticle() : nullptr;
3764 }
3765
3767 {
3768 return MMiscData.Read().ControlFlags();
3769 }
3770
3772 {
3773 MMiscData.Modify(true,MDirtyFlags,Proxy,[Flags](auto& Data){ Data.SetControlFlags(Flags);});
3774 }
3775
3776private:
3780
3781 int32 MIsland;
3782 bool MInitialized;
3783 EWakeEventEntry MWakeEvent;
3784
3785protected:
3787 {
3788 Base::SyncRemoteDataImp(Manager,DataIdx,RemoteData);
3789 MMassProps.SyncRemote(Manager,DataIdx,RemoteData);
3790 MDynamics.SyncRemote(Manager,DataIdx,RemoteData);
3791 MMiscData.SyncRemote(Manager,DataIdx,RemoteData);
3792 }
3793};
3794
3796{
3797public:
3799
3800 using FGeometryParticle::Type;
3801public:
3803 : FPBDRigidParticle(DynamicParams)
3804 {
3805 Type = EParticleType::GeometryCollection;
3806 }
3807
3812};
3813
3814// holding on the deprecation for now as inter dependencies require the use of TPBDGeometryCollectionParticle<>
3815template <typename T, int d>
3816using TPBDGeometryCollectionParticle /* UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDGeometryCollectionParticle instead") */ = FPBDGeometryCollectionParticle;
3817
3818template <typename T, int d>
3820{
3821 if (Type >= EParticleType::Kinematic)
3822 {
3823 return static_cast<const TKinematicGeometryParticle<T, d>*>(this);
3824 }
3825
3826 return nullptr;
3827}
3828
3829template <typename T, int d>
3831{
3832 if (Type >= EParticleType::Kinematic)
3833 {
3834 return static_cast<TKinematicGeometryParticle<T, d>*>(this);
3835 }
3836
3837 return nullptr;
3838}
3839
3840template <typename T, int d>
3842{
3843 if (Type >= EParticleType::Rigid)
3844 {
3845 return static_cast<TPBDRigidParticle<T, d>*>(this);
3846 }
3847
3848 return nullptr;
3849}
3850
3851
3852template <typename T, int d>
3854{
3855 if (Type >= EParticleType::Rigid)
3856 {
3857 return static_cast<const TPBDRigidParticle<T, d>*>(this);
3858 }
3859
3860 return nullptr;
3861}
3862
3863template <typename T, int d>
3865{
3866 MXR.Modify(bInvalidate, MDirtyFlags, Proxy, [&InX](auto& Data) { Data.SetX(InX); });
3867}
3868
3869template <typename T, int d>
3871{
3872 MXR.Modify(bInvalidate, MDirtyFlags, Proxy, [&InR](auto& Data) { Data.SetR(InR); });
3873}
3874
3875template <typename T, int d>
3877{
3878 const TKinematicGeometryParticle<T, d>* Kin = CastToKinematicParticle();
3879 return Kin ? Kin->ObjectState() : EObjectStateType::Static;
3880}
3881
3882template <typename T, int d>
3884{
3885 const TPBDRigidParticle<T, d>* Dyn = CastToRigidParticle();
3886 return Dyn ? Dyn->ObjectState() : EObjectStateType::Kinematic;
3887}
3888
3889template <typename T, int d>
3891{
3892 MVelocities.Modify(bInvalidate, MDirtyFlags, Proxy, [&InV](auto& Data) { Data.SetV(InV); });
3893}
3894
3895template <typename T, int d>
3897{
3898 MVelocities.Modify(bInvalidate, MDirtyFlags, Proxy, [&InW](auto& Data) { Data.SetW(InW); });
3899}
3900
3901template <typename T, int d>
3903{
3904 int8 ObjectType = Ar.IsLoading() ? 0 : (int8)Serializable->Type;
3905 Ar << ObjectType;
3906 switch ((EParticleType)ObjectType)
3907 {
3908 case EParticleType::Static: if (Ar.IsLoading()) { return new TGeometryParticle<T, d>(); } break;
3909 case EParticleType::Kinematic: if (Ar.IsLoading()) { return new TKinematicGeometryParticle<T, d>(); } break;
3910 case EParticleType::Rigid: if (Ar.IsLoading()) { return new TPBDRigidParticle<T, d>(); } break;
3911 case EParticleType::GeometryCollection: if (Ar.IsLoading()) { return new TPBDGeometryCollectionParticle<T, d>(); } break;
3912 default:
3913 check(false);
3914 }
3915 return nullptr;
3916}
3917
3918template <>
3920
3921FORCEINLINE_DEBUGGABLE FAccelerationStructureHandle::FAccelerationStructureHandle(FGeometryParticleHandle* InHandle)
3922 : ExternalGeometryParticle(InHandle->GTGeometryParticle())
3923 , GeometryParticleHandle(InHandle)
3924 , CachedUniqueIdx(InHandle->UniqueIdx())
3925 , bCanPrePreFilter(false)
3926{
3927 ensure(CachedUniqueIdx.IsValid());
3928 if (InHandle)
3929 {
3930 UpdatePrePreFilter(*InHandle);
3931 }
3932}
3933
3935 : ExternalGeometryParticle(InGeometryParticle)
3936 , GeometryParticleHandle(InGeometryParticle ? InGeometryParticle->Handle() : nullptr)
3937 , CachedUniqueIdx(InGeometryParticle ? InGeometryParticle->UniqueIdx() : FUniqueIdx())
3938 , bCanPrePreFilter(false)
3939{
3941 {
3942 ensure(CachedUniqueIdx.IsValid());
3944 if (bUsePrefiltering)
3945 {
3946 UpdatePrePreFilter(*InGeometryParticle);
3947 }
3948 }
3949}
3950
3951template <bool bPersistent>
3953 : ExternalGeometryParticle(InHandle.GTGeometryParticle())
3954 , GeometryParticleHandle(InHandle.Handle())
3955 , CachedUniqueIdx(InHandle.UniqueIdx())
3956 , bCanPrePreFilter(false)
3957{
3958 ensure(CachedUniqueIdx.IsValid());
3959 UpdatePrePreFilter(InHandle);
3960}
3961
3962template <typename TParticle>
3964{
3965 const auto& Shapes = Particle.ShapesArray();
3966 for (const auto& Shape : Shapes)
3967 {
3968 // For queries we can ignore any shapes that are not query-enabled (e.g., sim- and probe-only)
3969 if (Shape->GetQueryEnabled())
3970 {
3971 const FCollisionFilterData& ShapeQueryData = Shape->GetQueryData();
3973 OutQueryFilterData.Word1 |= ShapeQueryData.Word1;
3974 OutQueryFilterData.Word2 |= ShapeQueryData.Word2;
3975 OutQueryFilterData.Word3 |= ShapeQueryData.Word3;
3976 }
3977 }
3978}
3979
3980template <typename TParticle>
3982{
3983 const auto& Shapes = Particle.ShapesArray();
3984 OutSimFilterData.Word2 = 0;
3985 for (const auto& Shape : Shapes)
3986 {
3987 // In the simulation we can ignore query-only shapes, but need to know about sim- and probe-enabled shapes
3988 if (Shape->GetSimEnabled() || Shape->GetIsProbe())
3989 {
3990 const FCollisionFilterData& ShapeSimData = Shape->GetSimData();
3991
3992 // Word3 contains the channel index, this cannot be or'd together. Instead, expand the index to the bitmask and or that.
3993 // No one currently uses word2 (the component ID) which would also be invalid to or, so re-use that memory.
3997
3998 OutSimFilterData.Word0 |= ShapeSimData.Word0;
3999 OutSimFilterData.Word1 |= ShapeSimData.Word1;
4001 OutSimFilterData.Word3 |= ShapeSimData.Word3;
4002 }
4003 }
4004}
4005
4006template <typename TParticle>
4007FORCEINLINE_DEBUGGABLE void FAccelerationStructureHandle::UpdatePrePreFilter(const TParticle& Particle)
4008{
4009 ComputeParticleQueryFilterDataFromShapes(Particle, UnionQueryFilterData);
4011 ComputeParticleSimFilterDataFromShapes(Particle, UnionSimFilterData);
4013 bCanPrePreFilter = true;
4014}
4015
4016
4018{
4019 Ar << AsAlwaysSerializable(ExternalGeometryParticle);
4020 Ar << AsAlwaysSerializable(GeometryParticleHandle);
4021
4024 {
4026 Ar << DummyHash;
4027 }
4028
4029 if(GeometryParticleHandle)
4030 {
4031 CachedUniqueIdx = GeometryParticleHandle->UniqueIdx();
4032 }
4033 else if(ExternalGeometryParticle)
4034 {
4035 CachedUniqueIdx = ExternalGeometryParticle->UniqueIdx();
4036 }
4037
4038 if (GeometryParticleHandle && ExternalGeometryParticle)
4039 {
4040 ensure(GeometryParticleHandle->UniqueIdx() == ExternalGeometryParticle->UniqueIdx());
4041 }
4042
4043 ensure(!GeometryParticleHandle || CachedUniqueIdx.IsValid());
4044 ensure(!ExternalGeometryParticle || CachedUniqueIdx.IsValid());
4045}
4046
4048{
4049 AccelerationHandle.Serialize(Ar);
4050 return Ar;
4051}
4052
4053#if CHAOS_DEBUG_DRAW
4054FORCEINLINE_DEBUGGABLE void FAccelerationStructureHandle::DebugDraw(const bool bExternal, const bool bHit) const
4055{
4056 if (ExternalGeometryParticle && bExternal)
4057 {
4058 DebugDraw::DrawParticleShapes(FRigidTransform3(), ExternalGeometryParticle, bHit ? FColor::Red : FColor::Green);
4059 }
4060
4061 if (GeometryParticleHandle && !bExternal)
4062 {
4063 DebugDraw::DrawParticleShapes(FRigidTransform3(), GeometryParticleHandle, bHit ? FColor(200, 100, 100) : FColor(100, 200, 100));
4064 }
4065}
4066#endif
4067
4069{
4070 Rigid.SetObjectState(InState, bAllowEvents, bInvalidate);
4071}
4072
4074
4075#if !UE_MERGED_MODULES
4076#if PLATFORM_COMPILER_CLANG
4078extern template class CHAOS_API ISpatialVisitor<FAccelerationStructureHandle, FReal>;
4079#else
4081extern template class ISpatialVisitor<FAccelerationStructureHandle, FReal>;
4082#endif
4083#endif
4084
4085} // namespace Chaos
4086
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define CVD_TRACE_INVALIDATE_CACHED_PARTICLE_METADATA(ParticleHandlePtr)
Definition ChaosVDTraceMacros.h:300
#define CVD_TRACE_INVALIDATE_CACHED_GEOMETRY(ImplicitObjectPtr)
Definition ChaosVDTraceMacros.h:296
#define PRAGMA_DISABLE_INTERNAL_WARNINGS
Definition CoreMiscDefines.h:346
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define PRAGMA_ENABLE_INTERNAL_WARNINGS
Definition CoreMiscDefines.h:347
#define UE_INTERNAL
Definition CoreMiscDefines.h:345
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
#define TEXT(x)
Definition Platform.h:1272
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
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
return true
Definition ExternalRpcRegistry.cpp:601
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
ESPMode
Definition SharedPointerFwd.h:12
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
@ Multiplier
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ParticleHandle.h:213
void UpdateFrom(const FAccelerationStructureHandle &InOther)
Definition ParticleHandle.h:292
UE_INTERNAL bool PrePreSimFilter(const FCollisionFilterData &QuerierFilterData) const
Definition ParticleHandle.h:275
bool operator==(const FAccelerationStructureHandle &Rhs) const
Definition ParticleHandle.h:231
bool PrePreQueryFilter(const void *QueryData) const
Definition ParticleHandle.h:248
FAccelerationStructureHandle(TGeometryParticleHandleImp< FReal, 3, bPersistent > &InHandle)
FUniqueIdx UniqueIdx() const
Definition ParticleHandle.h:243
FAccelerationStructureHandle(FGeometryParticleHandle *InHandle)
Definition ParticleHandle.h:3921
bool operator!=(const FAccelerationStructureHandle &Rhs) const
Definition ParticleHandle.h:236
static UE_INTERNAL void ComputeParticleSimFilterDataFromShapes(const TParticle &Particle, FCollisionFilterData &OutSimFilterData)
FGeometryParticle * GetExternalGeometryParticle_ExternalThread() const
Definition ParticleHandle.h:226
static void ComputeParticleQueryFilterDataFromShapes(const TParticle &Particle, FCollisionFilterData &OutQueryFilterData)
Definition ParticleHandle.h:3963
FGeometryParticleHandle * GetGeometryParticleHandle_PhysicsThread() const
Definition ParticleHandle.h:229
bool PrePreSimFilter(const void *SimData) const
Definition ParticleHandle.h:262
void Serialize(FChaosArchive &Ar)
Definition ParticleHandle.h:4017
static constexpr bool bHasPayloadOnInternalThread
Definition ParticleHandle.h:215
Definition ChaosArchive.h:167
Definition ParticleHandle.h:2628
friend bool operator==(const FConstGenericParticleHandle &L, const FConstGenericParticleHandle &R)
Definition ParticleHandle.h:2644
FConstGenericParticleHandle(const FGeometryParticleHandle *InHandle)
Definition ParticleHandle.h:2631
friend uint32 GetTypeHash(const FConstGenericParticleHandle &H)
Definition ParticleHandle.h:2639
FConstGenericParticleHandle(const FGenericParticleHandle InHandle)
Definition ParticleHandle.h:2632
friend bool operator<(const FConstGenericParticleHandle &L, const FConstGenericParticleHandle &R)
Definition ParticleHandle.h:2649
const FGenericParticleHandleImp * Get() const
Definition ParticleHandle.h:2635
bool IsValid() const
Definition ParticleHandle.h:2637
const FGenericParticleHandleImp * operator->() const
Definition ParticleHandle.h:2634
FConstGenericParticleHandle()
Definition ParticleHandle.h:2630
Base class for constraint handles.
Definition ConstraintHandle.h:102
Definition ParticleDirtyFlags.h:1129
Definition ParticleDirtyFlags.h:1039
Definition ParticleHandle.h:1766
TSerializablePtr< FImplicitObject > Geometry() const
Definition ParticleHandle.h:1837
TVec3< FRealSingle > ConditionedInvI() const
Definition ParticleHandle.h:2375
FVec3 CenterOfMass() const
Definition ParticleHandle.h:2321
void SetR(const FRotation3 &InR)
Definition ParticleHandle.h:1830
const TPBDRigidClusteredParticleHandleImp< FReal, 3, true > * CastToClustered() const
Definition ParticleHandle.h:1794
bool PartialIslandSleepAllowed() const
Definition ParticleHandle.h:1920
bool Disabled() const
Definition ParticleHandle.h:1953
const FKinematicGeometryParticleHandle * CastToKinematicParticle() const
Definition ParticleHandle.h:1788
FParticleID ParticleID() const
Definition ParticleHandle.h:2239
const FString & GetDebugName() const
Definition ParticleHandle.h:2531
const FGeometryParticleHandle * Handle() const
Definition ParticleHandle.h:1800
UE_DEPRECATED(5.3, "No longer supported") void SetIslandIndex(const int32 IslandIndex)
Definition ParticleHandle.h:2562
FRotation3 R()
Definition ParticleHandle.h:1827
const TPBDGeometryCollectionParticleHandleImp< FReal, 3, true > * CastToGeometryCollection() const
Definition ParticleHandle.h:1792
const FRotation3 QCom() const
Definition ParticleHandle.h:2095
FRigidTransform3 GetTransformXR() const
Definition ParticleHandle.h:2125
const FVec3f GetWf() const
Definition ParticleHandle.h:1860
bool UseIgnoreCollisionManager() const
Definition ParticleHandle.h:2429
const FVec3 VSmooth() const
Definition ParticleHandle.h:2195
const FVec3 W() const
Definition ParticleHandle.h:1851
int32 CollisionParticlesSize() const
Definition ParticleHandle.h:1870
const FShapeInstanceArray & ShapeInstances() const
Definition ParticleHandle.h:2553
const FVec3 & P() const
Definition ParticleHandle.h:2028
const FKinematicTarget & KinematicTarget() const
Definition ParticleHandle.h:1865
const FRotation3 GetQ() const
Definition ParticleHandle.h:2063
const FRotation3 Q() const
Definition ParticleHandle.h:2053
void UpdateWorldSpaceState(const FRigidTransform3 &WorldTransform, const FVec3 &BoundsExpansion)
Definition ParticleHandle.h:2276
FRotation3 RotationOfMass() const
Definition ParticleHandle.h:2339
const FVec3 V() const
Definition ParticleHandle.h:1850
FRealSingle SleepThresholdMultiplier() const
Definition ParticleHandle.h:2506
bool HasBounds() const
Definition ParticleHandle.h:2249
FRigidTransform3 GetTransformPQCom() const
Definition ParticleHandle.h:2148
FVec3 & X()
Definition ParticleHandle.h:1817
const FVec3 PreV() const
Definition ParticleHandle.h:1963
void ClearIsMovingKinematic()
Definition ParticleHandle.h:2471
bool InertiaConditioningEnabled() const
Definition ParticleHandle.h:2395
FRigidTransform3 GetTransformXRCom() const
Definition ParticleHandle.h:2139
void SetVf(const FVec3f &InV)
Definition ParticleHandle.h:1862
bool IsDynamic() const
Definition ParticleHandle.h:1776
FKinematicGeometryParticleHandle * CastToKinematicParticle()
Definition ParticleHandle.h:1789
const FVec3 XCom() const
Definition ParticleHandle.h:2069
bool MACDEnabled() const
Definition ParticleHandle.h:1910
const FImplicitObjectRef GetGeometry() const
Definition ParticleHandle.h:1832
bool WasSleeping() const
Definition ParticleHandle.h:1779
void SetTransformPQCom(const FVec3 &InPCom, const FRotation3 &InQCom)
Definition ParticleHandle.h:2113
void SetW(const FVec3 &InW)
Definition ParticleHandle.h:1857
void SetInvIConditioning(const TVec3< FRealSingle > &InInvIConditioning)
Definition ParticleHandle.h:2367
void SetInertiaConditioningDirty()
Definition ParticleHandle.h:2413
FUniqueIdx UniqueIdx() const
Definition ParticleHandle.h:2244
const FVec3 & Acceleration() const
Definition ParticleHandle.h:2215
bool EnabledDuringResim() const
Definition ParticleHandle.h:1842
const FPBDRigidParticleHandle * CastToRigidParticle() const
Definition ParticleHandle.h:1790
void SetCenterOfMass(const FVec3 &InCom)
Definition ParticleHandle.h:2331
TVec3< FRealSingle > ConditionedI() const
Definition ParticleHandle.h:2385
int32 SolverBodyIndex() const
Definition ParticleHandle.h:2001
FRealSingle InitialOverlapDepenetrationVelocity() const
Definition ParticleHandle.h:2497
void SetQ(const FRotation3 &InQ)
Definition ParticleHandle.h:2043
void SetIsMovingKinematic()
Definition ParticleHandle.h:2463
UE_DEPRECATED(5.3, "No longer supported") void SetConstraintGraphIndex(const int32 InGraphIndex)
Definition ParticleHandle.h:2564
FString ToString() const
Definition ParticleHandle.h:1834
FReal M() const
Definition ParticleHandle.h:2301
const FRotation3 RCom() const
Definition ParticleHandle.h:2087
bool HasBoundingBox() const
Definition ParticleHandle.h:2260
const FGeometryParticleHandle * GeometryParticleHandle() const
Definition ParticleHandle.h:1797
const auto & AuxilaryValue(const Container &AuxContainer) const
Definition ParticleHandle.h:1845
const FVec3 PreW() const
Definition ParticleHandle.h:1973
void SetP(const FVec3 &InP)
Definition ParticleHandle.h:2018
const FAABB3 & WorldSpaceInflatedBounds() const
Definition ParticleHandle.h:2271
const FVec3 PCom() const
Definition ParticleHandle.h:2077
const TVec3< FRealSingle > I() const
Definition ParticleHandle.h:2281
void SetRotationOfMass(const FRotation3 &InRom)
Definition ParticleHandle.h:2349
FVec3 GetComRelativePosition(const FVec3 &P)
Definition ParticleHandle.h:2160
void ClearUseIgnoreCollisionManager()
Definition ParticleHandle.h:2446
FORCEINLINE Private::FPBDIslandParticle * GetConstraintGraphNode() const
Definition ParticleHandle.h:2542
bool IsKinematic() const
Definition ParticleHandle.h:1775
void SetUseIgnoreCollisionManager()
Definition ParticleHandle.h:2438
bool IsSleeping() const
Definition ParticleHandle.h:1777
const FVec3 GetW() const
Definition ParticleHandle.h:1854
FReal InvM() const
Definition ParticleHandle.h:2311
const FVec3f GetPreVf() const
Definition ParticleHandle.h:1982
void SetWf(const FVec3f &InW)
Definition ParticleHandle.h:1863
const FVec3 & GetP() const
Definition ParticleHandle.h:2038
FRigidTransform3 GetComRelativeTransform(const FRigidTransform3 &T)
Definition ParticleHandle.h:2186
FRotation3 GetComRelativeRotation(const FRotation3 &Q)
Definition ParticleHandle.h:2173
bool OneWayInteraction() const
Definition ParticleHandle.h:2515
void InitTransform(const FVec3 &InP, const FRotation3 &InQ)
Definition ParticleHandle.h:2104
FReal AngularEtherDrag() const
Definition ParticleHandle.h:2488
UE_DEPRECATED(5.3, "No longer supported") int32 IslandIndex() const
Definition ParticleHandle.h:2561
FORCEINLINE bool IsInConstraintGraph() const
Definition ParticleHandle.h:2537
TPBDGeometryCollectionParticleHandleImp< FReal, 3, true > * CastToGeometryCollection()
Definition ParticleHandle.h:1793
const EObjectStateType ObjectState() const
Definition ParticleHandle.h:2234
TPBDRigidClusteredParticleHandleImp< FReal, 3, true > * CastToClustered()
Definition ParticleHandle.h:1795
const FVec3 & GetX() const
Definition ParticleHandle.h:1825
const FVec3 WSmooth() const
Definition ParticleHandle.h:2205
const TUniquePtr< FImplicitObject > & DynamicGeometry() const
Definition ParticleHandle.h:1840
auto & AuxilaryValue(Container &AuxContainer)
Definition ParticleHandle.h:1847
void SetX(const FVec3 &InX)
Definition ParticleHandle.h:1824
bool CCDEnabled() const
Definition ParticleHandle.h:1900
FPBDRigidParticleHandle * CastToRigidParticle()
Definition ParticleHandle.h:1791
static constexpr EParticleType StaticType()
Definition ParticleHandle.h:2555
const FAABB3 & BoundingBox() const
Definition ParticleHandle.h:2266
FORCEINLINE void SetConstraintGraphNode(Private::FPBDIslandParticle *InNode)
Definition ParticleHandle.h:2547
FRigidTransform3 GetTransformPQ() const
Definition ParticleHandle.h:2130
void ClearInertiaConditioningDirty()
Definition ParticleHandle.h:2421
const FAABB3 & LocalBounds() const
Definition ParticleHandle.h:2254
TVec3< FRealSingle > InvIConditioning() const
Definition ParticleHandle.h:2357
void SetSolverBodyIndex(const int32 InSolverBodyIndex)
Definition ParticleHandle.h:2010
bool IsStatic() const
Definition ParticleHandle.h:1774
const FShapesArray & ShapesArray() const
Definition ParticleHandle.h:2552
UE_DEPRECATED(5.3, "No longer supported") int32 ConstraintGraphIndex() const
Definition ParticleHandle.h:2563
const FVec3f GetVf() const
Definition ParticleHandle.h:1859
Private::FIterationSettings IterationSettings() const
Definition ParticleHandle.h:1930
bool HasCollisionConstraintFlag(const ECollisionConstraintFlags Flag) const
Definition ParticleHandle.h:1941
bool InertiaConditioningDirty() const
Definition ParticleHandle.h:2404
int32 CollisionGroup() const
Definition ParticleHandle.h:1890
bool IsMovingKinematic() const
Definition ParticleHandle.h:2454
FGeometryParticleHandle * Handle()
Definition ParticleHandle.h:1801
const FVec3f GetPreWf() const
Definition ParticleHandle.h:1992
const FVec3 GetV() const
Definition ParticleHandle.h:1853
FGenericParticleHandleImp(FGeometryParticleHandle *InHandle)
Definition ParticleHandle.h:1771
const FRotation3 GetR() const
Definition ParticleHandle.h:1831
bool Sleeping() const
Definition ParticleHandle.h:1833
void SetV(const FVec3 &InV)
Definition ParticleHandle.h:1856
const FVec3 & AngularAcceleration() const
Definition ParticleHandle.h:2224
const TUniquePtr< FBVHParticles > & CollisionParticles() const
Definition ParticleHandle.h:1880
int32 GetHandleIdx() const
Definition ParticleHandle.h:1802
FReal LinearEtherDrag() const
Definition ParticleHandle.h:2479
void SetTransform(const FVec3 &Pos, const FRotation3 &Rot)
Definition ParticleHandle.h:1804
FGeometryParticleHandle * GeometryParticleHandle()
Definition ParticleHandle.h:1798
const TVec3< FRealSingle > InvI() const
Definition ParticleHandle.h:2291
Definition ParticleHandle.h:2590
FGenericParticleHandleImp * operator->() const
Definition ParticleHandle.h:2595
FGenericParticleHandle()
Definition ParticleHandle.h:2592
friend bool operator==(const FGenericParticleHandle &L, const FGenericParticleHandle &R)
Definition ParticleHandle.h:2605
bool IsValid() const
Definition ParticleHandle.h:2598
FGenericParticleHandle(FGeometryParticleHandle *InHandle)
Definition ParticleHandle.h:2593
FGenericParticleHandleImp * Get() const
Definition ParticleHandle.h:2596
friend uint32 GetTypeHash(const FGenericParticleHandle &H)
Definition ParticleHandle.h:2600
friend bool operator!=(const FGenericParticleHandle &L, const FGenericParticleHandle &R)
Definition ParticleHandle.h:2610
friend bool operator<(const FGenericParticleHandle &L, const FGenericParticleHandle &R)
Definition ParticleHandle.h:2615
Definition ImplicitObjectUnion.h:351
Definition ImplicitObjectUnion.h:27
Definition ImplicitObject.h:111
Definition KinematicTargets.h:34
Definition ParticleHandle.h:3796
static TUniquePtr< FPBDGeometryCollectionParticle > CreateParticle(const FPBDRigidParticleParameters &DynamicParams=FPBDRigidParticleParameters())
Definition ParticleHandle.h:3808
TPBDGeometryCollectionParticleHandle< FReal, 3 > FHandle
Definition ParticleHandle.h:3798
FPBDGeometryCollectionParticle(const FPBDRigidParticleParameters &DynamicParams=FPBDRigidParticleParameters())
Definition ParticleHandle.h:3802
Definition PBDRigidsEvolution.h:271
Knows about all the collisions detectors associated with a particular particle. Used when particles a...
Definition ParticleCollisions.h:21
Definition ParticleHandle.h:2724
FParticleData(EParticleType InType=EParticleType::Static)
Definition ParticleHandle.h:2726
virtual ~FParticleData()=default
EParticleType Type
Definition ParticleHandle.h:2734
void Reset()
Definition ParticleHandle.h:2730
Definition ParticleDirtyFlags.h:368
Definition ParticleDirtyFlags.h:177
FVec3 LinearImpulseVelocity() const
Definition ParticleDirtyFlags.h:236
FVec3 Acceleration() const
Definition ParticleDirtyFlags.h:230
FVec3 AngularAcceleration() const
Definition ParticleDirtyFlags.h:233
FVec3 AngularImpulseVelocity() const
Definition ParticleDirtyFlags.h:239
Definition ParticleDirtyFlags.h:293
const TVec3< FRealSingle > & I() const
Definition ParticleDirtyFlags.h:338
const FVec3 & CenterOfMass() const
Definition ParticleDirtyFlags.h:332
FReal M() const
Definition ParticleDirtyFlags.h:344
FReal InvM() const
Definition ParticleDirtyFlags.h:347
const FRotation3 & RotationOfMass() const
Definition ParticleDirtyFlags.h:335
const TVec3< FRealSingle > & InvI() const
Definition ParticleDirtyFlags.h:341
Definition ParticleDirtyFlags.h:619
Definition ParticleDirtyFlags.h:60
const FVec3 & X() const
Definition ParticleDirtyFlags.h:97
const FRotation3 R() const
Definition ParticleDirtyFlags.h:101
Definition ParticleDirtyFlags.h:118
Definition ShapeInstance.h:36
Definition PhysicsSolverBase.h:313
Definition PBDRigidClustering.h:56
Enable/Disable the features on a particle These flags are externally controlled and should not be cha...
Definition RigidParticleControlFlags.h:18
bool GetGyroscopicTorqueEnabled() const
Definition RigidParticleControlFlags.h:36
int32 GetGravityGroupIndex() const
Definition RigidParticleControlFlags.h:39
bool GetUpdateKinematicFromSimulation() const
Definition RigidParticleControlFlags.h:33
bool GetInertiaConditioningEnabled() const
Definition RigidParticleControlFlags.h:60
bool GetOneWayInteractionEnabled() const
Definition RigidParticleControlFlags.h:56
bool GetCCDEnabled() const
Definition RigidParticleControlFlags.h:47
bool GetPartialIslandSleepAllowed() const
Definition RigidParticleControlFlags.h:53
bool GetGravityEnabled() const
Definition RigidParticleControlFlags.h:30
bool GetMACDEnabled() const
Definition RigidParticleControlFlags.h:50
Definition ParticleDirtyFlags.h:1228
int32 GetShapeIdx() const
Definition ParticleDirtyFlags.h:1237
Definition GeometryParticles.h:107
Definition IslandManager.h:41
Definition IterationSettings.h:19
Definition AABB.h:37
Definition ArrayCollectionArray.h:15
Definition ArrayCollection.h:10
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 Properties.h:14
void SyncRemote(FDirtyPropertiesManager &Manager, int32 DataIdx, const FDirtyChaosProperties &Remote) const
Definition Properties.h:56
Definition ParticleIterator.h:359
bool IsDirty() const
Definition ParticleDirtyFlags.h:922
bool IsClean() const
Definition ParticleDirtyFlags.h:952
void MarkDirty(const FlagsType DirtyBits)
Definition ParticleDirtyFlags.h:937
void Clear()
Definition ParticleDirtyFlags.h:947
Definition ParticleHandle.h:436
void RemoveFromLists(const EGeometryParticleListMask ListMask)
Definition ParticleHandle.h:762
ESyncState SyncState() const
Definition ParticleHandle.h:603
void SetX(const TVector< T, d > &InX, bool bInvalidate=false)
Definition ParticleHandle.h:559
const FShapesArray & ShapesArray() const
Definition ParticleHandle.h:642
TGeometryParticles< T, d > * GeometryParticles
Definition ParticleHandle.h:403
bool HasBounds() const
Definition ParticleHandle.h:678
FRigidTransform3 GetTransformXR() const
Definition ParticleHandle.h:573
const TSharedPtr< const FImplicitObject, ESPMode::ThreadSafe > & SharedGeometryLowLevel() const
Definition ParticleHandle.h:634
const TGeometryParticleHandle< T, d > * Handle() const
Definition ParticleHandle.h:711
~TGeometryParticleHandleImp()
Definition ParticleHandle.h:501
void SetConstraintGraphNode(Private::FPBDIslandParticle *InNode)
Definition ParticleHandle.h:867
TPBDRigidParticleHandleImp< T, d, bPersistent > * CastToRigidParticle()
Definition ParticleHandle.h:1700
void SetPhysicsProxy(IPhysicsProxyBase *PhysicsProxy)
Definition ParticleHandle.h:697
std::conditional_t< bPersistent, int32, FInvalidFromTransient > HandleIdx
Definition ParticleHandle.h:881
TGeometryParticleHandle< T, d > * Handle()
Definition ParticleHandle.h:712
friend const TGeometryParticleHandle< T2, d2 > * GetHandleHelper(const TTransientGeometryParticleHandle< T2, d2 > *Handle)
EObjectStateType ObjectState() const
Definition ParticleHandle.h:1716
bool EnabledDuringResim() const
Definition ParticleHandle.h:736
void SetLightWeightDisabled(bool bLightWeightDisabled)
Definition ParticleHandle.h:740
static TUniquePtr< typename TParticlesType::THandleType > CreateParticleHandleHelper(TSerializablePtr< TParticlesType > InParticles, int32 InParticleIdx, int32 InHandleIdx, const TParams &Params)
Definition ParticleHandle.h:486
TGeometryParticleHandleImp(const TGeometryParticleHandleImp &)=delete
const FConstraintHandleArray & ParticleConstraints() const
Definition ParticleHandle.h:832
const FImplicitObjectRef GetGeometry() const
Definition ParticleHandle.h:613
TPayloadType GetPayload(int32 Idx)
Definition ParticleHandle.h:453
void LockGeometry()
Definition ParticleHandle.cpp:125
void AddConstraintHandle(FConstraintHandle *InConstraintHandle)
Definition ParticleHandle.h:837
FParticleCollisions & ParticleCollisions()
Definition ParticleHandle.h:847
EGeometryParticleListMask ListMask() const
Definition ParticleHandle.h:742
bool IsInConstraintGraph() const
Definition ParticleHandle.h:857
void SetEnabledDuringResim(bool bEnabledDuringResim)
Definition ParticleHandle.h:737
const TRotation< T, d > R() const
Definition ParticleHandle.h:565
FWeakParticleHandle & WeakParticleHandle()
Definition ParticleHandle.h:822
TGeometryParticleHandleImp< T, d, false > AsTransient()
Definition ParticleHandle.h:544
TGeometryParticleHandleImp(TGeometryParticles< T, d > *InParticles, const int32 InParticleIdx)
Definition ParticleHandle.h:480
void SetGeometry(const FImplicitObjectPtr &InGeometry)
Definition ParticleHandle.h:614
TGeometryParticleHandleImp(TSerializablePtr< TGeometryParticles< T, d > > InParticles, int32 InParticleIdx, int32 InHandleIdx, const FGeometryParticleParameters &Params)
Definition ParticleHandle.h:467
void Serialize(FChaosArchive &Ar)
Definition ParticleHandle.h:815
static constexpr EParticleType StaticType()
Definition ParticleHandle.h:811
void RemoveConstraintHandle(FConstraintHandle *InConstraintHandle)
Definition ParticleHandle.h:842
UE_DEPRECATED(5.3, "Use GetConstraintGraphNode()") int32 ConstraintGraphIndex() const
Definition ParticleHandle.h:873
EParticleType Type
Definition ParticleHandle.h:413
static constexpr bool AlwaysSerializable
Definition ParticleHandle.h:448
TPBDGeometryCollectionParticleHandleImp< T, d, bPersistent > * CastToGeometryCollection()
Definition ParticleHandle.h:1712
const TPBDRigidParticleHandleImp< T, d, bPersistent > * CastToRigidParticle() const
Definition ParticleHandle.h:1697
friend class TGeometryParticleHandleImp< T, d, false >
Definition ParticleHandle.h:541
const TRotation< FRealSingle, d > GetRf() const
Definition ParticleHandle.h:570
TGeometryParticle< T, d > *& GTGeometryParticle()
Definition ParticleHandle.h:693
void SetHasBounds(bool bHasBounds)
Definition ParticleHandle.h:679
void SetNonFrequentData(const FParticleNonFrequentData &InData)
Definition ParticleHandle.h:584
void UpdateWorldSpaceStateSwept(const FRigidTransform3 &WorldTransform, const FVec3 &BoundsExpansion, const FVec3 &DeltaX)
Update any cached state that depends on world-space transform for a sweep between WorldTransform and ...
Definition ParticleHandle.h:673
const TKinematicGeometryParticleHandleImp< T, d, bPersistent > * CastToKinematicParticle() const
Definition ParticleHandle.h:1694
void MoveToSOA(TGeometryParticles< T, d > &ToSOA)
Definition ParticleHandle.h:786
FUniqueIdx UniqueIdx() const
Definition ParticleHandle.h:561
const auto & AuxilaryValue(const Container &AuxContainer) const
Definition ParticleHandle.h:720
void SetUniqueIdx(const FUniqueIdx UniqueIdx, bool bInvalidate=false) const
Definition ParticleHandle.h:562
TKinematicGeometryParticleHandleImp< T, d, bPersistent > * CastToKinematicParticle()
Definition ParticleHandle.h:1691
void SetResimType(EResimType ResimType)
Definition ParticleHandle.h:733
TSharedPtr< const FImplicitObject, ESPMode::ThreadSafe > SharedGeometry() const
Definition ParticleHandle.h:628
TSerializablePtr< FImplicitObject > Geometry() const
Definition ParticleHandle.h:622
void UpdateWorldSpaceState(const FRigidTransform3 &WorldTransform, const FVec3 &BoundsExpansion)
Update any cached state that depends on world-space transform This includes the world space bounds fo...
Definition ParticleHandle.h:660
bool Sleeping() const
Definition ParticleHandle.h:717
const TPBDGeometryCollectionParticleHandleImp< T, d, bPersistent > * CastToGeometryCollection() const
Definition ParticleHandle.h:1709
const FString & GetDebugName() const
Definition ParticleHandle.h:688
UE_DEPRECATED(5.3, "Use GetConstraintGraphNode()") void SetConstraintGraphIndex(const int32 InGraphIndex)
Definition ParticleHandle.h:874
int32 ParticleIdx
Definition ParticleHandle.h:412
void InitTransform(const FVec3 &InP, const FRotation3 &InQ)
Definition ParticleHandle.h:576
void SetLocalBounds(const TAABB< T, d > &NewBounds)
Definition ParticleHandle.h:650
TPBDRigidClusteredParticleHandleImp< T, d, bPersistent > * CastToClustered()
Definition ParticleHandle.h:1706
const TUniquePtr< FImplicitObject > & DynamicGeometry() const
Definition ParticleHandle.h:637
TGeometryParticleHandleImp()
Definition ParticleHandle.h:461
const TVector< T, d > & X() const
Definition ParticleHandle.h:552
bool IsInAllLists(const EGeometryParticleListMask ListMask) const
Definition ParticleHandle.h:752
void RemoveShapesAtSortedIndices(const TArrayView< const int32 > &InIndices)
Definition ParticleHandle.cpp:206
bool IsInAnyList(const EGeometryParticleListMask ListMask) const
Definition ParticleHandle.h:747
void SetSpatialIdx(FSpatialAccelerationIdx Idx)
Definition ParticleHandle.h:682
auto & AuxilaryValue(Container &AuxContainer)
Definition ParticleHandle.h:726
void SetXR(const FParticlePositionRotation &XR)
Definition ParticleHandle.h:1487
FString ToString() const
Definition ParticleHandle.h:1737
static TUniquePtr< TGeometryParticleHandleImp< T, d, bPersistent > > CreateParticleHandle(TSerializablePtr< TGeometryParticles< T, d > > InParticles, int32 InParticleIdx, int32 InHandleIdx, const FGeometryParticleParameters &Params=FGeometryParticleParameters())
Definition ParticleHandle.h:496
const TVector< T, d > & GetX() const
Definition ParticleHandle.h:558
void SetDynamicGeometry(TUniquePtr< FImplicitObject > &&Unique)
Definition ParticleHandle.h:640
Private::FPBDIslandParticle * GetConstraintGraphNode() const
Definition ParticleHandle.h:862
int32 GetHandleIdx() const
Definition ParticleHandle.h:715
const TRotation< T, d > GetR() const
Definition ParticleHandle.h:568
const TAABB< T, d > & WorldSpaceInflatedBounds() const
Definition ParticleHandle.h:654
void SetSyncState(ESyncState State)
Definition ParticleHandle.h:608
bool HasCollision() const
Definition ParticleHandle.h:596
EResimType ResimType() const
Definition ParticleHandle.h:731
void MergeGeometry(TArray< Chaos::FImplicitObjectPtr > &&Objects)
Definition ParticleHandle.cpp:101
void SetHasCollision(const bool bHasCollision)
Definition ParticleHandle.h:598
void SetRf(const TRotation< FRealSingle, d > &InR, bool bInvalidate=false)
Definition ParticleHandle.h:571
void RemoveShape(FPerShapeData *InShape)
Definition ParticleHandle.cpp:185
static TGeometryParticleHandleImp< T, d, bPersistent > * SerializationFactory(FChaosArchive &Ar, TGeometryParticleHandleImp< T, d, bPersistent > *Handle)
Definition ParticleHandle.h:1758
const FParticleCollisions & ParticleCollisions() const
Definition ParticleHandle.h:852
TGeometryParticle< T, d > * GTGeometryParticle() const
Definition ParticleHandle.h:692
void SetR(const TRotation< T, d > &InR, bool bInvalidate=false)
Definition ParticleHandle.h:569
const FShapeInstanceArray & ShapeInstances() const
Definition ParticleHandle.h:644
FConstraintHandleArray & ParticleConstraints()
Definition ParticleHandle.h:827
const TPBDRigidClusteredParticleHandleImp< T, d, bPersistent > * CastToClustered() const
Definition ParticleHandle.h:1703
friend TGeometryParticleHandle< T2, d2 > * GetHandleHelper(TTransientGeometryParticleHandle< T2, d2 > *Handle)
const IPhysicsProxyBase * PhysicsProxy() const
Definition ParticleHandle.h:695
bool LightWeightDisabled() const
Definition ParticleHandle.h:739
FSpatialAccelerationIdx SpatialIdx() const
Definition ParticleHandle.h:681
const TVector< T, d > & CCDAxisThreshold() const
Definition ParticleHandle.h:652
void SetSharedGeometry(TSharedPtr< const FImplicitObject, ESPMode::ThreadSafe > InGeometry)
Definition ParticleHandle.h:631
IPhysicsProxyBase * PhysicsProxy()
Definition ParticleHandle.h:696
const TAABB< T, d > & LocalBounds() const
Definition ParticleHandle.h:649
void AddToLists(const EGeometryParticleListMask ListMask)
Definition ParticleHandle.h:757
Definition ParticleHandle.h:2663
const TUniquePtr< TGeometryParticleHandle< T, d > > & Handle(int32 Idx) const
Definition ParticleHandle.h:2704
void AddHandles(int32 NumHandles)
Definition ParticleHandle.h:2670
void Reset()
Definition ParticleHandle.h:2675
TUniquePtr< TGeometryParticleHandle< T, d > > & Handle(int32 Idx)
Definition ParticleHandle.h:2705
void DestroyHandleSwap(TGeometryParticleHandle< T, d > *Handle)
Definition ParticleHandle.h:2680
void Serialize(FChaosArchive &Ar)
Definition ParticleHandle.h:2698
TGeometryParticleHandles()
Definition ParticleHandle.h:2665
Definition ParticleHandle.h:2739
TSharedPtr< const FImplicitObject, ESPMode::ThreadSafe > SharedGeometryLowLevel() const
Definition ParticleHandle.h:2852
virtual bool IsParticleValid() const
Definition ParticleHandle.h:2785
void SetUniqueIdx(const FUniqueIdx UniqueIdx, bool bInvalidate=true)
Definition ParticleHandle.h:2798
virtual void Serialize(FChaosArchive &Ar)
Definition ParticleHandle.h:2770
void SetEnabledDuringResim(bool bEnabledDuringResim)
Definition ParticleHandle.h:3010
static TUniquePtr< TGeometryParticle< T, d > > CreateParticle(const FGeometryParticleParameters &Params=FGeometryParticleParameters())
Definition ParticleHandle.h:2756
void ModifyGeometry(const Lambda &Func, const bool bDirectAccess=false)
Definition ParticleHandle.h:3146
FSpatialAccelerationIdx SpatialIdx() const
Definition ParticleHandle.h:2994
const FDirtyChaosPropertyFlags & DirtyFlags() const
Definition ParticleHandle.h:3046
EParticleType ObjectType() const
Definition ParticleHandle.h:2981
class IPhysicsProxyBase * GetProxy() const
Definition ParticleHandle.h:3092
TGeometryParticleHandle< T, d > FHandle
Definition ParticleHandle.h:2741
TPBDRigidParticle< T, d > * CastToRigidParticle()
Definition ParticleHandle.h:3841
EParticleType Type
Definition ParticleHandle.h:3228
void MarkDirty(const EChaosPropertyFlags DirtyBits, bool bInvalidate=true)
const TKinematicGeometryParticle< T, d > * CastToKinematicParticle() const
Definition ParticleHandle.h:3819
TGeometryParticle & operator=(const TGeometryParticle &)=delete
void SetShapeSimCollisionEnabled(int32 InShapeIndex, bool bInEnabled)
Definition ParticleHandle.h:2883
EResimType ResimType() const
Definition ParticleHandle.h:3005
void SetSpatialIdx(FSpatialAccelerationIdx Idx)
Definition ParticleHandle.h:2995
void SetGeometry(Chaos::FImplicitObjectPtr ImplicitObjectPtr)
Definition ParticleHandle.h:2825
void UpdateShapeBounds(const FRigidTransform3 &Transform)
Definition ParticleHandle.h:2871
CHAOS_API void MergeGeometry(TArray< Chaos::FImplicitObjectPtr > &&Objects)
Definition ParticleHandle.cpp:79
void SetShapeCollisionTraceType(int32 InShapeIndex, EChaosCollisionTraceFlag TraceType)
Definition ParticleHandle.h:2901
bool IsDirty(const EChaosPropertyFlags CheckBits) const
Definition ParticleHandle.h:3036
void * UserData() const
Definition ParticleHandle.h:2860
TKinematicGeometryParticle< T, d > * CastToKinematicParticle()
Definition ParticleHandle.h:3830
void SetShapeQueryCollisionEnabled(int32 InShapeIndex, bool bInEnabled)
Definition ParticleHandle.h:2892
TGeometryParticle(const FGeometryParticleParameters &StaticParams=FGeometryParticleParameters())
Definition ParticleHandle.h:2747
bool IsClean() const
Definition ParticleHandle.h:3031
const FShapesArray & ShapesArray() const
Definition ParticleHandle.h:2944
const TRotation< T, d > R() const
Definition ParticleHandle.h:2814
void UpdateShapeBounds()
Definition ParticleHandle.h:2866
EObjectStateType ObjectState() const
Definition ParticleHandle.h:3876
CHAOS_API void RemoveShapesAtSortedIndices(const TArrayView< const int32 > &InIndices)
Definition ParticleHandle.cpp:153
void PrepareBVH()
Definition ParticleHandle.h:3084
static TGeometryParticle< T, d > * SerializationFactory(FChaosArchive &Ar, TGeometryParticle< T, d > *Serializable)
Definition ParticleHandle.h:3902
const FParticleID & ParticleID() const
Definition ParticleHandle.h:2803
void PrepareBVHImpl()
Definition ParticleHandle.cpp:233
FDirtyChaosPropertyFlags MDirtyFlags
Definition ParticleHandle.h:3229
const TVector< T, d > & GetX() const
Definition ParticleHandle.h:2794
void ClearDirtyFlags()
Definition ParticleHandle.h:3051
void SetShapeSimData(int32 InShapeIndex, const FCollisionFilterData &SimData)
Definition ParticleHandle.h:2910
class IPhysicsProxyBase * Proxy
Definition ParticleHandle.h:3122
const FImplicitObjectRef GetGeometry() const
Definition ParticleHandle.h:2833
void SetR(const TRotation< T, d > &InR, bool bInvalidate=true)
Definition ParticleHandle.h:3870
void SetNonFrequentData(const FParticleNonFrequentData &InData)
Definition ParticleHandle.h:3021
void SetX(const TVector< T, d > &InX, bool bInvalidate=true)
Definition ParticleHandle.h:3864
CHAOS_API void UpdateShapesArray()
Definition ParticleHandle.cpp:73
void SetResimType(EResimType ResimType)
Definition ParticleHandle.h:3000
void MergeShapeInstances(FShapeInstanceProxyArray &&InShapes)
Definition ParticleHandle.h:2962
void SetUserData(void *InUserData)
Definition ParticleHandle.h:2861
TGeometryParticle(const TGeometryParticle &)=delete
FUniqueIdx UniqueIdx() const
Definition ParticleHandle.h:2797
TGeometryParticleHandle< T, d > * Handle() const
Definition ParticleHandle.h:3056
void ForceDirty(EChaosPropertyFlags CheckBits)
Definition ParticleHandle.h:3041
void SetShapeInstances(FShapeInstanceProxyArray &&InShapes)
Definition ParticleHandle.h:2952
EGeometryAccess
Definition ParticleHandle.h:3128
virtual void SyncRemoteDataImp(FDirtyPropertiesManager &Manager, int32 DataIdx, const FDirtyChaosProperties &RemoteData) const
Definition ParticleHandle.h:3237
void SetIgnoreAnalyticCollisionsImp(FImplicitObject *Implicit, bool bIgnoreAnalyticCollisions)
Definition ParticleHandle.cpp:264
void SetParticleID(const FParticleID &ParticleID, bool bInvalidate=true)
Definition ParticleHandle.h:2804
static constexpr bool AlwaysSerializable
Definition ParticleHandle.h:2743
const FString & GetDebugName() const
Definition ParticleHandle.h:2927
void LockGeometry()
Definition ParticleHandle.cpp:249
void SyncRemoteData(FDirtyPropertiesManager &Manager, int32 DataIdx, FDirtyChaosProperties &RemoteData, const TArray< int32 > &ShapeDataIndices, FShapeDirtyData *ShapesRemoteData) const
Definition ParticleHandle.h:3067
const TVector< T, d > & X() const
Definition ParticleHandle.h:2793
CHAOS_API void SetIgnoreAnalyticCollisions(bool bIgnoreAnalyticCollisions)
Definition ParticleHandle.cpp:313
void ModifyGeometry(EGeometryAccess AccessType, const Lambda &Func)
Definition ParticleHandle.h:3152
const TPBDRigidParticle< T, d > * CastToRigidParticle() const
Definition ParticleHandle.h:3853
void SetProxy(IPhysicsProxyBase *InProxy)
Definition ParticleHandle.h:3097
const FParticlePositionRotation & XR() const
Definition ParticleHandle.h:2818
bool EnabledDuringResim() const
Definition ParticleHandle.h:3015
virtual ~TGeometryParticle()
Definition ParticleHandle.h:2761
const FShapeInstanceProxyArray & ShapeInstances() const
Definition ParticleHandle.h:2946
bool IsDirty() const
Definition ParticleHandle.h:3026
void SetXR(const FParticlePositionRotation &InXR, bool bInvalidate=true)
Definition ParticleHandle.h:2819
CHAOS_API void RemoveShape(FPerShapeData *InShape, bool bWakeTouching)
Definition ParticleHandle.cpp:137
void MergeShapesArray(FShapesArray &&InShapesArray)
Definition ParticleHandle.h:2939
const TRotation< T, d > GetR() const
Definition ParticleHandle.h:2815
TSerializablePtr< FImplicitObject > Geometry() const
Definition ParticleHandle.h:2855
Definition GeometryParticles.h:152
Definition ParticleHandle.h:907
TKinematicGeometryParticleHandleImp()
Definition ParticleHandle.h:920
const TVector< FRealSingle, d > GetVf() const
Definition ParticleHandle.h:950
void SetKinematicTarget(const FKinematicTarget &InKinematicTarget, bool bInvalidate=true)
Definition ParticleHandle.h:969
const TVector< T, d > GetW() const
Definition ParticleHandle.h:957
const TVector< T, d > V() const
Definition ParticleHandle.h:945
void SetW(const TVector< T, d > &InW, bool bInvalidate=false)
Definition ParticleHandle.h:958
TKinematicGeometryParticleHandleImp(TSerializablePtr< TKinematicGeometryParticles< T, d > > Particles, int32 InIdx, int32 InGlobalIdx, const FKinematicGeometryParticleParameters &Params)
Definition ParticleHandle.h:925
TKinematicGeometryParticleHandleImp< T, d, true > * Handle()
Definition ParticleHandle.h:979
FKinematicTarget & KinematicTarget()
Definition ParticleHandle.h:975
const TVector< T, d > GetV() const
Definition ParticleHandle.h:948
void SetVf(const TVector< FRealSingle, d > &InV, bool bInvalidate=false)
Definition ParticleHandle.h:951
const TVector< FRealSingle, d > GetWf() const
Definition ParticleHandle.h:959
const TKinematicGeometryParticleHandleImp< T, d, true > * Handle() const
Definition ParticleHandle.h:978
static constexpr EParticleType StaticType()
Definition ParticleHandle.h:982
const FKinematicTarget & KinematicTarget() const
Definition ParticleHandle.h:974
TSerializablePtr< TKinematicGeometryParticleHandleImp< T, d, bPersistent > > ToSerializable() const
Definition ParticleHandle.h:937
void SetV(const TVector< T, d > &InV, bool bInvalidate=false)
Definition ParticleHandle.h:949
const TVector< T, d > W() const
Definition ParticleHandle.h:954
static TUniquePtr< TKinematicGeometryParticleHandleImp< T, d, bPersistent > > CreateParticleHandle(TSerializablePtr< TKinematicGeometryParticles< T, d > > InParticles, int32 InParticleIdx, int32 InHandleIdx, const FKinematicGeometryParticleParameters &Params=FKinematicGeometryParticleParameters())
Definition ParticleHandle.h:932
EObjectStateType ObjectState() const
Definition ParticleHandle.h:1723
void SetVelocities(const FParticleVelocities &Velocities)
Definition ParticleHandle.h:963
void SetWf(const TVector< FRealSingle, d > &InW, bool bInvalidate=false)
Definition ParticleHandle.h:960
Definition ParticleHandle.h:3293
const TVector< T, d > V() const
Definition ParticleHandle.h:3325
const TVector< T, d > GetV() const
Definition ParticleHandle.h:3326
static TKinematicGeometryParticle< T, d > * Cast(TGeometryParticle< T, d > *Particle)
Definition ParticleHandle.h:3360
virtual void Serialize(FChaosArchive &Ar) override
Definition ParticleHandle.h:3318
const FKinematicTarget KinematicTarget() const
Definition ParticleHandle.h:3333
EObjectStateType ObjectState() const
Definition ParticleHandle.h:3883
void SetVelocities(const FParticleVelocities &InVelocities, bool bInvalidate=true)
Definition ParticleHandle.h:3353
void ClearKinematicTarget()
Definition ParticleHandle.h:3347
TKinematicGeometryParticleHandle< T, d > FHandle
Definition ParticleHandle.h:3295
const TVector< T, d > GetW() const
Definition ParticleHandle.h:3330
void SetW(const TVector< T, d > &InW, bool bInvalidate=true)
Definition ParticleHandle.h:3896
virtual void SyncRemoteDataImp(FDirtyPropertiesManager &Manager, int32 DataIdx, const FDirtyChaosProperties &RemoteData) const
Definition ParticleHandle.h:3376
static const TKinematicGeometryParticle< T, d > * Cast(const TGeometryParticle< T, d > *Particle)
Definition ParticleHandle.h:3365
const FParticleVelocities & Velocities() const
Definition ParticleHandle.h:3352
bool IsKinematicTargetDirty() const
Definition ParticleHandle.h:3342
void SetV(const TVector< T, d > &InV, bool bInvalidate=true)
Definition ParticleHandle.h:3890
void SetKinematicTarget(const FKinematicTarget &KinematicTarget, bool bInvalidate=true)
Definition ParticleHandle.h:3337
TKinematicGeometryParticle(const FKinematicGeometryParticleParameters &KinematicParams=FKinematicGeometryParticleParameters())
Definition ParticleHandle.h:3306
static TUniquePtr< TKinematicGeometryParticle< T, d > > CreateParticle(const FKinematicGeometryParticleParameters &Params=FKinematicGeometryParticleParameters())
Definition ParticleHandle.h:3313
const TVector< T, d > W() const
Definition ParticleHandle.h:3329
Definition KinematicGeometryParticles.h:13
Definition ParticleHandle.h:1641
TSerializablePtr< TPBDGeometryCollectionParticleHandleImp< T, d, bPersistent > > ToSerializable() const
Definition ParticleHandle.h:1677
TPBDGeometryCollectionParticleHandleImp< T, d, true > * Handle()
Definition ParticleHandle.h:1685
TPBDGeometryCollectionParticleHandleImp()
Definition ParticleHandle.h:1653
static constexpr EParticleType StaticType()
Definition ParticleHandle.h:1687
static TUniquePtr< TPBDGeometryCollectionParticleHandleImp< T, d, bPersistent > > CreateParticleHandle(TSerializablePtr< TPBDGeometryCollectionParticles< T, d > > InParticles, int32 InParticleIdx, int32 InHandleIdx, const FPBDRigidParticleParameters &Params=FPBDRigidParticleParameters())
Definition ParticleHandle.h:1667
const TPBDGeometryCollectionParticleHandleImp< T, d, true > * Handle() const
Definition ParticleHandle.h:1684
Definition PBDGeometryCollectionParticles.h:11
Definition ParticleHandle.h:1500
void SetChildToParentLocked(bool bValue)
Definition ParticleHandle.h:1619
TArray< TConnectivityEdge< T > > & ConnectivityEdges()
Definition ParticleHandle.h:1608
static constexpr EParticleType StaticType()
Definition ParticleHandle.h:1624
void SetClusterId(const ClusterId &Id)
Definition ParticleHandle.h:1540
void ClearCollisionImpulse()
Definition ParticleHandle.h:1586
TRigidTransform< T, d > & ChildToParent()
Definition ParticleHandle.h:1547
void SetExternalStrain(const FRealSingle Value)
Definition ParticleHandle.h:1590
void SetCollisionImpulses(const FRealSingle Value)
Definition ParticleHandle.h:1585
void SetIsAnchored(bool bValue)
Definition ParticleHandle.h:1613
void SetInternalCluster(bool bValue)
Definition ParticleHandle.h:1555
const FRealSingle & CollisionImpulses() const
Definition ParticleHandle.h:1583
void ClearExternalStrain()
Definition ParticleHandle.h:1592
FPBDRigidClusteredParticleHandle * Parent() const
Definition ParticleHandle.h:1544
const TUniquePtr< FImplicitObjectUnionClustered > & ChildrenSpatial() const
Definition ParticleHandle.h:1562
void RemovePhysicsProxy(IPhysicsProxyBase *PhysicsProxy)
Definition ParticleHandle.h:1537
void SetChildToParent(const TRigidTransform< T, d > &Xf)
Definition ParticleHandle.h:1548
const TArray< TConnectivityEdge< T > > & ConnectivityEdges() const
Definition ParticleHandle.h:1607
void SetStrains(const FRealSingle Value)
Definition ParticleHandle.h:1604
const FRealSingle & GetInternalStrains() const
Definition ParticleHandle.h:1594
const TRigidTransform< T, d > & ChildToParent() const
Definition ParticleHandle.h:1546
void SetConnectivityEdges(const TArray< TConnectivityEdge< T > > &Edges)
Definition ParticleHandle.h:1609
void SetClusterGroupIndex(const int32 Idx)
Definition ParticleHandle.h:1552
const TSet< IPhysicsProxyBase * > & PhysicsProxies() const
Definition ParticleHandle.h:1535
void SetMaximumInternalStrain()
Definition ParticleHandle.h:1605
bool InternalCluster() const
Definition ParticleHandle.h:1554
const FRealSingle & CollisionImpulse() const
Definition ParticleHandle.h:1580
const ClusterId & ClusterIds() const
Definition ParticleHandle.h:1541
void SetUnbreakable(bool bValue)
Definition ParticleHandle.h:1616
bool IsChildToParentLocked() const
Definition ParticleHandle.h:1618
ClusterId & ClusterIds()
Definition ParticleHandle.h:1542
const FImplicitObjectUnionClusteredPtr & GetChildrenSpatial() const
Definition ParticleHandle.h:1557
const TPBDRigidClusteredParticleHandleImp< T, d, true > * Handle() const
Definition ParticleHandle.h:1621
TSerializablePtr< TPBDRigidClusteredParticleHandleImp< T, d, bPersistent > > ToSerializable() const
Definition ParticleHandle.h:1528
bool Unbreakable() const
Definition ParticleHandle.h:1615
TPimplPtr< Private::FConvexOptimizer > & ConvexOptimizer()
Definition ParticleHandle.h:1630
void AddPhysicsProxy(IPhysicsProxyBase *PhysicsProxy)
Definition ParticleHandle.h:1536
void SetStrain(const FRealSingle Value)
Definition ParticleHandle.h:1599
FImplicitObjectUnionClusteredPtr & GetChildrenSpatial()
Definition ParticleHandle.h:1558
void ClearPhysicsProxies()
Definition ParticleHandle.h:1538
const FRealSingle & Strain() const
Definition ParticleHandle.h:1595
const int32 & ClusterGroupIndex() const
Definition ParticleHandle.h:1550
void SetConnectivityEdges(TArray< TConnectivityEdge< T > > &&Edges)
Definition ParticleHandle.h:1610
void SetChildrenSpatial(FImplicitObjectUnionClusteredPtr &Obj)
Definition ParticleHandle.h:1559
int32 TransientParticleIndex() const
Definition ParticleHandle.h:1626
bool IsAnchored() const
Definition ParticleHandle.h:1612
TPBDRigidClusteredParticleHandleImp< T, d, true > * Handle()
Definition ParticleHandle.h:1622
FRealSingle & CollisionImpulse()
Definition ParticleHandle.h:1581
FRealSingle GetExternalStrain() const
Definition ParticleHandle.h:1588
void SetCollisionImpulse(const FRealSingle Value)
Definition ParticleHandle.h:1582
static TUniquePtr< TPBDRigidClusteredParticleHandleImp< T, d, bPersistent > > CreateParticleHandle(TSerializablePtr< TPBDRigidClusteredParticles< T, d > > InParticles, int32 InParticleIdx, int32 InHandleIdx, const FPBDRigidParticleParameters &Params=FPBDRigidParticleParameters())
Definition ParticleHandle.h:1523
const FRealSingle & Strains() const
Definition ParticleHandle.h:1600
int32 & ClusterGroupIndex()
Definition ParticleHandle.h:1551
const TPimplPtr< Private::FConvexOptimizer > & ConvexOptimizer() const
Definition ParticleHandle.h:1629
FRealSingle & CollisionImpulses()
Definition ParticleHandle.h:1584
Definition PBDRigidClusteredParticles.h:146
Definition ParticleHandle.h:987
TVec3< FRealSingle > & I()
Definition ParticleHandle.h:1207
CHAOS_API void SetTorque(const TVector< T, d > &InTorque, bool bInvalidate=true)
Definition ParticleHandle.cpp:332
bool HasCollisionConstraintFlag(const ECollisionConstraintFlags Flag) const
Definition ParticleHandle.h:1063
void SetUpdateKinematicFromSimulation(bool bUpdateKinematicFromSimulation)
Definition ParticleHandle.h:1312
FRigidTransform3 GetTransformXRCom() const
Definition ParticleHandle.h:1140
const TRotation< T, d > RCom() const
Definition ParticleHandle.h:1123
void SetLinearEtherDrag(const T &InLinearEtherDrag)
Definition ParticleHandle.h:1240
const TVector< T, d > & AngularImpulseVelocity() const
Definition ParticleHandle.h:1172
T MaxAngularSpeedSq() const
Definition ParticleHandle.h:1250
TPBDRigidParticleHandleImp()
Definition ParticleHandle.h:1006
void SetDisabledLowLevel(bool disabled)
Definition ParticleHandle.h:1074
bool IsSleeping() const
Definition ParticleHandle.h:1266
void SetMaxLinearSpeedSq(const T &InMaxLinearSpeed)
Definition ParticleHandle.h:1248
bool InertiaConditioningDirty()
Definition ParticleHandle.h:1408
void SetAcceleration(const TVector< T, d > &InAcceleration)
Definition ParticleHandle.h:1154
TVec3< FRealSingle > ConditionedI() const
Definition ParticleHandle.h:1236
bool IsDynamic() const
Definition ParticleHandle.h:1050
TVector< T, d > & VSmooth()
Definition ParticleHandle.h:1145
void SetVelocitySolverIterations(const int32 VelocityIterationsIn)
Definition ParticleHandle.h:1372
bool CCDEnabled() const
Definition ParticleHandle.h:1327
const TRotation< T, d > GetQ() const
Definition ParticleHandle.h:1113
TPBDRigidParticleHandleImp< T, d, true > * Handle()
Definition ParticleHandle.h:1274
T & M()
Definition ParticleHandle.h:1216
FRigidTransform3 GetTransformPQ() const
Definition ParticleHandle.h:1138
bool MACDEnabled() const
Definition ParticleHandle.h:1337
const TVector< T, d > & CenterOfMass() const
Definition ParticleHandle.h:1223
TVec3< FRealSingle > & InvI()
Definition ParticleHandle.h:1212
void SetPartialIslandSleepAllowed(bool bEnabled)
Definition ParticleHandle.h:1352
void SetMaxAngularSpeedSq(const T &InMaxAngularSpeed)
Definition ParticleHandle.h:1252
void SetGravityGroupIndex(int32 GravityGroupIndex)
Definition ParticleHandle.h:1302
T AngularEtherDrag() const
Definition ParticleHandle.h:1242
void SetSleepCounter(int8 SleepCounter)
Definition ParticleHandle.h:1462
T & MaxAngularSpeedSq()
Definition ParticleHandle.h:1251
void SetVSmooth(const TVector< T, d > &InVSmooth)
Definition ParticleHandle.h:1146
const TVector< T, d > & LinearImpulseVelocity() const
Definition ParticleHandle.h:1168
bool IsKinematic() const
Definition ParticleHandle.h:1049
void SetProjectionSolverIterations(const int32 ProjectionIterationsIn)
Definition ParticleHandle.h:1377
void SetCCDEnabled(bool bEnabled)
Definition ParticleHandle.h:1332
bool WasSleeping() const
Definition ParticleHandle.h:1267
int32 SolverBodyIndex() const
Definition ParticleHandle.h:1095
TVector< T, d > & Acceleration()
Definition ParticleHandle.h:1153
void SetPreW(const TVector< T, d > &InPreW)
Definition ParticleHandle.h:1091
TVector< T, d > & AngularImpulseVelocity()
Definition ParticleHandle.h:1173
void SetRotationOfMass(const TRotation< T, d > &InRotationOfMass, bool bInvalidate=false)
Definition ParticleHandle.h:1227
void SetCollisionConstraintFlags(const uint32 Flags)
Definition ParticleHandle.h:1066
T InvM() const
Definition ParticleHandle.h:1219
FRigidTransform3 GetTransformPQCom() const
Definition ParticleHandle.h:1142
void SetMassProps(const FParticleMassProps &Props)
Definition ParticleHandle.h:1184
const TVector< T, d > PreV() const
Definition ParticleHandle.h:1078
void SetSleepThresholdMultiplier(FRealSingle Multiplier)
Definition ParticleHandle.h:1258
EObjectStateType ObjectState() const
Definition ParticleHandle.h:1260
int32 & CollisionGroup()
Definition ParticleHandle.h:1060
const TVector< T, d > & WSmooth() const
Definition ParticleHandle.h:1148
void SetPreV(const TVector< T, d > &InPreV)
Definition ParticleHandle.h:1082
const TVector< FRealSingle, d > GetPreWf() const
Definition ParticleHandle.h:1092
T MaxLinearSpeedSq() const
Definition ParticleHandle.h:1246
void SetInitialOverlapDepenetrationVelocity(FRealSingle InVel)
Definition ParticleHandle.h:1255
bool UpdateKinematicFromSimulation() const
Definition ParticleHandle.h:1307
void SetQ(const TRotation< T, d > &InQ)
Definition ParticleHandle.h:1114
const TRotation< T, d > & RotationOfMass() const
Definition ParticleHandle.h:1226
const TUniquePtr< TBVHParticles< T, d > > & CollisionParticles() const
Definition ParticleHandle.h:1052
void SetP(const TVector< T, d > &InP)
Definition ParticleHandle.h:1107
const TVector< T, d > XCom() const
Definition ParticleHandle.h:1119
T M() const
Definition ParticleHandle.h:1215
const TVector< T, d > & P() const
Definition ParticleHandle.h:1099
bool OneWayInteraction() const
Definition ParticleHandle.h:1382
void SetPositionSolverIterations(const int32 PositionIterationsIn)
Definition ParticleHandle.h:1367
EObjectStateType PreObjectState() const
Definition ParticleHandle.h:1261
const TVector< T, d > & GetP() const
Definition ParticleHandle.h:1106
const TVector< T, d > & Acceleration() const
Definition ParticleHandle.h:1152
bool UseIgnoreCollisionManager() const
Definition ParticleHandle.h:1423
void SetMACDEnabled(bool bEnabled)
Definition ParticleHandle.h:1342
void RemoveCollisionConstraintFlag(const ECollisionConstraintFlags Flag)
Definition ParticleHandle.h:1065
T & InvM()
Definition ParticleHandle.h:1220
void SetSleepType(ESleepType SleepType)
Definition ParticleHandle.h:1455
bool Disabled() const
Definition ParticleHandle.h:1069
T LinearEtherDrag() const
Definition ParticleHandle.h:1238
TVector< T, d > & WSmooth()
Definition ParticleHandle.h:1149
FRealSingle SleepThresholdMultiplier() const
Definition ParticleHandle.h:1257
void SetUseIgnoreCollisionManager()
Definition ParticleHandle.h:1428
bool PartialIslandSleepAllowed() const
Definition ParticleHandle.h:1347
void SetIsMovingKinematic()
Definition ParticleHandle.h:1443
void SetAngularImpulseVelocity(const TVector< T, d > &InAngularImpulseVelocity, bool bInvalidate=false)
Definition ParticleHandle.h:1174
const TPBDRigidParticleHandleImp< T, d, true > * Handle() const
Definition ParticleHandle.h:1273
static constexpr EParticleType StaticType()
Definition ParticleHandle.h:1477
int8 DisableCounter() const
Definition ParticleHandle.h:1467
bool GyroscopicTorqueEnabled() const
Definition ParticleHandle.h:1317
void SetInertiaConditioningEnabled(bool bEnabled)
Definition ParticleHandle.h:1397
FRigidParticleControlFlags ControlFlags() const
Definition ParticleHandle.h:1276
void ClearIsMovingKinematic()
Definition ParticleHandle.h:1448
T & MaxLinearSpeedSq()
Definition ParticleHandle.h:1247
void ResetSmoothedVelocities()
Definition ParticleHandle.h:1199
void SetGravityEnabled(bool bEnabled)
Definition ParticleHandle.h:1292
ESleepType SleepType() const
Definition ParticleHandle.h:1453
void SetWSmooth(const TVector< T, d > &InWSmooth)
Definition ParticleHandle.h:1150
const TVector< T, d > & AngularAcceleration() const
Definition ParticleHandle.h:1161
void SetAngularEtherDrag(const T &InAngularEtherDrag)
Definition ParticleHandle.h:1244
void SetPreWf(const TVector< FRealSingle, d > &InPreW)
Definition ParticleHandle.h:1093
void SetCollisionParticles(TParticles< T, d > &&Points)
Definition ParticleHandle.h:1057
const TVector< T, d > & VSmooth() const
Definition ParticleHandle.h:1144
void SetInvM(const T &InInvM)
Definition ParticleHandle.h:1221
bool GravityEnabled() const
Definition ParticleHandle.h:1287
void SetDisabled(const bool InDisabled)
Definition ParticleHandle.h:1075
void SetDisableCounter(int8 DisableCounter)
Definition ParticleHandle.h:1472
void SetPreVf(const TVector< FRealSingle, d > &InPreV)
Definition ParticleHandle.h:1084
void SetI(const TVec3< FRealSingle > &InI)
Definition ParticleHandle.h:1208
TVec3< FRealSingle > ConditionedInvI() const
Definition ParticleHandle.h:1235
const TVector< FRealSingle, d > GetPreVf() const
Definition ParticleHandle.h:1083
int32 GravityGroupIndex() const
Definition ParticleHandle.h:1297
void SetInvIConditioning(const TVec3< FRealSingle > &InInvIConditioning)
Definition ParticleHandle.h:1232
const TRotation< T, d > QCom() const
Definition ParticleHandle.h:1124
const TVec3< FRealSingle > & InvIConditioning() const
Definition ParticleHandle.h:1231
uint32 CollisionConstraintFlags() const
Definition ParticleHandle.h:1067
void SetQf(const TRotation< FRealSingle, d > &InQ)
Definition ParticleHandle.h:1116
FRealSingle InitialOverlapDepenetrationVelocity() const
Definition ParticleHandle.h:1254
void SetInvI(const TVec3< FRealSingle > &InInvI)
Definition ParticleHandle.h:1213
int8 SleepCounter() const
Definition ParticleHandle.h:1457
const TVector< T, d > PCom() const
Definition ParticleHandle.h:1120
void SetControlFlags(const FRigidParticleControlFlags Flags)
Definition ParticleHandle.h:1282
const TVec3< FRealSingle > & I() const
Definition ParticleHandle.h:1206
void SetSolverBodyIndex(const int32 InSolverBodyIndex)
Definition ParticleHandle.h:1096
void InitTransform(const FVec3 &InP, const FRotation3 &InQ)
Definition ParticleHandle.h:1127
T & LinearEtherDrag()
Definition ParticleHandle.h:1239
void SetInertiaConditioningDirty()
Definition ParticleHandle.h:1413
bool Sleeping() const
Definition ParticleHandle.h:1269
TUniquePtr< TBVHParticles< T, d > > & CollisionParticles()
Definition ParticleHandle.h:1053
static TUniquePtr< TPBDRigidParticleHandleImp< T, d, bPersistent > > CreateParticleHandle(TSerializablePtr< TPBDRigidParticles< T, d > > InParticles, int32 InParticleIdx, int32 InHandleIdx, const FPBDRigidParticleParameters &Params=FPBDRigidParticleParameters())
Definition ParticleHandle.h:1035
void ClearUseIgnoreCollisionManager()
Definition ParticleHandle.h:1433
TSerializablePtr< TPBDRigidParticleHandleImp< T, d, bPersistent > > ToSerializable() const
Definition ParticleHandle.h:1040
T & AngularEtherDrag()
Definition ParticleHandle.h:1243
bool IsMovingKinematic() const
Definition ParticleHandle.h:1438
int32 CollisionParticlesSize() const
Definition ParticleHandle.h:1055
void SetTransformPQCom(const TVector< T, d > &InPCom, const TRotation< T, d > &InQCom)
Definition ParticleHandle.h:1136
const TVector< T, d > GetPreV() const
Definition ParticleHandle.h:1081
TVector< T, d > & LinearImpulseVelocity()
Definition ParticleHandle.h:1169
void SetDynamics(const FParticleDynamics &Dynamics)
Definition ParticleHandle.h:1176
void SetOneWayInteraction(bool bEnabled)
Definition ParticleHandle.h:1387
const TVector< T, d > PreW() const
Definition ParticleHandle.h:1087
UE_DEPRECATED(5.3, "No longer supported") int32 &IslandIndex()
Definition ParticleHandle.h:1481
bool InertiaConditioningEnabled() const
Definition ParticleHandle.h:1392
const TVec3< FRealSingle > & InvI() const
Definition ParticleHandle.h:1211
void SetAngularAcceleration(const TVector< T, d > &InAngularAcceleration)
Definition ParticleHandle.h:1163
void SetM(const T &InM)
Definition ParticleHandle.h:1217
void SetGyroscopicTorqueEnabled(bool bEnabled)
Definition ParticleHandle.h:1322
void SetLinearImpulseVelocity(const TVector< T, d > &InLinearImpulseVelocity, bool bInvalidate=false)
Definition ParticleHandle.h:1170
void SetSleeping(bool bSleeping)
Definition ParticleHandle.h:1270
UE_DEPRECATED(5.3, "No longer supported") int32 IslandIndex() const
Definition ParticleHandle.h:1480
const TRotation< FRealSingle, d > GetQf() const
Definition ParticleHandle.h:1115
void CollisionParticlesInitIfNeeded()
Definition ParticleHandle.h:1056
void SetCenterOfMass(const TVector< T, d > &InCenterOfMass, bool bInvalidate=false)
Definition ParticleHandle.h:1224
void AddCollisionConstraintFlag(const ECollisionConstraintFlags Flag)
Definition ParticleHandle.h:1064
void SetIterationSettings(const Private::FIterationSettings &IterationSettingsIn)
Definition ParticleHandle.h:1362
const TRotation< T, d > Q() const
Definition ParticleHandle.h:1110
TVector< T, d > & AngularAcceleration()
Definition ParticleHandle.h:1162
void AddForce(const TVector< T, d > &InF, bool bInvalidate=true)
Definition ParticleHandle.h:1156
void SetObjectStateLowLevel(EObjectStateType InState)
Definition ParticleHandle.h:1263
void ClearInertiaConditioningDirty()
Definition ParticleHandle.h:1418
int32 CollisionGroup() const
Definition ParticleHandle.h:1059
void SetCollisionGroup(const int32 InCollisionGroup)
Definition ParticleHandle.h:1061
void SetDynamicMisc(const FParticleDynamicMisc &DynamicMisc, FPBDRigidsEvolutionBase &Evolution)
Definition ParticleHandle.h:1197
void SetPreObjectStateLowLevel(EObjectStateType InState)
Definition ParticleHandle.h:1264
const TVector< T, d > GetPreW() const
Definition ParticleHandle.h:1090
Private::FIterationSettings IterationSettings() const
Definition ParticleHandle.h:1357
bool & Disabled()
Definition ParticleHandle.h:1071
Definition ParticleHandle.h:3386
void SetVelocitySolverIterations(const int32 VelocitySolverIterationCount)
Definition ParticleHandle.h:3522
void SetMassProps(const FParticleMassProps &InProps)
Definition ParticleHandle.h:3651
void SetDisabled(bool bInDisabled)
Definition ParticleHandle.h:3540
void SetObjectState(const EObjectStateType InState, bool bAllowEvents=false, bool bInvalidate=true)
Definition ParticleHandle.h:3705
void SetDynamics(const FParticleDynamics &InDynamics, bool bInvalidate=true)
Definition ParticleHandle.h:3605
void SetRotationOfMass(const TRotation< T, d > &InRotationOfMass, bool bInvalidate=true)
Definition ParticleHandle.h:3646
void SetControlFlags(const FRigidParticleControlFlags &Flags)
Definition ParticleHandle.h:3771
void ClearEvents()
Definition ParticleHandle.h:3753
static TUniquePtr< TPBDRigidParticle< T, d > > CreateParticle(const FPBDRigidParticleParameters &DynamicParams=FPBDRigidParticleParameters())
Definition ParticleHandle.h:3412
void SetM(const T &InM, bool bInvalidate=true)
Definition ParticleHandle.h:3628
T InvM() const
Definition ParticleHandle.h:3633
void SetAcceleration(const FVec3 &Acceleration, bool bInvalidate=true)
Definition ParticleHandle.h:3553
void SetInertiaConditioningEnabled(bool bInEnabled)
Definition ParticleHandle.h:3533
void ClearTorques(bool bInvalidate=true)
Definition ParticleHandle.h:3588
void SetSleepType(ESleepType SleepType, bool bAllowEvents=false, bool bInvalidate=true)
Definition ParticleHandle.h:3738
void SetInvI(const TVec3< FRealSingle > &InInvI, bool bInvalidate=true)
Definition ParticleHandle.h:3622
const TVector< T, d > AngularImpulseVelocity() const
Definition ParticleHandle.h:3599
void SetMACDEnabled(bool bInEnabled)
Definition ParticleHandle.h:3499
TPBDRigidParticleHandle< T, d > FHandle
Definition ParticleHandle.h:3388
void SetSleepThresholdMultiplier(FRealSingle Multiplier)
Definition ParticleHandle.h:3692
void SetGravityGroupIndex(int32 NewIndex)
Definition ParticleHandle.h:3451
const TVector< T, d > LinearImpulseVelocity() const
Definition ParticleHandle.h:3593
const TRotation< T, d > & RotationOfMass() const
Definition ParticleHandle.h:3645
void SetUpdateKinematicFromSimulation(const bool bUpdateKinematicFromSimulation)
Definition ParticleHandle.h:3457
const TVector< T, d > AngularAcceleration() const
Definition ParticleHandle.h:3581
bool GyroscopicTorqueEnabled() const
Definition ParticleHandle.h:3462
void SetInitialized(const bool InInitialized)
Definition ParticleHandle.h:3547
void SetGravityEnabled(const bool bInEnabled)
Definition ParticleHandle.h:3445
T MaxLinearSpeedSq() const
Definition ParticleHandle.h:3673
bool GravityEnabled() const
Definition ParticleHandle.h:3444
void SetCCDEnabled(bool bInEnabled)
Definition ParticleHandle.h:3493
void SetLinearEtherDrag(const T &InLinearEtherDrag)
Definition ParticleHandle.h:3662
uint32 CollisionConstraintFlags() const
Definition ParticleHandle.h:3485
FRigidParticleControlFlags ControlFlags() const
Definition ParticleHandle.h:3766
T M() const
Definition ParticleHandle.h:3627
static TPBDRigidParticle< T, d > * Cast(TGeometryParticle< T, d > *Particle)
Definition ParticleHandle.h:3756
void SetCollisionGroup(const int32 InCollisionGroup)
Definition ParticleHandle.h:3432
T AngularEtherDrag() const
Definition ParticleHandle.h:3667
bool UpdateKinematicFromSimulation() const
Definition ParticleHandle.h:3456
void SetAngularAcceleration(const TVector< T, d > &InTorque, bool bInvalidate=true)
Definition ParticleHandle.h:3582
void SetCenterOfMass(const TVector< T, d > &InCenterOfMass, bool bInvalidate=true)
Definition ParticleHandle.h:3640
virtual void SyncRemoteDataImp(FDirtyPropertiesManager &Manager, int32 DataIdx, const FDirtyChaosProperties &RemoteData) const
Definition ParticleHandle.h:3786
void SetGyroscopicTorqueEnabled(const bool bGyroscopicTorqueEnabled)
Definition ParticleHandle.h:3463
void ClearForces(bool bInvalidate=true)
Definition ParticleHandle.h:3564
void AddForce(const TVector< T, d > &InF, bool bInvalidate=true)
Definition ParticleHandle.h:3558
bool CCDEnabled() const
Definition ParticleHandle.h:3492
bool IsInitialized() const
Definition ParticleHandle.h:3546
void SetPositionSolverIterations(const int32 PositionSolverIterationCount)
Definition ParticleHandle.h:3517
const TVec3< FRealSingle > & InvI() const
Definition ParticleHandle.h:3621
bool InertiaConditioningEnabled() const
Definition ParticleHandle.h:3532
static const TPBDRigidParticle< T, d > * Cast(const TGeometryParticle< T, d > *Particle)
Definition ParticleHandle.h:3761
bool MACDEnabled() const
Definition ParticleHandle.h:3498
const TVector< T, d > & CenterOfMass() const
Definition ParticleHandle.h:3639
void SetAngularImpulseVelocity(const TVector< T, d > &InAngularImpulseVelocity, bool bInvalidate=true)
Definition ParticleHandle.h:3600
int32 GravityGroupIndex() const
Definition ParticleHandle.h:3450
FRealSingle SleepThresholdMultiplier() const
Definition ParticleHandle.h:3691
void SetMaxAngularSpeedSq(const T &InAngularSpeed)
Definition ParticleHandle.h:3680
void SetCollisionConstraintFlags(const uint32 Flags)
Definition ParticleHandle.h:3487
const TVec3< FRealSingle > & I() const
Definition ParticleHandle.h:3615
void ResetSmoothedVelocities()
Definition ParticleHandle.h:3610
void SetDynamicMisc(const FParticleDynamicMisc &DynamicMisc)
Definition ParticleHandle.h:3656
void SetI(const TVec3< FRealSingle > &InI, bool bInvalidate=true)
Definition ParticleHandle.h:3616
EObjectStateType ObjectState() const
Definition ParticleHandle.h:3704
void ApplyDynamicsWeight(const FReal DynamicsWeight)
Definition ParticleHandle.h:3569
void SetAngularEtherDrag(const T &InAngularEtherDrag)
Definition ParticleHandle.h:3668
bool OneWayInteraction() const
Definition ParticleHandle.h:3468
void SetOneWayInteraction(const bool bInEnabled)
Definition ParticleHandle.h:3469
void SetIsland(const int32 InIsland)
Definition ParticleHandle.h:3699
bool PartialIslandSleepAllowed() const
Definition ParticleHandle.h:3504
int32 CollisionGroup() const
Definition ParticleHandle.h:3431
Private::FIterationSettings IterationSettings() const
Definition ParticleHandle.h:3510
bool Disabled() const
Definition ParticleHandle.h:3538
void Serialize(FChaosArchive &Ar) override
Definition ParticleHandle.h:3417
T MaxAngularSpeedSq() const
Definition ParticleHandle.h:3679
void SetMaxLinearSpeedSq(const T &InLinearSpeed)
Definition ParticleHandle.h:3674
EWakeEventEntry GetWakeEvent()
Definition ParticleHandle.h:3754
FRealSingle InitialOverlapDepenetrationVelocity() const
Definition ParticleHandle.h:3685
void SetInvM(const T &InInvM, bool bInvalidate=true)
Definition ParticleHandle.h:3634
void SetPartialIslandSleepAllowed(bool bInEnabled)
Definition ParticleHandle.h:3505
void SetProjectionSolverIterations(const int32 ProjectionSolverIterationCount)
Definition ParticleHandle.h:3527
ESleepType SleepType() const
Definition ParticleHandle.h:3748
const TVector< T, d > Acceleration() const
Definition ParticleHandle.h:3552
void AddCollisionConstraintFlag(const ECollisionConstraintFlags Flag)
Definition ParticleHandle.h:3475
void SetInitialOverlapDepenetrationVelocity(FRealSingle InVel)
Definition ParticleHandle.h:3686
void SetIterationSettings(const Private::FIterationSettings &SolverIterationSettingsIn)
Definition ParticleHandle.h:3512
void SetLinearImpulseVelocity(const TVector< T, d > &InLinearImpulseVelocity, bool bInvalidate=true)
Definition ParticleHandle.h:3594
void RemoveCollisionConstraintFlag(const ECollisionConstraintFlags Flag)
Definition ParticleHandle.h:3480
int32 Island() const
Definition ParticleHandle.h:3697
T LinearEtherDrag() const
Definition ParticleHandle.h:3661
Definition PBDRigidParticles.h:22
Definition ParticleHandle.h:346
TParticleHandleBase(TSerializablePtr< TParticlesType > InParticles, int32 InParticleIdx)
Definition ParticleHandle.h:359
void SetSOALowLevel(TGeometryParticles< T, d > *InParticles)
Definition ParticleHandle.h:391
TGeometryParticles< T, d > * GeometryParticles
Definition ParticleHandle.h:403
EParticleType GetParticleType() const
Definition ParticleHandle.h:398
~TParticleHandleBase()
Definition ParticleHandle.h:377
TKinematicGeometryParticles< T, d > * KinematicGeometryParticles
Definition ParticleHandle.h:404
EParticleType Type
Definition ParticleHandle.h:413
TSerializablePtr< TGeometryParticles< T, d > > SerializableGeometryParticles
Definition ParticleHandle.h:402
TParticleHandleBase(TGeometryParticles< T, d > *InParticles, int32 InParticleIdx)
Definition ParticleHandle.h:367
T TType
Definition ParticleHandle.h:348
void Serialize(FChaosArchive &Ar)
Definition ParticleHandle.h:381
TPBDRigidClusteredParticles< T, d > * PBDRigidClusteredParticles
Definition ParticleHandle.h:406
int32 ParticleIdx
Definition ParticleHandle.h:412
TPBDRigidParticles< T, d > * PBDRigidParticles
Definition ParticleHandle.h:405
static constexpr int D
Definition ParticleHandle.h:349
TParticleHandleBase()
Definition ParticleHandle.h:351
Definition Particles.h:32
Definition Rotation.h:41
Definition Serializable.h:10
void SetFromRawLowLevel(const T *InPtr)
Definition Serializable.h:46
Definition Vector.h:407
Definition Vector.h:1000
Definition Vector.h:41
virtual CORE_API void UsingCustomVersion(const struct FGuid &Guid)
Definition Archive.cpp:590
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
Definition PhysicsProxyBase.h:97
Chaos::FPhysicsSolverBase * GetSolverBase() const
Definition PhysicsProxyBase.h:112
virtual void * GetHandleUnsafe() const
Definition PhysicsProxyBase.h:121
SOLVER_TYPE * GetSolver() const
Definition PhysicsProxyBase.h:110
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition SharedPointer.h:692
Definition UniquePtr.h:107
Definition GeometryCollectionComponent.h:578
bool ForceDeepCopyOnModifyGeometry()
Definition ParticleHandle.cpp:23
CHAOS_API bool bEnableAsyncInitBody
Definition AsyncInitBodyHelper.cpp:10
FString EmptyParticleName
Definition GeometryParticles.cpp:20
FIterationSettings8 FIterationSettings
Definition IterationSettings.h:83
Definition SkeletalMeshComponent.h:307
bool GeometryParticleSleeping(const FConcrete &Concrete)
Definition ParticleHandle.h:147
EParticleType
Definition GeometryParticlesfwd.h:11
void UpdateParticleShapes(const TArray< ParticleType * > &ShapesParticles, const FImplicitObject *ImplicitObject, const FShapesArray &ShapesArray, const int32 ActorId, const int32 ComponentID)
Definition ParticleHandle.h:3246
ESyncState
Definition GeometryParticlesfwd.h:29
void KinematicGeometryParticleDefaultConstruct(FConcrete &Concrete, const FKinematicGeometryParticleParameters &Params)
Definition ParticleHandle.h:96
EResimType
Definition GeometryParticles.h:143
TPBDRigidParticleHandle< FReal, 3 > FPBDRigidParticleHandle
Definition ParticleHandleFwd.h:60
void PBDRigidParticleDefaultConstruct(FConcrete &Concrete, const FPBDRigidParticleParameters &Params)
Definition ParticleHandle.h:110
FORCEINLINE_DEBUGGABLE uint32 GetChaosCollisionChannelAndExtraFilter(uint32 Word3, uint8 &OutMaskFilter)
Definition ParticleHandle.h:183
TRigidTransform< FReal, 3 > FRigidTransform3
Definition Core.h:22
CHAOS_API int32 AccelerationStructureSplitStaticAndDynamic
Definition PBDRigidsEvolution.cpp:40
EChaosPropertyFlags
Definition ParticleDirtyFlags.h:869
FChaosArchive & operator<<(FChaosArchive &Ar, FRigidParticleControlFlags &Flags)
Definition RigidParticleControlFlags.cpp:15
FORCEINLINE_DEBUGGABLE bool PrePreQueryFilterImp(const FCollisionFilterData &QueryFilterData, const FCollisionFilterData &UnionFilterData)
Definition ParticleHandle.h:161
constexpr EChaosPropertyFlags ChaosPropertyToFlag(EChaosProperty Prop)
Definition ParticleDirtyFlags.h:875
FRealDouble FReal
Definition Real.h:22
void GeometryParticleDefaultConstruct(FConcrete &Concrete, const FGeometryParticleParameters &Params)
Definition ParticleHandle.h:84
ECollisionConstraintFlags
Flags for user-control over per-particle collision behaviour.
Definition CollisionConstraintFlags.h:22
void SetObjectStateHelper(IPhysicsProxyBase &Proxy, FPBDRigidParticleHandle &Rigid, EObjectStateType InState, bool bAllowEvents, bool bInvalidate)
Definition ParticleHandle.cpp:31
EObjectStateType
Definition ObjectState.h:10
EChaosCollisionTraceFlag
Definition Particles.h:231
TGeometryParticleHandle< T, d > * GetHandleHelper(TGeometryParticleHandle< T, d > *Handle)
Definition ParticleHandle.h:423
@ ChaosNumCollisionChannelBits
Definition CollisionFilterBits.h:7
float FRealSingle
Definition Real.h:14
@ ChaosNumExtraFilterBits
Definition CollisionFilterBits.h:6
TVector< FReal, 3 > FVec3
Definition Core.h:17
ESleepType
Definition RigidParticles.h:23
EGeometryParticleListMask
Definition GeometryParticlesfwd.h:115
TEnableIf< T::AlwaysSerializable, TSerializablePtr< T > >::Type & AsAlwaysSerializable(T *&Ptr)
Definition Serializable.h:97
TArray< FShapeInstanceProxyPtr, TInlineAllocator< 1 > > FShapeInstanceProxyArray
Definition ShapeInstanceFwd.h:24
EWakeEventEntry
Definition ParticleHandle.h:1730
TKinematicGeometryParticleHandle< FReal, 3 > FKinematicGeometryParticleHandle
Definition ParticleHandleFwd.h:42
@ Dynamic
Definition SpatialAccelerationCollection.h:22
void PBDRigidClusteredParticleDefaultConstruct(FConcrete &Concrete, const FPBDRigidParticleParameters &Params)
Definition ParticleHandle.h:141
FORCEINLINE_DEBUGGABLE bool PrePreSimFilterImp(const FCollisionFilterData &SimFilterData, const FCollisionFilterData &OtherSimFilterData)
Definition ParticleHandle.h:192
Definition OverriddenPropertySet.cpp:45
FAutoConsoleVariableRef CVars[]
Definition MassProcessingPhaseManager.cpp:29
@ false
Definition radaudio_common.h:23
Definition PBDRigidClusteredParticles.h:25
FPBDRigidParticleHandle * Id
Definition PBDRigidClusteredParticles.h:34
Definition ParticleDirtyFlags.h:722
Definition ParticleHandle.h:47
FGeometryParticleParameters()
Definition ParticleHandle.h:48
bool bDisabled
Definition ParticleHandle.h:50
Definition ParticleHandle.h:57
FKinematicGeometryParticleParameters()
Definition ParticleHandle.h:58
Definition ParticleHandle.h:67
FPBDRigidParticleParameters()
Definition ParticleHandle.h:68
bool bStartSleeping
Definition ParticleHandle.h:74
bool bCCDEnabled
Definition ParticleHandle.h:76
bool bGravityEnabled
Definition ParticleHandle.h:75
Definition ParticleDirtyFlags.h:37
Definition GeometryParticlesfwd.h:59
Definition GeometryParticlesfwd.h:87
bool IsValid() const
Definition GeometryParticlesfwd.h:92
Definition PBDRigidClusteredParticles.h:48
Definition CollisionFilterData.h:46
uint32 Word3
Definition CollisionFilterData.h:50
uint32 Word0
Definition CollisionFilterData.h:47
uint32 Word2
Definition CollisionFilterData.h:49
uint32 Word1
Definition CollisionFilterData.h:48
Definition Color.h:486
static CORE_API const FColor Red
Definition Color.h:752
CORE_API static const FGuid GUID
Definition ExternalPhysicsCustomObjectVersion.h:144
@ SerializeShapeWorldSpaceBounds
Definition ExternalPhysicsCustomObjectVersion.h:61
@ SerializeHashResult
Definition ExternalPhysicsCustomObjectVersion.h:55
@ UniquePayloadIdx
Definition ExternalPhysicsCustomObjectVersion.h:115
Definition PhysSubstepTasks.h:18
Definition NumericLimits.h:41
Definition PimplPtr.h:50