UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SingleParticlePhysicsProxy.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Chaos/Real.h"
11#include "Chaos/PhysicsObject.h"
12#include "PhysicsCoreTypes.h"
13#include "Chaos/Defines.h"
15#include "Chaos/Core.h"
17#include "Framework/Threading.h"
18#include "Math/NumericLimits.h"
19#include "RewindData.h"
20
21
22namespace Chaos
23{
24
25class FPBDRigidsEvolutionGBF;
26
27struct FDirtyRigidParticleData;
28
30{
31public:
33 : Mass(0.f)
34 , InvMass(0.f)
35 , InertiaTensor(1.f)
36 {}
37
39 : Mass(MassIn)
40 , InvMass(InvMassIn)
41 , InertiaTensor(InertiaTensorIn)
42 {}
43
44 FReal GetMass() const { return Mass; }
45 FReal GetInverseMass() const { return InvMass; }
46 FVector GetInertiaTensor() const { return InertiaTensor; }
47
48private:
49 FReal Mass;
50 FReal InvMass;
51 FVector InertiaTensor;
52};
53
54class FRigidBodyHandle_External;
55class FRigidBodyHandle_Internal;
56
58{
59public:
62
64
69
70 FProxyInterpolationBase* GetInterpolationData() { return InterpolationData.Get(); }
71 const FProxyInterpolationBase* GetInterpolationData() const { return InterpolationData.Get(); }
72
77
79 {
80 return (const FRigidBodyHandle_External&)*this;
81 }
82
83 //Note this is a pointer because the internal handle may have already been deleted
88
89 //Note this is a pointer because the internal handle may have already been deleted
91 {
92 return GetHandle_LowLevel() == nullptr ? nullptr : (const FRigidBodyHandle_Internal*)this;
93 }
94
95 //Returns the underlying physics thread particle. Note this should only be needed for internal book keeping type tasks. API may change, use GetPhysicsThreadAPI instead
97 {
98 return Handle;
99 }
100
101 //Returns the underlying physics thread particle. Note this should only be needed for internal book keeping type tasks. API may change, use GetPhysicsThreadAPI instead
103 {
104 return Handle;
105 }
106
107 virtual void* GetHandleUnsafe() const override
108 {
109 return Handle;
110 }
111
116
117 // Threading API
118
119 CHAOS_API void PushToPhysicsState(const FDirtyPropertiesManager& Manager,int32 DataIdx,const FDirtyProxy& Dirty,FShapeDirtyData* ShapesData, FReal ExternalDt);
120
121
123
124
126
127
129
130
132
133
134 CHAOS_API bool IsDirty();
135
136
137
139
140
141 CHAOS_API void ClearEvents();
142
143 //Returns the underlying game thread particle. Note this should only be needed for internal book keeping type tasks. API may change, use GetGameThreadAPI instead
145 {
146 return Particle.Get();
147 }
148
149 //Returns the underlying game thread particle. Note this should only be needed for internal book keeping type tasks. API may change, use GetGameThreadAPI instead
151 {
152 return Particle.Get();
153 }
154
159
161 {
162 return static_cast<const FPBDRigidParticle*>(GetParticle_LowLevel());
163 }
164
169
171 {
172 return Reference.Get();
173 }
174
176 template<typename ErrorDataType>
178 {
179 if (!InterpolationData.IsValid())
180 {
181 InterpolationData = MakeUnique<ErrorDataType>();
182 }
183 else if (InterpolationData.Get()->GetInterpolationType() != ErrorDataType::InterpolationType)
184 {
185 InterpolationData = MakeUnique<ErrorDataType>(InterpolationData.Get()->GetPullDataInterpIdx_External(), InterpolationData.Get()->GetInterpChannel_External());
186 }
187
188 return static_cast<ErrorDataType*>(InterpolationData.Get());
189 }
190
191protected:
195
197
198private:
199 TUniquePtr<FProxyInterpolationBase> InterpolationData;
200
201 //use static Create
203};
204
206template <bool bExternal>
208{
209 TThreadedSingleParticlePhysicsProxyBase() = delete; //You should only ever new FSingleParticlePhysicsProxy, derived types are simply there for API constraining, no new data
210public:
211
213
215 {
216 return Read([](auto* Particle) { return Particle->CastToKinematicParticle() != nullptr; });
217 }
218
219 bool CanTreatAsRigid() const
220 {
221 return Read([](auto* Particle) { return Particle->CastToRigidParticle() != nullptr; });
222 }
223
224 //API for static particle
225 const FVec3& X() const { return ReadRef([](auto* Particle) -> const auto& { return Particle->GetX(); }); }
226 const FVec3& GetX() const { return ReadRef([](auto* Particle) -> const auto& { return Particle->GetX(); }); }
227
228protected:
229 void SetXBase(const FVec3& InX, bool bInvalidate = true) { Write([&InX, bInvalidate, this](auto* Particle)
230 {
231 if (bInvalidate)
232 {
233 auto Dyn = Particle->CastToRigidParticle();
234 if (Dyn && Dyn->ObjectState() == EObjectStateType::Sleeping)
235 {
236 SetObjectStateHelper(*GetProxy(), *Dyn, EObjectStateType::Dynamic, true);
237 }
238 }
239 Particle->SetX(InX, bInvalidate);
240 });}
241public:
242
243 FUniqueIdx UniqueIdx() const { return Read([](auto* Particle) { return Particle->UniqueIdx(); }); }
244 void SetUniqueIdx(const FUniqueIdx UniqueIdx, bool bInvalidate = true) { Write([UniqueIdx, bInvalidate](auto* Particle) { Particle->SetUniqueIdx(UniqueIdx, bInvalidate); }); }
245
246 FRotation3 R() const { return Read([](auto* Particle) -> const auto { return Particle->GetR(); }); }
247 FRotation3 GetR() const { return Read([](auto* Particle) -> const auto { return Particle->GetR(); }); }
248
249protected:
250 void SetRBase(const FRotation3& InR, bool bInvalidate = true){ Write([&InR, bInvalidate, this](auto* Particle)
251 {
252 if (bInvalidate)
253 {
254 auto Dyn = Particle->CastToRigidParticle();
255 if (Dyn && Dyn->ObjectState() == EObjectStateType::Sleeping)
256 {
257 SetObjectStateHelper(*GetProxy(), *Dyn, EObjectStateType::Dynamic, true);
258 }
259 }
260 Particle->SetR(InR, bInvalidate);
261 });}
262public:
263
264 UE_DEPRECATED(5.4, "Use GetGeometry instead.")
271
272
273#if CHAOS_DEBUG_NAME
274 const TSharedPtr<FString, ESPMode::ThreadSafe>& DebugName() const { return ReadRef([](auto* Ptr) -> const auto& { return Ptr->DebugName(); }); }
275 void SetDebugName(const TSharedPtr<FString, ESPMode::ThreadSafe>& InDebugName) { Write([&InDebugName](auto* Ptr) { Ptr->SetDebugName(InDebugName); }); }
276#endif
277
278 const FImplicitObjectRef GetGeometry() const { return Read([](auto* Ptr) { FImplicitObjectRef ImplicitRef = Ptr->GetGeometry(); return ImplicitRef; }); }
279
280 UE_DEPRECATED(5.4, "Please use GetGeometry instead")
282
283 const FShapesArray& ShapesArray() const { return ReadRef([](auto* Ptr) -> const auto& { return Ptr->ShapesArray(); }); }
284
285 EObjectStateType ObjectState() const { return Read([](auto* Ptr) { return Ptr->ObjectState(); }); }
286
287 EParticleType ObjectType() const { return Read([](auto* Ptr) { return Ptr->ObjectType(); }); }
288
289 FSpatialAccelerationIdx SpatialIdx() const { return Read([](auto* Ptr) { return Ptr->SpatialIdx(); }); }
290 void SetSpatialIdx(FSpatialAccelerationIdx Idx) { Write([Idx](auto* Ptr) { Ptr->SetSpatialIdx(Idx); }); }
291
292 //API for kinematic particle
293 const FVec3 V() const
294 {
295 return Read([](auto* Particle)
296 {
297 if (auto Kinematic = Particle->CastToKinematicParticle())
298 {
299 return Kinematic->GetV();
300 }
301
302 return FVec3(0);
303 });
304 }
305 const FVec3 GetV() const
306 {
307 return V();
308 }
309
310protected:
311 void SetVBase(const FVec3& InV, bool bInvalidate = true)
312 {
313 Write([&InV, bInvalidate, this](auto* Particle)
314 {
315 if (auto Kinematic = Particle->CastToKinematicParticle())
316 {
317 if (bInvalidate)
318 {
319 auto Dyn = Particle->CastToRigidParticle();
320 if (Dyn && Dyn->ObjectState() == EObjectStateType::Sleeping && !InV.IsNearlyZero())
321 {
322 SetObjectStateHelper(*GetProxy(), *Dyn, EObjectStateType::Dynamic, true);
323 }
324 }
325
326 Kinematic->SetV(InV, bInvalidate);
327 }
328 });
329 }
330public:
331
332 const FVec3 W() const
333 {
334 return Read([](auto* Particle)
335 {
336 if (auto Kinematic = Particle->CastToKinematicParticle())
337 {
338 return Kinematic->GetW();
339 }
340
341 return FVec3(0);
342 });
343 }
344
345 const FVec3 GetW() const
346 {
347 return W();
348 }
349
350protected:
351 void SetWBase(const FVec3& InW, bool bInvalidate = true)
352 {
353 Write([&InW, bInvalidate, this](auto* Particle)
354 {
355 if (auto Kinematic = Particle->CastToKinematicParticle())
356 {
357 if (bInvalidate)
358 {
359 auto Dyn = Particle->CastToRigidParticle();
360 if (Dyn && Dyn->ObjectState() == EObjectStateType::Sleeping && !InW.IsNearlyZero())
361 {
362 SetObjectStateHelper(*GetProxy(), *Dyn, EObjectStateType::Dynamic, true);
363 }
364 }
365
366 Kinematic->SetW(InW, bInvalidate);
367 }
368 });
369 }
370public:
371
373 {
374 SetKinematicTarget(FKinematicTarget::MakePositionTarget(InTargetTransform), bInvalidate);
375 }
376
378 {
379 Write([&InKinematicTarget, bInvalidate](auto* Ptr)
380 {
381 if (auto Kinematic = Ptr->CastToKinematicParticle())
382 {
383 Kinematic->SetKinematicTarget(InKinematicTarget, bInvalidate);
384 }
385 });
386 }
387
388 //API for dynamic particle
389
390 bool GravityEnabled() const
391 {
392 return Read([](auto* Particle)
393 {
394 if (auto Rigid = Particle->CastToRigidParticle())
395 {
396 return Rigid->GravityEnabled();
397 }
398
399 return false;
400 });
401 }
402
404 {
405 Write([InGravityEnabled](auto* Particle)
406 {
407 if (auto Rigid = Particle->CastToRigidParticle())
408 {
409 return Rigid->SetGravityEnabled(InGravityEnabled);
410 }
411 });
412 }
413
415 {
416 return Read([](auto* Particle)
417 {
418 if (auto Rigid = Particle->CastToRigidParticle())
419 {
420 return Rigid->GravityGroupIndex();
421 }
422
423 return -1;
424 });
425 }
426
428 {
429 Write([InGravityGroupIndex](auto* Particle)
430 {
431 if (auto Rigid = Particle->CastToRigidParticle())
432 {
433 return Rigid->SetGravityGroupIndex(InGravityGroupIndex);
434 }
435 });
436 }
437
439 {
440 return Read([](auto* Particle)
441 {
442 if (auto Rigid = Particle->CastToRigidParticle())
443 {
444 return Rigid->UpdateKinematicFromSimulation();
445 }
446
447 return false;
448 });
449 }
450
452 {
453 Write([InUpdateKinematicFromSimulation](auto* Particle)
454 {
455 if (auto Rigid = Particle->CastToRigidParticle())
456 {
457 return Rigid->SetUpdateKinematicFromSimulation(InUpdateKinematicFromSimulation);
458 }
459 });
460 }
461
463 {
464 return Read([](auto* Particle)
465 {
466 if (auto Rigid = Particle->CastToRigidParticle())
467 {
468 return Rigid->GyroscopicTorqueEnabled();
469 }
470
471 return false;
472 });
473 }
474
476 {
477 Write([InGyroscopicTorqueEnabled](auto* Particle)
478 {
479 if (auto Rigid = Particle->CastToRigidParticle())
480 {
481 return Rigid->SetGyroscopicTorqueEnabled(InGyroscopicTorqueEnabled);
482 }
483 });
484 }
485
486 bool CCDEnabled() const
487 {
488 return Read([](auto* Particle)
489 {
490 if (auto Rigid = Particle->CastToRigidParticle())
491 {
492 return Rigid->CCDEnabled();
493 }
494
495 return false;
496 });
497 }
498
500 {
501 Write([InCCDEnabled](auto* Particle)
502 {
503 if (auto Rigid = Particle->CastToRigidParticle())
504 {
505 return Rigid->SetCCDEnabled(InCCDEnabled);
506 }
507 });
508 }
509
510 bool MACDEnabled() const
511 {
512 return Read([](auto* Particle)
513 {
514 if (auto Rigid = Particle->CastToRigidParticle())
515 {
516 return Rigid->MACDEnabled();
517 }
518
519 return false;
520 });
521 }
522
524 {
525 Write([InMACDEnabled](auto* Particle)
526 {
527 if (auto Rigid = Particle->CastToRigidParticle())
528 {
529 return Rigid->SetMACDEnabled(InMACDEnabled);
530 }
531 });
532 }
533
535 {
536 return Read([](auto* Particle)
537 {
538 if (auto Rigid = Particle->CastToRigidParticle())
539 {
540 return Rigid->PartialIslandSleepAllowed();
541 }
542
543 return false;
544 });
545 }
546
548 {
549 Write([InPartialIslandSleepAllowed](auto* Particle)
550 {
551 if (auto Rigid = Particle->CastToRigidParticle())
552 {
553 return Rigid->SetPartialIslandSleepAllowed(InPartialIslandSleepAllowed);
554 }
555 });
556 }
557
559 {
560 Write([PositionSolverIterationsIn](auto* Particle)
561 {
562 if (auto Rigid = Particle->CastToRigidParticle())
563 {
564 return Rigid->SetPositionSolverIterations(PositionSolverIterationsIn);
565 }
566 });
567 }
568
570 {
571 Write([VelocitySolverIterationsIn](auto* Particle)
572 {
573 if (auto Rigid = Particle->CastToRigidParticle())
574 {
575 return Rigid->SetVelocitySolverIterations(VelocitySolverIterationsIn);
576 }
577 });
578 }
579
581 {
582 Write([ProjectionSolverIterationsIn](auto* Particle)
583 {
584 if (auto Rigid = Particle->CastToRigidParticle())
585 {
586 return Rigid->SetProjectionSolverIterations(ProjectionSolverIterationsIn);
587 }
588 });
589 }
590
591 bool OneWayInteraction() const
592 {
593 return Read([](auto* Particle)
594 {
595 if (auto Rigid = Particle->CastToRigidParticle())
596 {
597 return Rigid->OneWayInteraction();
598 }
599
600 return false;
601 });
602 }
603
605 {
606 Write([bInOneWayInteraction](auto* Particle)
607 {
608 if (auto Rigid = Particle->CastToRigidParticle())
609 {
610 return Rigid->SetOneWayInteraction(bInOneWayInteraction);
611 }
612 });
613 }
614
616 {
617 return Read([](auto* Particle)
618 {
619 if (auto Rigid = Particle->CastToRigidParticle())
620 {
621 return Rigid->InertiaConditioningEnabled();
622 }
623
624 return false;
625 });
626 }
627
629 {
630 Write([bInEnabled](auto* Particle)
631 {
632 if (auto Rigid = Particle->CastToRigidParticle())
633 {
634 return Rigid->SetInertiaConditioningEnabled(bInEnabled);
635 }
636 });
637 }
638
639 void SetResimType(EResimType ResimType)
640 {
641 Write([ResimType](auto* Particle)
642 {
643 if (auto Rigid = Particle->CastToRigidParticle())
644 {
645 return Rigid->SetResimType(ResimType);
646 }
647 });
648 }
649
651 {
652 if (auto Rigid = Particle->CastToRigidParticle())
653 {
654 return Rigid->ResimType();
655 }
656
657 return EResimType::FullResim;
658 }
659
660 const FVec3 Acceleration() const
661 {
662 return Read([](auto* Particle)
663 {
664 if (auto Rigid = Particle->CastToRigidParticle())
665 {
666 return Rigid->Acceleration();
667 }
668
669 return FVec3(0);
670 });
671 }
672
674 {
675 Write([&Acceleration, bInvalidate, this](auto* Particle)
676 {
677 if (auto Rigid = Particle->CastToRigidParticle())
678 {
679 if (Rigid->ObjectState() == EObjectStateType::Sleeping || Rigid->ObjectState() == EObjectStateType::Dynamic)
680 {
681 if (bInvalidate)
682 {
683 SetObjectStateHelper(*GetProxy(), *Rigid, EObjectStateType::Dynamic, true);
684 }
685
686 Rigid->SetAcceleration(Acceleration);
687 }
688 }
689 });
690 }
691
692 void AddForce(const FVec3& InForce, bool bInvalidate = true)
693 {
694 Write([&InForce, bInvalidate, this](auto* Particle)
695 {
696 if (auto* Rigid = Particle->CastToRigidParticle())
697 {
698 if (Rigid->ObjectState() == EObjectStateType::Sleeping || Rigid->ObjectState() == EObjectStateType::Dynamic)
699 {
700 if (bInvalidate)
701 {
702 SetObjectStateHelper(*GetProxy(), *Rigid, EObjectStateType::Dynamic, true);
703 }
704
705 Rigid->AddForce(InForce, bInvalidate);
706 }
707 }
708 });
709 }
710
711 void SetAngularAcceleration(const FVec3& AngularAcceleration, bool bInvalidate = true)
712 {
713 Write([&AngularAcceleration, bInvalidate, this](auto* Particle)
714 {
715 if (auto Rigid = Particle->CastToRigidParticle())
716 {
717 if (Rigid->ObjectState() == EObjectStateType::Sleeping || Rigid->ObjectState() == EObjectStateType::Dynamic)
718 {
719 if (bInvalidate)
720 {
721 SetObjectStateHelper(*GetProxy(), *Rigid, EObjectStateType::Dynamic, true);
722 }
723
724 Rigid->SetAngularAcceleration(AngularAcceleration);
725 }
726 }
727 });
728 }
729
731 {
732 return Read([](auto* Particle)
733 {
734 if (auto Rigid = Particle->CastToRigidParticle())
735 {
736 return Rigid->AngularAcceleration();
737 }
738
739 return FVec3(0);
740 });
741 }
742
743 void AddTorque(const FVec3& InTorque, bool bInvalidate = true)
744 {
745 Write([&InTorque, bInvalidate, this](auto* Particle)
746 {
747 if (auto* Rigid = Particle->CastToRigidParticle())
748 {
749 if (Rigid->ObjectState() == EObjectStateType::Sleeping || Rigid->ObjectState() == EObjectStateType::Dynamic)
750 {
751 if (bInvalidate)
752 {
753 SetObjectStateHelper(*GetProxy(), *Rigid, EObjectStateType::Dynamic, true);
754 }
755
756 Rigid->AddTorque(InTorque, bInvalidate);
757 }
758 }
759 });
760 }
761
763 {
764 return Read([](auto* Particle)
765 {
766 if (auto Rigid = Particle->CastToRigidParticle())
767 {
768 return Rigid->LinearImpulseVelocity();
769 }
770
771 return FVec3(0);
772 });
773 }
774
775 const FVec3 LinearImpulse() const
776 {
777 return Read([](auto* Particle)
778 {
779 if (auto Rigid = Particle->CastToRigidParticle())
780 {
781 return Rigid->LinearImpulseVelocity() * Rigid->M();
782 }
783
784 return FVec3(0);
785 });
786 }
787
789 {
790 Write([&InLinearImpulse, bIsVelocity, bInvalidate, this](auto* Particle)
791 {
792 if (auto Rigid = Particle->CastToRigidParticle())
793 {
794 if (Rigid->ObjectState() == EObjectStateType::Sleeping || Rigid->ObjectState() == EObjectStateType::Dynamic)
795 {
796 if (bInvalidate)
797 {
798 SetObjectStateHelper(*GetProxy(), *Rigid, EObjectStateType::Dynamic, true);
799 }
800
801 if (bIsVelocity)
802 {
803 Rigid->SetLinearImpulseVelocity(InLinearImpulse, bInvalidate);
804 }
805 else
806 {
807 Rigid->SetLinearImpulseVelocity(InLinearImpulse * Rigid->InvM(), bInvalidate);
808 }
809 }
810 }
811 });
812 }
813
815 {
816 return Read([](auto* Particle)
817 {
818 if (auto Rigid = Particle->CastToRigidParticle())
819 {
820 return Rigid->AngularImpulseVelocity();
821 }
822
823 return FVec3(0);
824 });
825 }
826
827 const FVec3 AngularImpulse() const
828 {
829 return Read([](auto* Particle)
830 {
831 if (auto Rigid = Particle->CastToRigidParticle())
832 {
833 const FMatrix33 WorldI = Utilities::ComputeWorldSpaceInertia(Rigid->GetR() * Rigid->RotationOfMass(), Rigid->I());
834 return WorldI * Rigid->AngularImpulseVelocity();
835 }
836
837 return FVec3(0);
838 });
839 }
840
842 {
843 Write([&InAngularImpulse, bIsVelocity, bInvalidate, this](auto* Particle)
844 {
845 if (auto Rigid = Particle->CastToRigidParticle())
846 {
847 if (Rigid->ObjectState() == EObjectStateType::Sleeping || Rigid->ObjectState() == EObjectStateType::Dynamic)
848 {
849 if (bInvalidate)
850 {
851 SetObjectStateHelper(*GetProxy(), *Rigid, EObjectStateType::Dynamic, true);
852 }
853
854 if (bIsVelocity)
855 {
856 Rigid->SetAngularImpulseVelocity(InAngularImpulse, bInvalidate);
857 }
858 else
859 {
860 const FMatrix33 WorldInvI = Utilities::ComputeWorldSpaceInertia(Rigid->GetR() * Rigid->RotationOfMass(), Rigid->InvI());
861 Rigid->SetAngularImpulseVelocity(WorldInvI * InAngularImpulse, bInvalidate);
862 }
863 }
864 }
865 });
866 }
867
869 {
870 return Read([](auto* Particle)
871 {
872 if (auto Rigid = Particle->CastToRigidParticle())
873 {
874 return Rigid->I();
875 }
876
877 return Chaos::TVec3<FRealSingle>(0, 0, 0);
878 });
879 }
880
882 {
883 Write([&InI](auto* Particle)
884 {
885 if (auto Rigid = Particle->CastToRigidParticle())
886 {
887 Rigid->SetI(InI);
888 }
889 });
890 }
891
893 {
894 return Read([](auto* Particle)
895 {
896 if (auto Rigid = Particle->CastToRigidParticle())
897 {
898 return Rigid->InvI();
899 }
900
901 return Chaos::TVec3<FRealSingle>(0, 0, 0);
902 });
903 }
904
906 {
907 Write([&InInvI](auto* Particle)
908 {
909 if (auto Rigid = Particle->CastToRigidParticle())
910 {
911 Rigid->SetInvI(InInvI);
912 }
913 });
914 }
915
916 const FReal M() const
917 {
918 return Read([](auto* Particle) -> FReal
919 {
920 if (auto Rigid = Particle->CastToRigidParticle())
921 {
922 return Rigid->M();
923 }
924
925 return 0;
926 });
927 }
928
929 void SetM(const FReal InM)
930 {
931 Write([&InM](auto* Particle)
932 {
933 if (auto Rigid = Particle->CastToRigidParticle())
934 {
935 Rigid->SetM(InM);
936 }
937 });
938 }
939
940 const FReal InvM() const
941 {
942 return Read([](auto* Particle) -> FReal
943 {
944 if (auto Rigid = Particle->CastToRigidParticle())
945 {
946 return Rigid->InvM();
947 }
948
949 return 0;
950 });
951 }
952
953 void SetInvM(const FReal InInvM)
954 {
955 Write([&InInvM](auto* Particle)
956 {
957 if (auto Rigid = Particle->CastToRigidParticle())
958 {
959 Rigid->SetInvM(InInvM);
960 }
961 });
962 }
963
964 const FVec3 CenterOfMass() const
965 {
966 return Read([](auto* Particle)
967 {
968 if (auto Rigid = Particle->CastToRigidParticle())
969 {
970 return Rigid->CenterOfMass();
971 }
972
973 return FVec3(0);
974 });
975 }
976
978 {
979 Write([&InCenterOfMass, bInvalidate](auto* Particle)
980 {
981 if (auto Rigid = Particle->CastToRigidParticle())
982 {
983 Rigid->SetCenterOfMass(InCenterOfMass, bInvalidate);
984 }
985 });
986 }
987
989 {
990 return Read([](auto* Particle)
991 {
992 if (auto Rigid = Particle->CastToRigidParticle())
993 {
994 return Rigid->RotationOfMass();
995 }
996
997 return FRotation3::FromIdentity();
998 });
999 }
1000
1002 {
1003 Write([&InRotationOfMass, bInvalidate](auto* Particle)
1004 {
1005 if (auto Rigid = Particle->CastToRigidParticle())
1006 {
1007 Rigid->SetRotationOfMass(InRotationOfMass, bInvalidate);
1008 }
1009 });
1010 }
1011
1013 {
1014 return Read([](auto* Particle) -> FReal
1015 {
1016 if (auto Rigid = Particle->CastToRigidParticle())
1017 {
1018 return Rigid->LinearEtherDrag();
1019 }
1020
1021 return 0;
1022 });
1023 }
1024
1026 {
1027 Write([&InLinearEtherDrag](auto* Particle)
1028 {
1029 if (auto Rigid = Particle->CastToRigidParticle())
1030 {
1031 Rigid->SetLinearEtherDrag(InLinearEtherDrag);
1032 }
1033 });
1034 }
1035
1037 {
1038 return Read([](auto* Particle) -> FReal
1039 {
1040 if (auto Rigid = Particle->CastToRigidParticle())
1041 {
1042 return Rigid->AngularEtherDrag();
1043 }
1044
1045 return 0;
1046 });
1047 }
1048
1050 {
1051 Write([&InAngularEtherDrag](auto* Particle)
1052 {
1053 if (auto Rigid = Particle->CastToRigidParticle())
1054 {
1055 Rigid->SetAngularEtherDrag(InAngularEtherDrag);
1056 }
1057 });
1058 }
1059
1060protected:
1062 {
1063 Write([InState, bAllowEvents, bInvalidate, this](auto* Ptr)
1064 {
1065 if (auto Rigid = Ptr->CastToRigidParticle())
1066 {
1067 SetObjectStateHelper(*this, *Rigid, InState, bAllowEvents, bInvalidate);
1068 }
1069 });
1070 }
1071public:
1072
1074 {
1075 Write([InSleepType](auto* Particle)
1076 {
1077 if (auto Rigid = Particle->CastToRigidParticle())
1078 {
1079 return Rigid->SetSleepType(InSleepType);
1080 }
1081 });
1082 }
1083
1085 {
1086 if (auto Rigid = Particle->CastToRigidParticle())
1087 {
1088 return Rigid->SleepType();
1089 }
1090
1091 return ESleepType::MaterialSleep;
1092 }
1093
1094protected:
1095 void VerifyContext() const
1096 {
1097#if PHYSICS_THREAD_CONTEXT
1098 //Are you using the wrong API type for the thread this code runs in?
1099 //GetGameThreadAPI should be used for gamethread, GetPhysicsThreadAPI should be used for callbacks and internal physics thread
1100 //Note if you are using a ParallelFor you must use PhysicsParallelFor to ensure the right context is inherited from parent thread
1101 if(bExternal)
1102 {
1103 //if proxy is registered with solver, we need a lock
1104 if(GetSolverBase() != nullptr)
1105 {
1107 }
1108 }
1109 else
1110 {
1112 }
1113#endif
1114 }
1115
1116private:
1117
1118 template <typename TLambda>
1119 auto Read(const TLambda& Lambda) const { VerifyContext(); return bExternal ? Lambda(GetParticle_LowLevel()) : Lambda(GetHandle_LowLevel()); }
1120
1121 template <typename TLambda>
1122 const auto& ReadRef(const TLambda& Lambda) const { VerifyContext(); return bExternal ? Lambda(GetParticle_LowLevel()) : Lambda(GetHandle_LowLevel()); }
1123
1124 template <typename TLambda>
1125 auto& ReadRef(const TLambda& Lambda) { VerifyContext(); return bExternal ? Lambda(GetParticle_LowLevel()) : Lambda(GetHandle_LowLevel()); }
1126
1127 template <typename TLambda>
1128 void Write(const TLambda& Lambda)
1129 {
1130 VerifyContext();
1131 if (bExternal)
1132 {
1133 Lambda(GetParticle_LowLevel());
1134 }
1135 else
1136 {
1137 //Mark entire particle as dirty from PT. TODO: use property system
1138 FPhysicsSolverBase* SolverBase = GetSolverBase(); //internal so must have solver already
1139 if(FRewindData* RewindData = SolverBase->GetRewindData())
1140 {
1141 RewindData->MarkDirtyFromPT(*GetHandle_LowLevel());
1142 }
1143
1144 Lambda(GetHandle_LowLevel());
1145 }
1146 }
1147};
1148
1149static_assert(sizeof(TThreadedSingleParticlePhysicsProxyBase<true>) == sizeof(FSingleParticlePhysicsProxy), "Derived types only used to constrain API, all data lives in base class ");
1150static_assert(sizeof(TThreadedSingleParticlePhysicsProxyBase<false>) == sizeof(FSingleParticlePhysicsProxy), "Derived types only used to constrain API, all data lives in base class ");
1151
1152
1154{
1155 FRigidBodyHandle_External() = delete; //You should only ever new FSingleParticlePhysicsProxy, derrived types are simply there for API constraining, no new data
1156
1157public:
1159 using Base::VerifyContext;
1160
1161 void SetIgnoreAnalyticCollisions(bool bIgnoreAnalyticCollisions) { VerifyContext(); GetParticle_LowLevel()->SetIgnoreAnalyticCollisions(bIgnoreAnalyticCollisions); }
1162 void UpdateShapeBounds() { VerifyContext(); GetParticle_LowLevel()->UpdateShapeBounds(); }
1163
1164 void UpdateShapeBounds(const FTransform& Transform) { VerifyContext(); GetParticle_LowLevel()->UpdateShapeBounds(Transform); }
1165
1166 void SetShapeCollisionTraceType(int32 InShapeIndex, EChaosCollisionTraceFlag TraceType) { VerifyContext(); GetParticle_LowLevel()->SetShapeCollisionTraceType(InShapeIndex, TraceType); }
1167
1168 void SetShapeSimCollisionEnabled(int32 InShapeIndex, bool bInEnabled) { VerifyContext(); GetParticle_LowLevel()->SetShapeSimCollisionEnabled(InShapeIndex, bInEnabled); }
1169 void SetShapeQueryCollisionEnabled(int32 InShapeIndex, bool bInEnabled) { VerifyContext(); GetParticle_LowLevel()->SetShapeQueryCollisionEnabled(InShapeIndex, bInEnabled); }
1170 void SetShapeSimData(int32 InShapeIndex, const FCollisionFilterData& SimData) { VerifyContext(); GetParticle_LowLevel()->SetShapeSimData(InShapeIndex, SimData); }
1171
1172 void SetParticleID(const FParticleID& ParticleID)
1173 {
1174 VerifyContext();
1175 GetParticle_LowLevel()->SetParticleID(ParticleID);
1176 }
1177
1178 void SetX(const FVec3& InX, bool bInvalidate = true)
1179 {
1180 VerifyContext();
1181 SetXBase(InX, bInvalidate);
1183 SyncTS.OverWriteX.Set(GetSolverSyncTimestamp_External(), InX);
1184 }
1185
1186 void SetR(const FRotation3& InR, bool bInvalidate = true)
1187 {
1188 VerifyContext();
1189 SetRBase(InR, bInvalidate);
1191 SyncTS.OverWriteR.Set(GetSolverSyncTimestamp_External(), InR);
1192 }
1193
1194 void SetV(const FVec3& InV, bool bInvalidate = true)
1195 {
1196 VerifyContext();
1197 SetVBase(InV, bInvalidate);
1198 if (InV == FVec3(0)) //should we use an explicit API instead?
1199 {
1200 //external thread is setting velocity to 0 so we want to freeze object until sim catches up
1201 //but we also want position to snap to where it currently is on external thread
1202 SetX(X(), bInvalidate);
1203 }
1205 SyncTS.OverWriteV.Set(GetSolverSyncTimestamp_External(), InV);
1206 }
1207
1208 void SetW(const FVec3& InW, bool bInvalidate = true)
1209 {
1210 VerifyContext();
1211 SetWBase(InW, bInvalidate);
1212
1213 if (InW == FVec3(0)) //should we use an explicit API instead?
1214 {
1215 //external thread is setting velocity to 0 so we want to freeze object until sim catches up
1216 //but we also want position to snap to where it currently is on external thread
1217 SetR(R(), bInvalidate);
1218 }
1220 SyncTS.OverWriteW.Set(GetSolverSyncTimestamp_External(), InW);
1221 }
1222
1223 void SetObjectState(const EObjectStateType InState, bool bAllowEvents = false, bool bInvalidate = true)
1224 {
1225 VerifyContext();
1226 if (auto Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1227 {
1229 SyncTS.ObjectStateTimestamp = GetSolverSyncTimestamp_External();
1230 if (InState != EObjectStateType::Dynamic && Rigid->ObjectState() == EObjectStateType::Dynamic)
1231 {
1232 //we want to snap the particle to its current state on the external thread. This is because the user wants the object to fully stop right now
1233 //the internal thread will continue if async is on, but eventually it will see this snap
1234 SetV(FVec3(0), bInvalidate);
1235 SetW(FVec3(0), bInvalidate);
1236 }
1237
1238 if (InState == EObjectStateType::Kinematic && Rigid->ObjectState() != EObjectStateType::Kinematic)
1239 {
1240 // NOTE: using ClearKinematicTarget() here would just clean the dirty flag, but we actually
1241 // want to make sure the kinematic target mode is set to "None", which is how it's default constructed.
1242 SetKinematicTarget(Chaos::FKinematicTarget(), bInvalidate);
1243 }
1244 }
1245
1246 SetObjectStateBase(InState, bAllowEvents, bInvalidate);
1247 }
1248
1250 {
1251 VerifyContext();
1252 if (const TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1253 {
1254 return Rigid->Island();
1255 }
1256
1257 return INDEX_NONE;
1258 }
1259 // TODO(stett): Make the setter private. It is public right now to provide access to proxies.
1261 {
1262 VerifyContext();
1263 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1264 {
1265 Rigid->SetIsland(InIsland);
1266 }
1267 }
1268
1270 {
1271 VerifyContext();
1272 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1273 {
1274 Rigid->ClearEvents();
1275 }
1276 }
1277
1279 {
1280 VerifyContext();
1281 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1282 {
1283 return Rigid->GetWakeEvent();
1284 }
1285
1286 return EWakeEventEntry::None;
1287 }
1288
1289 void ClearForces(bool bInvalidate = true)
1290 {
1291 VerifyContext();
1292 if (TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1293 {
1294
1295 Rigid->ClearForces(bInvalidate);
1296 }
1297 }
1298
1299 void ClearTorques(bool bInvalidate = true)
1300 {
1301 VerifyContext();
1302 if (TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1303 {
1304 Rigid->ClearTorques(bInvalidate);
1305 }
1306 }
1307
1308 void* UserData() const { VerifyContext(); return GetParticle_LowLevel()->UserData(); }
1309 void SetUserData(void* InUserData) { VerifyContext(); GetParticle_LowLevel()->SetUserData(InUserData); }
1310
1312 {
1313 VerifyContext();
1314 GetParticle_LowLevel()->SetGeometry(ImplicitGeometryPtr);
1315 }
1316
1317 UE_DEPRECATED(5.4, "Use SetGeometry with FImplicitObjectPtr instead.")
1319 {
1320 check(false);
1321 }
1322
1323 UE_DEPRECATED(5.4, "Use SetGeometry with FImplicitObjectPtr instead.")
1324 void SetGeometry(TSharedPtr<const FImplicitObject, ESPMode::ThreadSafe> SharedGeometry)
1325 {
1326 check(false);
1327 }
1328
1329 void RemoveShape(FPerShapeData* InShape, bool bWakeTouching) { VerifyContext(); GetParticle_LowLevel()->RemoveShape(InShape, bWakeTouching); }
1330
1331 void MergeShapesArray(FShapesArray&& OtherShapesArray) { VerifyContext(); GetParticle_LowLevel()->MergeShapesArray(MoveTemp(OtherShapesArray)); }
1332
1333 void MergeGeometry(TArray<Chaos::FImplicitObjectPtr>&& Objects) { VerifyContext(); GetParticle_LowLevel()->MergeGeometry(MoveTemp(Objects)); }
1334
1335 UE_DEPRECATED(5.4, "Please use MergeGeometry with FImplicitObjectPtr instead.")
1336 void MergeGeometry(TArray<TUniquePtr<FImplicitObject>>&& Objects) { check(false); }
1337
1339 {
1340 VerifyContext();
1341 if (auto Kinematic = GetParticle_LowLevel()->CastToKinematicParticle())
1342 {
1343 return Kinematic->IsKinematicTargetDirty();
1344 }
1345 return false;
1346 }
1347
1349 {
1350 VerifyContext();
1351 if (auto Kinematic = GetParticle_LowLevel()->CastToKinematicParticle())
1352 {
1353 return Kinematic->ClearKinematicTarget();
1354 }
1355 }
1356
1358 {
1359 VerifyContext();
1360 if (TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1361 {
1362 if (bEnabled)
1363 {
1364 Rigid->AddCollisionConstraintFlag(ECollisionConstraintFlags::CCF_SmoothEdgeCollisions);
1365 }
1366 else
1367 {
1368 Rigid->RemoveCollisionConstraintFlag(ECollisionConstraintFlags::CCF_SmoothEdgeCollisions);
1369 }
1370 }
1371 }
1372
1373 void SetCCDEnabled(bool bEnabled)
1374 {
1375 VerifyContext();
1376 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1377 {
1378 Rigid->SetCCDEnabled(bEnabled);
1379 }
1380 }
1381
1382 bool CCDEnabled() const
1383 {
1384 VerifyContext();
1385 if (const TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1386 {
1387 return Rigid->CCDEnabled();
1388 }
1389
1390 return false;
1391 }
1392
1393 void SetMACDEnabled(bool bEnabled)
1394 {
1395 VerifyContext();
1396 if (TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1397 {
1398 Rigid->SetMACDEnabled(bEnabled);
1399 }
1400 }
1401
1402 bool MACDEnabled() const
1403 {
1404 VerifyContext();
1405 if (const TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1406 {
1407 return Rigid->MACDEnabled();
1408 }
1409
1410 return false;
1411 }
1412
1414 {
1415 VerifyContext();
1416 if (TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1417 {
1418 Rigid->SetPartialIslandSleepAllowed(bEnabled);
1419 }
1420 }
1421
1423 {
1424 VerifyContext();
1425 if (const TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1426 {
1427 return Rigid->PartialIslandSleepAllowed();
1428 }
1429
1430 return false;
1431 }
1432
1434 {
1435 VerifyContext();
1436 if (const TPBDRigidParticle<FReal, 3>*Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1437 {
1438 return Rigid->IterationSettings();
1439 }
1440
1441 return Private::FIterationSettings(0, 0, 0);
1442 }
1443
1445 {
1446 VerifyContext();
1447 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1448 {
1449 Rigid->SetPositionSolverIterations(PositionSolverIterationCountIn);
1450 }
1451 }
1452
1453
1455 {
1456 VerifyContext();
1457 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1458 {
1459 Rigid->SetVelocitySolverIterations(VelocitySolverIterationCountIn);
1460 }
1461 }
1462
1463
1465 {
1466 VerifyContext();
1467 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1468 {
1469 Rigid->SetProjectionSolverIterations(ProjectionSolverIterationCountIn);
1470 }
1471 }
1472
1474 {
1475 VerifyContext();
1476 if(TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1477 {
1478 Rigid->SetMaxLinearSpeedSq(InNewSpeed);
1479 }
1480 }
1481
1483 {
1484 VerifyContext();
1485 if(const TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1486 {
1487 return Rigid->MaxLinearSpeedSq();
1488 }
1489
1491 }
1492
1494 {
1495 VerifyContext();
1496 if(TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1497 {
1498 Rigid->SetMaxAngularSpeedSq(InNewSpeed);
1499 }
1500 }
1501
1503 {
1504 VerifyContext();
1505 if(const TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1506 {
1507 return Rigid->MaxAngularSpeedSq();
1508 }
1509
1511 }
1512
1514 {
1515 VerifyContext();
1516 if (const TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1517 {
1518 return Rigid->InitialOverlapDepenetrationVelocity();
1519 }
1520
1521 return 0;
1522 }
1523
1525 {
1526 VerifyContext();
1527 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1528 {
1529 Rigid->SetInitialOverlapDepenetrationVelocity(InNewSpeed);
1530 }
1531 }
1532
1534 {
1535 VerifyContext();
1536 if (TPBDRigidParticle<FReal, 3>* Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1537 {
1538 Rigid->SetSleepThresholdMultiplier(Multiplier);
1539 }
1540 }
1541
1543 {
1544 VerifyContext();
1545 if (auto Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1546 {
1547 Rigid->SetDisabled(bDisable);
1548 }
1549 }
1550
1551 bool Disabled() const
1552 {
1553 VerifyContext();
1554 if (auto Rigid = GetParticle_LowLevel()->CastToRigidParticle())
1555 {
1556 return Rigid->Disabled();
1557 }
1558
1559 return false;
1560 }
1561};
1562
1563static_assert(sizeof(FRigidBodyHandle_External) == sizeof(FSingleParticlePhysicsProxy), "Derived types only used to constrain API, all data lives in base class ");
1564
1565
1567{
1568 FRigidBodyHandle_Internal() = delete; //You should only ever new FSingleParticlePhysicsProxy, derived types are simply there for API constraining, no new data
1569
1570public:
1572
1573 const FVec3 PreV() const
1574 {
1575 VerifyContext();
1576 if (auto Rigid = GetHandle_LowLevel()->CastToRigidParticle())
1577 {
1578 return Rigid->GetPreV();
1579 }
1580 return FVec3(0);
1581 }
1582
1583 const FVec3 PreW() const
1584 {
1585 VerifyContext();
1586 if (auto Rigid = GetHandle_LowLevel()->CastToRigidParticle())
1587 {
1588 return Rigid->GetPreW();
1589 }
1590 return FVec3(0);
1591 }
1592
1593 void SetX(const FVec3& InX, bool bInvalidate = true)
1594 {
1595 VerifyContext();
1596 SetXBase(InX, bInvalidate);
1597 if (auto Rigid = GetHandle_LowLevel()->CastToRigidParticle())
1598 {
1599 Rigid->SetP(InX);
1600 }
1601 }
1602
1603 void SetR(const FRotation3& InR, bool bInvalidate = true)
1604 {
1605 VerifyContext();
1606 SetRBase(InR, bInvalidate);
1607 if (auto Rigid = GetHandle_LowLevel()->CastToRigidParticle())
1608 {
1609 Rigid->SetQ(InR);
1610 }
1611 }
1612
1613 void SetV(const FVec3& InV, bool bInvalidate = true)
1614 {
1615 VerifyContext();
1616 SetVBase(InV, bInvalidate);
1617 }
1618
1619 void SetW(const FVec3& InW, bool bInvalidate = true)
1620 {
1621 VerifyContext();
1622 SetWBase(InW, bInvalidate);
1623 }
1624
1625 void SetObjectState(const EObjectStateType InState, bool bAllowEvents = false, bool bInvalidate = true)
1626 {
1627 VerifyContext();
1628 SetObjectStateBase(InState, bAllowEvents, bInvalidate);
1629 }
1630};
1631
1632static_assert(sizeof(FRigidBodyHandle_Internal) == sizeof(FSingleParticlePhysicsProxy), "Derived types only used to constrain API, all data lives in base class ");
1633
1634inline FSingleParticlePhysicsProxy* FSingleParticlePhysicsProxy::Create(TUniquePtr<FGeometryParticle>&& Particle, UObject* InOwner = nullptr)
1635{
1636 ensure(Particle->GetProxy() == nullptr); //not already owned by another proxy. TODO: use TUniquePtr
1637 auto Proxy = new FSingleParticlePhysicsProxy(MoveTemp(Particle), nullptr, InOwner);
1638 return Proxy;
1639}
1640}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
#define X(Name, Desc)
Definition FormatStringSan.h:47
@ Rigid
Definition HairStrandsInterface.h:200
ESPMode
Definition SharedPointerFwd.h:12
@ Multiplier
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ParticleDirtyFlags.h:1039
Definition ImplicitObject.h:111
Definition SingleParticlePhysicsProxy.h:30
FVector GetInertiaTensor() const
Definition SingleParticlePhysicsProxy.h:46
FInitialState(FReal MassIn, FReal InvMassIn, FVector InertiaTensorIn)
Definition SingleParticlePhysicsProxy.h:38
FReal GetMass() const
Definition SingleParticlePhysicsProxy.h:44
FReal GetInverseMass() const
Definition SingleParticlePhysicsProxy.h:45
FInitialState()
Definition SingleParticlePhysicsProxy.h:32
Definition KinematicTargets.h:34
Definition ShapeInstance.h:36
Definition SingleParticlePhysicsProxy.h:1154
bool IsKinematicTargetDirty() const
Definition SingleParticlePhysicsProxy.h:1338
void SetShapeSimData(int32 InShapeIndex, const FCollisionFilterData &SimData)
Definition SingleParticlePhysicsProxy.h:1170
void MergeGeometry(TArray< Chaos::FImplicitObjectPtr > &&Objects)
Definition SingleParticlePhysicsProxy.h:1333
bool Disabled() const
Definition SingleParticlePhysicsProxy.h:1551
int32 Island() const
Definition SingleParticlePhysicsProxy.h:1249
void UpdateShapeBounds()
Definition SingleParticlePhysicsProxy.h:1162
FReal GetMaxAngularSpeedSq()
Definition SingleParticlePhysicsProxy.h:1502
void ClearForces(bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1289
void SetShapeSimCollisionEnabled(int32 InShapeIndex, bool bInEnabled)
Definition SingleParticlePhysicsProxy.h:1168
FRealSingle GetInitialOverlapDepenetrationVelocity()
Definition SingleParticlePhysicsProxy.h:1513
void SetSleepThresholdMultiplier(FRealSingle Multiplier)
Definition SingleParticlePhysicsProxy.h:1533
Private::FIterationSettings IterationSettings() const
Definition SingleParticlePhysicsProxy.h:1433
void SetInitialOverlapDepenetrationVelocity(FRealSingle InNewSpeed)
Definition SingleParticlePhysicsProxy.h:1524
void ClearKinematicTarget()
Definition SingleParticlePhysicsProxy.h:1348
void ClearTorques(bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1299
bool CCDEnabled() const
Definition SingleParticlePhysicsProxy.h:1382
void SetGeometry(const Chaos::FImplicitObjectPtr &ImplicitGeometryPtr)
Definition SingleParticlePhysicsProxy.h:1311
void MergeShapesArray(FShapesArray &&OtherShapesArray)
Definition SingleParticlePhysicsProxy.h:1331
bool PartialIslandSleepAllowed() const
Definition SingleParticlePhysicsProxy.h:1422
void SetShapeCollisionTraceType(int32 InShapeIndex, EChaosCollisionTraceFlag TraceType)
Definition SingleParticlePhysicsProxy.h:1166
void SetSmoothEdgeCollisionsEnabled(bool bEnabled)
Definition SingleParticlePhysicsProxy.h:1357
void SetMACDEnabled(bool bEnabled)
Definition SingleParticlePhysicsProxy.h:1393
void SetV(const FVec3 &InV, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1194
void SetVelocitySolverIterationCount(int32 VelocitySolverIterationCountIn)
Definition SingleParticlePhysicsProxy.h:1454
FReal GetMaxLinearSpeedSq()
Definition SingleParticlePhysicsProxy.h:1482
void RemoveShape(FPerShapeData *InShape, bool bWakeTouching)
Definition SingleParticlePhysicsProxy.h:1329
void SetPartialIslandSleepAllowed(bool bEnabled)
Definition SingleParticlePhysicsProxy.h:1413
void SetProjectionSolverIterationCount(int32 ProjectionSolverIterationCountIn)
Definition SingleParticlePhysicsProxy.h:1464
EWakeEventEntry GetWakeEvent()
Definition SingleParticlePhysicsProxy.h:1278
void SetMaxAngularSpeedSq(FReal InNewSpeed)
Definition SingleParticlePhysicsProxy.h:1493
void SetObjectState(const EObjectStateType InState, bool bAllowEvents=false, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1223
void SetMaxLinearSpeedSq(FReal InNewSpeed)
Definition SingleParticlePhysicsProxy.h:1473
void SetIgnoreAnalyticCollisions(bool bIgnoreAnalyticCollisions)
Definition SingleParticlePhysicsProxy.h:1161
void ClearEvents()
Definition SingleParticlePhysicsProxy.h:1269
void SetIsland(const int32 InIsland)
Definition SingleParticlePhysicsProxy.h:1260
void SetPositionSolverIterationCount(int32 PositionSolverIterationCountIn)
Definition SingleParticlePhysicsProxy.h:1444
void SetW(const FVec3 &InW, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1208
void SetCCDEnabled(bool bEnabled)
Definition SingleParticlePhysicsProxy.h:1373
void SetX(const FVec3 &InX, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1178
void SetShapeQueryCollisionEnabled(int32 InShapeIndex, bool bInEnabled)
Definition SingleParticlePhysicsProxy.h:1169
void SetUserData(void *InUserData)
Definition SingleParticlePhysicsProxy.h:1309
void SetR(const FRotation3 &InR, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1186
void UpdateShapeBounds(const FTransform &Transform)
Definition SingleParticlePhysicsProxy.h:1164
bool MACDEnabled() const
Definition SingleParticlePhysicsProxy.h:1402
void SetParticleID(const FParticleID &ParticleID)
Definition SingleParticlePhysicsProxy.h:1172
void * UserData() const
Definition SingleParticlePhysicsProxy.h:1308
void SetDisabled(bool bDisable)
Definition SingleParticlePhysicsProxy.h:1542
Definition SingleParticlePhysicsProxy.h:1567
const FVec3 PreW() const
Definition SingleParticlePhysicsProxy.h:1583
void SetW(const FVec3 &InW, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1619
const FVec3 PreV() const
Definition SingleParticlePhysicsProxy.h:1573
void SetR(const FRotation3 &InR, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1603
void SetV(const FVec3 &InV, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1613
void SetObjectState(const EObjectStateType InState, bool bAllowEvents=false, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1625
void SetX(const FVec3 &InX, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1593
Definition ParticleDirtyFlags.h:1228
Definition SingleParticlePhysicsProxy.h:58
CHAOS_API void ClearAccumulatedData()
Definition SingleParticlePhysicsProxy.cpp:244
CHAOS_API EWakeEventEntry GetWakeEvent() const
Definition SingleParticlePhysicsProxy.cpp:533
FORCEINLINE FRigidBodyHandle_External & GetGameThreadAPI()
Definition SingleParticlePhysicsProxy.h:73
FProxyInterpolationBase * GetInterpolationData()
Definition SingleParticlePhysicsProxy.h:70
TUniquePtr< PARTICLE_TYPE > Particle
Definition SingleParticlePhysicsProxy.h:192
CHAOS_API void ClearEvents()
Definition SingleParticlePhysicsProxy.cpp:540
CHAOS_API bool IsDirty()
Definition SingleParticlePhysicsProxy.cpp:528
CHAOS_API void BufferPhysicsResults(FDirtyRigidParticleData &)
Definition SingleParticlePhysicsProxy.cpp:267
const FPhysicsObjectHandle GetPhysicsObject() const
Definition SingleParticlePhysicsProxy.h:170
CHAOS_API bool PullFromPhysicsState(const FDirtyRigidParticleData &PullData, int32 SolverSyncTimestamp, const FDirtyRigidParticleData *NextPullData=nullptr, const FRealSingle *Alpha=nullptr, const FDirtyRigidParticleReplicationErrorData *Error=nullptr, const Chaos::FReal AsyncFixedTimeStep=0)
Definition SingleParticlePhysicsProxy.cpp:305
ErrorDataType * GetOrCreateErrorInterpolationData()
Definition SingleParticlePhysicsProxy.h:177
PARTICLE_TYPE * GetParticle_LowLevel()
Definition SingleParticlePhysicsProxy.h:144
FParticleHandle * GetHandle_LowLevel()
Definition SingleParticlePhysicsProxy.h:96
FORCEINLINE FRigidBodyHandle_Internal * GetPhysicsThreadAPI()
Definition SingleParticlePhysicsProxy.h:84
FSingleParticlePhysicsProxy(FSingleParticlePhysicsProxy &&)=delete
FORCEINLINE const FRigidBodyHandle_External & GetGameThreadAPI() const
Definition SingleParticlePhysicsProxy.h:78
FParticleHandle * Handle
Definition SingleParticlePhysicsProxy.h:193
FPhysicsObjectUniquePtr Reference
Definition SingleParticlePhysicsProxy.h:194
void SetHandle(FParticleHandle *InHandle)
Definition SingleParticlePhysicsProxy.h:112
CHAOS_API void BufferPhysicsResults_External(FDirtyRigidParticleData &)
Definition SingleParticlePhysicsProxy.cpp:279
FPBDRigidParticle * GetRigidParticleUnsafe()
Definition SingleParticlePhysicsProxy.h:155
FPhysicsObjectHandle GetPhysicsObject()
Definition SingleParticlePhysicsProxy.h:165
int32 GravityGroupIndex
Definition SingleParticlePhysicsProxy.h:196
const PARTICLE_TYPE * GetParticle_LowLevel() const
Definition SingleParticlePhysicsProxy.h:150
FSingleParticlePhysicsProxy(const FSingleParticlePhysicsProxy &)=delete
CHAOS_API void PushToPhysicsState(const FDirtyPropertiesManager &Manager, int32 DataIdx, const FDirtyProxy &Dirty, FShapeDirtyData *ShapesData, FReal ExternalDt)
Definition SingleParticlePhysicsProxy.cpp:228
const FProxyInterpolationBase * GetInterpolationData() const
Definition SingleParticlePhysicsProxy.h:71
const FParticleHandle * GetHandle_LowLevel() const
Definition SingleParticlePhysicsProxy.h:102
virtual void * GetHandleUnsafe() const override
Definition SingleParticlePhysicsProxy.h:107
virtual CHAOS_API ~FSingleParticlePhysicsProxy()
Definition SingleParticlePhysicsProxy.cpp:54
FORCEINLINE const FRigidBodyHandle_Internal * GetPhysicsThreadAPI() const
Definition SingleParticlePhysicsProxy.h:90
const FPBDRigidParticle * GetRigidParticleUnsafe() const
Definition SingleParticlePhysicsProxy.h:160
Definition IterationSettings.h:19
Definition ParticleHandle.h:436
Definition ParticleHandle.h:2739
Definition Serializable.h:10
Definition SingleParticlePhysicsProxy.h:208
EParticleType ObjectType() const
Definition SingleParticlePhysicsProxy.h:287
FSpatialAccelerationIdx SpatialIdx() const
Definition SingleParticlePhysicsProxy.h:289
const Chaos::TVec3< FRealSingle > I() const
Definition SingleParticlePhysicsProxy.h:868
bool CanTreatAsRigid() const
Definition SingleParticlePhysicsProxy.h:219
void SetXBase(const FVec3 &InX, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:229
void SetInvM(const FReal InInvM)
Definition SingleParticlePhysicsProxy.h:953
void SetProjectionSolverIterations(const int32 ProjectionSolverIterationsIn)
Definition SingleParticlePhysicsProxy.h:580
void SetRBase(const FRotation3 &InR, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:250
bool CanTreatAsKinematic() const
Definition SingleParticlePhysicsProxy.h:214
const FReal AngularEtherDrag() const
Definition SingleParticlePhysicsProxy.h:1036
const FVec3 LinearImpulse() const
Definition SingleParticlePhysicsProxy.h:775
void SetSpatialIdx(FSpatialAccelerationIdx Idx)
Definition SingleParticlePhysicsProxy.h:290
void SetKinematicTarget(const FKinematicTarget &InKinematicTarget, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:377
bool GyroscopicTorqueEnabled() const
Definition SingleParticlePhysicsProxy.h:462
void SetM(const FReal InM)
Definition SingleParticlePhysicsProxy.h:929
void SetUniqueIdx(const FUniqueIdx UniqueIdx, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:244
const FImplicitObjectRef GetGeometry() const
Definition SingleParticlePhysicsProxy.h:278
void SetCenterOfMass(const FVec3 &InCenterOfMass, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:977
void SetKinematicTarget(const FRigidTransform3 &InTargetTransform, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:372
EResimType ResimType() const
Definition SingleParticlePhysicsProxy.h:650
const FReal InvM() const
Definition SingleParticlePhysicsProxy.h:940
TSerializablePtr< FImplicitObject > Geometry() const
Definition SingleParticlePhysicsProxy.h:281
const FVec3 & GetX() const
Definition SingleParticlePhysicsProxy.h:226
const FVec3 CenterOfMass() const
Definition SingleParticlePhysicsProxy.h:964
const FReal LinearEtherDrag() const
Definition SingleParticlePhysicsProxy.h:1012
const FVec3 AngularImpulse() const
Definition SingleParticlePhysicsProxy.h:827
void SetMACDEnabled(const bool InMACDEnabled)
Definition SingleParticlePhysicsProxy.h:523
void VerifyContext() const
Definition SingleParticlePhysicsProxy.h:1095
bool MACDEnabled() const
Definition SingleParticlePhysicsProxy.h:510
void SetUpdateKinematicFromSimulation(const bool InUpdateKinematicFromSimulation)
Definition SingleParticlePhysicsProxy.h:451
void SetOneWayInteraction(const bool bInOneWayInteraction)
Definition SingleParticlePhysicsProxy.h:604
const FVec3 Acceleration() const
Definition SingleParticlePhysicsProxy.h:660
const FVec3 W() const
Definition SingleParticlePhysicsProxy.h:332
void SetCCDEnabled(const bool InCCDEnabled)
Definition SingleParticlePhysicsProxy.h:499
const FShapesArray & ShapesArray() const
Definition SingleParticlePhysicsProxy.h:283
bool InertiaConditioningEnabled() const
Definition SingleParticlePhysicsProxy.h:615
void SetI(const Chaos::TVec3< FRealSingle > &InI)
Definition SingleParticlePhysicsProxy.h:881
FUniqueIdx UniqueIdx() const
Definition SingleParticlePhysicsProxy.h:243
bool OneWayInteraction() const
Definition SingleParticlePhysicsProxy.h:591
void SetLinearEtherDrag(const FReal InLinearEtherDrag)
Definition SingleParticlePhysicsProxy.h:1025
bool GravityEnabled() const
Definition SingleParticlePhysicsProxy.h:390
const Chaos::TVec3< FRealSingle > InvI() const
Definition SingleParticlePhysicsProxy.h:892
bool UpdateKinematicFromSimulation() const
Definition SingleParticlePhysicsProxy.h:438
const FVec3 GetV() const
Definition SingleParticlePhysicsProxy.h:305
bool PartialIslandSleepAllowed() const
Definition SingleParticlePhysicsProxy.h:534
const FVec3 LinearImpulseVelocity() const
Definition SingleParticlePhysicsProxy.h:762
int32 GravityGroupIndex() const
Definition SingleParticlePhysicsProxy.h:414
const FRotation3 RotationOfMass() const
Definition SingleParticlePhysicsProxy.h:988
const FVec3 AngularImpulseVelocity() const
Definition SingleParticlePhysicsProxy.h:814
FSingleParticlePhysicsProxy * GetProxy()
Definition SingleParticlePhysicsProxy.h:212
const FVec3 GetW() const
Definition SingleParticlePhysicsProxy.h:345
void SetGravityEnabled(const bool InGravityEnabled)
Definition SingleParticlePhysicsProxy.h:403
FRotation3 GetR() const
Definition SingleParticlePhysicsProxy.h:247
void SetVBase(const FVec3 &InV, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:311
void AddTorque(const FVec3 &InTorque, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:743
void SetAngularEtherDrag(const FReal InAngularEtherDrag)
Definition SingleParticlePhysicsProxy.h:1049
void SetSleepType(ESleepType InSleepType)
Definition SingleParticlePhysicsProxy.h:1073
void SetGyroscopicTorqueEnabled(const bool InGyroscopicTorqueEnabled)
Definition SingleParticlePhysicsProxy.h:475
void SetPositionSolverIterations(const int32 PositionSolverIterationsIn)
Definition SingleParticlePhysicsProxy.h:558
void SetPartialIslandSleepAllowed(const bool InPartialIslandSleepAllowed)
Definition SingleParticlePhysicsProxy.h:547
void SetWBase(const FVec3 &InW, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:351
bool CCDEnabled() const
Definition SingleParticlePhysicsProxy.h:486
void SetInertiaConditioningEnabled(const bool bInEnabled)
Definition SingleParticlePhysicsProxy.h:628
void SetAngularImpulse(const FVec3 &InAngularImpulse, bool bIsVelocity, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:841
void SetGravityGroupIndex(const uint32 InGravityGroupIndex)
Definition SingleParticlePhysicsProxy.h:427
void SetLinearImpulse(const FVec3 &InLinearImpulse, bool bIsVelocity, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:788
void SetRotationOfMass(const FRotation3 &InRotationOfMass, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1001
EObjectStateType ObjectState() const
Definition SingleParticlePhysicsProxy.h:285
const FVec3 AngularAcceleration() const
Definition SingleParticlePhysicsProxy.h:730
const FReal M() const
Definition SingleParticlePhysicsProxy.h:916
FRotation3 R() const
Definition SingleParticlePhysicsProxy.h:246
void SetInvI(const Chaos::TVec3< FRealSingle > &InInvI)
Definition SingleParticlePhysicsProxy.h:905
void AddForce(const FVec3 &InForce, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:692
ESleepType SleepType() const
Definition SingleParticlePhysicsProxy.h:1084
void SetAngularAcceleration(const FVec3 &AngularAcceleration, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:711
const FVec3 V() const
Definition SingleParticlePhysicsProxy.h:293
void SetObjectStateBase(const EObjectStateType InState, bool bAllowEvents=false, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:1061
void SetResimType(EResimType ResimType)
Definition SingleParticlePhysicsProxy.h:639
const TSharedPtr< FImplicitObject, ESPMode::ThreadSafe > & SharedGeometryLowLevel() const
Definition SingleParticlePhysicsProxy.h:265
const FVec3 & X() const
Definition SingleParticlePhysicsProxy.h:225
void SetAcceleration(const FVec3 &Acceleration, bool bInvalidate=true)
Definition SingleParticlePhysicsProxy.h:673
void SetVelocitySolverIterations(const int32 VelocitySolverIterationsIn)
Definition SingleParticlePhysicsProxy.h:569
Definition Vector.h:1000
Definition PhysicsProxyBase.h:97
Definition Array.h:670
Definition SharedPointer.h:692
Definition UniquePtr.h:107
bool IsValid() const
Definition UniquePtr.h:280
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:324
Definition Object.h:95
Definition SkeletalMeshComponent.h:307
EParticleType
Definition GeometryParticlesfwd.h:11
EResimType
Definition GeometryParticles.h:143
FORCEINLINE void EnsureIsInPhysicsThreadContext()
Definition Threading.h:290
FORCEINLINE void EnsureIsInGameThreadContext()
Definition Threading.h:295
FRealDouble FReal
Definition Real.h:22
EObjectStateType
Definition ObjectState.h:10
EChaosCollisionTraceFlag
Definition Particles.h:231
float FRealSingle
Definition Real.h:14
TGeometryParticleHandle< FReal, 3 > FGeometryParticleHandle
Definition ParticleHandleFwd.h:24
ESleepType
Definition RigidParticles.h:23
EWakeEventEntry
Definition ParticleHandle.h:1730
TGeometryParticle< FReal, 3 > FGeometryParticle
Definition ParticleHandleFwd.h:113
Definition ChaosMarshallingManager.h:21
Definition PullPhysicsDataImp.h:53
Definition PullPhysicsDataImp.h:62
Definition ParticleDirtyFlags.h:37
Definition PhysicsObjectInternal.h:16
Definition GeometryParticlesfwd.h:59
Definition GeometryParticlesfwd.h:87
Definition CollisionFilterData.h:46
Definition PhysicsProxyBase.h:258
int32 GetInterpChannel_External() const
Definition PhysicsProxyBase.h:268
virtual const EProxyInterpolationType GetInterpolationType() const
Definition PhysicsProxyBase.h:282
int32 GetPullDataInterpIdx_External() const
Definition PhysicsProxyBase.h:265
Definition PhysicsProxyBase.h:74
Definition NumericLimits.h:41